什么是hdr
HDR是一种将数据从主服务器复制到备服务器的方法
实例级别的复制 (所有启用日志记录功能的数据库)
基于逻辑日志的复制技术,需要传输大量的逻辑日志,数据库需启用日志模式
通过网络持续将数据复制到备节点
HDR 确保从服务器总是与主服务器保持同步
如果主服务器发生故障,那么备用服务器可以接管,直到主服务器恢复运行为止
HDR特点
仅有一个HDR备节点,备节点可读写
高带宽、主备节点距离近
每个节点拥有它自己的存储设备
能承受服务器软硬件故障
HDR 提供了三种同步模式
完全同步,近似同步,异步
主要差异来源于集群交互时的不同处理
通信流程如下
完全同步
近似同步
异步
图片来源于网络
相关线程
主节点
dr_prsend
主要函数 dr_primary_send()
作用
1 向备节点发送DR buffer
2 每次发送成功后等待备节点的ack
3 启动时强制检查点与备机同步
dr_prping
主要函数 dr_primary_ping()
作用
1 向备机发送DR_MSG_PING 消息,每隔DR_TIMEOUT s 一次(有的版本固定1s)
2 接收备节点的响应ack报文
dr_idx_send
索引发送线程
主要函数 dr_idx_send_thread()
作用
1 索引上加共享锁
2 复制index btree page 到 DR Buffers ,并且发送到备节点
3 等待备节点返回ack 并且释放共享锁
gbase8s 特有的集群通信协议smx
smxrcv gbase02
主要函数 smx_send_thread()
使用内部smx_pipe结构来管理缓冲队列,用于向对等节点发送数据消息
smxsnd gbase02
主要函数 smx_recv_thread()
使用内部smx_pipe结构来管理缓冲队列,用于从对等节点接收数据消息
smxRecvSnd
主要函数 smx_send_from_recv_thread()
用于从ASF层发送消息,而不会因管道破裂而遇到问题
备节点
dr_secrcv
主要函数 dr_secondary_recv()
作用
1 接收从主节点发送过来的DR Buffers
2 将DR Buffers传递给dr_secapply线程
3 向主节点响应ack
dr_secapply
主要函数 dr_secondary_apply()
作用
1 获取完整的DR Buffers,并将逻辑日志页转发给恢复线程 logrecvr
2 返回一个空的DR Buffers
dr_secping
主要函数 dr_secondary_ping()
作用
检查是否收到 主节点 每隔DR_TIMEOUT s 的DR_MSG_PING 消息
dr_idx_recv
主要函数 dr_idx_recv_thread()
作用
接收主节点发送的index btree page 并且写入到 buffer pool
如下线程主要作用为解析主机发送的逻辑日志然后在备机重做
logrecover
logredo
xchg_*
如下线程同主节点
smxsnd gbase01
smxrcv gbase01
smxRecvSnd
hdr集群监控
onstat -g gri
onstat -g cluster
onstat -g smx
可使用xtrace 追踪数据库集群交互的通信过程
xtrace 是用来追踪在线运行ids的工具,这个工具可以打印代码中已经插针的日志,使用时会先初始化一个环形队列,将用来记录日志信息。
xtrace on
xtrace size 10000
xtrace heavy –c XTF_HDR –f XTF_CALL
将环形队列信息导出到文件
xtrace -t fview > result.txt
关闭
xtrace off
xtrace 输出如下