2018-04-20 by 安靜的下雪天 http://www.cnblogs.com/quiet-snowy-day/p/8890785.html html
本文翻譯自SymmetricDS官方文檔 How SymmetricDS Works 算法
Published: Saturday, 15 September 2012 00:00數據庫
Written by Eric Long服務器
SymmetricDS 是開源的數據庫複製服務器,經過捕捉、路由、批處理數據處理以實現多個數據庫之間的同步。配置和運行時的信息使用數據庫模型存儲,爲各類操做提供了一致的、可訪問的視角。讓咱們來快速瀏覽一下,在概念上從安裝到同步SymmetricDS是如何工做的。網絡
配置數據模型是一組表,用戶在其中描述節點網絡,數據同步以及如何傳輸數據。節點是鏈接到數據庫的SymmetricDS實例。每一個節點在SYM_NODE表中都有一條記錄,其中有一個系統使用的惟一內部節點ID,和一個供用戶使用的外部節點ID。因爲系統中的許多節點都具備共同特徵,所以經過SYM_NODE_GROUP表會給每一個節點都分配一個節點組。爲了把節點鏈接在一塊兒來同步數據,使用SYM_NODE_GROUP_LINK表中的一條記錄將他們聯繫起來。該鏈接能夠被指定爲「push」即源節點發送本身的變動,也能夠指定爲「pull」即目標輪詢源節點的變動。架構
數據的同步開始於邏輯觸發器,它能夠捕獲對錶的insert、update、delete操做。用戶指定源表名稱及其所在的目錄和架構中的位置。可使用通配符來匹配多個表,而不是分別錄入每一個表。若是不須要全部的列,能夠建立一個列表記錄被排除的列,即建立一個垂直子集。配置一個邏輯觸發器將使SymmetricDS服務器在數據庫的表上建立一個物理觸發器。ui
獲取數據到目標節點叫作路由,這是路由器的職責。最簡單的是默認路由器,它將發送數據到全部節點。列匹配路由器能夠在發送數據到節點以前在列中查找特殊值。它會等待外部節點ID出如今某一列中,在將它發送到該節點以前。其餘路由器能夠查詢數據庫,或者執行自定義腳本,以肯定數據將會被髮送到哪裏。路由器與觸發器想關聯,它提供了建立水平子集的能力。spa
定義邏輯出發器會致使數據庫觸發器被置於表上,從而捕獲數據到SYM_DATA表中。該表中被捕獲的變動數據,使得SymmetricDS保證了傳輸數據的順序和原子性,這意味着數據在目標節點上會被正確的回放他是如何被記錄的。一個條目記錄了惟一數據ID序列號,事件類型(insert、update、delete),事務ID,以及變動數據。事務ID做爲本次事務的一部分被數據提交共同使用。爲了適應不一樣的表,變動數據被存儲爲CSV格式。插入事件只記錄新的數據行,刪除事件記錄舊的數據行連同使用的主鍵,更新事件記錄新的數據行,舊的數據行,以及用到的主鍵。翻譯
Change Data Capturehtm
譯者注:上圖 SYM_DATA表第1,2兩條記錄有相同的事務ID,說明此次事務包含兩個表的數據處理事件。兩個表的數據提交都使用了該事務ID。第3條記錄表示更新處理,以CSV的格式記錄了新數據,舊數據,以及主鍵。第4條記錄表示刪除處理,只記錄舊數據和主鍵。
路由做業在後臺按期執行,把變動彙集到批處理中,並分配到要交付的目標節點。變動的數據經過已配置的路由器來決定哪些節點將接收數據。若是使用的是默認路由器,數據會被分配到全部節點而且給出相同的批號。不然,每一個節點將獲取本身的批號,以便數據路由到它。數據將會被分配到同一批次處理直到達到最大批處理大小。若是用戶配置了事務批處理算法,當有更多包含相同事務ID的數據的時候,批處理會擴大。數據到批處理的指派連同肯定指派的路由器ID,記錄在SYM_DATA_EVENT表中。批處理到節點的指派記錄在SYM_OUTGOING_BATCH表中。
在配置中關聯到一塊兒的節點,使用被指定的「push」或「pull」動做來同步它們的數據。Push是指一個節點鏈接到另外一個節點並推送本身的變動,而pull是指一個節點等待其餘節點的鏈接並接收它們的變動。每一個動做都是在必定的時間間隔內執行,可是push動做只在有變動要發送的時候鏈接到網絡,而pull動做是一直保持鏈接來確認是否有等待處理的變動。Pull處理是頗有用的,當鏈接的節點處於防火牆以後,只容許傳出鏈接而不是傳入的鏈接。
批處理的狀態記錄在兩端,源端記錄在SYM_OUTGOING_BATCH表中,目標端記錄在SYM_INCOMING_BATCH表中。批處理狀態記錄在兩方的數據庫中,使得數據複製的問題更容易查找,無論你使用的是哪一種系統。帶有中心節點而且使用遠程節點發送和接收變動的網絡,對於網絡中任何數據複製的錯誤,從中心位置查找更加有利。