docker中如何搭建mysql的主从复制:

110 阅读5分钟

作者:xiaotong

myslq主从复制原理

MySQL 主从复制用于实现数据在多个 MySQL 实例之间的同步。它基于主服务器(master)将写操作记录为二进制日志,然后从服务器(slave)通过读取并应用这些二进制日志来实现数据的复制。

主从复制的原理如下:

  1. 配置主服务器(Master):首先,在主服务器上启用二进制日志(binary logging)。二进制日志记录了主服务器上执行的所有写操作(例如 INSERT、UPDATE、DELETE),以二进制形式保存在文件中,称为二进制日志文件(binary log files)。

  2. 启动从服务器(Slave):在从服务器上配置需要与主服务器进行复制同步的数据库。然后,配置从服务器连接到主服务器并获取二进制日志文件的位置信息。

  3. 主服务器发送二进制日志:当主服务器接收到写操作时,它将这些操作记录到二进制日志中,并将二进制日志文件发送到从服务器。

  4. 从服务器获取二进制日志:从服务器连接到主服务器,并根据配置信息请求获取二进制日志文件及其位置信息。

  5. 应用二进制日志:从服务器接收到二进制日志文件后,按顺序读取并应用其中记录的写操作,将其在从服务器上执行,从而实现主从数据的同步。

  6. 进行持续复制:一旦从服务器开始复制主服务器的数据,它会持续连接并读取新的二进制日志文件,以便实时同步主服务器上的写操作。

通过这种方式,主从复制实现了数据的异地备份、负载均衡以及故障恢复等功能。从服务器可以用作读取查询的副本,从而减轻主服务器的负载,并提高整体系统的可用性和性能。

需要注意的是,在配置主从复制时,还需要考虑网络稳定性、主从服务器的时间一致性、主服务器的备份等因素,以确保复制过程的可靠性和一致性。

注意注意注意,请详细检查每一步每一个字段是否出错!我总结的时候因疏忽浪费一个半小时

主从复制步骤如下:

1.运行主服务器:映射 log日志 data数据 conf配置 docker run -d -p 3307:3306 --privileged=true -v /mysql-master/mysql/log:/var/log/mysql -v /mysql-master/mysql/data:/var/lib/mysql -v/mysql-master/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql:5.7 2.修改conf配置文件如下(修改完需要重启容器): [mysqld]

设置serverid,同一局域网中需要唯一

server_id=101

指定不需要同步的数据库名称

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

3.进入mysql执行一下命令创建用户并授权 创建一个 MySQL 用户可以通过以下步骤完成:

  1. 连接到 MySQL 数据库服务器:
mysql -u root -p

根据提示输入 MySQL 的 root 用户密码。

  1. 创建一个新用户:
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

username 替换为你想要创建的用户名,将 password 替换为用户的密码。如果你希望用户能够从任何主机连接到数据库,可以将 'localhost' 更改为 '%'

  1. 授予用户适当的权限。例如,授予用户对所有数据库的只读权限:
GRANT SELECT ON *.* TO 'username'@'localhost';

如果你希望授予用户更多权限,请根据需要调整权限。

  1. 刷新权限以使更改生效:
FLUSH PRIVILEGES;

CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON . TO 'slave'@'%'; FLUSH PRIVILEGES; SHOW GRANTS FOR 'slave'@'%';

4.创建从服务器并修改my.conf如下 [mysqld]

设置server_id,同一局域网中需要唯一

server_id=102

指定不需要同步的数据库名称

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 5.查看主服务器状态 并记录 show master status 一定要记录后面MASTER_LOG_POS会用到

6.从服务器绑定主服务器,并查看是否配置成功(注意是在从数据库中进行配置) show slave status \G; \G键值对 CHANGE MASTER TO MASTER_HOST='121.36.254.198', MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_PORT=3307, MASTER_LOG_FILE='mall-mysql-bin.000001', MASTER_LOG_POS=594, MASTER_CONNECT_RETRY=30; 这里千万千万别写错了,我这里写错了mall-mysql-bin.000001 写成mall-mysl-bin.000001 漏了个q,白给1个半小时兄弟们 还有就是主从操作一定要分清出啊!主服务器建立一个用户授权,然后查看主服务器状态记录Position,其他的都交给副服务器!!!

从数据库中使用start slave命令开启同步

show slave status \G 查看状态是否都是yes