基於二進制日誌文件位置(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