宗國福 張歡 許雄
(西北工業大學軟件學院,陜西 西安 710129)
微服務架構風格自2014 年開始推廣后,六年期間出現了無數優秀成果。目前學術界對微服務的架構研究分為三類:一種是研究單體應用遷移到微服務架構應避免的陷阱以及相對應采取的策略[1]。第二種是微服務架構的通用研究。第三種是在微服務架構實際應用中遇到的問題及優化,如H.Song 等人利用侵入式微服務實現SaaS 的深度定制。
微服務的一個重要特點是通常各個微服務的數據存儲都是獨立的。每個服務都在單獨的進程中運行并且可以獨立部署,其配置、數量和服務地址都是不同的。作為一個分布式且松散的架構,微服務在整個團隊中更改其中某個模塊不會破壞整個應用程序。
異構數據庫最簡單的理解是多個數據庫系統的集合,能實現不同數據庫間數據的共享和透明訪問。其異構性可分為多個方面,而本文所提出的異構數據庫是指:多種數據庫間所使用的數據模型、數據模式、數據表結構以及數據類型的差異。
業界對于數據同步沒有嚴格的定義。文獻中指出:“數據同步是一種允許在不同計算機上的多個數據庫之間保持數據庫一致性的技術手段”[4]。在SyncML 協議的白皮書上寫道:“數據同步是一個使得兩個集合中的數據看起來一致的處理過程”。而本文針對課題對數據同步下定義:數據同步是指在不同版本數據庫間保持數據一致性的技術手段。
目前業界針對數據同步的研究現狀,共有三種:1.使用數據庫廠商提供的同步軟件。2.基于數據庫文件導入導出功能同步數據。3.獲取數據庫增量數據進行同步。相比全量同步,獲取到的增量數據是源源不斷的,這樣既減少了網絡帶寬的消耗,也減輕了用戶的處理負擔,同時也是異構數據庫間同步的最優方案。
數據同步是把數據從一個數據庫傳遞到另外一個數據庫中,中間的通道則是連接源端和目標端數據庫的媒介。數據同步流程可以描述為:數據源作為數據同步的源端數據庫,通過操作解析源數據庫的日志文件,轉換為便于數據交換的統一格式,并序列化為二進制格式數據發送到操作隊列中。操作復現模塊從操作隊列中取出日志解析結果,按照其順序在目標數據庫中復現,實現最終的數據同步。
數據庫會記錄下對數據的每一次操作,并存檔下來形成日志文件,以便于對數據的維護和回檔,并提供數據修改的可靠證明。Mysql 在主從復制時,利用的就是數據庫日志文件。主數據庫會按照一定的協議,將記錄下來的日志文件推送到從數據庫中,從數據庫按照日志文件進行操作。
數據庫日志文件解析采用行模式,不僅能監控每條記錄的更改情況,還能讓數據處理的連續性更好,從而降低平均時延。使用了行模式的日志文件由事務組成,在被記錄下來的每一條具體操作語句前,帶有###標識,合理利用這些標識,可以方便地解析出日志文件的每個操作動作。
Canal 是阿里巴巴公司為解決跨機房同步數據而衍生出的項目,可以用作解析Mysql數據庫的Binlog 文件。Canal 內部可以劃分為4 個子模塊:Parser、Sink、Store、Meta。Parser 用于與源端數據庫建立連接,獲取日志文件進行解析。Sink 則負責對解析結果進行加工處理。Store 存儲解析結果,Meta 是對解析出來的結果進行交付統籌。
異構數據庫間的性能往往有所差異,日志解析速度和寫入端數據庫的速度不會完全匹配。因此,可以設置緩存區來兼容兩端解析和寫入的速度。當出現數據同步錯誤時,只需要回退程序,重新消費再次入庫即可。
考慮到源數據庫操作有一定順序,因此緩存區的選取隊列這一數據結構來實現。另外,源數據庫產生的數據有著較大的吞吐量,而單機版的隊列吞吐量較小。因此選取分布式隊列Kafka 來實現數據緩存的作用。
要實現數據的均衡分發,最優方案是消費者數量與隊列分區數一致??紤]到數據同步過程中的數據丟失等異常情況,采用Hash 值分配選區的方法,可以保證同表數據在同一分區內,即對每條數據表名進行Hash 計算取模分配。該方案可以保證出現同步錯誤時受影響的數據會集中在特定分區,回滾操作范圍也能保證在特定分區。但不同表之間的數據量仍有差異,依然會出現數據分配不均勻的問題。假設將m 張表的總數據均勻分配到N 分分區,若不考慮相同表在同一分區,只需均分即可。每個分區的數據量相等,均為:
由于需要保證同一張表數據在同一分區,此時最優方案與均值肯定存在偏差,偏差越小,數據分布越均勻。與最優方案的偏差可以定義為:
其中是分區j 的數據量,要保證最小,只需要保證最小即可,方法如下:
1.將m 張表的數據量從小到大排序,將最大的N 張表分配到N 個選??;
2.新表則分配到數據量最小的分區中,以此類推直到所有表分配完畢。
在分配過程中,每次新的分配都會優先選擇數據量最小的分區,即可減少和的偏差,從而達到均衡分發的目的。
增量數據從源端數據庫的日志文件中被解析出來后,轉換為統一格式的操作信息,均勻分發到分布式隊列中進行緩存,等待消費者消費。當操作復現速度高于解析速度時,數據能夠及時被處理,不容易擠壓在隊列中。
為盡可能提高操作復現速度,本文提出了操作合并優化方法。但首先需要數據庫中的表都有主鍵,保證唯一性的拘束。因為數據同步只需要數據一段時間內的最終狀態,所以可對相同主鍵值的先后操作進行合并,減少需要執行的操作,從而增加單位時間內執行的操作數。又因為通過日志解析有著該次操作的全部字段的數值,合并操作后不會造成某些字段值的丟失。
采用操作合并優化,若數據源在一段時間內對某一主鍵值的記錄頻繁操作,在目標端中會被簡化為一次操作。該主鍵值的中間狀態被丟棄掉,處理量大大減少,執行效率增加,同步效率得到大幅提升。
操作復現模塊包括監聽器、緩存區、操作執行。監聽器負責從隊列中拉取數據,一個進程的不同監聽器都為同一個消費者組。緩存區操作復現模塊中的緩存區,和分布式隊列構成二級緩沖結構。操作執行負責從緩存區中取出緩存塊,把緩存塊中的數據轉換為操作語句,在數據庫中還原操作。
隨著業務需求的變化,初始的底層數據結構不一定滿足現要求。得益于微服務技術的發展,可通過單一服務的升級提升工作效率。但為了滿足用戶對不同版本軟件的使用情況,數據庫版本間的同步問題就顯得格外重要。
本文基于Mysql 數據庫日志,提出混合版本下數據庫的同步方案,此方案分為三步:操作解析、數據分發、操作復現。
數據庫采用Mysql 的行模式來記錄日志獲取增量數據。操作解析后,增量數據會被分發到緩存區中。本文提出的數據均衡分發算法,保證同一個表數據在同一分區中,從而降低同步出錯需要數據回滾而造成的影響。同時,也使得數據在不同分區中分布均勻。緩存區中對數據進行消費后,在目標端進行操作復現。操作復現采用操作合并優化,盡可能提高操作復現的速度。利用數據庫主鍵唯一性約束,合并主鍵相同的操作,從而減少實際需要執行的操作,提升效率。
通過該設計實現了服務多版本間的數據同步問題,既滿足了業務需求又能讓不同版本的用戶產品使用過程中無感知。吉的美好祈愿,將武門神形象以及故宮貓與創意賀卡進行結合,突顯武門神威武的形象以及故宮貓的憨態可掬,也有利于故宮博物館文化的傳承與發展。