Berkeley DB Replication示例程序(一)

引言

       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

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值