MySQL雙主複製環境中BINLOG日誌的解析~
MySQL Replication的雙主高可用是很常用的資料庫高可用方案,在資料庫軟體升級、大資料量更新、物件結構變更等方面相比普通的M-S結構有巨大優勢。但是,多主模式由於只有兩個例項,在讀寫分離方面不太好處理,如果為每個
master各掛載幾個slave的話,一旦該master當機,則這一組slave也統統失去了資料更新的有效來源。
本文主要通過分析MySQL資料庫記錄的BINLOG日誌,驗證當某個master當機時,掛載於其下的slave是否有在不丟失(損壞)資料的前提下,變更master。
文章中的測試環境如下:
MASTER:
10.0.0.110:3306
10.0.0.111:3306
兩者互為主從,構成了雙主架構。
SLAVE:
10.0.0.111:3307,是10.0.0.110:3306的SLAVE。
有表如下:
mysql> desc j1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| vl | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
為有效分析mysql的binlog記錄的資訊,驗證不同節點上操作對各slave的影響(每個mysql節點均可視為slave,即使是雙主的兩個master),下面分別在兩個master身份的節點上均執行寫操作:
先是在111:3306端操作:
mysql> insert into j1 values (1,'a');
Query OK, 1 row affected (0.00 sec)
然後到110:3306端再操作:
mysql> insert into j1 values (2,'b');
Query OK, 1 row affected (0.00 sec)
下面分別各個節點去檢視生成的binlog日誌
-----------------------------------------------------------------------------------
110:3306端執行mysqlbinlog
# mysqlbinlog -v --base64-output=DECODE-ROWS binlog/mysql-bin.000019
輸出資訊中如下:
/*!*/;
# at 547
# at 592
#111117 16:25:14 server id 1113306 end_log_pos 592 Table_map: `jssdb`.`j1` mapped to number 34
#111117 16:25:14 server id 1113306 end_log_pos 628 Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
### @1=1
### @2='a'
# at 628
#111117 16:25:14 server id 1113306 end_log_pos 655 Xid = 20
COMMIT/*!*/;
# at 655
#111117 12:40:39 server id 1103306 end_log_pos 729 Query thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1321504839/*!*/;
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;
BEGIN
/*!*/;
# at 729
# at 774
#111117 12:40:39 server id 1103306 end_log_pos 774 Table_map: `jssdb`.`j1` mapped to number 34
#111117 12:40:39 server id 1103306 end_log_pos 810 Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
### @1=2
### @2='b'
# at 810
#111117 12:40:39 server id 1103306 end_log_pos 837 Xid = 22
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
------------------------------------------------------------------------------------
111:3306
# mysqlbinlog -v --base64-output=DECODE-ROWS 3306/binlog/mysql-bin.000023
輸出資訊中如下:
/*!*/;
# at 557
# at 602
#111117 16:25:14 server id 1113306 end_log_pos 602 Table_map: `jssdb`.`j1` mapped to number 34
#111117 16:25:14 server id 1113306 end_log_pos 638 Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
### @1=1
### @2='a'
# at 638
#111117 16:25:14 server id 1113306 end_log_pos 665 Xid = 16
COMMIT/*!*/;
# at 665
#111117 12:40:39 server id 1103306 end_log_pos 729 Query thread_id=5 exec_time=14298 error_code=0
SET TIMESTAMP=1321504839/*!*/;
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;
BEGIN
/*!*/;
# at 729
# at 774
#111117 12:40:39 server id 1103306 end_log_pos 774 Table_map: `jssdb`.`j1` mapped to number 34
#111117 12:40:39 server id 1103306 end_log_pos 810 Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
### @1=2
### @2='b'
# at 810
#111117 12:40:39 server id 1103306 end_log_pos 837 Xid = 19
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
------------------------------------------------------------------------------------
111:3307slave端檢視relay-bin-log檔案:
# mysqlbinlog -v --base64-output=DECODE-ROWS 3307/data/mysql-relay-bin.000009
輸出資訊中如下:
/*!*/;
# at 693
# at 738
#111117 16:25:14 server id 1113306 end_log_pos 592 Table_map: `jssdb`.`j1` mapped to number 34
#111117 16:25:14 server id 1113306 end_log_pos 628 Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
### @1=1
### @2='a'
# at 774
#111117 16:25:14 server id 1113306 end_log_pos 655 Xid = 20
COMMIT/*!*/;
# at 801
#111117 12:40:39 server id 1103306 end_log_pos 729 Query thread_id=5 exec_time=0 error_code=0
SET TIMESTAMP=1321504839/*!*/;
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;
BEGIN
/*!*/;
# at 875
# at 920
#111117 12:40:39 server id 1103306 end_log_pos 774 Table_map: `jssdb`.`j1` mapped to number 34
#111117 12:40:39 server id 1103306 end_log_pos 810 Write_rows: table id 34 flags: STMT_END_F
### INSERT INTO jssdb.j1
### SET
### @1=2
### @2='b'
# at 956
#111117 12:40:39 server id 1103306 end_log_pos 837 Xid = 22
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
------------------------------------------------------------------------------------
通過分析上述資訊可以看到,不管master是什麼,其slave記錄的binlog資訊中server id和end_log_pos是恆定的。
由於110:3306和111:3306互為主從關係,而其它slave只能跟一臺master,當110或111任意mysql服務中斷,可以根據當前slave讀取到的binlog位置,重點在於:
#111117 12:40:39 server id 1103306 end_log_pos 837 Xid = 22
每個slave都會有這樣的資訊(包括110/111和3306),因此可以到仍然alive的master端檢視binlog,通過前面那個資訊中得到的關鍵字過濾,確定行號資訊中對應的end_log_pos的位置,再向上讀取一行,即前一行資訊:
# at 810
得到這個資訊後,分別在各個slave端change master,指定成當前存活的那個binlog檔案和position即可。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-711551/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 主從複製搭建,基於日誌(binlog)MySql
- MySQL複製應用中繼日誌解析MySql中繼
- Windows 環境下,MySQL 的主從複製和主主複製WindowsMySql
- windows環境下,Mysql的主從複製和主主複製WindowsMySql
- mysql 基於日誌的主從複製MySql
- mysql之 mysql 5.6不停機主主搭建(活躍雙主基於日誌點複製)MySql
- 主庫reset master清理binlog日誌到主從複製錯誤AST
- mysql主主複製(雙主複製)配置步驟MySql
- [MySQL binlog]徹底解析Mixed日誌格式的binlogMySql
- mysql之 mysql 5.6不停機雙主一從搭建(活躍雙主一從基於日誌點複製)MySql
- MariaDB系列之三:基於日誌(binlog)主主複製(Master-Master)AST
- MySQL主主複製(雙主複製)配置過程介紹MySql
- MySQL基於binlog主從複製配置MySql
- MySQL 的日誌:binlogMySql
- MySQL的binlog日誌MySql
- 生產環境中MySQL複製的搭建KPMySql
- MySQL主從雙向同步複製MySql
- Mysql5.6主從複製-基於binlogMySql
- MySQL(二):主從複製結構、半同步複製、雙主複製結構、利用SSL實現安全的MySQL主從複製MySql
- MySQL的主從複製與MySQL的主主複製MySql
- mysql清除binlog日誌MySql
- 清除MySQL Binlog日誌MySql
- MySQL 複製全解析 Part 1 實驗環境介紹MySql
- Mysql實現主從複製(一主雙從)MySql
- MySQL 主從複製,雙機熱備MySql
- Linux下MySQL主從複製(Binlog)的部署過程LinuxMySql
- MySQL主從複製與主主複製MySql
- 5-5配置Mysql複製 基於日誌點的複製MySql
- MySQL搭建帶過濾的複製環境MySql
- 生產環境搭建MySQL複製的教程MySql
- mysql binlog日誌刪除MySql
- Mysql-binlog日誌-TMySql
- MySQL的主從複製、半同步複製、主主複製詳解MySql
- mysql之 mysql 5.6不停機主從搭建(一主一從基於日誌點複製)MySql
- 主從複製、雙主複製及半同步複製、以及基於SSL的複製
- MySQL主從複製、半同步複製和主主複製MySql
- MySQL 主主複製MySql
- mysql5.7主從複製,主主複製MySql