1、什麼是MySQL的主從複製?html
MySQL能夠將一個數據庫設置爲主庫,另外一個數據庫設置爲該主庫的從庫,當主庫發生了變動,會同步到從庫中。MySQL的主從架構,能夠是星型的,也能夠是線型的。mysql
星型架構:sql
線型架構:docker
因爲主從複製的延遲問題,星型架構比線型架構更經常使用。下文中的應用主要是以星型架構爲例。數據庫
2、MySQL主從複製的方式centos
MySQL的複製能夠分爲基於二進制日誌的複製和基於事務(GTID)的複製,基於二進制日誌的複製方式,又能夠分爲基於行(ROW)的二進制日誌複製方式,和基於語句(STATEMENT)的二進制日誌複製方式。那麼這些複製方式有什麼區別呢?bash
基於語句的二進制日誌複製,主庫將變動SQL語句以及上下文記錄到二進制日誌中,這樣的話,若是SQL語句中有不肯定值的函數,例如uuid(),在從庫中執行執行相同的SQL語句可能會致使不一樣的變動結果。如今來看一下基於語句的二進制日誌,臨時設置二進制日誌格式爲statement:set session binlog_format=statement,在庫中插入一條數據:insert into novel values(4, '杯雪')。查看產生的二進制日誌:mysqlbinlog --no-defaults mysql-bin.000002,日誌以下所示:session
基於行的二進制日誌複製,主庫是將每行的變動數據記錄到二進制日誌中,在從庫中直接是對每行數據進行修改,而不用在從庫中執行SQL語句,這樣會更高效,而且不會致使主從數據不一致的問題。不過,這樣會致使二進制日誌比較大。下面是基於ROW的二進制日誌:架構
上面的兩種二進制日誌複製方式,須要指定是哪一個二進制日誌以及相應的偏移量,來進行增量同步,若是指定錯誤會形成遺漏或者重複。函數
GTID方式,本文暫不討論,後續會補上。
3、MySQL複製的原理
4、基於行的二進制日誌的主從複製方式實例
docker run --name cnt-centos-mysql-w -itd 87de1d39ef43 /bin/bash
2. 在容器中安裝並配置mysql,參考http://www.javashuo.com/article/p-omyniwxi-cq.html
3. docker commit cfb8dfa6ddd8 centos-mysql,將安裝mysql後的容器保存爲一個鏡像。
4. 用上述centos-mysql鏡像,啓動三個容器實例,做爲一主二從:
Master:docker run --name cnt-centos-mysql-master -itd -p 7000:22 centos-mysql /bin/bash
Slave1:ocker run --name cnt-centos-mysql-slave1 -itd -p 7001:22 centos-mysql /bin/bash
Slave2:docker run --name cnt-centos-mysql-slave2 –itd –p 7002:22 centos-mysql /bin/bash
5. 在主庫建立一個數據庫,建立表,插入數據
在啓動mysql服務的時候,若是報「」,能夠嘗試使用rm -fr /var/lib/mysql/*這個命令來解決,從新初始化數據庫。
備份主數據庫:
將備份腳本拷貝到從庫中:
初始化從庫:
創建對應網段的複製用戶:
給repl用戶授予複製權限:
其中,master_log_file的取值,來自備份的腳本,以下:
啓動複製鏈路,並查看複製鏈路轉態信息:
在主庫中插入數據:
查詢從庫,能夠看到剛插入的數據已經從主庫同步到從庫中了: