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 兩件包郵