oceanbase之RootServer(一)

來源:互聯網
上載者:User
1 概述

我們從Root Server開始分析。Root Server主要是提供命名服務,管理資料庫系統的meta資訊,管理ChunkServer,Root Server對叢集的管理主要基於lease租約機制。Root Server使用HA主備機制來提高可用性。由HA檢測master/slave節點的狀態,如果master節點不可用,則虛擬IP會自動漂移到slave節點,slave節點接著提供服務。這塊具體見《OceanBase介紹》。 2 Server架構 2.1 簡單類架構

Oceanbase使用了tbnet網路架構,其服務基類ObBaseServer就是派生自tbnet::IServerAdapter類,繼承這類需要實現handlePacket這兩個操作介面。

關於tbnet架構的簡單介紹,見《tbnet架構簡介》。


這個鳥毛的類裡面,start_service介面是public,但實際上代碼裡調用的地方只有一處,就是在start()函數裡。如果是protected的就不會引起歧義了。

這個類裡面的IPacketFactory、PacketStreamer和Transport都是tbnet網路架構定義的類,與底層網路和資料包相關。

幾個相關函數:

1 虛函數initialize()給了實作類別一個初始化機會;

2 函數start是服務啟動程式;

3 發送response packet都是統一的,這個封裝在函數send_response()中; 2.2 服務啟動、停止

啟動流程也就是start()函數,首先調用initialize()讓繼承類完成自己的初始化工作;後面就是tbnet相關的必要初始化事項,為packet streamer設定packet factory,並啟動Transport;最後調用start_service()啟動服務。

停止直接調用介面stop()即可,先將stopped_置為true,然後調用destroy(),給繼承類一個做清理工作的機會,最後關閉Transport。 2.3 發送響應

 

函數send_response根據傳入的參數構建一個ObPacket,然後設定packet資料,調用sereialize()方法序列化為byte stream,最後調用connection的postPacket()方法發送出去。

int ObBaseServer::send_response(const int32_t pcode, constint32_t version,

const ObDataBuffer& buffer,

tbnet::Connection* connection, const int32_t channel_id)

流程其實很簡單,還是搞個流程圖吧。


3 從main函數開始 3.1 BaseMain基類

沒辦法,只能從啟動函數開始看,找線索。Root Server的main函數相當簡單,在ob_rt_main.cpp中,建立了BaseMain對象,然後直接調用其start介面啟動服務。最後調用destory介面在結束時釋放資源。簡單點就是:

BaseMain*pmain = ObRootMain::get_instance();

pmain->start(argc,argv, "root_server");

pmain->destroy();

這個是個虛類,沒啥東西,就是一個簡單的架構,先看看類聲明:

1 兩個public介面,就像前面main()裡面調用的那樣。也是virtual的,不過一般子類不會重寫。

virtual int start(const int argc,char *argv[], const char* section_name);

        virtual void destroy();

2 幾個protected函數,幹活的部分do_work()是純虛的,子類必須實現。

        virtual void do_signal(const int sig);

        void add_signal_catched(const int sig);

        virtual void print_usage(const char*prog_name);

        virtual void print_version();

        virtual const char*parse_cmd_line(const int argc, char *const argv[]);

        virtual int do_work() = 0;

但是get_instance函數確定義在ObMainRoot類裡,這有些tricky。類BaseMain在common模組中,但是get_instance卻散落在子模組中。

比如Root Server,它就在ObMainRoot中;Chunk Server,它在ObChunkServerMain中,直接返回ObChunkServerMain對象。

在start()函數中,BaseMain做一些配置工作,最後調用do_work()。 3.2 ObMainRoot類

顯然目標指向了ObMainRoot類,它在檔案ob_root_main.h/cpp中。它重載了兩個介面do_work和do_signal。還有一個成員ObRootWorker worker對象。

依然來個類圖:


在do_work中,首先設定一些關注的signal,在設定了worker的一些屬性後,直接調用worker.start()開啟服務,可見它是個框,真正幹活的是ObRootWorker類。基本函數邏輯如下:

      add_signal_catched(START_REPORT_SIG);

      add_signal_catched(START_MERGE_SIG);

     add_signal_catched(DUMP_ROOT_TABLE_TO_LOG);

     add_signal_catched(DUMP_AVAILABLE_SEVER_TO_LOG);

      add_signal_catched(SWITCH_SCHEMA);

      add_signal_catched(RELOAD_CONFIG);

      add_signal_catched(DO_CHECK_POINT);

      add_signal_catched(DROP_CURRENT_MERGE);

      add_signal_catched(CREATE_NEW_TABLE);

      worker.set_listen_port(port)

      worker.set_dev_name(dev_name)

      worker.set_config_file_name(config_file_name_)

      worker.set_packet_factory(&packet_factory_)

      worker.start()

另外這些所謂的signal並不是系統signal,而是OceanBase自訂的系統事件。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.