簡(jiǎn)單的做一個(gè)標(biāo)準(zhǔn)模式復(fù)寫(xiě)的示例。
為了方便建立多個(gè) MariaDB 的實(shí)例,使用 MariaDB docker 鏡像做 replication。
會(huì)創(chuàng)建 3 個(gè)安裝 MariaDB 的 docker 容器,分別命名為 mariadb1(設(shè)為 Master)、mariadb2 和 mariadb3(Slave1 和 Slave2)。端口映射依次 3307、3308、3309。
簡(jiǎn)單的 replication 前置準(zhǔn)備
1、MariaDB docker 準(zhǔn)備與配置
快速安裝 docker:
sudo sh -c "$(curl -fsSL https://get.docker.com)"
sudo usermod -aG docker $USER
第一行用 docker 官方提供的 script 快速安裝。
第二行將現(xiàn)有的使用者加入 docker 群組,否則會(huì)沒(méi)有權(quán)限操作 docker 命令。
記得注銷(xiāo)賬號(hào)重登,以獲取 docker 操作權(quán)限。
拉取 MariaDB 鏡像:
docker pull mariadb/server:10.4
創(chuàng)建 3 個(gè)用于安裝 mariadb 的容器,命名為 mariadb1、mariadb2、mariadb3:
sudo docker run -it -p 3307:3306 --name mariadb1 -e MYSQL_ROOT_PASSWORD=root -d mariadb/server:10.4
2、基準(zhǔn)文件的準(zhǔn)備
拷貝一份同樣的數(shù)據(jù)庫(kù)結(jié)構(gòu)文件到 3 個(gè)容器中,并導(dǎo)入各自數(shù)據(jù)庫(kù)
準(zhǔn)備一份 sql script。
我這份示例是一個(gè)名為 test_replication 的數(shù)據(jù)庫(kù),以下有一個(gè)名為 call_record 的表,結(jié)構(gòu)如下:
CREATE TABLE `call_record` (
`start_time` char(19) DEFAULT NULL,
`dial_out_number` varchar(12) DEFAULT NULL,
`dial_out_name` varchar(20) DEFAULT NULL,
`dial_out_department` varchar(20) DEFAULT NULL,
`call_duration` char(19) DEFAULT NULL,
`uuid` varchar(36) NOT NULL,
`create_time` char(19) NOT NULL,
`create_user` varchar(20) NOT NULL,
`update_time` char(19) DEFAULT NULL,
`update_user` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
同時(shí)插入了 10w 條測(cè)試數(shù)據(jù)。
將示例 sql 腳本,復(fù)制到 3 個(gè)容器中
sudo docker cp /home/sanotsu/Dump20200303.sql mariadb1:/home/Dump20200303.sql
為了方面修改配置文件,給 3 個(gè)容器中安裝 vim。
sudo docker exec -it mariadb1 bash
apt update
apt install vim
導(dǎo)入數(shù)據(jù)庫(kù)
就在剛剛的容器的交互界面,繼續(xù)執(zhí)行:
mysql -uroot -p < /home/Dump20200303.sql
mysql_upgrade -uroot -p
root 賬號(hào)的密碼就是之前創(chuàng)建容器時(shí)指定的 MYSQL_ROOT_PASSWORD 參數(shù)的值。
mysql_upgrade 用于更新表格到最新的版本。
3、Master-Slaves 設(shè)置(主從服務(wù)器設(shè)定)
配置 3 個(gè)容器中的 MariaDB server-id 分別為 1、2、3,log-basename 分別為 master01、slave01、slave02,并建立 relication 用賬號(hào)。
修改配置文件:
使用 vim 打開(kāi)容器中 mariadb 的配置文件,在容器的終端運(yùn)行
vim /etc/mysql/my.cnf
修改或添加以下參數(shù):
server-id = 1
log_bin = /var/log/mysql/mariadb-bin
log_basename = master01
binlog_format=mixed
示例的設(shè)定是,mariadb1(master)容器如下:
mariadb2(slave1)容器如下:
mariadb3(slave2)容器如下:
建立 replication 用賬號(hào):
在容器中,進(jìn)入到 MariaDB 的命令窗口,創(chuàng)建一個(gè)用于備份的賬號(hào)和賦予復(fù)制權(quán)限,記得要刷新權(quán)限。
CREATE USER 'reptest'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'reptest'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
設(shè)定完權(quán)限后,重啟 docker 容器來(lái)重啟 MariaDB 。
重啟之后,查看下 master01 binarylog 狀態(tài),后續(xù)將 master01 作為 MASTER 主機(jī),slave01 和 slave02 作為 SLAVE 主機(jī)。
mariadb1 會(huì)作為 master,查看狀態(tài)如下
mariadb2 和 mariadb3 要作為 slave,需要在 mariadb 命令窗口 執(zhí)行以下配置:
CHANGE MASTER TO
MASTER_HOST='192.168.28.93',
MASTER_USER='reptest',
MASTER_PASSWORD='123456',
MASTER_PORT=3307,
MASTER_LOG_FILE='master01-bin.000001',
MASTER_LOG_POS= 331,
MASTER_CONNECT_RETRY=6;
注意配置的屬性都要與 master 的狀態(tài)一致。
配置完之后在啟動(dòng) slave,然后查看下 slave 狀態(tài):
START SLAVE;
SHOW SLAVE STATUS\G;
兩臺(tái) slave 實(shí)例應(yīng)該會(huì)現(xiàn)實(shí)如下
到這里,簡(jiǎn)單的 master-slave 的設(shè)定就完成了,可以測(cè)試一下。
簡(jiǎn)單的 replication 測(cè)試示例
1、master 的修改是否會(huì)同步到 slave 去
先查看目前 3 個(gè) MariaDB 的測(cè)試數(shù)據(jù),可見(jiàn) master 和兩個(gè) slave 在 test_replication.call_record 測(cè)試數(shù)據(jù)都是 10w 條。
對(duì) MASTER 進(jìn)行刪除操作:
delete from test_replication.call_record limit ;
注意:如果想馬上看到級(jí)聯(lián)更新的效果,建議對(duì)一條數(shù)據(jù)進(jìn)行修改刪除插入的操作。如果如示例一樣進(jìn)行了 5w 條的刪除,可能需要等待一段時(shí)間才能完成同步到 Slaves。
一般情況下,同步都是實(shí)時(shí)的,如果上述的操作是刪除 1 條數(shù)據(jù)或者修改 1 條數(shù)據(jù)可以更加清晰地看到。(沒(méi)有截圖,有實(shí)際刪除 1 條看效果,目前 3 個(gè)表中數(shù)據(jù)還有 49999 條)
但是也有可能需求,master 更新之后,要延遲一點(diǎn)時(shí)間,再同步到 slave。
只需簡(jiǎn)單設(shè)定如下:
在需要被延遲更新的 SLAVE 中,設(shè)定延遲時(shí)間:
STOP SLAVE;
CHANGE MASTER TO master_delay= 60;
START SLAVE;
再次測(cè)試結(jié)果(3 個(gè)表分表有 49999 條數(shù)據(jù))
選取 SLAVE02,設(shè)定 60s 延遲更新:
查看兩個(gè) slave 的狀態(tài)可見(jiàn) SQL_Delay 的數(shù)值變化:
show slave status\G;
在 master 表刪除 1 條數(shù)據(jù),從下圖可以看出,slave01 是很快就同步了,二 slave02 是延遲時(shí)間到達(dá)之前,是沒(méi)有更新的。
2、SLAVE 取代 MASTER
在 master 主機(jī)因?yàn)橐恍┣闆r不能繼續(xù)使用的時(shí)候,可以快速地升級(jí)某一臺(tái) SLAVE 機(jī)器替換 master,避免相關(guān)業(yè)務(wù)中斷。
基本步驟如下:
1> 停止 master 寫(xiě)入
設(shè)置 mater 讀鎖定
FLUSH TABLES WITH READ LOCK ;
檢查 master、slave 數(shù)據(jù)是否同步完成
master:
SHOW MASTER STATUS;
slave:
SHOW SLAVE STATUS\G;
(注意紅框中參數(shù))
2> 設(shè)置 slave02 主機(jī)為 MASTER
STOP ALL SLAVES;
RESET SLAVE ALL;
SHOW MASTER STATUS;
SELECT @@global.gtid_binlog_pos;
SET @@global.read_only=0;
3 更改 slave01 主機(jī)連接配置
之前 slave01 連接的主服務(wù)器是 master01,現(xiàn)在要為 slave02。在原 salve01 中執(zhí)行:
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO
MASTER_HOST='192.168.28.93',
MASTER_USER='reptest',
MASTER_PASSWORD='123456',
MASTER_PORT=3309,
MASTER_LOG_FILE='slave02-bin.000002',
MASTER_LOG_POS= 331,
MASTER_CONNECT_RETRY=6;
START SLAVE;
SHOW SLAVE STATUS\G;
4 更改原 master 主機(jī)配置,修改為 slave 主機(jī)
原來(lái)的主服務(wù)器,現(xiàn)在是從服務(wù)器了,修改主服務(wù)器連接為原 slave02。
UNLOCK TABLES;
SET @@global.read_only=1;
STOP ALL SLAVES;
RESET MASTER;
RESET SLAVE ALL;
CHANGE MASTER TO
MASTER_HOST='192.168.28.93',
MASTER_USER='reptest',
MASTER_PASSWORD='123456',
MASTER_PORT=3309,
MASTER_LOG_FILE='slave02-bin.000002',
MASTER_LOG_POS= 330,
MASTER_CONNECT_RETRY=6;
START SLAVE;
SHOW SLAVE STATUS\G;
完成之后,可以測(cè)試一下,在新 master 刪除兩條數(shù)據(jù),然后可以看到新的兩個(gè) salve 中數(shù)據(jù)少了兩條:
當(dāng)然,除了 delete 其它語(yǔ)句可以自行測(cè)試。
3、設(shè)定并行復(fù)制 Parallel Replication
可以在從屬服務(wù)器上并行(同時(shí))執(zhí)行從主服務(wù)器復(fù)制的某些寫(xiě)入操作。
將 slave01 設(shè)置并行復(fù)制:
STOP SLAVE SQL_THREAD;
SET GLOBAL slave_parallel_threads = 4;
SET GLOBAL slave_parallel_max_queued=67108864;
START SLAVE SQL_THREAD;
SELECT @@slave_parallel_threads;
show processlist;
有看到進(jìn)程列表中有 4 個(gè) slave_worker
STOP SLAVE;
Change master to master_use_gtid =slave_pos;
START SLAVE;
使用 gitd 位置:
查看 slave 狀態(tài):
master 主機(jī)查看:
select @@gloabl.gtid_binlog_pos;
slave server 查看 slave 狀態(tài):
SHOW SLAVE STATUS\G;
設(shè)定 salve01 可并行復(fù)制完成。
(到這里,這系列就先告一段落了,后續(xù)有可能再按需補(bǔ)充,謝謝。)
























