支援MySQL半同步複製的virtual_slave元件
文章目錄
一、簡介
在設計高可用架構時,為了保證主從故障切換時的資料一致性,有各種處理方式。在5.5/5.6的單機房資料庫架構中,我們採取了共享儲存的方式,來保證master伺服器宕機後,slave即便有延遲,也可以從儲存中拿到自己缺失的binlog檔案,來進行資料補償,這種做法在當時已經算是比較完善的了。但還是存在一些問題,比如說,儲存莫名的不可寫入問題,由於對他的內部實現並不是十分了解,相當於一個黑盒,我們開始尋求新的解決方案。
在master 宕機後,slave對可用區域A進行搶佔,讀取binlog。
二、新的技術架構
MySQL-5.7半同步複製功能的完善讓我們找到了新的架構實施方案。插一句為什麼之前的after_commit模式不行呢?不行在哪裡?after_commit的半同步複製在事務完全提交之後,返回給客戶端之前進行ack的等待,其實此時其他客戶端已經可以看到提交的資料,如果此時master故障,發生切換行為,slave很有可能丟失這部分資料。
為什麼after_sync可以呢?after_sync模式下,是在事務提交的binlog落盤之後進行ack的等待,此時儲存引擎層並沒有提交,其他客戶端亦看不到此部分的資料,雖然binlog已經落盤,redo已經落盤。此時master發生故障,slave有可能丟失這部分資料,但是這部分資料在客戶端看來是未提交成功的。所以可以進行切換。但是考慮到一主一從半同步複製架構中,如果出現slave宕機,或者master-slave之間的網路抖動,則會出現事務無法提交的情況,影響master效能,所以引入了virtual_slave元件。如下
virtual_slave元件增強了整個叢集效能和服務的持續性,不會因為單方面的網路或其他原因導致master不可寫入。
三、virtual_slave
virtual_slave使用原生主從半同步複製協議,進行binlog同步與返回ack的動作,其只是作為MyKeeper的一個元件,可以單獨使用,也可以配合Mykeeper來一起使用。我會在另外的文章中介紹MyKeeper,它是一個負責管理MySQL服務的高可用元件集合。
virtual_slave的開發靈感來源於mysqlbinlog的遠端日誌同步功能,進而對這一過程進行了模仿,並且加入了半同步複製的特性,使其可以替代一個slave節點進行工作。並且這種處理速度要快於slave節點返回ack的速度。隨後帶來的就是主庫更快的效能。
virtual_slave可以單獨進行使用。
單獨使用方式如下:
- 配置檔案 virtual_slave.cnf
#replication protocol GTID or file+pos
opt_remote_proto=1
#mode for get start pos.
get_start_gtid_mode=1
exclude_gtids=cdfe45e6-c227-11e8-abf5-001c42bf9720:1-4
virtual_slave_server_id=123456
raw_mode=1
master_host=10.211.55.32
master_port=13307
master_user=ashe
master_password=ashe
binlog_dir=/data/binlog_backup/
heartbeat_period = 15
- 啟動
nohup ./virtual_slave ./virtual_slave.cnf &
- 檢視同步的binlog
-rw-r----- 1 ashe wheel 911 11 23 13:06 mysql-bin.000005
-rw-r----- 1 ashe wheel 241 11 23 13:06 mysql-bin.000006
-rw-r----- 1 ashe wheel 1584 11 23 13:06 mysql-bin.000007
-rw-r----- 1 ashe wheel 440 11 23 13:06 mysql-bin.000008
-rw-r----- 1 ashe wheel 1584 11 23 13:06 mysql-bin.000009
-rw-r----- 1 ashe wheel 3209 11 23 13:06 mysql-bin.000010
-rw-r----- 1 ashe wheel 123 11 23 13:06 mysql-bin.000011
[email protected] /data/binlog_backup $
- master 上檢視virtual_slave 資訊
mysql> show processlist;
+----+------+-------------------+------+------------------+------+---------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-------------------+------+------------------+------+---------------------------------------------------------------+------------------+
| 51 | ashe | 10.211.55.2:51855 | NULL | Binlog Dump GTID | 1370 | Master has sent all binlog to slave; waiting for more updates | NULL |
| 52 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-------------------+------+------------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
mysql> show slave hosts;
+-----------+-----------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+-----------+------+-----------+--------------------------------------+
| 123456 | 127.0.0.1 | 3239 | 12713307 | 63cf7450-9829-11e7-8a58-000c2985ca33 |
+-----------+-----------+------+-----------+--------------------------------------+
1 row in set (0.01 sec)
目前元件的功能並不是十分完善,程式碼暫時不公佈了,持續完善中。比如說自動清理binglog策略,自動尋找同步位點的策略,資料補償策略等。
歡迎加入MySQL核心交流群 群號:860945825 ,互相學習交流。