Docker部署MySQL主从复制

1. 主从复制概念及优势

1.1 概念

MySQL主从复制是一种数据库复制技术,它允许将一个数据库服务器(主服务器)上的数据更改复制到一个或多个数据库服务器(从服务器)。这种技术在数据库管理和维护中扮演着重要的角色,尤其是在需要数据冗余、负载均衡和高可用性的场景中。

主从复制的概念

  • 主服务器(Master):主服务器是数据更改的源头。所有的写操作(包括插入、更新和删除)都在主服务器上执行。主服务器负责记录所有数据变更到它的二进制日志中。

  • 从服务器(Slave):从服务器接收主服务器的数据变更并将它们应用到自己的数据库中。从服务器通常用于读取操作,如查询,这样可以减轻主服务器的负载。

  • 复制过程:复制过程涉及两个主要的线程——主服务器上的日志转储线程和从服务器上的复制I/O线程与复制SQL线程。主服务器将变更写入二进制日志,从服务器的I/O线程读取这些日志并将其写入中继日志,然后从服务器的SQL线程执行这些日志中的命令以更新数据。

1.2 主从复制的优势

  • 数据冗余和备份:主从复制提供了数据的冗余副本,这意味着即使主服务器发生故障,数据也不会丢失,可以从从服务器恢复。

  • 提高读取性能:通过将读取操作(如查询)分配给一个或多个从服务器,可以显著减轻主服务器的负载,提高整体的读取性能。

  • 高可用性:在主服务器发生故障时,可以从服务器接管服务,从而实现无缝的数据服务切换,保证系统的高可用性。

  • 负载均衡:主从复制允许将不同的数据库负载分配给不同的服务器,这样可以优化资源使用,提高系统的整体性能。

  • 数据分发:在分布式系统中,主从复制可以用来将数据分发到不同的地理位置,以减少数据访问的延迟。

  • 备份和恢复:从服务器通常用于备份目的,因为它们提供了数据的一个只读副本,这使得备份操作不会影响主服务器的性能。

MySQL主从复制是一种强大的工具,它提供了数据冗余、提高了读取性能和系统的可用性,同时还支持了负载均衡和数据分发等多种场景。

2.主从复制流程

Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。

在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。

配置主从同步的步骤总结:

  • 在主服务器上,必须开启二进制日志机制和配置一个独立的ID
  • 在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号,可以是同一个,也可以不同
  • 在开始复制进程前,在主服务器上记录二进制文件的位置信息
  • 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)
  • 配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置
  • 从服务器开启复制功能
  • 主服务器修改数据测试是否成功

3.主从复制实战

3.1 部署主服务器

创建容器,运行数据库主服务器master

docker run -p 3307:3306 --name master-mysql -v /masterdata/mysql-master/log:/var/log/mysql -v /masterdata/mysql-master/data:/var/lib/mysql -v /masterdata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456  -d mysql:5.7

修改master配置文件,/masterdata/mysql-master/conf 新建配置文件

vim /masterdata/mysql-master/conf/my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=1001 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

重启master实例

docker restart master-mysql

进入master容器,验证数据库

docker exec -it master-mysql /bin/bash

连接数据库,看是否能进入

bash-4.2# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44-log MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 

出现这个红框中内容,即为部署成功

在master容器实例内创建数据同步用户(重要)

# 创建用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
# 赋予权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 刷新权限
FLUSH PRIVILEGES;

查询创建的用户是否已经创建成功

SELECT user FROM mysql.user;

3.2 部署从服务器

创建从机服务器

docker run -p 3308:3306 --name mysql-slave -v /masterdata/mysql-slave/log:/var/log/mysql -v /masterdata/mysql-slave/data:/var/lib/mysql -v /masterdata/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456  -d mysql:5.7

修改从机服务器配置文件,进入/mydata/mysql-slave/conf目录下新建my.cnf

vi /masterdata/mysql-slave/confmy.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=1002
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1

