MySQL Replication提供了數據庫之間復制數據的功能,通過這個功能可以讓一個數據庫的數據更改自動同步到另外一個數據庫。通常用這個功能來實現數據備份、數據容災、數據冗余,進一步實現數據的讀寫分離等功能。具體的功能介紹不詳細描述,這是一個成熟的解決方案,官網有詳細的step by step教程。
官網給出的實現Replication的指引,是基於服務器MySQL實現的,參考它的步驟可以將MySQL Replication的功能在Docker平台下實現。整個過程主要改變是將host主機的配置和數據映射到MySQL容器中,也就是之前提供配置和存儲數據的方式變了。
下面來開始我們的實施:
實施環境:
運行在CentOS上的Docker平台
1.下載MySQL Server Docker鏡像
這里我們使用MySQL官方提供的社區版本的鏡像
docker pull mysql/mysql-server
2.創建數據存放目錄和配置目錄
master是主庫的目錄,slave是從庫的目錄
sudo mkdir -p /var/Docker/master/data /var/Docker/slave/data
sudo mkdir -p /var/Docker/master/cnf /var/Docker/slave/cnf
這里創建的目錄是供接下來創建MySQL容器使用的,這里的路徑將映射到容器中
3.創建數據庫配置文件
創建主庫配置文件
sudo vim /var/Docker/master/cnf/my.cnf
內容如下
# Config Settings
[mysqld]
user=mysql
server-id=1
binlog_format=ROW
log-bin
創建從庫配置文件
sudo vim /var/Docker/slave/cnf/my.cnf
內容如下
# Config Settings
[mysqld]
user=mysql
server-id=2
同樣這里創建的配置文件,在接下來創建容器時將映射到容器中。
4.主庫的Replication設置
啟動主庫的MySQL容器實例
docker run --name master_mysql --mount type=bind,src=/var/Docker/master/cnf/my.cnf,dst=/etc/my.cnf --mount type=bind,src=/var/Docker/master/data/,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d mysql/mysql-server
這個命令的意思是基於myql/mysql-server這個鏡像創建mysql容器實例,並且將宿主機的配置路徑和數據路徑映射到mysql容器中,這樣MySQL的數據就能保存到宿主機器中。
登錄到主庫的MySQL
docker exec -it master_mysql mysql -uroot -p
然后就會進入到mysql的命令行,之后的操作跟普通配置Replication基本相似。
創建用於Replication的用戶
GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'repl_password';
查詢主庫的日志position信息
SHOW MASTER STATUS\G;
*************************** 1. row ***************************
File: 9fd14f7de2e4-bin.000001
Position: 437
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
記錄下File和Position的值
6.從庫的Replication設置
啟動從庫的MySQL容器實例
docker run --name slave_mysql --mount type=bind,src=/var/Docker/slave/cnf/my.cnf,dst=/etc/my.cnf --mount type=bind,src=/var/Docker/slave/data/,dst=/var/lib/mysql --link master_mysql:master_mysql -e MYSQL_ROOT_PASSWORD=password -d mysql/mysql-server
這里跟運行主庫的MySQL容器類似,區別在於增加了--link參數,將master_mysql的主機名稱鏈接到容器中,在配置master信息的時候需要用到。
登錄到從庫的MySQL
docker exec -it slave_mysql mysql -uroot –p
配置maste信息
change master to master_host='master_mysql',master_user='repl',master_password='repl_password',master_log_file='9fd14f7de2e4-bin.000001',master_log_pos=437;
啟動SLAVE
START SLAVE;
查看SLAVE狀態
SHOW SLAVE STATUS\G;
如果一切成功,那么可以看到如下信息,其中Slave_IO_Running和Slave_SQL_Running應該都是Yes的值,並且沒有其他Error。
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master_mysql
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: 9fd14f7de2e4-bin.000001
Read_Master_Log_Pos: 437
Relay_Log_File: 4f02ee10dc71-relay-bin.000002
Relay_Log_Pos: 327
Relay_Master_Log_File: 9fd14f7de2e4-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
7 驗證數據修改
在主庫更新數據測試是否能正確同步數據到從庫
docker exec -it slave_mysql mysql -uroot –p
不詳細演示了,就是登陸到主庫改改數據,然后到從庫看看是否存在對應的數據即可。
小結
這個實驗主要演練了以下知識點
1.將MySQL部署到Docker平台
2.練習將宿主機的文件夾/文件映射到Docker容器實例中
3.演練了MySQL Replication的實現方式,並且在Docker中實現
