原文地址:https://chanjarster.github.io...
本文對應代碼:github
用Docker部署基於GTID的MySQL Master-Slave Replication例子。
啓動Master
寫一個文件mysql-master.cnf
:
[mysqld]
server_id=1
binlog_format=ROW
gtid_mode=ON
enforce-gtid-consistency=true
這個配置文件把Master的server_id
設置爲1,要注意在同一個Master-Slave集羣裏,server_id
不能重複。
啓動Master:
docker run -d --name mysql-master \
-e MYSQL_USER=my_user \
-e MYSQL_DATABASE=my_database \
-e MYSQL_PASSWORD=my_database_password \
-e MYSQL_ROOT_PASSWORD=my_root_password \
-p 3307:3306 \
-v $(pwd)/mysql-master.cnf:/etc/mysql/conf.d/mysql-master.cnf \
mysql:8.0 \
--log-bin=my
啓動Slave
寫一個文件mysql-slave-1.cnf
:
[mysqld]
server_id=2
binlog_format=ROW
gtid_mode=ON
enforce-gtid-consistency=true
read_only=ON
這個文件把Slave的server_id
設置爲2,如果你有多個Slave,那麼得分別設置不同的server_id
。此外,將Slave設置爲read_only
模式(這樣就不能在slave上執行寫操作了)。
啓動Slave:
docker run -d --name mysql-slave-1 \
-e MYSQL_ROOT_PASSWORD=my_root_password \
-p 3308:3306 \
-v $(pwd)/mysql-slave-1.cnf:/etc/mysql/conf.d/mysql-slave-1.cnf \
mysql:8.0 \
--skip-log-bin \
--skip-log-slave-updates \
--skip-slave-start
創建Replication用戶
到Master上創建Replication用戶:
$ docker exec -it mysql-master mysql -u root -p
Enter password: my_root_password
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
將Slave和Master關聯
到Slave上把自己和Master關聯起來:
$ docker exec -it mysql-slave-1 mysql -u root -p
Enter password: my_root_password
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.101.21',
MASTER_PORT=3307,
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_AUTO_POSITION=1;
注意MASTER_HOST
寫的是Master所在的Host的IP,MASTER_PORT
寫的是Master暴露在Host上的端口,MASTER_USER
和MASTER_PASSWORD
則是Replication用戶的信息。
最後正式啓動Slave:
mysql> START SLAVE;
驗證
到Slave上看看my_database是否存在:
$ docker exec -it mysql-slave-1 mysql -u root -p
Enter password: my_root_password
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_database |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
如果有就說明my_database從Master複製到了Slave上。
已知問題
Slave無法使用hostname來鏈接Master
本例子中使用的MySQL Docker鏡像自帶了一個配置文件位置在/etc/mysql/conf.d/docker.cnf
,它裏面配置了:
[mysqld]
skip-host-cache
skip-name-resolve
注意skip-name-resolve
,因爲這個配置,在MASTER_HOST
裏只能寫IP,不能寫hostname,否則就解析不到。這個可以觀察Slave的日誌看到:docker logs -f mysql-slave-1
。
本例在Mac上無法工作
這個是因爲Slave容器無法訪問到Master的host。解決辦法我也不知道。