原文鏈接: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 的相關,這里說下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 的插件。參考地址
- 嘗試相關插件,發現可行。
- clickhouse 建表,查看相關優化
- 了解 clickhouse 的相關表引擎,為遷移建表准備。之前的文檔有相關說明。
- 准備shell腳本,依次執行腳本,順序執行
- 這里需要說明,為什么要依次執行?
- datax 那里可以進行份job,一起執行,但是我這里,沒有選擇並發處理多任務。前期測試的時候,我這邊設置了datax 的一個優化參數線程數 channel 為15 ,同時執行多個任務。但是這樣大數據量並發讀寫操作,給oracle 的服務器,以及遷移的服務器帶來了幾個問題。
- 多個任務同時讀取oracle ,導致oracle那邊出現了阻塞現象,有的任務已經開始拉取,有的任務遲遲不見開始。
- 過多的任務,啟動過多的線程,導致linux遷移的服務器最后經常出現cpu 鎖死,任務極度不穩定,進行奔潰,遷移失敗。
- datax 那里可以進行份job,一起執行,但是我這里,沒有選擇並發處理多任務。前期測試的時候,我這邊設置了datax 的一個優化參數線程數 channel 為15 ,同時執行多個任務。但是這樣大數據量並發讀寫操作,給oracle 的服務器,以及遷移的服務器帶來了幾個問題。
- datax 支持where 條件,准備sql 的where 條件,進行數據庫的 用創建時間進行分割數據,使每個任務的job 拉取數據量保持平衡,過濾一部分無效數據。
- 建立臨時表,每個任務的時間分區,對應一個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 的分表