標籤:
本文為作者原創,如需轉載請註明出處。
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自己是否為主,並進行切換。
本文為作者原創,如需轉載請註明出處。
簡單可用好實現的 HA 高可用設計