基於gtid 主從復制
參考鏈接:https://blog.csdn.net/weixin_43407305/article/details/87911235
參考鏈接:https://blog.csdn.net/martingpf/article/details/81115187
參考鏈接:https://blog.csdn.net/leshami/article/details/50630691
參考鏈接:https://blog.csdn.net/qq_43094192/article/details/83994952
MySQL 5.6引入的GTID(Global Transaction IDs)使得其復制功能的配置、監控及管理變得更加易於實現,且更加健壯.
MySQL 5.6中使用復制功能,其服務配置段[mysqld]中於少應該定義如下選項:
binlog-format:二進制日志的格式,有row、statement和mixed幾種類型;需要注意的是:當設置隔離級別為READ-COMMITED必 須設置二進制日志格式為ROW,現在MySQL官方認為STATEMENT這個已經不再適合繼續使用,但mixed類型在默認的事務隔離級別下,可能會導致主從數據不一致;
log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用於啟動GTID及滿足附屬的其它需求;
master-info-repository和relay-log-info-repository:啟用此兩項,可用於實現在崩潰時保證二進制及從服務器安全的功能;
sync-master-info:啟用之可確保無信息丟失;
slave-paralles-workers:設定從服務器的SQL線程數;0表示關閉多線程復制功能;
binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:啟用復制有關的所有校驗功能;
binlog-rows-query-log-events:啟用之可用於在二進制日志記錄事件相關的信息,可降低故障排除的復雜度;
log-bin:啟用二進制日志,這是保證復制功能的基本前提;
server-id:同一個復制拓撲中的所有服務器的id號必須惟一;
GTID的概念:
1)全局事務標識:global transaction identifiers。
2)GTID是一個事務一一對應,並且全局唯一ID。
3)一個GTID在一個服務器上只執行一次,避免重復執行導致數據混亂或者主從不一致。
4)GTID用來代替傳統復制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS開啟復制。而是使用MASTER_AUTO_POSTION=1的方式開始復制。
5)MySQL-5.6.5開始支持的,MySQL-5.6.10后開始完善。
6)在傳統的slave端,binlog是不用開啟的,但是在GTID中slave端的binlog是必須開啟的,目的是記錄執行過的GTID(強制)。
GTID組成:
GTID = source_id:transaction_id
source_id,用於鑒別原服務器,即mysql服務器唯一的的server_uuid,由於GTID會傳遞到slave,所以也可以理解為源ID。
transaction_id,為當前服務器上已提交事務的一個序列號,通常從1開始自增長的序列,一個數值對應一個事務。
示例:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
前面的一串為服務器的server_uuid,即3E11FA47-71CA-11E1-9E33-C80AA9429562,后面的23為transaction_id
GTID原理:
1、當一個事務在主庫端執行並提交時,產生GTID,一同記錄到binlog日志中。
2、binlog傳輸到slave,並存儲到slave的relaylog后,讀取這個GTID的這個值設置gtid_next變量,即告訴Slave,下一個要執行的GTID值。
3、sql線程從relay log中獲取GTID,然后對比slave端的binlog是否有該GTID。
4、如果有記錄,說明該GTID的事務已經執行,slave會忽略。
5、如果沒有記錄,slave就會執行該GTID事務,並記錄該GTID到自身的binlog,
在讀取執行事務前會先檢查其他session持有該GTID,確保不被重復執行。
6、在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。
一、簡單主從模式配置步驟
1、配置主從節點的服務配置文件
1.1、配置master節點:
[mysqld]
binlog-format=ROW
log-bin=master-bin
log-slave-updates=true ###從服務器更新同步二進制日志信息,適用於高可用中,從服務器升級主服務器用
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=1
report-port=3306
port=3306
datadir=/mydata/
socket=/tmp/mysql.sock
report-host=edong1
1.2、配置slave節點:
[mysqld]
binlog-format=ROW
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=11
report-port=3306
port=3306
log-bin=mysql-bin.log
datadir=/mydata/
socket=/tmp/mysql.sock
report-host=edong2
slave節點配置和master節點配置一樣的目的:主服務器掛了,從服務器可以快速升級為主服務器
2、創建復制用戶
mysql>grant replication slave on *.* to 'repluser'@'192.168.0.%' identified by 'replpassword';
3、為備節點提供初始數據集
鎖定主表,備份主節點上的數據,將其還原至從節點;如果沒有啟用GTID,在備份時需要在master上使用show master status命令查看二進制日志文件名稱及事件位置,以便后面啟動slave節點時使用。
4、啟動從節點的復制線程
如果啟用了GTID功能,則使用如下命令:
mysql>change master to master_host='192.168.0.202',master_user='repluser',master_password='replpassword',master_auto_position=1;
半同步復制
1、分別在主從節點上安裝相關的插件
master> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
slave> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
2、啟用半同步復制
在master上的配置文件中,添加
rpl_semi_sync_master_enabled=ON
在至少一個slave節點的配置文件中添加
rpl_semi_sync_slave_enabled=ON
而后重新啟動mysql服務即可生效。
或者,也可以mysql服務上動態啟動其相關功能:
master> SET GLOBAL rpl_semi_sync_master_enabled = ON;
slave> SET GLOBAL rpl_semi_sync_slave_enabled = ON;
slave> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
3、確認半同步功能已經啟用
master> CREATE DATABASE magedudb;
master> SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx';
slave> SHOW DATABASES;
主從復制
主從復制過程存在三個線程,Master端的I/O線程,Slave的I/O線程與SQL線程。Master端需要開啟binlog日志,Slave端需要開啟relaylog。
1、Slave端的I/O讀取master.info文件,獲取binlog文件名和位置點,然后向Master端的I/O線程請求,該binlog文件名和位置點的binlog信息。
(master.info文件在配置主從復制時使用change master命令來指定生成)
2、Master端的I/O線程會根據Slave端的I/O線程請求的信息來讀取Master的binlog日志信息與及讀取到最新的binlog文件名和位置點一同返回給Slave的I/O線程。
3、Slave端的I/O線程會把獲取到的binlog日志寫入relaylog(中繼日志)文件中,並且更新master.info文件信息。(把讀取到Master最新的binlog日志文件名和位置點更新到master.info文件中,下一次當前位置去讀取Master的binlog日志)
4、Slave端的SQL線程會定期讀取relaylog,把二進制的日志解析成SQL語句,並執行這些SQL語句,同步數據到從庫中
原文鏈接:https://blog.csdn.net/weixin_43407305/article/details/87911235