您好,登錄后才能下訂單哦!
MySQL
的主從復制是實現應用的高性能,高可用的基礎。對于數據庫讀操作較密集的應用,通過使數據庫請求負載均衡分配到不同MySQL
服務器,可有效減輕數據庫壓力。當遇到MySQL
單點故障中,也能在短時間內實現故障切換。本文就MySQL
的內建的復制功能進行闡述。
5.7.17
7.4.1708
1.13.1
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
文件夾
# 利用 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
的復制雖然使用簡單方便,但也伴隨著一些問題需要我們在使用中進行解決,比如:不能從服務器異常停止中恢復,數據同步的延遲等等,還好現在遇到的大部分問題在行業中已得到相應的解決。對這方面感興趣的可以去了解下現在解決這些問題的中間件實現方案。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。