OceanBase選擇了強一致性,主UpdateServer往備UpdateServer同步操做日誌,若是同步成功,主UpdateServer操做本地後返回客戶端更新成功,不然,主UpdateServer會把備UpdateServer從同步列表中剔除。另外,剔除備UpdateServer 以前須要通知RootServer,從而防止RootServer將不一致的備UpdateServer 選爲主UpdateServer。網絡
以下所示,主UpdateServer往備機推送操做日誌,備UpdateServer的接收線程接收日誌,並寫人到一塊全局日誌緩衝區中。備UpdateServer只要接收到日誌就能夠回覆主UpdateServer同步成功,主UpdateServer接着更新本地內存並將日誌刷到磁盤文件中,最後回覆客戶端寫入操做成功。這種方式實現了強一致性,若是主UpdateServer出現故障,備Updatcserver包含全部的修改操做,於是可以徹底無量地切換爲主Updateserver繼續提供服務。另外,主備同步過程當中要求主機刷磁盤文件,備機只須要寫內存緩衝區,強同步帶來的額外延時也幾乎能夠忽略。
多線程
OceanBase引入多版本併發控制機制後,UpdateServer備機支持多線程併發回放日誌功能。如上圖所示,有一個日誌分發線程每次從日誌源讀取一批日誌,拆分爲單獨的日誌回聽任務交給不一樣的日誌回放線程處理。一批日誌回放完成時,日誌提交線程會將對應的事務提交到內存表並將日誌內容持久化到日誌文件。併發
class ObLogReplayWorker { public: //提交一批待回放的操做日誌 // @param [out]task_id 最後一條操做日誌的編號 //@param [in] buf 日誌緩衝區 // @param [in]len 日誌緩衝區的大小 //@paran [in]replay_type 日誌回放類型,包話RT_LOCAL(回放本地日誌)和RT_APPLY(回放經過網絡接收到的日誌) int aubmit_batch(int64_t4& task_id, const char* buf, int64_t len, const ReplayType replay_type); public: //需放一條操做日誌 int handle_apply(ObLogTask* task); };
備UpdateServer 有專門的日誌回放線程不斷地調用ObUpsLog-Mgr中的replay_log函數獲取並回放操做日誌。UpdateServer 支持多線程併發寫事務後,replay log函數實現成調用ObLogReplay Worker中的submit_batch,將一批待回放的操做日誌加入到回聽任務隊列中。多個日誌回放線程會取出回聽任務並不斷地調用Handle_apply回放操做日誌,即首先將操做日誌預提交到MemTable中,接着加入到提交任務隊列。另外,還有一個單獨的提app