1 典型主從架構(gòu)
- 一主多從
? 特點(diǎn):讀寫分離,應(yīng)用于讀取壓力大的場景,將要求實(shí)時(shí)性不高的請(qǐng)求分發(fā)到多個(gè)從庫,降低主庫的壓力
? 缺陷:存在主從延時(shí)問題
? 如何解決:優(yōu)化網(wǎng)絡(luò)環(huán)境,MySQL5.5~5.6使用半同步復(fù)制,MySQL5.7使用增強(qiáng)半同步復(fù)制
-
多級(jí)復(fù)制
解決了主庫I/O和網(wǎng)絡(luò)壓力大的問題,多級(jí)復(fù)制可以減小主庫的壓力,主庫只需要向另一個(gè)主庫發(fā)送binlog日志
-
雙主
適用主從切換的場景,通過雙主復(fù)制架構(gòu)避免了重復(fù)搭建從庫的麻煩
-
? 主庫Master1和Master互為主從,所有Web Client的寫請(qǐng)求都訪問主庫Master1或Master2
-
多源復(fù)制
多源(Multi-Source)復(fù)制架構(gòu)適用于復(fù)雜的業(yè)務(wù)需求,既可以支撐OLTP(聯(lián)機(jī)事務(wù)處理),也可以滿足OLAP(聯(lián)機(jī)分析處理)
2 主從復(fù)制原理
mysql支持兩種復(fù)制方式,一是基于行的復(fù)制,二是基于語句的復(fù)制通過主庫記錄的二進(jìn)制日志并在從庫進(jìn)行異步復(fù)制,可能會(huì)產(chǎn)出延時(shí)
-
-
3 主從復(fù)制搭建
3.1 異步復(fù)制
-
邏輯上
MySQL默認(rèn)的復(fù)制操作是異步的,主庫在客戶端提交的事務(wù)會(huì)立即返回結(jié)果給客戶端,不關(guān)心從庫是否已經(jīng)被接收并處理,若主庫crash,從庫也無法收到提交的事務(wù),強(qiáng)行切換導(dǎo)致數(shù)據(jù)不完整
-
技術(shù)上
主庫將事務(wù)寫入binlog后通知dump線程發(fā)送到從庫,主庫繼續(xù)處理其他事務(wù),不能保證binlog完全送達(dá)所有從庫
-
環(huán)境搭建
1)相關(guān)主庫與從庫的配置文件
-
[mysqld] ? ? ? ? ?# master
datadir=/data
socket=/data/mysql.sock
log-bin=master-bin
sync-binlog=1
server-id=100
#----------------------------------
[mysqld] ? ? ? # slave
datadir=/data
socket=/data/mysql.sock
relay-log=slave-bin
server-id=111
#------------------------------------2)開啟master與slave的實(shí)例
-
#關(guān)閉mysql實(shí)例
mysqladmin -uroot -h127.1 ?-P3306 ?-p'123456' shutdown;
#開啟mysql數(shù)據(jù)庫實(shí)例
mysqld_safe --defaults-file=/home/mysql/etc/my.cnf &
#查看進(jìn)程
ps -ef |grep mysqld3)創(chuàng)建復(fù)制專用用戶
-
mysql> create user 'repl'@'192.169.43.%' identified by '123456';
#create user 'repl'@'%' identified by '123456';
mysql> grant REPLICATION SLAVE on *.* to 'repl'@'192.169.43.%';
mysql> flush privileges;4)導(dǎo)出master數(shù)據(jù)
-
#--master-data值為2會(huì)注釋change master,值為1或者沒有提供值時(shí),這些語句是直接激活的。同時(shí),--master-data會(huì)鎖定所有表(如果同時(shí)使用了--single-transaction,則不是鎖所有表
mysqldump -uroot -p --all-databases --master-data=2 > master.sql5)從master.sql中獲取到binlog的坐標(biāo)
-
grep -i -m 1 'change master to' master.sql
6)在從庫執(zhí)行導(dǎo)出的master.sql
-
mysql -uroot -p -h 127.1 -e 'source master.sql'
7)從庫連接master
-
mysql> change master to?
? ? ? ? master_host='192.168.43.42',
? ? ? ? master_port=3306,
? ? ? ? master_user='repl',
? ? ? ? master_password='Password',
? ? ? ? master_log_file='master-bin.000002',
? ? ? ? master_log_pos=771;8)啟動(dòng)IO線程和SQL線程
-
#一次性啟動(dòng)
start slave;
#分開執(zhí)行
start slave io_thread;
start slave sql_thread;9)在從庫查看同步信息
-
mysql> show slave status\G
Master_Log_File:IO線程正在讀取的master binlog
Read_Master_Log_Pos:IO線程已經(jīng)讀取到master binlog的哪個(gè)位置
Relay_Log_File:SQL線程正在讀取和執(zhí)行的relay log
Relay_Log_Pos:SQL線程已經(jīng)讀取和執(zhí)行到relay log的哪個(gè)位置
Relay_Master_Log_File:SQL線程最近執(zhí)行的操作對(duì)應(yīng)的是哪個(gè)master binlog
Exec_Master_Log_Pos:SQL線程最近執(zhí)行的操作對(duì)應(yīng)的是master binlog的哪個(gè)位置10)reset master與reset slave
reset slave會(huì)刪除master.info/relay-log.info和relay log,然后新生成一個(gè)relay log。但是change master to設(shè)置的連接參數(shù)還在內(nèi)存中保留著,所以此時(shí)可以直接start slave,并根據(jù)內(nèi)存中的change master to連接參數(shù)復(fù)制日志。
reset slave all除了刪除reset slave刪除的東西,還刪除內(nèi)存中的change master to設(shè)置的連接信息
reset master會(huì)刪除master上所有的二進(jìn)制日志,并新建一個(gè)日志。在正常運(yùn)行的主從復(fù)制環(huán)境中,執(zhí)行reset master很可能導(dǎo)致異常狀況。所以建議使用purge來刪除某個(gè)時(shí)間點(diǎn)之前的日志(應(yīng)該保證只刪除那些已經(jīng)復(fù)制完成的日志),生產(chǎn)環(huán)境慎用
3.2 全同步復(fù)制
也稱之組復(fù)制MGR
-
邏輯上
主庫執(zhí)行完事務(wù),會(huì)等待所有事務(wù)分發(fā)給從庫并執(zhí)行完才返回客戶端,因此會(huì)帶來性能影響
-
技術(shù)上
主庫提交事務(wù)后,所有的從庫必須收到并提交事務(wù),主庫線程收到返回才繼續(xù)工作,缺點(diǎn)是主庫完成事務(wù)是時(shí)間變長,性能降低
-
額外的,全同步是主從同步的增強(qiáng)。
因?yàn)橹鲝耐诫m可以實(shí)現(xiàn)一主多從,但它的局限在于只有在主數(shù)據(jù)庫上寫的時(shí)候從數(shù)據(jù)庫才會(huì)做數(shù)據(jù)備份,而在從數(shù)據(jù)庫做出改變時(shí),主數(shù)據(jù)庫不會(huì)記錄相應(yīng)的改變。
然而,全同步出現(xiàn)了,它可以是只要在一個(gè)數(shù)據(jù)庫做出改變,所以其它在同組的數(shù)據(jù)庫也會(huì)改變,同組的數(shù)據(jù)庫沒有等級(jí)之分。可以理解為“同組數(shù)據(jù)庫之間數(shù)據(jù)相等”
-
Master節(jié)點(diǎn)設(shè)置
1)配置Master節(jié)點(diǎn)my.cnf配置文件
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin=slave-bin
binlog_checksum=NONE
sync-binlog=1
#此處需要作出區(qū)分
server-id=101
gtid_mode=on
enforce-gtid-consistency=1
# 啟用SQL線程回放之后將二進(jìn)制寫入自身的binlog中,在組復(fù)制中,依賴于每個(gè)成員持久化的binlog來實(shí)現(xiàn)一些數(shù)據(jù)自動(dòng)平衡>的特性
log_slave_updates=ON
# 啟用ROW格式復(fù)制,增強(qiáng)數(shù)據(jù)一致性
binlog_format=ROW
# 啟用雙TABLE,使用InnoDB引擎表來保存IO和SQL線程的位置信息(復(fù)制元數(shù)據(jù)),以增強(qiáng)復(fù)制狀態(tài)的安全性
master_info_repository=TABLE
relay_log_info_repository=TABLE
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
#組內(nèi)統(tǒng)一,自行設(shè)定值
loose-group_replication_group_name="eba794f9-cfb3-11ec-9b91-000c29058c90"
loose-group_replication_start_on_boot=off
#本機(jī)ip,此處各節(jié)點(diǎn)需單獨(dú)配置
loose-group_replication_local_address= "192.168.43.43:33061"
#組內(nèi)ip
loose-group_replication_group_seeds="192.168.43.42:33061,192.168.43.43:33061"
loose-group_replication_bootstrap_group=off
#白名單
loose-group_replication_ip_whitelist="127.0.0.1,192.168.43.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF2)新建復(fù)制用戶
-
#創(chuàng)建用戶,需暫時(shí)關(guān)閉同步,避免同步問題
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;#設(shè)置同步Master
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';3)配置hosts
-
#vi /etc/hosts 按實(shí)際情況填寫 ip 主機(jī)名
192.168.43.43 master
192.168.43.42 slave4)啟動(dòng)組
-
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF; -
注意:引導(dǎo)只能由單個(gè)服務(wù)器完成,即啟動(dòng)組的服務(wù)器并且只執(zhí)行一次。這就是為什么group_replication_bootstrap_group選項(xiàng)的值沒有存儲(chǔ)在實(shí)例的選項(xiàng)文件中的原因。如果它保存在選項(xiàng)文件中,則在重新啟動(dòng)服務(wù)器時(shí)會(huì)自動(dòng)引導(dǎo)第二個(gè)具有相同名稱的組。這將導(dǎo)致兩個(gè)不同的組具有相同的名稱
5)查看組內(nèi)成員
-
mysql> select * from performance_schema.replication_group_members;
+---------------------------+------------------+------+------+-------+
| CHANNEL_NAME ? ? ? ? ? ? ?| MEMBER_ID ? ? ? ?| HOST | PORT | STATE |
+---------------------------+------------------+------+------+-------+
| group_replication_applier | 688532-0c296515c |master| 3306 | ONLINE|
+---------------------------+------------------+------+------+-------+Slave節(jié)點(diǎn)設(shè)置
1)配置Master節(jié)點(diǎn)my.cnf配置文件
-
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin=slave-bin
binlog_checksum=NONE
sync-binlog=1
#此處需要作出區(qū)分
server-id=100
gtid_mode=on
enforce-gtid-consistency=1
# 啟用SQL線程回放之后將二進(jìn)制寫入自身的binlog中,在組復(fù)制中,依賴于每個(gè)成員持久化的binlog來實(shí)現(xiàn)一些數(shù)據(jù)自動(dòng)平衡>的特性
log_slave_updates=ON
# 啟用ROW格式復(fù)制,增強(qiáng)數(shù)據(jù)一致性
binlog_format=ROW
# 啟用雙TABLE,使用InnoDB引擎表來保存IO和SQL線程的位置信息(復(fù)制元數(shù)據(jù)),以增強(qiáng)復(fù)制狀態(tài)的安全性
master_info_repository=TABLE
relay_log_info_repository=TABLE
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
#組內(nèi)統(tǒng)一,自行設(shè)定值
loose-group_replication_group_name="eba794f9-cfb3-11ec-9b91-000c29058c90"
loose-group_replication_start_on_boot=off
#本機(jī)ip,此處各節(jié)點(diǎn)需單獨(dú)配置
loose-group_replication_local_address= "192.168.43.42:33061"
#組內(nèi)ip
loose-group_replication_group_seeds="192.168.43.42:33061,192.168.43.43:33061"
loose-group_replication_bootstrap_group=off
#白名單
loose-group_replication_ip_whitelist="127.0.0.1,192.168.43.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF2)新建復(fù)制用戶
-
#創(chuàng)建用戶,需暫時(shí)關(guān)閉同步,避免同步問題
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;#設(shè)置同步Master
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';3)配置Slave服務(wù)器hosts
-
#vi /etc/hosts 按實(shí)際情況填寫 ip 主機(jī)名
192.168.43.43 master
192.168.43.42 slave
-
-