OceanBase中主备Rootserver如何管理切换
int ObCheckRunnable::renew_lease(const ObLease& lease)
{
int err = OB_SUCCESS;
lease_on_ = true;
lease_time_ = lease.lease_time;
lease_interval_ = lease.lease_interval;
renew_interval_ = lease.renew_interval;
return err;
}
然后备RootServer的CheckRunnable::run()线程中会周期性检查是否需要进行lease续约。RS会检查vip是否与自己的本地ip一致,分为几种情况:
if (rs.ip = vip && rs.role = slave)
{
vip漂移到了备rs(原因可能是主rs挂掉了)
备rs读取自己的lease状态,如果状态不为invalid则自己进入switching状态。
(如果被发现自己lease已经超时,则认为自己的lease状态为invalid,此时报警,不做切换)
}
if (rs.ip = vip && rs.role = master)
{
vip还在主rs上。属于一般正常情况。什么都不用做。
}
if (rs.ip != vip && rs.role = slave)
{
vip不在备rs上。属于一般正常情况。
这时候检查一下自己的lease状态,如果lease为invalid状态,则进入state变为init状态,重新注册。
如果lease为should renew状态,则renew lease(向vip rs发送renew请求)。
}
if (rs.ip != vip && rs.role = master)
{
异常情况。主rs失去了vip,为了避免损失进一步扩大,主rs立即退出。(思考:这里为什么主rs不把自己切换成备?)
}
这里特别需要注意的是renew lease,它始终是向vip rs发送renew lease请求,而不是向某个具体的rs发送请求。所以rs的lease状态严重依赖于HA。
// common/ob_check_runnable.cpp int64_t ObCheckRunnable::get_lease_status_()
{
LeaseStatus status = LEASE_NORMAL;
timeval time_val;
gettimeofday(&time_val, NULL);
int64_t cur_time_us = time_val.tv_sec * 1000 * 1000 + time_val.tv_usec;
if (lease_time_ + lease_interval_ < cur_time_us)
{
TBSYS_LOG(WARN, "Lease expired");
status = LEASE_INVALID;
}
else if (lease_time_ + lease_interval_ < cur_time_us + renew_interval_)
{
TBSYS_LOG(DEBUG, "Lease will expire");
status = LEASE_SHOULD_RENEW;
} return status;
}
下面梳理一次主死掉、备切换成主的过程:
1. 主、备各司其职。主负责具体工作,备通过回放commit log与主保持准同步状态。
2. 主因为某种原因死掉(运维、异常等),HA检测到该事件,立即进行IP切换(把备的IP设置成VIP)
3. 备在CheckRunnable::run()中检测到自己的IP与VIP相等,并且自己当前角色是SLAVE,立即把自己的STATE设置成SWITCH状态。
4. 在run()开始执行之前,主线程(ob_root_worker.cpp)就已经在一个loop里面了:
while (ObRoleMgr::SWITCHING != role_mgr_.get_state() // lease is valid and vip is mine
&& ObRoleMgr::INIT != role_mgr_.get_state() // lease is invalid, should reregister to master
// but now just let it exit.
&& ObRoleMgr::STOP != role_mgr_.get_state() // stop normally
&& ObRoleMgr::ERROR != role_mgr_.get_state())
{
usleep(10 * 1000); // 10 ms
} if (ObRoleMgr::SWITCHING == role_mgr_.get_state())
{
切换成master:停止log等待线程,停止log重放线程,启动工作线程,等等。
}
小结:
1. 主备切换受HA管理,非异常情况下主备RS不进行切换
2. 备集群SWITCH状态是进入ACTIVE MASTER状态的准备态
相关阅读
推荐几本数据库相关的书籍:
数据库系统设计、实现与管理(第8版)
数据库原理与设计
NoSQL数据库入门/图灵程序设计丛书 (日)佐佐木达也|译
深入NoSQL /Shashank Tiwari 著 图灵程序设计丛书
大数据挑战与NoSQL数据库技术(大数据技术的学习指南。突破迷局
几本架构书:
网络.4.4BSD操作系统设计与实现(从系统架构师角度出发)
架构实战(软件架构设计的过程)
网络.ACE技术内幕:深入解析ACE架构设计与实现原理
架构之美/斯宾耐立思,(Diomidis Spinellis)

再来个个性t-shirt:
NoSQL 非结构化数据库/大数据 程序主题T恤/Tshirt 两件包邮
OceanBase中主备Rootserver如何管理切换的更多相关文章
- (摘)DataGuard物理standby管理 - 主备切换
DataGuard物理standby管理 - 主备切换 Dataguard的切换分为两种,switchover和failover. switchover一般用于数据库或硬件升级,这时只需要较短时间中断 ...
- f5主备切换演练
1.准备工作: 1)保证主备机同步 2)备份主备机配置 2.切换:所有操作均在主机 方法1:shutdown主机上联的核心交换机的端口: 此方法在主备切换过程中会丢1个包 方法2:命令行下reboot ...
- Postgres主备切换
主备查询 主备不会自动切换(即需要实现线上环境主数据库宕掉之后,从数据库能够自动切换为主数据库,需要借用第三方软件,例如heartbeat等) (1)如何查看是primary还是standby 方法1 ...
- Oracle 11.2.0.4.0 Dataguard部署和日常维护(5)-Datauard 主备切换和故障转移篇
1. dataguard主备切换 1.1. 查看当前主备库是否具备切换条件 on slave select sequence#,first_time,next_time,archived,appl ...
- MySQL主备复制原理、实现及异常处理
复制概述 MySQL支持三种复制方式:基于行(Row)的复制.基于语句(Statement)的复制和混合类型(Mixed)的复制. 基于语句的复制早在3.23版本中就存在,而基于行的复制方式在5.1版 ...
- 在Windows Azure上配置VM主备切换(1)——Linux篇
对任何一个上线系统来说,高可用设计是不可或缺的一个环节,这样才可以确保应用可以持续.稳定的运行,而不是频繁的掉线.停机.高可用设计的核心思路很简单,就是消除一切单点故障,将单点链路或者节点升级为多点. ...
- 测试redis+keepalived实现简单的主备切换【转载】
转自: 测试redis+keepalived实现简单的主备切换 - Try My Best 尽力而为 - ITeye技术网站http://raising.iteye.com/blog/2311757 ...
- 在物理 Data Guard 中对异构主备系统的支持 (文档 ID 1602437.1)
Data Guard中主数据库与物理备用数据库(Redo Apply)之间可以有什么差别?本说明针对重做应用和 Oracle Data Guard 12 发行版 1 进行了更新.它适用于 Oracle ...
- ycache中redis主备功能设计及使用说明
方案概述: 对于ycache-client,如下图,在一致性hash环上的每个节点都有一个备用的节点.正常情况下slave节点不参与key的分配(冷备).只有当master挂了,ycache clie ...
随机推荐
- MEMS市场介绍
惠普第一.德州仪器第二 市场观察发展报告说,MEMS市场在2007年增长百分之九,达到70亿美元,其中前30名制造商的收入总和有56亿美元,平均增长7个百分点. 惠普(HP)打印机使用MEMS喷墨头, ...
- ARM和X86功耗差别的深层原因探讨
ARM和X86功耗差别的深层原因探讨 ARM和X86功耗的差别一直是个很热的话题.ARM可以做的很低,甚至1瓦都不到.而X86服务器的芯片可以达到100-200瓦,就算是嵌入式处理器Atom系列也需要 ...
- html5 notifications通知
http://www.html5rocks.com/en/tutorials/notifications/quick/?redirect_from_locale=zh http://www.paulu ...
- [置顶] Oracle GoldenGate 系列:使用 Oracle ASM API DBLOGREADER 时遇 ora-01031 错误
今天在自己新搭建的 Oracle ACFS 文件系统上测试 GoldenGate ,启动 extract 进程报如下错误: 2013-08-27 14:58:39 ERROR OGG-00446 ...
- 杭电 HDU 4608 I-number
http://acm.hdu.edu.cn/showproblem.php?pid=4608 听说这个题是比赛的签到题......无语..... 问题:给你一个数x,求比它大的数y. y的要求: 1. ...
- ffmpeg+SDl+ 播放器 -01
最近因公司项目需要,打算自己在LINUX平台整一个播放器,来学习和研究音频编解码. 项目需求: 支持下列格式文件播放. 1> WMA 硬件解码,但需要软件分析ASF格式,提取Payload数据 ...
- as3 页游中,新手指导中,屏蔽所有交互对象,但除了指定交互对象可用的方法【转http://blog.csdn.net/linjf520/article/details/9450945】
package { import flash.display.InteractiveObject; import flash.display.Stage; import flash.events.Mo ...
- Java基础笔记-String类2
StringBuffer 特点: 是字符串缓冲区. 是一个容器,其长度可变,可以操作添加多个数据类型. 最后通过toString方法变成字符串. 被final锁修饰,因此不能被继承. 存储: 方法1: ...
- uva 1471 Defense Lines
题意: 给一个长度为n(n <= 200000) 的序列,你删除一段连续的子序列,使得剩下的序列拼接起来,有一个最长的连续递增子序列 分析: 就是最长上升子序列的变形.需要加一个类似二分搜索就好 ...
- poj2752Seek the Name, Seek the Fame
Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...