1. 程式人生 > >支援MySQL半同步複製的virtual_slave元件

支援MySQL半同步複製的virtual_slave元件

文章目錄

一、簡介

在設計高可用架構時,為了保證主從故障切換時的資料一致性,有各種處理方式。在5.5/5.6的單機房資料庫架構中,我們採取了共享儲存的方式,來保證master伺服器宕機後,slave即便有延遲,也可以從儲存中拿到自己缺失的binlog檔案,來進行資料補償,這種做法在當時已經算是比較完善的了。但還是存在一些問題,比如說,儲存莫名的不可寫入問題,由於對他的內部實現並不是十分了解,相當於一個黑盒,我們開始尋求新的解決方案。

在master 宕機後,slave對可用區域A進行搶佔,讀取binlog。
image_1csv5st7m15prl6e1rgu1ol526m16.png-39.9kB

二、新的技術架構

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元件。如下
image_1csvdt02411001gbrbsoe4bmmi9.png-17.6kB


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 ,互相學習交流。