OceanBase中主備Rootserver如何管理切換

 

主RootServer會不斷給備RootServer發送lease。被RootServer收到該lease後會保存到幾個變量中:
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。

何時須要Renew lease呢?看下面一段代碼。僅當lease超過了一個安全區域即將過時的時候纔會renew。

 

 

// 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簡史
操作系統

OceanBase Join操做

OceanBase內部表

OceanBase官網

 

推薦幾本數據庫相關的書籍:

數據庫系統設計、實現與管理(第8版)
數據庫原理與設計
NoSQL數據庫入門/圖靈程序設計叢書 (日)佐佐木達也|譯
深刻NoSQL /Shashank Tiwari 著 圖靈程序設計叢書
大數據挑戰與NoSQL數據庫技術(大數據技術的學習指南。突破迷局

幾本架構書:

網絡.4.4BSD操做系統設計與實現(從系統架構師角度出發)
架構實戰(軟件架構設計的過程)
網絡.ACE技術內幕:深刻解析ACE架構設計與實現原理
架構之美/斯賓耐立思,(Diomidis Spinellis)



再來個個性t-shirt:
NoSQL 非結構化數據庫/大數據 程序主題T恤/Tshirt 兩件包郵

相關文章
相關標籤/搜索