重启slave实例

docker restart mysql-slave

进入从机,验证是否安装成功

docker exec -it mysql-slave /bin/bash
bash-4.2# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44-log MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 

 出现图片内容,证明安装成功

3.3 主从复制

主数据库中查看主从同步状态

show master status;

进入从机mysql-slave容器

docker exec -it mysql-slave /bin/bash

在从数据库中配置主从复制

change master to master_host='192.168.1.42', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000004', master_log_pos=769,master_connect_retry=30;

master_log_file对应的是主服务器中查询状态的文件名称

master_log_pos对于查询文件的Postion

change master命令参数: 

master_host:主数据库的IP地址;

master_port:主数据库的运行端口;

master_user:在主数据库创建的用于同步数据的用户账号;

master_password:在主数据库创建的用于同步数据的用户密码;

master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;

master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;

master_connect_retry:连接失败重试的时间间隔,单位为秒。

在从数据库中查看主从同步状态:no代表没有开始复制数据

show slave status \G;

在从数据库中开启主从同步

start slave;

 

再次查看从数据库状态:yes表示已经同步

3.4 主从复制数据验证

使用数据库管理工具,连接主从复制数据库

主机创建数据库即数据表,写入测试数据

从机查看是否同步

至此,mysql主从复制配置完成。

4.最后

感谢大家,请大家多多支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455158.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 2张4090,显卡安装,无法双屏显示

项目场景: 提示:这里简述项目相关背景: Ubuntu20.04 安装nvidia显卡 在已经安装好nvidia显卡的情况下: 单屏幕无法修改屏幕分辨率 无法双屏显示 问题描述 提示:这里描述项目中遇到的问题: 单屏幕无法…

【Origin科技绘图】最新Origin2024中文版软件安装教程

Origin是由OriginLab公司开发的一个科学绘图、数据分析软件,支持在MicrosoftWindows下运行。Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计,信号处理,曲线拟合以及峰值分析。Origin中的曲线拟合是采用基Levernberg-Marquardt算法(LMA)的非线性最小二乘法拟合…

理工科考研想考计算机,湖南大学、重大、哈工大威海、山东大学,该如何选择?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 计算机对理工科同学来说,还是性价比很高的,具有很大的优势! 一、就业前景广阔 高需求行业 在当今数字化时代,计算机技术几乎渗透到了各个领域,无论是互联网…

LabVIEW提高开发效率技巧----插入式架构

随着LabVIEW项目规模的扩大和系统复杂性的增加,传统的单一代码架构难以应对后期维护和功能扩展的需求。插入式架构(Plug-In Architecture)作为一种模块化设计方式,通过动态加载和运行子VI,使系统功能更加灵活、模块化&…

Django从请求到响应

视图 一个视图函数,简称视图,是一个简单的Python函数 def view_name() 定义视图函数view_name() URL的常用配置 path函数: path(route,view,name,**kwargs) route:RUL匹配规则 view:视图函数 name&#xf…

【部署篇】RabbitMq-03集群模式部署

一、准备主机 准备3台主机用于rabbitmq部署,文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署,只需下载对应的版本进行相同的操作。 主机IP角色说明192.168.128.31种子节点192.168.128.32普通节点192.16…

React 分装webSocket

背景 AI 实时对话 需要流式数据 React Hooks 写法。新建WebSocket.tsx 放在根目录components import { useCallback, useRef, useState } from react;type MessageHandler (message: MessageEvent) > void; type ErrorHandler (event: Event) > void;export functi…

技术成神之路:设计模式(二十二)命令模式

介绍 命令模式(Command Pattern)是一种行为设计模式,允许将请求(命令)封装为对象,从而使您可以使用不同的请求、队列或记录请求日志,以及支持可撤销操作。 1. 定义 命令模式将一个请求封装为一个…

S32DS for ARM GPIO实践

