Berkeley DB Replication示例程序(二)

来源:互联网 发布:定额计价软件 编辑:程序博客网 时间:2024/05/19 18:43

     在上一篇文章中,我们粗略地介绍bdb示例程序的框架,这里会对其中的某些部分进行补充,以达到“知其所以然”的效果,充分了解bdb实现replication的方法。

通信

       通过跟踪bdb源码,会发现rep_elect,rep_start,rep_process_message等都会调用__rep_send_message,而__rep_send_message调用的是用户自己实现的通信函数,所以send函数必须在调用rep_elect,rep_start,rep_process_message之前注册,即用rep_set_transport注册。

      在示例程序中,通信函数是quote_send。

选举

         在一个replication group里面,master可能出现故障,这个时候就需要重新选举出一个master。在bdb中,若某一个节点被超过n/2个节点选举,则该节点将成为新的master。选举函数是rep_elect。

      在示例程序中,是创建线程来做选举,选举出master之后就要rep_start。

hm_loop处理逻辑

      hm_loop主要监测与当前进程有关节点的连接状态。其处理逻辑:

      获取与当前进程建立连接的socket句柄fd,eid,进入一个循环:

      1 从fd读取数据,如读取操作不成功,关闭socket,并将相关信息从双向链表中删除,然后判断master eid与eid的关系

       1.1 若master是当前节点,则不作处理,因为master没有故障,只是失去了一个client;

       1.2 若master eid与eid不等,则表明当前节点不是master(因为只有一个master),是client,而eid代表的节点也是client,master依旧是存在的,故不作处理;

       1.3 若当前节点不是master,而eid代表节点是master,此时说明master出现故障了。调用rep_elect选举出新的master,并rep_start。

      2 调用rep_process_message,可获得一些消息,根据返回的值(列举一部分)做不同处理

       2.1 返回DB_REP_NEWSITE,说明选举出了新的master,则调用connect_site与新的master建立连接并创建新的线程进行hm_loop操作

       2.2 返回DB_REP_HOLDELECTION,说明要进行新的一轮选举,则关闭之前可能存在的选举线程,创建新的选举线程

       2.3 返回0,判断app->elected,为1则置为0,调用rep_start

do_loop处理逻辑

      主要是master写数据到数据库操作

 

下面的一张图可以大概说明进程中创建的线程:

      其中connect_all是调用了函数connect_site,connect_site创建线程进行hm_loop操作。

总结

       由示例程序可知,用bdb中的base api实现replication时,关键部分是通信,以及节点的管理和监测。

原创粉丝点击