Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1903096
  • 博文数量: 217
  • 博客积分: 4362
  • 博客等级: 上校
  • 技术积分: 4180
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-20 09:31
文章分类

全部博文(217)

文章存档

2017年(1)

2015年(2)

2014年(2)

2013年(6)

2012年(42)

2011年(119)

2010年(28)

2009年(17)

分类: LINUX

2011-04-28 21:44:21

master节点的故障发现
 对于master节点故障的检测,采用“心跳线”的方式进行,它的布局如图1-1所示。当master A在处理客户端的请求时,master B处于监控master A的状态。

 master是本地无状态的。所谓本地无状态,是指master的状态数据都存放在后端数据库里,所以可以认为是个无状态的服务。但严格来说,master是有状态的,比如nc节点注册之后,在ets中建立的nc pid和host的对应关系是个内存状态,但这个状态是可恢复状态,因为每次注册都会重建这个状态在内存中的数。
在master A正常处理客户端的请求时,master B会有一个监督进程来监督master A是否发生故障,具体是通过master B端的监督进程给master A发送消息来实现的。
要注意的是,在erlang环境中,数据库需要配置成多副本,且A机器和B机器都应是数据库的备份点。
master节点的故障处理
对于master节点,我们有两个机器,master A和master B机器,master B上会有一个监控进程来监控master A,当然,master上的数据都保存在后端的数据库里,当master A发生故障时,master B上的监控进程就会获知A发生了故障,然后B自己获取后端数据库里的数据重新启动自己,从而代替A。
master B重新启动之后,nc节点会重新在master B上进行注册的。另外,对于用户发给master A的一些请求参数,当master A还没有来得及处理时,master A就崩溃了,那么master B又是如何获取这些参数的呢?如果这样,master A请求处理超时,客户端获得返回错误。master客户端会再次重新发起请求,这时如果master B准备好了,则进行处理,如果不行,那么客户端又要再次发送请求,直至master B接受。至于这里客户端重复发送请求,应该由客户端的逻辑层负责的。
对于上述过程的恢复描述,主要也就是三点。一是nc节点在内存里的数据恢复,二是本地数据的恢复,三是用户请求的恢复。对于内存里nc节点数据恢复,是通过nc重新注册的方法实现的;对于本地数据的恢复,是通过“本地无状态”方式(数据存储在后端数据库里)来实现的;至于用户请求的恢复,是通过重新发送的方式来实现的。
上述的方法是我们具体的实现过程,下面我们可以看一下,一般通用的内存数据恢复的处理方法:
1.内存数据提前备份到远程的数据库里。这样的缺点是网络的速度远慢于内存的速度。
2.内存数据再生,这样就不怕内存数据丢失了。
3.主从同步的方式。任何主服务的内存数据,都传输到从服务的内存当中,这样就使得主从的数据同步了。对于我们的实例当中的话,也就是master A和master B的内存数据时时刻刻是一样的。
    显然,对于我们的实际系统,我们采用的是第二中方法。因为master节点的数据是可以容忍丢失的,也就是说master节点的数据是可再生的,并且我们关键的内存数据是注册信息,而这些数据是在ets中记录的,所以这些信息可以通过由master A切换到master B之后再次注册时重建。

阅读(3333) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~