分布式專題|面試官問(wèn)我了解Mysql主從復(fù)制原理么,我能說(shuō)不會(huì)么?

搭建Mysql主從同步之前,我們先來(lái)說(shuō)他們之間同步的過(guò)程與原理:

同步復(fù)制過(guò)程

獻(xiàn)上一張圖,這張圖詮釋了整個(gè)同步過(guò)程


在這里插入圖片描述

主從復(fù)制過(guò)程:

  • slave節(jié)點(diǎn)與主節(jié)點(diǎn)進(jìn)行連接,建立主從關(guān)系,并把從哪開(kāi)始同步,及哪個(gè)日志文件都一并發(fā)送到master
  • master將修改的數(shù)據(jù)保存到binlog中
  • master開(kāi)啟binlog dump線程,將binlog日志推送到連接的slave中
  • slave接受到推送的binlog,slave開(kāi)啟IO線程將數(shù)據(jù)寫到中繼日志(relay log)中
  • slave同時(shí)還會(huì)開(kāi)啟一個(gè)SQL線程,對(duì)比中繼日志中新增的內(nèi)容,并且解析SQL,回放數(shù)據(jù)到從數(shù)據(jù)庫(kù)中

好的,復(fù)制過(guò)程已經(jīng)說(shuō)完了,我們現(xiàn)在實(shí)踐下,快速搭建一個(gè)mysql主從架構(gòu)。

沒(méi)錯(cuò),我這里還是使用docker搭建,因?yàn)樗芟惆。?/p>

搭建Mysql 主從

創(chuàng)建mysql網(wǎng)絡(luò)

docker network create mysqlNet

安裝mysql

  • 運(yùn)行mysql主節(jié)點(diǎn)
docker run -p 3306:3306 --name mysql_master -h mysql_master --net=mysqlNet \
    -v ~/docker/mysql/mysql_master/log:/var/log/mysql \
    -v ~/docker/mysql/mysql_master/data:/var/lib/mysql \
    -v ~/docker/mysql/mysql_master/conf:/etc/mysql  \
    -e lower_case_table_names=1 \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7
  • 修改配置文件
# 編輯文件
vim ~/docker/mysql/mysql_master/conf

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection=utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
## 同一局域網(wǎng)內(nèi)注意要唯一
server-id=1  
## 開(kāi)啟二進(jìn)制日志功能,可以隨便取(關(guān)鍵)
log-bin=mysql-bin
  • 重啟mysql_master
docker restart mysql_master
  • 在master節(jié)點(diǎn)上 創(chuàng)建給從節(jié)點(diǎn)進(jìn)行復(fù)制的用戶
docker exec -it mysql_master mysql -uroot -proot
# 創(chuàng)建用戶
CREATE USER 'mysql_slave'@'%' IDENTIFIED BY '111111';
# 授權(quán)
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'mysql_slave'@'%';
  • 運(yùn)行mysql從節(jié)點(diǎn)
docker run -p 33306:3306 --name mysql_slave -h mysql_slave --net=mysqlNet \
    -v ~/docker/mysql/mysql_slave/log:/var/log/mysql \
    -v ~/docker/mysql/mysql_slave/data:/var/lib/mysql \
    -v ~/docker/mysql/mysql_slave/conf:/etc/mysql  \
    -e lower_case_table_names=1 \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7
  • 編輯從節(jié)點(diǎn)配置文件
# 編輯文件
vim ~/docker/mysql/mysql_master/conf

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection=utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
## 設(shè)置server_id,注意要唯一
server-id=2 
## 開(kāi)啟二進(jìn)制日志功能,以備Slave作為其它Slave的Master時(shí)使用
log-bin=mysql-slave-bin   
## relay_log配置中繼日志
relay_log=edu-mysql-relay-bin
## 設(shè)置只讀權(quán)限
read_only = 1
innodb_read_only
## 使得更新的數(shù)據(jù)寫進(jìn)二進(jìn)制日志中
log_slave_updates = 1
#如果master庫(kù)名與salve庫(kù)名不同,使用以下配置[需要做映射]
#replicate-rewrite-db = [主庫(kù)名] -> [從庫(kù)名]
#如果不是要全部同步[默認(rèn)全部同步],則指定需要同步的表
#replicate-wild-do-table=庫(kù)名.表1
#replicate-wild-do-table=庫(kù)名.表2

現(xiàn)在主從節(jié)點(diǎn)已經(jīng)安裝完成,我們接下來(lái)需要讓他們建立關(guān)系:

先查看master節(jié)點(diǎn)當(dāng)前的狀態(tài),主要看下日志文件和當(dāng)前的位置

docker exec -it mysql_master mysql -uroot -proot
show master status;
exit
exit

結(jié)果如下:文件為mysql-bin.000001 位置為629

image.png

拿到這些信息之后,我們現(xiàn)在就可以讓從節(jié)點(diǎn)與主節(jié)點(diǎn)建立關(guān)系,并執(zhí)行同步了:

docker exec -it mysql_slave mysql -uroot -proot
change master to master_host='mysql_master', master_user='mysql_slave', master_password='111111', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 629, master_connect_retry=30;

我們繼續(xù)看下slave節(jié)點(diǎn)的狀態(tài)

show slave status\G;
image.png

我們看到我們?cè)谖氖滋岬降膬蓚€(gè)線程并沒(méi)有啟動(dòng),所以我們需要手動(dòng)啟動(dòng)著兩個(gè)線程,一個(gè)命令就好了

start slave;
image.png

現(xiàn)在可以看到兩個(gè)線程已經(jīng)在運(yùn)行了。
到此,已經(jīng)搭建完成了

測(cè)試

這個(gè)我就不演示了,大家可以在mysql_master上創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),看看是不是會(huì)同步到mysql_slave上。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容