Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mysql Master/Slave Replication With Docker #1

Open
Junnplus opened this issue Mar 31, 2016 · 3 comments

Comments

Projects
None yet
2 participants
@Junnplus
Copy link
Owner

commented Mar 31, 2016

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 Junnplus self-assigned this Mar 31, 2016

@ttop5

This comment has been minimized.

Copy link

commented Mar 31, 2016

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

@Junnplus

This comment has been minimized.

Copy link
Owner Author

commented Mar 31, 2016

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

@ttop5

This comment has been minimized.

Copy link

commented Apr 1, 2016

666啊

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.