本文不再介绍主从复制,主从复制请移步至 [Linux][数据库]配置 docker 容器的 MySQL 的主从复制
1. 主主复制概念
使用主从复制后,存在一个问题:从库一定不能进行增删改操作,会导致主从数据不一致。
那么,解决方案之一就是让原来的主从数据库,变成互为主从,也就是主从双写。
2. 主主复制配置
2.1 关闭从库复制
进入从库的容器内:docker exec -it mysql-slave bash
登陆MySQL控制台之后,关闭主从复制:stop slave;
2.2 修改配置文件
2.2.1 主库修改
1、进入主库容器:docker exec -it mysql-master bash
。
2、修改主库容器内的配置文件:vim /etc/mysql/my.cnf
[mysqld]
# 设定服务id,同一局域网内 此id唯一
server-id=100
# 启动二进制日志,并定义日志位置名称;将操作命令记录到日志中,同步数据
# 可在主节点执行 show variables like '%log_bin%'; 查看日志位置
log-bin=mysql-bin
# 在主从配置上,加上下边的配置
# 开启主库的中继日志
relay-log=master-relay-log
#步进值。一般有n台主MySQL就填n(MySQL设置自增主键时,自增的步进值,避免主从冲突)
auto_increment_increment=2
#起始值。一般填第n台主MySQL。此时为第一台主MySQL(自增偏移量)
auto_increment_offset=1
3、重启服务,启动docker(加上–restart就不用重启容器了)
service mysql restart
docker start mysql-master
2.2.2 从库修改
进入从库容器:docker exec -it mysql-slaver bash
。
修改从库容器内的配置文件:vim /etc/mysql/my.cnf
[mysqld]
# server-id ,意义同上
server-id=101
# 如果此从库 作为 主库,开启二进制日志功能
# log-bin=mysql-slave-bin
# 定义中继日志位置和名称;将主机的二进制日志记录到中继日志,SQL线程读取中继日志SQL 用于同步数据
# 可在从节点执行 show variables like '%relay_log%'; 查看日志位置
relay_log=mysql-relay-log
# 在主从配置上,加上下边的配置
# 启动二进制日志,并命名
log-bin=mysql-bin
# 同步数据 忽略 mysql、information_schema 库
# binlog-ignore-db=mysql,information_schema
# 自增步长和偏移量
auto_increment_increment=2
auto_increment_offset=1
3、重启服务,启动docker(加上–restart就不用重启容器了)
service mysql restart
docker start mysql-slave
2.3 配置主主复制
2.3.1 配置从库用户权限
进入从库容器控制台,并对slave用户授权。
为slave用户赋予权限:
# replication client 用户的复制权限
# replication slave 监视管理复制用户权限
# 赋予slave用户 对于 *.*(所有库的所有表 格式:database_name.table_name) 的权限
grant replication slave, replication client on *.* to 'slave'@'%';
如果没有该用户,就先创建用户:
# 创建用户slave 密码为 123456,% 允许任何远程主机登录此用户
create user 'slave'@'%' identified by '123456';
2.3.2 反向链接主从
1、查看从节点状态信息
在mysql-slave容器的mysql控制台root用户 查看从库状态信息,记录File和Position,sql:
-- 因为现在的 mysql-slave 作为主库,所以展示 master 状态。
show master status;
2、在 mysql-master 配置同步信息
SQL语句:
change master to master_host='192.168.44.156', \
master_user='slave', \
master_password='123456', \
master_port=3340, \
master_log_file='mysql-bin.000001', \
master_log_pos= 617, \
master_connect_retry=30;
配置说明(这里所说的主节点是mysql-slave):
master_host:主节点的地址,同一台服务器用主库容器mysql-master的ip
mster_user:主节点创建授权的账户
master_password:用户密码
master_port:主节点的端口号,指的是容器的端口号,我mysql-master映射出来的端口是3339;同一台服务器使用3306
master_log_file:上述主节点状态信息中的File,指定slave从哪个日志文件复制数据
master_log_pos:上述的Position,从哪个Positon开始读取
master_connect_retry:连接失败时的重试 时间间隔,单位是秒,默认60s
3、开启主从复制
在 mysql-master 执行sql:
start slave;
4、查看主从复制状态信息
mysql-master 执行SQL:
# 注意末尾没有分号
show slave status \G
当 Slave_IO_Running 和 Slave_SQL_Running 都为 YES,说明主从复制配置成功。
5、开启 mysql-slave 的主从复制功能
mysql-slave 执行SQL:
start slave;
3. 遇到问题
问题描述:
从节点重新链接 master 时报错,
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
解决方案:
执行SQL:
reset slave;
start slave;