MySQL Master Slave Docker部署例子

原文地址: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_USERMASTER_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。解決辦法我也不知道。

參考資料

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