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);

出現如下說明主從同步成功,至此集群可以快樂玩耍了:

  

 

 

 

 

 

 

    

 
        






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM