本文為作者原創,如需轉載請註明出處。 1. 實現的功能 一主多備,自動選主 啟動記錄可查詢 一主多備,自動選主 啟動記錄可查詢 2. 前置需求 一臺資料庫用以記錄,如 MySQL、Redis、MongoDB 等。關鍵是設計中的思想,用啥資料庫都行。 3. 設計實現 在資料庫中,存一張表,結構如下: ...
本文為作者原創,如需轉載請註明出處。
1. 實現的功能
- 一主多備,自動選主
- 啟動記錄可查詢
2. 前置需求
一臺資料庫用以記錄,如 MySQL、Redis、MongoDB 等。關鍵是設計中的思想,用啥資料庫都行。
3. 設計實現
在資料庫中,存一張表,結構如下:
列名 | 說明 |
id | 自增數字,nosql的話想實現也不難 |
instance | 存放程式實例名,如 app1, app2 |
startTime | 實例啟動時間 |
heartBeat | 心跳時間 |
現以2個實例組成的cluster (心跳為1秒)舉例說明:
a. 實例啟動
當實例啟動時,插入一條記錄,例如:
0 | app1 | 2016-08-01 13:00:00 | 2016-08-01 13:00:00 |
當全部實例啟動時,例如:
0 | app1 | 2016-08-01 13:00:00 | 2016-08-01 13:01:00 |
1 | app2 | 2016-08-01 13:01:00 | 2016-08-01 13:01:00 |
b.選主
原則:一個實例認為自己是主,當且僅當表中heartbeat有效的行中最小id是自己。上面的兩個表中都可以看出app1為主。
select min(id) from table where heartbeat > now – heartbeat_interval
c.心跳
每個心跳周期,每個實例自己更新表中的自己的心跳欄位:
update table set heartbeat=now where id=myid and heartbeat > now-heartbeat_interval
如果更新結果為0,即失敗了,那麼說明心跳超時,這時新加入一條記錄,例如 app1 超時了:
0 | app1 | 2016-08-01 13:00:00 | 2016-08-01 13:58:00 |
1 | app2 | 2016-08-01 13:01:00 | 2016-08-01 14:00:00 |
2 | app1 | 2016-08-01 14:00:00 | 2016-08-01 14:00:00 |
最後,在每個心跳周期結束的時候檢查按步驟b自己是否為主,併進行切換。
本文為作者原創,如需轉載請註明出處。