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自訂的系統事件。