在數據倉庫建模中,未經任何加工處理的原始業務層數據,我們稱之為ODS(Operational Data Store)數據。在互聯網企業中,常見的ODS數據有業務日志數據(Log)和業務DB數據(DB)兩類。對於業務DB數據來說,從MySQL等關系型數據庫的業務數據進行采集,然后導入到Hive中,是進行數據倉庫生產的重要環節。
如何准確、高效地把MySQL數據同步到Hive中?一般常用的解決方案是批量取數並Load:直連MySQL去Select表中的數據,然后存到本地文件作為中間存儲,最后把文件Load到Hive表中。這種方案的優點是實現簡單,但是隨着業務的發展,缺點也逐漸暴露出來:
-
性能瓶頸:隨着業務規模的增長,Select From MySQL -> Save to Localfile -> Load to Hive這種數據流花費的時間越來越長,無法滿足下游數倉生產的時間要求。
-
直接從MySQL中Select大量數據,對MySQL的影響非常大,容易造成慢查詢,影響業務線上的正常服務。
-
由於Hive本身的語法不支持更新、刪除等SQL原語,對於MySQL中發生Update/Delete的數據無法很好地進行支持。
為了徹底解決這些問題,我們逐步轉向CDC(Change Data Capture)+ Merge的技術方案,即實時Binlog采集 + 離線處理Binlog還原業務數據這樣一套解決方案。Binlog是MySQL的二進制日志,記錄了MySQL中發生的所有數據變更,MySQL集群自身的主從同步就是基於Binlog做的。
本文主要從Binlog實時采集和離線處理Binlog還原業務數據兩個方面,來介紹如何實現DB數據准確、高效地進入數倉。