MySQL
的主從複製是實現應用的高性能,高可用的基礎。對於數據庫讀操做較密集的應用,經過使數據庫請求負載均衡分配到不一樣MySQL
服務器,可有效減輕數據庫壓力。當遇到MySQL
單點故障中,也能在短期內實現故障切換。本文就MySQL
的內建的複製功能進行闡述。mysql
5.7.17
7.4.1708
1.13.1
MySQL
複製數據流程:sql
my.cnf
配置在主庫的my.cnf
中打開二進制日誌,並設置服務Id。docker
log-bin = mysql-bin server-id = 1
注意server-id
必須是一個惟一的數字,必須主從不一致, 且主從庫必須設置項。數據庫
my.cnf
配置log-bin = mysql-bin server-id = 2 log-slave-updates = 1 read-only = 1
從庫也開啓log-bin
,log-slave-updates
設置爲從庫重放中繼日誌時,記錄到本身的二進制日誌中,可讓從庫做爲其餘服務器的主庫,將二進制日誌轉發給其餘從庫,在作一主多從方案時可考慮該種方案。安全
這裏master
和slave
文件各自保存不共用,先建立文件夾 /usr/local/mysql
而後在目錄建立master
和slave
兩個目錄,再各自建立data
文件夾
bash
# 利用 mysql 鏡像建立新的鏡像 FROM mysql:5.7.17 ENV MYSQL_ROOT_PASSWORD ytao COPY start.sh /mysql/start.sh COPY my.cnf /etc/mysql/my.cnf COPY init.sql /mysql/init.sql EXPOSE 3306 CMD ["sh", "/mysql/start.sh"]
這裏的master
和slave
都是基於同一個鏡像構建,使用的存儲引擎和其餘的組件最好是同一中,否則在複製過程當中可能會出現異常。服務器
-- 建立 data_copy 數據庫 DROP DATABASE IF EXISTS `data_copy`; CREATE DATABASE `data_copy` /*!40100 DEFAULT CHARACTER SET utf8mb4 collate utf8mb4_general_ci */; -- 建立 person 表 USE `data_copy`; DROP TABLE IF EXISTS `person`; CREATE TABLE `person` ( `id` int(32) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
建立data_copy
數據庫和person
表。負載均衡
#!/bin/sh echo '啓動mysql' service mysql start sleep 5 echo '初始化數據庫' mysql -uroot -pytao < /mysql/init.sql echo '初始化完成!' tail -f /dev/null
master
和slave
鏡像並運行容器構建master
鏡像異步
docker build -t master/mysql .
構建slave
鏡像性能
docker build -t slave/mysql .
構建成功會返回 Successfuly
,或經過docker images
命令查看鏡像
使用剛構建的鏡像來運行容器
# master 容器 docker run --name master -p 3306:3306 -v /usr/local/mysql/master/data/:/var/lib/mysql -d master/mysql # slave 容器 docker run --name slave -p 3307:3306 -v /usr/local/mysql/slave/data/:/var/lib/mysql -d slave/mysql
指定master
端口爲3306
,slave
端口爲3307
,掛載data目錄爲保存數據的目錄。
鏈接到數據庫後驗證數據庫是否初始化成功
查看 log-bin
是否開啓
前面有提到從庫I/O線程要與主庫創建鏈接,因此須要用到帳號進行驗證。帳號除了要有鏈接權限(REPLICATION CLIENT),同時還要有複製權限(REPLICATION SLAVE)。
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO muser@'%' IDENTIFIED BY 'ytao';
這裏設置的訪問地址是開放的,實際使用過程當中安全起見必定要指定訪問地址。
從庫鏈接到主庫,獲取到二進制日誌後重放。這裏首先要配置上面建立的帳號進行鏈接,使用命令進行相應的設置。
CHANGE MASTER TO MASTER_HOST = '47.107.xx.xxx', MASTER_PORT = 3306, MASTER_USER = 'muser', MASTER_PASSWORD = 'ytao', MASTER_LOG_FILE = 'mysql-bin.000006';
到這裏複製尚未啓動,須要再從庫中啓動
START SLAVE;
使用SHOW SLAVE STATUS\G;
命令查看啓動後的狀況
上面標記的輸出信息Slave_IO_Running: Yes
和Slave_SQL_Running: Yes
能夠看到I/O線程和SQL線程已啓動運行中。
若是在主庫中添加,更新或刪除一個數據,那麼從庫中應該也有與主庫對應的數據變化。
向主庫添加一條數據
INSERT INTO `data_copy`.`person` (`id`, `name`) VALUES ('1', 'ytao');
查詢從庫數據,數據已被同步過來。
上述是最簡單最基本的配置,可是理解上面的配置過程,就能夠根據自身狀況定製不一樣方案,實現一主多從,主主複製(主動-主動或主動-被動模式)等等來知足自身需求。
MySQL
的複製雖然使用簡單方便,但也伴隨着一些問題須要咱們在使用中進行解決,好比:不能從服務器異常中止中恢復,數據同步的延遲等等,還好如今遇到的大部分問題在行業中已獲得相應的解決。對這方面感興趣的能夠去了解下如今解決這些問題的中間件實現方案。
我的博客: https://ytao.top
個人公衆號 ytao