S32DS操作: 一、新建项目 打开S32DS,FIle–>NEW–> S32DS Application Project选择对应芯片,写入项目名然后下一步 选择对应的SDK,Debugger选带有PE字眼的,点击完成 配置GPIO,双击Components界面下的…

【MySQL】详解MySQL数据类型

一、数据类型 各类型的数值范围: 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。 可以通过UNSIGNED来说明某个字段是无符号的。对于int类型可能存放不下的数据,尽量不使用unsigned,unsigned int 同样可…

pytorch dataloader学习

import torch from torch.utils.data import Dataset, DataLoader import numpy as np torch.manual_seed(1) # 自定义数据集 class CustomDataset(Dataset):def __init__(self):# 创建一些示例数据(100个样本,每个样本包含10个特征)self.dat…

推荐一个开源非线性视频编辑器:Kdenlive

Kdenlive是一个开源的视频编辑软件,项目始于约2003年。它基于Qt和KDE框架库构建,大部分视频处理由MLT框架完成,同时依赖其他开源项目如FFmpeg、frei0r、movit、ladspa、sox等。 软件特点: - 多轨视频编辑:支持多个音频…

MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询

一、生成学生信息脚本 利用该脚本可以生成任意个学生信息,包括学号、姓名、班级、年级、专业、课程名称、课程成绩等信息,此处生成2万名学生,学生所有信息都是给定范围后随机生成。 生成学生信息后,再来对学生信息进行简单查询。…

论文阅读:Guided Linear Upsampling

今天介绍一篇有趣的文章,Guided Linear Upsampling,基于引导的线性上采样,这是发表在 ACM transaction on Graphic 的一篇工作。 Abstract 引导上采样是加速高分辨率图像处理的一种有效方法。在本文中,文章作者提出了一种简单而…

【2024】【字节青训营】:字节青训营入营测试题——Java版本(已提交通过)

目录 简单题目 计算x到y的最小步数 环状 DNA 序列的最小表示法 Base32 解码和编码 打点计时器 兔群繁殖之谜 完美整数 找出整数数组中占比超过 一半 的数 找出最长的神奇数列 找单独的数 字符串最短循环字串 二进制反码转换问题 中等题目 简单四则运算 数字翻译…

【图解版】力扣第146题:LRU缓存

力扣第146题:LRU缓存 一、LRU算法1. 基本概念2. LRU 和 LFU 的区别:3. 为什么 LRU 不需要记录使用频率? 二、Golang代码实现三、代码图解1. LRUCache、DLinkedNode两个结构体2. 初始化结构体对象3. addToHead函数4. removeNode函数5. moveToH…

rust grpc demo

文章目录 1. 创建项目2. 配置proto2.1 配置Cargo.toml, 内容如下:2.2 创建文件proto/hello.proto, 内容如下:2.3 添加build.rs文件, 内容如下:2.4 项目结构如下:2.5 编译proto文件 3.0 处理服务3.1 项目引入3.2 添加sr…

多模态大语言模型(MLLM)-Deepseek Janus

论文链接:https://arxiv.org/abs/2410.13848 代码链接:https://github.com/deepseek-ai/Janus 本次解读Janus: Decoupling Visual Encoding for Unified Multimodal Understanding and Generation 前言 Deepseek出品,必属精品。 创新点 传…

docker容器无法连接宿主机mysql排查

1、docker无法访问宿主机 在docker容器内,需要访问当前docker容器的网关,例如172.xx.0.1,即可访问宿主机,因此需要保证docker的网络配置正确 查看当前docker容器的网关: docker inspect 你的容器名或者容器id 显示…

【纯前端excel导出】vue2纯前端导出excel,使用xlsx插件,修改样式、合并单元格

官网: 1、xlsx-js-style xlsx-js-style | xlsx-js-style homepage 2、xlsx SheetJS 中文网 一、使用第三方插件 1、安装 npm install xlsx-js-style 2、引入 import xlsx from xlsx-js-style xlsx插件是基础的导出,不可以修改样式,直接xlsx-s…