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

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 .. 65535
  auto-increment-increment=2

  # 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
  auto-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 .. 65535
  auto-increment-increment=2

  # 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
  auto-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 MASTER TO 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` INT UNSIGNED 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);

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

  

 

 

 

 

 

 

    







posted @ 2020-12-26 08:56  爱搬砖的小码农  阅读(1108)  评论(0编辑  收藏  举报