repmgr/repmgr_net.c,

__repmgr_send(): 做send_broadcast, 然后根据policy 对DB_REP_PERMANENT的处理

__repmgr_send_broadcast(): 对每个site, send_connection().

MASTER 发送

log/log_put.c, log_put(),

不接受 REP_CLIENT

__rep_send_message(env, DB_EID_BROADCAST, - REP_NEWFILE, REP_LOG

txn/txn_chkpt.c, __txn_checkpoint()

REP_CLIENT仅在recover时到这里, sync mp后马上退出

在master sync mp之前, 发送给client:

__rep_send_message(env, DB_EID_BROADCAST, REP_START_SYNC

等待 chkpt_delay

写ckp log rec

DB_REP_REREQUEST vs  DB_REP_ANYWHERE

* Gap requests are "new" and can go anywhere, unless
* this is already a re-request.

repmgr_net.c, __repmgr_send()

if ((flags & (DB_REP_ANYWHERE | DB_REP_REREQUEST)) ==DB_REP_ANYWHERE &&

    (site = __repmgr_find_available_peer(env))

发完后, DB_REP_PERMANENT, 检查policy, 需要多少ack 才能返回(for durability).

http://docs.oracle.com/cd/E17076_03/html/api_reference/C/repmgrset_ack_policy.html

默认 DB_REPMGR_ACKS_QUORUM, repmgr_net.c, __repmgr_send(), 可见 (n - 1) / 2 + 1

确定了之后, __repmgr_await_cond(env, got_acks, &perm, rep->ack_timeout, &db_rep->ack_waiters);

=> while (got_acks(env, &perm)) {pthread_cond_timedwait(&db_rep->ack_waiters,rep->ack_timeout)}

repmgr_net.c,  got_acks().

dbinc/rep.h,

struct __db_rep {}

REPMGR_RUNNABLE *selector, **messengers, **elect_threads;

WSAEventSelect

client接收

repmgr_method.c, __repmgr_start_int() - elect/msg/select threads
repmgr_method.c, __repmgr_start_selector()
repmgr_sel.c, __repmgr_select_thread()
repmgr_windows.c, __repmgr_select_loop()
repmgr_windows.c, handle_completion() -
repmgr_sel.c, __repmgr_read_from_site()
repmgr_sel.c, dispatch_msgin() -

放入db_rep->input_queue, __repmgr_signal(&db_rep->msg_avail)

rep.h, struct __db_rep     -    cond_var_t check_election, gmdb_idle, msg_avail;

repmgr_method.c, __repmgr_start_int()
repmgr_method.c, __repmgr_start_msg_threads()
repmgr_msg.c, __repmgr_msg_thread()
message_loop()

while ((ret = __repmgr_queue_get()...

__repmgr_queue_get - while(m = available_work(env)) == NULL), wait 在msg_avail 上
process_message()
repmgr_record.c, __rep_process_message_int()

对 REP_LOG 消息, 调用

rep_log.c, __rep_log()

rep_record.c, __rep_apply():

log.h,  struct log {}  - waiting_lsn,  max_wait_lsn, __db.rep.db, ready_lsn

waiting_lsn:   It is the first LSN that we are holding without putting in the log, because we received one or more log records out of order.

ready_lsn:  It is the next LSN we expect to receive. It's normally equal to "lsn", except at the beginning of a log file, at which point it's set to the LSN of the first record of the new file

若正是我们需要的 下一个log rec, call  __rep_process_rec(); __rep_remfirst/__rep_getnext 接着处理 tmp db里的log; __rep_loggap_req().

若 在我们需要的 log rec后面, 入tmp db, 更新 waiting_lsn, 发送__rep_loggap_req(). 

若 在我们需要的 log rec前面, 收到 重复 log rec. 

rep_record.c, __rep_process_rec(), newfile特殊处理退出. 除ckp,其他先直接写入log 文件

   - DB___txn_prepare:  直接flush log

   - DB___txn_regop:  __rep_process_txn(),  拿到 需要的写锁; 拿到txn对应的所有log rec, 排序, 读出,  db_dispatch(DB_TXN_APPLY

- DB___txn_ckp: 首先在 rep_db(bookkeeping db)中写一个 rec, nooverwrite, 如果已经有, 则其他线程在做ckp, 退出.  sync mp; 写DB_LOG_CHKPNT log rec,  flush log

berkeley db replica机制 - 主从同步的更多相关文章

  1. berkeley db replica机制 - 消息处理

    repmgr_method.c, __repmgr_start_int()repmgr_method.c, __repmgr_start_msg_threads()repmgr_msg.c, __re ...

  2. berkeley db replica机制 - election algorithm

    repmgr_method.c, __repmgr_start_int() 初始2个elect线程. repmgr_elect.c, __repmgr_init_election() __repmgr ...

  3. 了解 Oracle Berkeley DB 可以为您的应用程序带来 NoSQL 优势的原因及方式。

    将 Oracle Berkeley DB 用作 NoSQL 数据存储 作者:Shashank Tiwari 2011 年 2 月发布 “NoSQL”是在开发人员.架构师甚至技术经理中新流行的一个词汇. ...

  4. Linux 安装mysql,mariadb,mysql主从同步

    myariadb安装 centos7 mariadb的学习 在企业里面,多半不会使用阿里云的mariadb版本,因为版本太低,安全性太低,公司会配置myariadb官方的yum仓库 1.手动创建mar ...

  5. redis多实例与主从同步及高级特性(数据过期机制,持久化存储)

    redis多实例 创建redis的存储目录 vim /usr/local/redis/conf/redis.conf #修改redis的配置文件 dir /data/redis/ #将存储路径配置修改 ...

  6. RocketMQ 主从同步机制

    主从同步(HA 高可用) 主从同步原理: 为了保证系统的高可用,消息到达主服务器后,需要将消息同步到从服务器.如果主服务器宕机,消费者可用从从服务器拉取消息. 大体步骤: 1.主服务器启动,监听从服务 ...

  7. Mysql主从同步机制

    1.1 主从同步介绍和优点 *在多台数据服务器中,分为主服务器和从服务器.一台主服务器对应多台从服务器. *主服务器只负责写入数据,从服务器只负责同步主服务器的数据,并让外部程序读取数据 *主服务器写 ...

  8. 【mq学习笔记-分布式篇】主从同步机制

    核心类: 消息消费到达主服务器后需要将消息同步到从服务器,如果主服务器Broker宕机后,消息消费者可以从从服务器拉取消息. HAService:RocketMQ主从同步核心实现类 HAService ...

  9. MySQL数据库的主从同步实现及应用

    >>主从同步机制及应用 读写分离(Read/Write Splitting)让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),从数据库处理SELECT查询操作 ...

随机推荐

  1. Codeforces Round #228 (Div. 1) B

    B. Fox and Minimal path time limit per test 1 second memory limit per test 256 megabytes input stand ...

  2. 正则表达式(转自https://segmentfault.com/a/1190000000699097)

    https://segmentfault.com/a/1190000000699097

  3. 潜入ICU的四逆汤

    制附子50克(先煎2小时).干姜15克.炙甘草10克.桂枝10克.上好肉桂10克(后下).煎取药液300毫升,分三次鼻饲.这是昨天我给A先生病危的父亲开的处方:四逆汤加肉桂.桂枝. 昨天上午的门诊到2 ...

  4. 元素JS拖动的实现

    涉及到了几个位置的属性 offset   clientX cilentY 等 $(selector).on("mousedown",function (e){ var x = e. ...

  5. android 实现桌面显示内容

    //获取windowmanager 对象 WindowManager wm = (WindowManager) getApplicationContext().getSystemService(WIN ...

  6. [转载]:经纬度与WGS84坐标转换

    本代码实现在WGS84系统的大地坐标(BLH)和空间直角坐标(XYZ)的互相转换,符合标准语法,可直接使用 如下代码,输出为: WGS84:  -2175790.73969891    4461032 ...

  7. 去除DEDECMS后台预览文章URL地址多余的数字信息

    在使用织梦模板时发现这样一个问题:在后台预览文章的时候,出现的文章网址尽管是静态URL,但是会在网址的尾部出现问号并跟随一个时间戳,在复制URL时就显得很不方便.那么如何解决这一问题呢? 经过查找资料 ...

  8. 【转】提高VR渲染速度的最好方法(经典转载)

    VR的基本渲染方法掌握起来并不难,但是最迫切需要解决的问题是VR的出图速度问题.动则需要数小时的渲染时间真的是很难以接受,我们从三个影响速度的参数结合网上一些高手的教程来分析一下. 一.Irradia ...

  9. 云主机不能外网ssh连接,只能内网ssh连接的问题处理

    某台服务器外网无法ssh,内网可以ssh连接,ping值延时比较大 安装iftop查看流量 yum install -y iftop iftop界面含义如下 第一行:带宽显示 中间部分:外部连接列表, ...

  10. {VS2010C#}{WinForm}{ActiveX}VS2010C#开发基于WinForm的ActiveX控件

    在VS2010中使用C#开发基于WinForm的ActiveX控件 常见的一些ActiveX大部分是使用VB.Delphi.C++开发,使用C#开发ActiveX要解决下面三个问题: 使.NET组件可 ...