引言
Berkeley DB支持基于副本的HA应用程序。在一个replication groups里面,只有一个master,其余均为client,并且仅有master提供数据库更新和读取,client仅提供数据库读取操作。个人理解,这就是副本协议中的中心化副本控制协议的应用实例。
replicated 应用程序有两种实现方式,一种是简单的方式——Berkeley DB Replication Manager,另一种是更为灵活的方式——Base API。其中Berkeley DB Replication Manager有标准的通信机制(基于TCP/IP),并且创建、管理着处理消息的后台线程。而利用Base API则需要实现几个关键的组件:通信机制(可以使用RPC ,TCP/IP ,UDP,VI等),env的id管理,master和clients状态的监测,安全策略的采取。下面将就利用Base API实现replication程序做一些介绍。
replication框架
1. 用create_env创建环境,每个进程有一个环境句柄
2. 用set_event_notify来注册环境句柄的db_event_func
3. 设置打开环境的配置参数,用open函数打开环境
4. 用rep_set_transport来注册环境句柄的db_rep->send,而send函数是用户自己实现的一套通信机制,这个函数将在__rep_send_message中调用,而__rep_send_message会被rep_process_message调用
5.用rep_start开始replication
6.若要关闭replication,用close
关键数据结构
如图1所示,这是维护replication group中节点的数据结构——双向链表,member_t就是节点的一些信息。每个节点都会有一个图1所示的结构。并且每个进程还有一个数组,元素为节点要与之通信的节点host和port。
图1
进程处理流程
每个进程首先会建立双向链表,然后新建环境。然后进程会创建两个线程:connect_thread,connect_all。线程connect_thread 新建socket并监听,将accept得到的socket句柄加入双向链表,然后在针对每个监听得到的socket句柄创建线程, 进入hm_loop操作。线程connet_all 会尝试与每一个节点建立连接并得到socket,然后进入hm_loop操作。最后是do_loop处理。图2所示为示例程序的函数调用关系。关于connect_all是怎么样的一个逻辑,以及hm_loop,do_loop的处理流程稍后整理。
图2