您好,登錄后才能下訂單哦!
MySQL
的主從復(fù)制是實(shí)現(xiàn)應(yīng)用的高性能,高可用的基礎(chǔ)。對(duì)于數(shù)據(jù)庫(kù)讀操作較密集的應(yīng)用,通過(guò)使數(shù)據(jù)庫(kù)請(qǐng)求負(fù)載均衡分配到不同MySQL
服務(wù)器,可有效減輕數(shù)據(jù)庫(kù)壓力。當(dāng)遇到MySQL
單點(diǎn)故障中,也能在短時(shí)間內(nèi)實(shí)現(xiàn)故障切換。本文就MySQL
的內(nèi)建的復(fù)制功能進(jìn)行闡述。
5.7.17
7.4.1708
1.13.1
MySQL
復(fù)制數(shù)據(jù)流程:
my.cnf
配置在主庫(kù)的my.cnf
中打開二進(jìn)制日志,并設(shè)置服務(wù)Id。
log-bin = mysql-bin
server-id = 1
注意server-id
必須是一個(gè)唯一的數(shù)字,必須主從不一致, 且主從庫(kù)必須設(shè)置項(xiàng)。
my.cnf
配置log-bin = mysql-bin
server-id = 2
log-slave-updates = 1
read-only = 1
從庫(kù)也開啟log-bin
,log-slave-updates
設(shè)置為從庫(kù)重放中繼日志時(shí),記錄到自己的二進(jìn)制日志中,可以讓從庫(kù)作為其他服務(wù)器的主庫(kù),將二進(jìn)制日志轉(zhuǎn)發(fā)給其他從庫(kù),在做一主多從方案時(shí)可考慮該種方案。
這里master
和slave
文件各自保存不共用,先創(chuàng)建文件夾?/usr/local/mysql
?然后在目錄創(chuàng)建master
和slave
兩個(gè)目錄,再各自創(chuàng)建data
文件夾
# 利用 mysql 鏡像創(chuàng)建新的鏡像
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
都是基于同一個(gè)鏡像構(gòu)建,使用的存儲(chǔ)引擎和其他的組件最好是同一中,不然在復(fù)制過(guò)程中可能會(huì)出現(xiàn)異常。
-- 創(chuàng)建 data_copy 數(shù)據(jù)庫(kù)
DROP DATABASE IF EXISTS `data_copy`;
CREATE DATABASE `data_copy` /*!40100 DEFAULT CHARACTER SET utf8mb4 collate utf8mb4_general_ci */;
-- 創(chuàng)建 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;
創(chuàng)建data_copy
數(shù)據(jù)庫(kù)和person
表。
#!/bin/sh
echo '啟動(dòng)mysql'
service mysql start
sleep 5
echo '初始化數(shù)據(jù)庫(kù)'
mysql -uroot -pytao < /mysql/init.sql
echo '初始化完成!'
tail -f /dev/null
master
和slave
鏡像并運(yùn)行容器構(gòu)建master
鏡像
docker build -t master/mysql .
構(gòu)建slave
鏡像
docker build -t slave/mysql .
構(gòu)建成功會(huì)返回?Successfuly
,或通過(guò)docker images
命令查看鏡像
使用剛構(gòu)建的鏡像來(lái)運(yùn)行容器
# 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目錄為保存數(shù)據(jù)的目錄。
連接到數(shù)據(jù)庫(kù)后驗(yàn)證數(shù)據(jù)庫(kù)是否初始化成功
查看?log-bin
?是否開啟
前面有提到從庫(kù)I/O線程要與主庫(kù)建立連接,所以需要用到賬號(hào)進(jìn)行驗(yàn)證。賬號(hào)除了要有連接權(quán)限(REPLICATION CLIENT),同時(shí)還要有復(fù)制權(quán)限(REPLICATION SLAVE)。
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO muser@'%'?IDENTIFIED BY?'ytao';
這里設(shè)置的訪問(wèn)地址是開放的,實(shí)際使用過(guò)程中安全起見一定要指定訪問(wèn)地址。
從庫(kù)連接到主庫(kù),獲取到二進(jìn)制日志后重放。這里首先要配置上面創(chuàng)建的賬號(hào)進(jìn)行連接,使用命令進(jìn)行相應(yīng)的設(shè)置。
CHANGE MASTER TO
MASTER_HOST = '47.107.xx.xxx',
MASTER_PORT = 3306,
MASTER_USER = 'muser',
MASTER_PASSWORD = 'ytao',
MASTER_LOG_FILE = 'mysql-bin.000006';
到這里復(fù)制還沒有啟動(dòng),需要再?gòu)膸?kù)中啟動(dòng)
START SLAVE;
使用SHOW SLAVE STATUS\G;
命令查看啟動(dòng)后的情況
上面標(biāo)記的輸出信息Slave_IO_Running: Yes
和Slave_SQL_Running: Yes
可以看到I/O線程和SQL線程已啟動(dòng)運(yùn)行中。
如果在主庫(kù)中添加,更新或刪除一個(gè)數(shù)據(jù),那么從庫(kù)中應(yīng)該也有與主庫(kù)對(duì)應(yīng)的數(shù)據(jù)變化。
向主庫(kù)添加一條數(shù)據(jù)
INSERT?INTO?`data_copy`.`person`?(`id`,?`name`)?VALUES?('1',?'ytao');
查詢從庫(kù)數(shù)據(jù),數(shù)據(jù)已被同步過(guò)來(lái)。
上述是最簡(jiǎn)單最基本的配置,但是理解上面的配置過(guò)程,就可以根據(jù)自身情況定制不同方案,實(shí)現(xiàn)一主多從,主主復(fù)制(主動(dòng)-主動(dòng)或主動(dòng)-被動(dòng)模式)等等來(lái)滿足自身需求。
MySQL
的復(fù)制雖然使用簡(jiǎn)單方便,但也伴隨著一些問(wèn)題需要我們?cè)谑褂弥羞M(jìn)行解決,比如:不能從服務(wù)器異常停止中恢復(fù),數(shù)據(jù)同步的延遲等等,還好現(xiàn)在遇到的大部分問(wèn)題在行業(yè)中已得到相應(yīng)的解決。對(duì)這方面感興趣的可以去了解下現(xiàn)在解決這些問(wèn)題的中間件實(shí)現(xiàn)方案。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。