标签:
本文为作者原创,如需转载请注明出处。
一台数据库用以记录,如 MySQL、Redis、MongoDB 等。关键是设计中的思想,用啥数据库都行。
在数据库中,存一张表,结构如下:
列名 | 说明 |
id | 自增数字,nosql的话想实现也不难 |
instance | 存放程序实例名,如 app1, app2 |
startTime | 实例启动时间 |
heartBeat | 心跳时间 |
现以2个实例组成的cluster (心跳为1秒)举例说明:
当实例启动时,插入一条记录,例如:
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 |
原则:一个实例认为自己是主,当且仅当表中heartbeat有效的行中最小id是自己。上面的两个表中都可以看出app1为主。
select min(id) from table where heartbeat > now – heartbeat_interval
每个心跳周期,每个实例自己更新表中的自己的心跳字段:
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自己是否为主,并进行切换。
本文为作者原创,如需转载请注明出处。
标签:
原文地址:http://www.cnblogs.com/seasonsluo/p/ha_design.html