1. 在/user/local/share/下创建mysql文件夹,在mysql文件夹目录下创建4个文件夹分别是:
master1, master2, slave1, slave2分别在每个目录下建立data, conf, logs用于数据持久化
创建后如下
2.创建容器:
1)创建一个名为master1的mysql容器(主 mysql)
docker run -p 4306:3306 --name master1 \
-v /usr/local/share/mysql/master1/conf:/etc/mysql/conf.d \-v /usr/local/share/mysql/master1/logs:/var/log/mysql \-v /usr/local/share/mysql/master1/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=123456 -itd mysql:8.0.22
2)创建一个名为master2的mysql容器(主 mysql)
docker run -p 4307:3306 --name master2 \
-v /usr/local/share/mysql/master2/conf:/etc/mysql/conf.d \-v /usr/local/share/mysql/master2/logs:/var/log/mysql \-v /usr/local/share/mysql/master2/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=123456 -itd mysql:8.0.22
3)创建一个名为salve1 的mysql容器(从 mysql)
docker run -p 5306:3306 --name salve1 \
-v /usr/local/share/mysql/salve1/conf:/etc/mysql/conf.d \-v /usr/local/share/mysql/salve1/logs:/var/log/mysql \-v /usr/local/share/mysql/salve1/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=123456 -itd mysql:8.0.22
4)创建一个名为salve2的mysql容器(从 mysql)
docker run -p 5307:3306 --name salve2 \
-v /usr/local/share/mysql/salve2/conf:/etc/mysql/conf.d \-v /usr/local/share/mysql/salve2/logs:/var/log/mysql \-v /usr/local/share/mysql/salve2/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD= 123456 -itd mysql:8.0.22
命令参数注解:
--name : 容器名称
-p : 映射容器端口号和宿主机端口号
-v : 挂载宿主机目录和docker容器中的目录,前面是宿主机目录,后面是容器内部目录
-d : 后台运行容器
-e :环境参数,MYSQL_ROOT_PASSWORD设置root用户的密码
-itd : 指定数据库版本
3.查看是否将mysql容器创建成功
命令:docker ps
4.配置(双主双从)
1) 配置master1
命令:vim /usr/local/share/mysql/master1/conf/my.cnf 添加如下内容:
[mysqld]# master01主服务器01唯一ID
server-id=4306# 启用二进制日志log-bin=mysql-bin
#从库的中继日志,主库日志写到中继日志,中继日志再重做到从库
# relay-log=myslql-relay-bin
# binlog保留时间7天
expire_logs_days=7# binlog 文件的大小
max_binlog_size=1G
#设置logbin格式。取值:STATEMENT (默认),ROW,MIXED
binlog_format=ROW
# 设置不要赋值的数据
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 设置需要复制的数据(可选)
# 如果配置了此项,就是只复制那个数据库, 如果不指定就是所有
# binlog-do-db=需要复制的主数据库1
# 设置login格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件log-slave-updates
# 该从库是否写入二进制日志。如果需要成为多主则可启用。只读可以不需要log-slave-updates=1#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 ..65535auto-increment-increment=2# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 ..65535auto-increment-offset=1
2)配置master2
命令:vim /usr/local/share/mysql/master2/conf/my.cnf 添加如下内容:
[mysqld]# master01主服务器01唯一ID
server-id=4307# 启用二进制日志log-bin=mysql-bin
#从库的中继日志,主库日志写到中继日志,中继日志再重做到从库
# relay-log=myslql-relay-bin
# binlog保留时间7天
expire_logs_days=7# binlog 文件的大小
max_binlog_size=1G
#设置logbin格式。取值:STATEMENT (默认),ROW,MIXED
binlog_format=ROW
# 设置不要赋值的数据
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 设置需要复制的数据(可选)
# 如果配置了此项,就是只复制那个数据库, 如果不指定就是所有
# binlog-do-db=需要复制的主数据库1
# 设置login格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件log-slave-updates
# 该从库是否写入二进制日志。如果需要成为多主则可启用。只读可以不需要log-slave-updates=1#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 ..65535auto-increment-increment=2# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 ..65535auto-increment-offset=1
3)配置slave1
命令:vim /usr/local/share/mysql/slave1/conf/my.cnf 添加如下内容:
[mysqld]# 从服务唯一ID
server-id=5306# 启用中继日志
relay-log=mysql-relay
4)配置slave2
命令:vim /usr/local/share/mysql/slave2/conf/my.cnf 添加如下内容:
[mysqld]# 从服务唯一ID
server-id=5307# 启用中继日志
relay-log=mysql-relay
注:查看server_id 的语句 show variables like 'server_id';
5.配置完成后重启容器,即可生效
docker restart $(docker ps -q)
6.创建数据库相关账户并授权
1)进入容器 master1是容器名称
docker exec -it master1 bash
2)进入mysql窗口
mysql -uroot -p123456 //-u表示账号 -p密码(为上述创建容器时设置)
3)创建一个用户来做同步的用户,并授权,所有集群内的服务器都需要做
create user 'master1'@'%' identified with mysql_native_password by 'a123456';
grant replication slave,replication client on *.* TO 'master1'@'%'; //一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.245.139,加强安全。
4)刷新生效
flush privileges;
6)使用exit命令退出mysql命令、退出master1容器
7)进入master2容器创建账号:
docker exec -it master2 bash //进入容器master2
mysql -uroot -p123456 //进去mysql窗口
mysql> create user 'master2'@'%' identified with mysql_native_password by 'a123456'; //创建账号 master2
mysql>grant replication slave,replication client on *.* TO 'master2'@'%'; //授权
mysql> flush privileges;//刷新生效
7.从机复制主机
slave1复制master1 slave2复制master2
#复制主机的命令
CHANGE MASTERTO MASTER_HOST='主机的IP地址',//查看容器ip的命令 docker inspect master1 |grep IPAddress #master1 容器名称
MASTER_USER='username',//主机的数据库账号
MASTER_PASSWORD='passworld',//主机的数据库密码
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS=具体值;
配置slave1:
如下图即为主机master1的参数:
master_log_file的值对应为File的值
master_log_pos的值为Position对应的值
配置步骤:
同上述主机配置 先进入容器salve1->再进入mysql窗口运行如下命令即可,具体参数配置根据自己安装的查询填写
change master to master_host='172.17.0.2',
master_user='master1',
master_password='a123456',
master_log_file='mysql-bin.000004',
master_log_pos=156;
启用同步进程
start slave;
查看同步从库状态
show slave status\G;
如上图没有相关报错信息就是配置成功了
本人安装时遇到的问题:
执行start slave时报:
Slave failed to initialize relay log info structure from the repository
原因:由于之前配置过主从备份已经执行过一次change master to命令,这次再次执行change master to,2次的pos值不一样。
解决:
#停止同步
stop slave
# 重置slave
reset slave;
# 执行同步change master to master_host='172.17.0.2',
master_user='master1',
master_password='a123456',
master_log_file='mysql-bin.000004',
master_log_pos=156;
# 启动slave
start slave;
# 查看slave状态
show slave status\G;
配置完成后报错:
The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manu
原因:server_id重复,是由于配置文件放错位置,导致未生效
解决:my.cnf放到容器创建时指定的位置,重启容器即可
同理配置slave2,不再重复赘述
change master to master_host='172.17.0.3',
master_user='master2',
master_password='a123456',
master_log_file='mysql-bin.000003',
master_log_pos=880;
8.两主机互相复制
master1复制master2, master2复制master1
配置master1:
change master to master_host='172.17.0.3',
master_user='master2',
master_password='a123456',
master_log_file='mysql-bin.000003',
master_log_pos=880;
启用同步进行:
start master
查看状态:
show slave status\G;
如上报错:
解决:使用flush privileges 刷新一下即可,如果还是不行,使用show master status\G;查看对应的主机信息是否已经变更新了,重新设置slave即可
正常的显示如下:
同理配置master2复制master1
change master to master_host='172.17.0.2',
master_user='master1',
master_password='a123456',
master_log_file='mysql-bin.000004',
master_log_pos=156;
到此就完成了安装和配置
测试以上集群是否成功:
1.在master1上创建一个库
CREATE DATABASE test_db;
2.创建一个表
CREATE TABLE IF NOT EXISTS `user`(
`id`INTUNSIGNED AUTO_INCREMENT,
`name`VARCHAR(30) NOT NULL,
`age`INT(3) NOT NULL,PRIMARY KEY( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.插入数据
INSERT INTO user (name, age) VALUES ("zhaoming", 18);INSERT INTO user (name, age) VALUES ("张三", 20);
出现如下说明主从同步成功,至此集群可以快乐玩耍了: