文章來源公眾號ytao ,
作者ytao
MySQL的主從複製是實現應用的高性能,高可用的基礎。對於資料庫讀操作較密集的應用,通過使資料庫請求負載均衡分配到不同 MySQL伺服器,可有效減輕資料庫壓力。當遇到 MySQL單點故障中,也能在短時間內實現故障切換。本文就 MySQL的內建的複製功能進行闡述。
MySQL複製數據流程:
主庫my.cnf配置
在主庫的my.cnf中打開二進位日誌,並設置服務Id。
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文件夾
Dockerfile 內容
這裡的master和slave都是基於同一個鏡像構建,使用的存儲引擎和其他的組件最好是同一中,不然在複製過程中可能會出現異常。
init.sql 初始化數據
創建data_copy資料庫和person表。
start.sh 腳本
構建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';
這裡設置的訪問地址是開放的,實際使用過程中安全起見一定要指定訪問地址。
從庫連接到主庫,獲取到二進位日誌後重放。這裡首先要配置上面創建的帳號進行連接,使用命令進行相應的設置。
到這裡複製還沒有啟動,需要再從庫中啟動
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的複製雖然使用簡單方便,但也伴隨著一些問題需要我們在使用中進行解決,比如:不能從伺服器異常停止中恢復,數據同步的延遲等等,還好現在遇到的大部分問題在行業中已得到相應的解決。對這方面感興趣的可以去了解下現在解決這些問題的中間件實現方案。