基础
1:复制将你master的写操作分发给所有参与者,你只能在master中写,其他参与者只能读,参与者的写会产生错误
2:master和参与者属于一个"复制组",复制组的程序必须是事务的,他们之间发送的是日志记录
3:复制的参与者都必须有自己唯一的环境,基于这个原因,如果多个参与者在同一台电脑上,他们不能使用一样的环境目录
4:技术上讲,复制组是由一个master环境和多个参与者环境构成
5:参与者的数量只受限于网络带宽
6:对于一个应用程序中的在复制组中的环境,你必须分配一个唯一ID,不需要保证此ID全局唯一
7:数据库必须放置在需要复制的环境的EVN_HOME目录或者DbEvn::set_data_dir()目录中,你不能将这些数据库文件放置到这些目录的子目录下面
8:复制需要一个传输层,berkeley DB提供了一个基于TCP/IP的传输层
9:一个复制组必须有一个master,可以通过自动选举或者手动指定这个master
10:两种办法实现复制:
(1):使用pre-packaged Replication Manager框架
(2):使用Replication Base API自己写框架
pre-packaged Replication Manager基础
pre-packaged Replication Manager存在于DB lib的顶层,多线程实现
1:提供了一个多线程通信层
2:使用select()编写的socket(),所以只能提供60个参与者
3:环境的句柄必须是唯一的
4:程序启动阶段,选举或者手工指定一个master
消息的持久化
当参与者收到一条master发送过来的消息,它会先持久化,然后回复master
当提交一个事务时,采用异步写硬盘日志,并在网络提供层阻塞等待参与者的回应,之所以异步写硬盘日志是因为它认为既然能保证参与者数据完整性就没必要再保证自己的完整性
不管理消息的持久化
master只是广播消息,这里要选择是否使用异步写硬盘日志和是否等待参与者的回应
Replicaton Manager
打开
1:创建环境句柄
2:配置你的环境(设置错误产生时的消息前缀码等)
3:要使用Replication Manager必须配置环境优先级(如果优先级为0则没有成为master的资格),配置自己的Ip地址,成为其他复制参与者消息达到的入口,配置其他参与者的Ip地址,设置自己的ID
4:打开你的环境,使用DB_INIT_REP和DB_THREAD,DB_INIT_REP会初始化复制,DB_THREAD会保证线程安全性
5:调用DbEvn::repmgr_start开始复制
6:打开你所需要的数据库,Master必须以读写方式打开,其他复制参与者可以只以读方式打开,这也就意味着如果重新选举了一个Master,可能必须重新打开数据库
Note:每一个进程只能有一个环境
关闭
1:关闭所有DbSite句柄
2:关闭你的数据库
3:关闭你的环境,这也会导致你的复制被关闭
DbSite句柄
DbSite句柄描述了参与复制的主机IP和端口
打开和关闭复制
使用DbEvn::repmgr_site(),使用这个函数设置自己的IP和端口,然后使用DbEvn::repmgr_start()设置复制用线程数量和开始标志(包括选举Master,设置自己为Master,设置自己为参与者) 然后再打开环境
线程数量随便设置,一个也可以,这些线程组回来读取,写入,处理消息
设置消息持久化策略
DB_REPMGR_ACKS_NONE,不等待参与者的回应,适应DbEvn::repmgr_set_ack_policy()
设置连接策略
当连接失败时,用DbEvn::rep_set_timeout()采用DB_REP_CONNECTION设置毫秒级重连时间
设置心跳检测
Master发送心跳检测,参与者接收心跳检测和其他信息
Master:DnEvn::rep_set_timeout() with DB_REP_HEATBEAD_SEND
参与者:DnEvn::rep_set_timeout() with DB_REP_HEATBEAD_MONITOR