搭建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上。