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; }
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重放线程,启动工做线程,等等。 }
小结:oop
1. 主备切换受HA管理,非异常状况下主备RS不进行切换学习
2. 备集群SWITCH状态是进入ACTIVE MASTER状态的准备态大数据
相关阅读spa
OceanBase简史
操作系统
推荐几本数据库相关的书籍:
数据库系统设计、实现与管理(第8版)
数据库原理与设计
NoSQL数据库入门/图灵程序设计丛书 (日)佐佐木达也|译
深刻NoSQL /Shashank Tiwari 著 图灵程序设计丛书
大数据挑战与NoSQL数据库技术(大数据技术的学习指南。突破迷局
几本架构书:
网络.4.4BSD操做系统设计与实现(从系统架构师角度出发)
架构实战(软件架构设计的过程)
网络.ACE技术内幕:深刻解析ACE架构设计与实现原理
架构之美/斯宾耐立思,(Diomidis Spinellis)
再来个个性t-shirt:
NoSQL 非结构化数据库/大数据 程序主题T恤/Tshirt 两件包邮