docker 多个mysql_mysql8.0 利用docker容器安装配置多主多从集群

1. 在/user/local/share/下创建mysql文件夹,在mysql文件夹目录下创建4个文件夹分别是:

master1, master2, slave1, slave2分别在每个目录下建立data, conf, logs用于数据持久化

创建后如下

9a98748efedc241f65d52662ab46042c.png

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

ead93e13d22ddd119cceb8466ff6bbfc.png

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对应的值

39ccff20c3bd53dcf7dda515cdc95aaa.png

配置步骤:

同上述主机配置 先进入容器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;

fcece534436c379f18b2ea216fe52822.png

如上图没有相关报错信息就是配置成功了

本人安装时遇到的问题:

执行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;

c7874a283f2fbec1ae7306b80568ee05.png

如上报错:

解决:使用flush privileges 刷新一下即可,如果还是不行,使用show master status\G;查看对应的主机信息是否已经变更新了,重新设置slave即可

正常的显示如下:

fd3bb873abfdbcb974b33b5fa1334879.png

同理配置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);

出现如下说明主从同步成功,至此集群可以快乐玩耍了:

cd1789d25515ba048153f7840f5fe922.png

8c5cbf18857f28a0965c6889aebb6937.png

670ffe5feb20a1a6dd5cc74b45515026.png


版权声明:本文为weixin_30682635原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。