原文見https://github.com/Junnplus/blog/issues/...html
Mysql 的主從複製原理見下圖Replication
是一個異步的複製過程,所謂異步,是指系統更新到 Master 的內容並必定會及時的反映到 Slave 上。mysql
Slave 上會同時有兩個線程在工做, I/O 線程從 Master 獲得數據(Binary Log
文件),放到被稱爲 Relay Log
文件中進行記錄。另外一方面,SQL 線程則將 Relay Log
讀取並執行。
爲什麼要有兩個線程?這是爲了下降同步的延遲。因爲 I/O 線程和 SQL 線程都是相對很耗時的操做。git
Master 會生成二進制日誌 Binary Log
, Slave 會生成中繼日誌 Relay Log
。
二進制日誌之記錄修改數據的語句,不記錄查詢類的語句。
中繼日誌是指 Slave 的 I/O 線程從 Master 獲取的二進制日誌文件,將其保留在 Slave 上。不一樣二進制日誌的是,當不須要,中繼日誌會被 SQL 線程自動刪除。github
Slave 會記錄同步了多少 Master 數據,以便斷點同步。
將 Master 所在的主機名,日誌文件名,以及日誌文件中處理的信息稱爲位置信息。sql
docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name=master mysql
master.cnf
docker
[mysqld] server-id = 1 log-bin=mysql-bin binlog-ignore-db=mysql # binlog-do-db # binlog_format=mixed
#
都是可選操做,下同spa
將 master.cnf
複製到容器內的 /etc/mysql/conf.d
裏面rest
docker cp master.cnf master:/etc/mysql/conf.d
docker run -d --link master:master -e MYSQL_ROOT_PASSWORD=123456 --name=slave mysql
slave.cnf
code
[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
裏面orm
docker cp slave.cnf slave:/etc/mysql/conf.d
docker restart 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_State 是 Slave has read all relay log; waiting for more updates 表示正常運行。
docker exec master mysql -uroot -p123456 -e "CREATE DATABASE test" docker exec slave mysql -uroot -p123456 -e "SHOW DATABASES"