(參考原文鏈接https://www.cnblogs.com/taosim/articles/4244576.html)
數(shù)據(jù)庫復(fù)制 replication 的實(shí)現(xiàn)原理
主服務(wù)器凡運(yùn)行語句 , 都產(chǎn)生一個(gè)二進(jìn)制日志 binlog
從服務(wù)器不斷讀取主服務(wù)器的 binlog
從主服務(wù)讀取到的 binlog, 轉(zhuǎn)換為自身可執(zhí)行的 relaylog,
執(zhí)行 relaylog
實(shí)現(xiàn)步驟 :
首先確保主服務(wù)器打開二進(jìn)制日志功能 .這樣 , 主服務(wù)器一旦有數(shù)據(jù)變化 , 立即產(chǎn)生二進(jìn)制日志 .
從服務(wù)器也需要開啟二進(jìn)制日志和 relay 日志功能 .這樣可以從主服務(wù)器讀取 binlog, 并產(chǎn)生 relaylog
在主服務(wù)器建立一個(gè)從服務(wù)器的賬號 , 并授予數(shù)得上權(quán)限 .
指定從服務(wù)對應(yīng)的主服務(wù)器 , 開啟從服務(wù)器 .
實(shí)現(xiàn)過程
服務(wù)器準(zhǔn)備:
10.3.136.128 主服務(wù)器 master
10.3.136.129 從服務(wù)器slave
1.為了簡化MySQL的安裝,我這里使用的docker-compose啟動服務(wù)器
docker-compose.yml的內(nèi)容為
version: '3.1'
services:
? db:
? ? # 目前 latest 版本為 MySQL8.x
? ? image: mysql
? ? restart: always
? ? environment:
? ? ? MYSQL_ROOT_PASSWORD: 123456
? ? command:
? ? ? --default-authentication-plugin=mysql_native_password
? ? ? --character-set-server=utf8mb4
? ? ? --collation-server=utf8mb4_general_ci
? ? ? --explicit_defaults_for_timestamp=true
? ? ? --lower_case_table_names=1
? ? ports:
? ? ? - 3306:3306
? ? volumes:
? ? ? - ./data:/var/lib/mysql? # 這里主要是為了將容器中的數(shù)據(jù)持久化到磁盤上
然后運(yùn)行兩個(gè)虛擬機(jī)上的容器:docker-compose up -d
2.使用Navicat遠(yuǎn)程連接數(shù)據(jù)庫娜庇,兩個(gè)數(shù)據(jù)庫均連接成功
3.配置Master(主)
(1)通過docker exec -it 容器ID /bin/bash命令進(jìn)入到Master容器內(nèi)部甫何,
(2)cd /etc/mysql切換到/etc/mysql目錄下,
(3)使用apt-get install vim命令安裝vim
如果出現(xiàn)如下問題:
Readingpackagelists...?
DoneBuilding dependency tree? ? ??
?Reading state information...?
DoneE:Unable to locatepackagevim
(4)執(zhí)行apt-get update颤诀,然后再次執(zhí)行apt-get install vim即可成功安裝vim。
(5)使用vim編輯my.cnf对湃,在my.cnf中添加如下配置:
server-id=128
log-bin=mysql-bin
(6)配置完成之后崖叫,需要重啟mysql服務(wù)使配置生效。使用service mysql restart完成重啟拍柒。重啟mysql服務(wù)時(shí)會使得docker容器停止心傀,我們還需要docker start mysql-master啟動容器。
(7)mysql -u root -p進(jìn)入mysql
在Master數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)同步用戶拆讯,授予用戶 slave REPLICATION SLAVE權(quán)限和REPLICATION CLIENT權(quán)限剧包,用于在主從庫之間同步數(shù)據(jù)。
CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';
4.配置Slave(從)
(1)和配置Master(主)一樣往果,在Slave配置文件my.cnf中添加如下配置:
##設(shè)置server_id,注意要唯一
server-id=129
## 開啟二進(jìn)制日志功能,以備Slave作為其它Slave的Master時(shí)使用
log-bin=mysql-slave-bin
## relay_log配置中繼日志
relay_log=edu-mysql-relay-bin
(2)配置完成后也需要重啟mysql服務(wù)和docker容器一铅,操作和配置Master(主)一致陕贮。
5.鏈接Master(主)和Slave(從)
(1)在Master進(jìn)入mysql,執(zhí)行show master status;
File和Position字段的值后面將會用到潘飘,在后面的操作完成之前肮之,需要保證Master庫不能做任何操作掉缺,否則將會引起狀態(tài)變化,F(xiàn)ile和Position字段的值變化戈擒。
(2)在Slave 中進(jìn)入 mysql眶明,執(zhí)行
change master to master_host='10.3.136.128', master_user='repl', master_password='123456', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos= 2270, master_connect_retry=30;
命令說明:
master_host?:即Master的虛擬主機(jī)IP
master_port:Master的端口號,指的是容器的端口號
master_user:用于數(shù)據(jù)同步的用戶
master_password:用于同步的用戶的密碼
master_log_file:指定 Slave 從哪個(gè)日志文件開始復(fù)制數(shù)據(jù)筐高,即上文中提到的 File 字段的值
master_log_pos:從哪個(gè) Position 開始讀搜囱,即上文中提到的 Position 字段的值
master_connect_retry:如果連接失敗,重試的時(shí)間間隔柑土,單位是秒,默認(rèn)是60秒
(3)在Slave 中的mysql終端執(zhí)行show slave status \G;用于查看主從同步狀態(tài)稽屏。
正常情況下,SlaveIORunning 和 SlaveSQLRunning 都是No狐榔,因?yàn)槲覀冞€沒有開啟主從復(fù)制過程。使用start slave開啟主從復(fù)制過程薄腻,然后再次查詢主從同步狀態(tài)show slave status \G;收捣。
SlaveIORunning 和 SlaveSQLRunning 都是Yes,說明主從復(fù)制已經(jīng)開啟被廓。此時(shí)可以測試數(shù)據(jù)同步是否成功。
主從復(fù)制排錯:
使用start slave開啟主從復(fù)制過程后嫁乘,如果SlaveIORunning一直是Connecting,則說明主從復(fù)制一直處于連接狀態(tài)蜓斧,這種情況一般是下面幾種原因造成的仓蛆,我們可以根據(jù) Last_IO_Error提示予以排除。
(1)網(wǎng)絡(luò)不通
檢查ip,端口
(2)密碼不對
檢查是否創(chuàng)建用于同步的用戶和用戶密碼是否正確
(3)pos不對
檢查Master的 Position
我在配置的時(shí)候出現(xiàn)的問題:
一挎春、mysql版本問題導(dǎo)致的權(quán)限問題: