blog icon indicating copy to clipboard operation
blog copied to clipboard

Mysql Master/Slave Replication With Docker

Open junnplus opened this issue 9 years ago • 4 comments

Mysql 的主從複製原理見下圖 image Replication 是一個異步的複製過程,所謂異步,是指系統更新到 Master 的內容並一定會及時的反映到 Slave 上。

Slave 的 I/O 線程和 SQL 線程

Slave 上會同時有兩個線程在工作, I/O 線程從 Master 得到數據(Binary Log 文件),放到被稱爲 Relay Log 文件中進行記錄。另一方面,SQL 線程則將 Relay Log 讀取並執行。 爲什麼要有兩個線程?這是爲了降低同步的延遲。因爲 I/O 線程和 SQL 線程都是相對很耗時的操作。

Binary Log 和 Relay Log

Master 會生成二進制日誌 Binary Log, Slave 會生成中繼日誌 Relay Log。 二進制日誌之記錄修改數據的語句,不記錄查詢類的語句。 中繼日誌是指 Slave 的 I/O 線程從 Master 獲取的二進制日誌文件,將其保留在 Slave 上。不同二進制日誌的是,當不需要,中繼日誌會被 SQL 線程自動刪除。

位置信息

Slave 會記錄同步了多少 Master 數據,以便斷點同步。 將 Master 所在的主機名,日誌文件名,以及日誌文件中處理的信息稱爲位置信息。

當 Mysql Master/Slave Replication 遇上 Docker

創建 Master 容器

docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name=master mysql

master.cnf

[mysqld]
server-id = 1
log-bin=mysql-bin
binlog-ignore-db=mysql
# binlog-do-db
# binlog_format=mixed

# 都是可選操作,下同

master.cnf 複製到容器內的 /etc/mysql/conf.d 裏面

docker cp master.cnf master:/etc/mysql/conf.d

創建 Slave 容器

docker run -d --link master:master -e MYSQL_ROOT_PASSWORD=123456 --name=slave mysql

slave.cnf

[mysqld]
server-id = 2
# relay_log = relay_bin
# relay-log-index = relay-bin.index
# read-only=1 # 除非有SUPER權限,否則只讀
# super-read-only=1 # SUPER權限也是只讀

slave.cnf 複製到容器內的 /etc/mysql/conf.d 裏面

docker cp slave.cnf slave:/etc/mysql/conf.d

重啓 Master 和 Slave 容器

docker restart master slave

配置 Master 和 Slave

進入容器操作

docker exec -it master mysql -uroot -p123456  # 進入 Master 容器
docker exec -it slave mysql -uroot -p123456  # 進入 Slave 容器

在 Master 容器中創建同步帳號並授權

GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'repl';

在 Slave 容器中連接 Master 並啓動 slave

CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='repl', MASTER_PASSWORD='repl';
start slave;

可以檢查一下 Slave 是否正常工作

show slave status\G

如果 Slave_SQL_Running_StateSlave has read all relay log; waiting for more updates 表示正常運行。

測試 Master/Slave 同步

docker exec master mysql -uroot -p123456 -e "CREATE DATABASE test"
docker exec slave mysql -uroot -p123456 -e "SHOW DATABASES"

簡單思考

  • 如果 Master 已有數據,怎麼新增 Slave? 參考
  • 如果已有 Master/Slave ,怎麼增加 Slave? 參考

junnplus avatar Mar 31 '16 07:03 junnplus

已Watch。繁体字看着好难受!!!!!!

ttop5 avatar Mar 31 '16 15:03 ttop5

@ttop5 Docker 可以用來做一些好玩的東西哈,很早就想嘗試 Mysql 的主從複製,Docker上操作更方便。

junnplus avatar Mar 31 '16 16:03 junnplus

666啊

ttop5 avatar Apr 01 '16 03:04 ttop5

用issue来写blog,厉害啊

xiaohuazi123 avatar Jun 30 '20 07:06 xiaohuazi123