需求
在我們的實際業務中,業務數據大部分是通過傳統DB做持久化,但有時會使用Solr/Elastic Search等做搜索、緩存等其他服務,那么如何將數據同步到這些異構的存儲系統中呢?
這就是我最近在學習的一個東西,要想讓數據非常穩定、高效、低延時的同步,並非一件易事(對於我來說是這樣,如果你有非常成熟的方案,請務必要推薦給我!!!)。
這個系列將會以SQL SEVER同步到ELK為例,嘗試一下各種不同的方案,在寫本篇時,還只是理論研究階段,所以未來這篇文章如果寫不下去了,希望大家諒解,畢竟SQL SERVER的方案實在太少了。
常見思路
一般來說,解決該問題的常見思路有以下幾種(歡迎補充):
- 利用數據庫觸發器,在需要監聽的字段或表上創建觸發器
- 使用數據庫的一些特性,比如本篇想說的SQL Server CDC,或者MySQL的Bin Log等
- 在程序中修改DB數據的地方,同時修改搜索引擎中的數據
- 利用DB中的LastModifyTime之類的字段來追蹤變更
但上述方案均有不同程度的優勢和不足:
方案1:
優:簡單,而且主流數據庫都支持觸發器,方案較為通用。
劣:觸發器這三個字一說出來,就會想到性能差。沒錯,該方案雖然簡單,但性能是個大問題,基本上DBA是不允許你在PRD搞觸發器這種東西的。
方案2:
優:可靠性較高,而且大部分數據庫有辦法對數據變化進行排序,不需要額外處理順序問題
劣:不同的數據庫機制不一致,如果一套系統涉及多種存儲方式,那就得考慮和研究多種變更監測方式,如果數據庫不支持或支持的不好,這種方式也基本上就不太容易往下進行了。
而且這種方式有時候也會帶來一些額外的DB開銷,比如SQL SERVER的CDC可能會導致DB死鎖和DB文件占用空間變大的問題。
方案3:
優:能輕松應對不同數據庫和多份額外存儲(存儲到多種大數據、緩存等產品中),實時性較高,甚至可以犧牲性能來保證多種產品同時存儲完成。
劣:需要對程序進行較大的實現方案調整,而且該方式會導致無法直接修改DB中的數據,會給運維帶來一定的麻煩,除非有比較完善的運維工具來協助。
方案4:
優:方案非常簡單,任何一種數據庫都能支持,也能滿足運維時直接對DB中數據的操作需求。
劣:需要依賴DB中的特定字段,可能會涉及到原有表結構的修改。在刪除數據時無法通過這種方式獲得數據的變更
現有方案情況
MySQL的數據庫同步方案,有阿里巴巴開源的比較成熟的Canal(https://github.com/alibaba/canal),其他國內的大廠也有不少的開源產品。
BUT,SQL SERVER就尷尬了,除了微軟的一些文檔,其他的方案少之又少,更別說像阿里這樣的大廠的方案了,所以本着嘗試的態度,開了這樣一篇博客,希望對后人研究有些幫助吧~
BUT,還是有一些通用的基於JDBC的產品,比如ELK系列中的L(LogStash), SQL SERVER可以湊合的使用,接下來我將會做一些嘗試,來同步SQL SERVER和ELK中的數據。