Docker搭建MySQL8.0主從複製(Replication)環境

基於二進制日誌文件位置(Binary Log File Position)的複製配置

環境準備:

Centos 7.7.1908 64位
Docker 18.06.3-ce
要求服務器可連接互聯網
本實驗使用Root用戶操作,mysql:latest鏡像的MySQL版本爲8.0.18

Docker鏡像

# docker search mysql
選擇STARS數最多的mysql官方鏡像
# docker pull mysql

啓動Master,Slave節點

啓動2容器,一個用作master節點,一個用作slave節點
以下命令大致含義:容器後臺運行,docker容器名命名爲master/slave,容器端口映射到宿主機3306/3307端口, 設定root賬號的密碼爲root,啓動的mysql鏡像版本爲latest,切換mysql默認連接認證方式(使用賬號密碼登陸認證,8.0新特性)。

# docker run -it -d --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:latest --default-authentication-plugin=mysql_native_password 
# docker run -it -d --name slave -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:latest --default-authentication-plugin=mysql_native_password 

查看已啓動容器
# docker ps
查看所有容器
# docker ps -a

Docker宿主機防火牆端口開放

開放3306到3307之間的2個端口,3306用於master節點,3307用於slave節點

# firewall-cmd --zone=public --add-port=3306-3307/tcp --permanent
# firewall-cmd --reload

設置容器內MySQL配置

1、master節點執行配置命令

# docker exec -it master mysql -uroot -proot \
-e "SET PERSIST server_id=1;" \
-e "SET PERSIST_ONLY gtid_mode=ON;" \
-e "SET PERSIST_ONLY enforce_gtid_consistency=true; " \
-e "CREATE USER 'repl_user'@'%' IDENTIFIED BY '123456' REQUIRE SSL; " \
-e "GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; "

Master節點命令行參數大致含義:
在容器內的mysql下執行復制參數配置,包括設置節點server-id,開啓GTID複製模式,
master節點創建repl_user/123456 用戶給slave連接複製使用,給repl_user用戶添加所有Master數據庫和表的複製權限。

還有些常見參數可酌情配置:
log-bin=二進制文件名
binlog_format=row #按行復制

啓用了二進制日誌記錄的從服務器也可以用作複製拓撲的一部分。複製順序如:master->slave1->slave2
參數配置可參考:https://dev.mysql.com/doc/refman/8.0/en/replication-howto-slavebaseconfig.html

2、slave節點執行配置命令

# docker exec -it slave mysql -uroot -proot \
-e "SET PERSIST server_id=2;" \
-e "SET PERSIST_ONLY gtid_mode=ON;" \
-e "SET PERSIST_ONLY enforce_gtid_consistency=true; " 

3、重啓Master和Slave節點
# docker restart master slave

以下操作可驗證配置是否生效
1)進入容器mysql命令
# docker exec -it master mysql -uroot -proot
2)分別查看配置項是否生效:
mysql> show variables like 'server_id';
mysql> show variables like 'gtid_mode';
mysql> show variables like 'enforce_gtid_consistency';
3)查看用戶權限分配:
mysql> select * from user where user = 'repl_user'
4)使用mysql客戶端連接工具測試Master和Slave外部網絡連接是否正常
本次實驗連接信息:
IP:192.168.18.128
port:3306(從庫3307)
user:root
password:root

Slave連接Master

# docker exec -it slave mysql -uroot -p
Enter password: root
mysql > CHANGE MASTER TO MASTER_HOST='192.168.18.128', MASTER_PORT=3306, MASTER_USER='repl_user', MASTER_PASSWORD='123456', MASTER_AUTO_POSITION=1, MASTER_SSL=1;
mysql > START SLAVE;
mysql > show slave status;   -- 驗證連接是否成功

命令行含義:登陸slave數據庫,執行配置連接Master的參數(包括Master的IP,端口,用戶名,密碼),啓動連接,驗證連接是否成功。
show slave status展示如下狀態爲正常:
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上連接sql也可以通過客戶端工具在從庫直接執行,並查詢驗證

驗證主從複製是否生效

主庫創建數據庫,查看從庫是否會同步創建

參考資料:
https://dev.mysql.com/doc/refman/8.0/en/binlog-replication-configuration-overview.html/
https://www.jianshu.com/p/6194106cdd05
https://www.jianshu.com/p/3eb1e178f51b

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章