berkeley db replica机制 - 主从同步
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机制 - 主从同步的更多相关文章
- berkeley db replica机制 - 消息处理
repmgr_method.c, __repmgr_start_int()repmgr_method.c, __repmgr_start_msg_threads()repmgr_msg.c, __re ...
- berkeley db replica机制 - election algorithm
repmgr_method.c, __repmgr_start_int() 初始2个elect线程. repmgr_elect.c, __repmgr_init_election() __repmgr ...
- 了解 Oracle Berkeley DB 可以为您的应用程序带来 NoSQL 优势的原因及方式。
将 Oracle Berkeley DB 用作 NoSQL 数据存储 作者:Shashank Tiwari 2011 年 2 月发布 “NoSQL”是在开发人员.架构师甚至技术经理中新流行的一个词汇. ...
- Linux 安装mysql,mariadb,mysql主从同步
myariadb安装 centos7 mariadb的学习 在企业里面,多半不会使用阿里云的mariadb版本,因为版本太低,安全性太低,公司会配置myariadb官方的yum仓库 1.手动创建mar ...
- redis多实例与主从同步及高级特性(数据过期机制,持久化存储)
redis多实例 创建redis的存储目录 vim /usr/local/redis/conf/redis.conf #修改redis的配置文件 dir /data/redis/ #将存储路径配置修改 ...
- RocketMQ 主从同步机制
主从同步(HA 高可用) 主从同步原理: 为了保证系统的高可用,消息到达主服务器后,需要将消息同步到从服务器.如果主服务器宕机,消费者可用从从服务器拉取消息. 大体步骤: 1.主服务器启动,监听从服务 ...
- Mysql主从同步机制
1.1 主从同步介绍和优点 *在多台数据服务器中,分为主服务器和从服务器.一台主服务器对应多台从服务器. *主服务器只负责写入数据,从服务器只负责同步主服务器的数据,并让外部程序读取数据 *主服务器写 ...
- 【mq学习笔记-分布式篇】主从同步机制
核心类: 消息消费到达主服务器后需要将消息同步到从服务器,如果主服务器Broker宕机后,消息消费者可以从从服务器拉取消息. HAService:RocketMQ主从同步核心实现类 HAService ...
- MySQL数据库的主从同步实现及应用
>>主从同步机制及应用 读写分离(Read/Write Splitting)让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),从数据库处理SELECT查询操作 ...
随机推荐
- Mysql中将日期转化为毫秒
一:将毫秒值转化为指定日期格式 使用MYSQL自带的函数FROM_UNIXTIME(unix_timestamp,format). 举例: select FROM_UNIXTIME(136417651 ...
- Android IOS WebRTC 音视频开发总结(七一)-- H265/H264有何不同
本文整理自自网络,非原创,喜欢相关文章请关注我们的微信公众号:blackerteam H.265 H.265是ITU-TVCEG继H.264之后所制定的新的视频编码标准.H.265标准围绕着现有的视频 ...
- Uiautomator自动编译运行脚本
Uiautomator的编译运行过程需要输入好几个命令,太麻烦. 花了点时间写了个简单的bat.方便多了.id输入当前使用的SDK ID号(android list target命令可以查看到),cl ...
- 修改Django的默认打印时间
环境 Django版本:1.10 前言 默认情况下,Django会把日期按照“月份 天数, 年”的格式打印,比如2003年2月4日会打印成“Feb. 4, 2003”,这种格式对于西方人来说很好看,但 ...
- 比较一下Linux下的Epoll模型和select模型的区别
一. select 模型(apache的常用) 1. 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Sel ...
- Asp.net Page指令
Page指令为编译器编译页面时使用的指令 指令的格式为 <%@ [Directive] [Attribute=value]%> <%@ Page Language="C#& ...
- nagios二次开发(二)---nagios和nagiosql合并与取舍
NAGIOS做前台 上一篇本人分析了nagios和nagiosql的优缺点,根据之前的使用经验及探索.决定将nagios做为监控数据的展示层,暂称做“前台”.将nagiosql做为监控体的配置层,暂称 ...
- Json格式转化为string格式
今天在学习Jsonp的时候,想通过服务端返回一段json数据,因为使用的服务端是NodeJs,那么就需要在js文件中实现返回json.(这里不懂的同学,可以先了解一下NodeJs的基础概念,在这里,我 ...
- Delphi 字符数组存入文件
TDMSRequestBuffer=object Head:TDMSHead; Data:array[0..2047] of char; DataSize:Integer; p ...
- laravel 数据库迁移
问题:之前有创建迁移文件 并且执行过 如果删除迁移文件 再重新创建迁移文件时就有问题 提示找不到之前的迁移文件 /** 一开始执行的命令 php artisan make:migration crea ...