oracle 遷移到clickhouse 45億條數據


原文鏈接:http://www.520mwx.com/view/90469

45億數據遷移記錄

  • 背景

    • 數據庫數據量日益增加,逐漸開始顯得很是臃腫,日常查詢統計的時候,僅僅是count(1) 查詢下總數,耗費的時間也在500s左右,而且之前的orcle數據庫,前期建立的時候,也未考慮太多,未進行索引,分表,等優化。后面鑒於種種考慮,以及后期的規划,准備將數據遷移至clickhouse(oracle -> clickhouse)。
    • clickhouse 相關背景
      • ClickHouse是一個用於聯機分析(OLAP)的列式數據庫管理系統(DBMS)。
      • 相關介紹
    • 遷移相關考慮
      • 數據庫現有數據45億
      • 每天還有新數據持續入庫-數據量 3000萬/天
  • 資源

    • 服務器資源 CPU 16C;內存 48G;硬盤 500G磁盤左右,總共3台
  • 准備

    • 開始查看相關的數據遷移工具
      • datax 阿里推出的一個,但是相對而言,社區不是很活躍。相關鏈接
      • waterdrop 社區活躍,作者很用心。再次感謝在使用過程中給與我的幫助 相關鏈接
  • 過程-時間-思考

    1. 選擇方式,與遷移工具

    • 首先,選擇截斷數據日期,進行之前的數據遷移。
    • 最開始看的datax 的相關,這里說下datax的clickhouse官方還沒提供指定的插件,所有無法直接到達clickhouse。
    • 嘗試 oracle -> datax -> mysql -> clickhouse 使用 clickhouse 的insert into ,clickhouse 對mysql 有很好的支持。
      • 嘗試失敗,mysql 數據遷移過去以后,一旦到達億級別,數據庫統計無結果。考慮過,使用datax分任務,分表,但是數據已經45億,分表量太小。花費時間過長。
    • 嘗試 oracle -> datax -> hdfs -> waterdrop -> clickhouse 嘗試使用 datax 遷移數據到hdfs,然后使用 waterdrop 在把數據從 hdfs 到 clickhouse 。
      • 這個是可行的,但是在這期間,我在github 上面發現了其他網友擴展的datax 的 clickhouse 的插件,畢竟這個方案還需要 hdfs 做一步的中轉。
    • 嘗試 oracle -> datax -> clickhouse
      • 在網上查看相關文檔,發現有朋友在github 提供了 datax 的 clickhouse 的插件。參考地址
      • 嘗試相關插件,發現可行。

    1. clickhouse 建表,查看相關優化

    • 了解 clickhouse 的相關表引擎,為遷移建表准備。之前的文檔有相關說明。
      • 着重了解了我們需要使用的表引擎,最后選定引擎 MergeTree(合並樹引擎) Distributed(分布式引擎)
      • MergeTree 后續需要持續落入數據。並且對數據按照時間進行合並,優化效率。參考鏈接
      • Distributed clickhouse 公司這邊建立的是集群,而且分布式引擎,可以並行處理數據,最后在總表會合,效率高。參考鏈接

    1. 准備shell腳本,依次執行腳本,順序執行

    • 這里需要說明,為什么要依次執行?
      • datax 那里可以進行份job,一起執行,但是我這里,沒有選擇並發處理多任務。前期測試的時候,我這邊設置了datax 的一個優化參數線程數 channel 為15 ,同時執行多個任務。但是這樣大數據量並發讀寫操作,給oracle 的服務器,以及遷移的服務器帶來了幾個問題。
        • 多個任務同時讀取oracle ,導致oracle那邊出現了阻塞現象,有的任務已經開始拉取,有的任務遲遲不見開始。
        • 過多的任務,啟動過多的線程,導致linux遷移的服務器最后經常出現cpu 鎖死,任務極度不穩定,進行奔潰,遷移失敗。
    • datax 支持where 條件,准備sql 的where 條件,進行數據庫的 用創建時間進行分割數據,使每個任務的job 拉取數據量保持平衡,過濾一部分無效數據。

    1. 建立臨時表,每個任務的時間分區,對應一個datax 的配置。防止數據拉取過程中某個任務失敗。

    • 我這邊建立clickhouse 的臨時job表,建立了14個, 每個集群所在的節點,是7個,每個datax 在兩台服務器分別順序執行7個任務。
    • 中間會有任務失敗,所有最后拉取完畢以后,查看每個job 的日志,失敗的,進行清表,二次拉取。
    • 全部成功以后,使用 clickhouse 的 insert into 插入之前的建立的正式表,進行數據合並,至此45億數據拉取成功。
  • 總結

    • 遷移過程中,主要耗費時間在前期的工具,以及方案備選,因為之前沒做過此類事情,所以查看每個工具,而后選擇測試的方案也不相同。
  • linux 腳本

echo '開始釋放緩存'

echo 3 > /proc/sys/vm/drop_caches

echo '緩存清理完畢,執行第4次任務'

python2 /home/datax/bin/datax.py --jvm="-Xms3G -Xmx3G" /home/datax/job/job_clickhouse4.json >/home/datax/log/job_clickhouse4.log 2>&1

echo '第4次任務執行完畢'

echo '開始睡眠'

sleep 1h

echo '結束睡眠'

echo '開始釋放緩存'

echo 3 > /proc/sys/vm/drop_caches

echo '緩存清理完畢,執行第5次任務'

python2 /home/datax/bin/datax.py --jvm="-Xms3G -Xmx3G" /home/datax/job/job_clickhouse5.json >/home/datax/log/job_clickhouse5.log 2>&1

echo '第5次任務執行完畢'

 

job 與 臨時表 后面添加后綴 _數字 以方便區分。與任務日志對應。 而這里的睡眠是因為,clickhosue 拉取數據以后,就會整理文件,整理文件會耗費內存以及性能,進行睡眠,先讓他進行整理。

datax的多job 

clickhouse 的分表 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM