Alibaba 資料庫遷移開源工具 Datax 安裝和使用

其名發表於2022-11-23

起因

事情是這樣的,服務商有一批資料,現在的資料量大致為 2 千萬條(單表),每天都會增加資料(增加多少暫不知道),但是呢給我們提供的查詢不是一張資料表而是一張檢視,我們再根據這個資料對外提供一個查詢服務。因為是檢視查詢的時候就比較慢,我們也沒有許可權進行表的最佳化,所以就需要將資料同步到我們本地資料庫,在本地進行資料表的最佳化(加索引等等的),但是資料量是 2 千萬多,就需要一個工具來把遠端資料同步到本地,然後在 github 上發現了 Datax,就按照文件

依賴關係

  • Linux
  • JDK(1.8 以上,推薦 1.8)
  • Python(2或3都可以)

jdk 安裝

JDK1.8 華為映象下載地址

解壓重新命名

解壓重名為 java1.8 並移動到 /usr/local 目錄下 /usr/local/java1.8

執行環境配置

vim ~/.bashrc


# 寫入一下內容
export JAVA_HOME=/usr/local/java1.8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

# 執行 source
source ~/.bashrc

# 檢視版本
java -version

java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

Python 安裝

Python 在 Ubuntu 系統上已經預設安裝了,可以使用命令 python -Vpython3 -V 檢視當前版本。

可以使用命令 apt install python3 安裝 Python3。也可以自己使用編譯的方式安裝。

datax 安裝

DataX Github 地址

Datax 下載地址

可以直接下載工具包,不需要再編譯安裝,可以直接使用。

驗證是否安裝成功

輸入

python3 /usr/local/datax/bin/datax.py /usr/local/datax/job/job.json

輸出

2022-11-21 14:05:28.828 [job-0] INFO  JobContainer - PerfTrace not enable!
2022-11-21 14:05:28.829 [job-0] INFO  StandAloneJobContainerCommunicator - Total 100000 records, 2600000 bytes | Speed 261.91KB/s, 20000 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 0.070s |  All Task WaitReaderTime 0.068s | Percentage 100.00%
2022-11-21 14:05:28.829 [job-0] INFO  JobContainer - 
任務啟動時刻                    : 2022-11-21 14:05:18
任務結束時刻                    : 2022-11-21 14:05:28
任務總計耗時                    :                 10s
任務平均流量                    :          253.91KB/s
記錄寫入速度                    :          10000rec/s
讀出記錄總數                    :              100000
讀寫失敗總數                    :                   0

job.json 檔案解析

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",# 讀端,這個 name 不能 streamreader 會報錯的
                    "parameter": {
                        "username": "",# 使用者
                        "password": "",# 密碼
                        "connection": [
                            {
                                "jdbcUrl": [],# 連線資訊,貌似可以連線多個資料庫,沒有進行測試
                                "table": []# 資料表
                            }
                        ], 
                        "column": ["*"],# 需要同步的列 (* 表示所有的列)
                        "where": " id >= 500000 and id < 500100 "# 描述篩選條件,多個表時不適用
                    }
                }, 
                "writer": {
                    "name": "mysqlwriter",# 寫端
                    "parameter": {
                        "username": "",# 賬號
                        "password": "", # 密碼
                        "writeMode": "insert",# 操作型別,可選:【insert | replace | update】
                        "connection": [
                            {
                                "jdbcUrl": "", # 連線資訊,這個連線資訊最好是這樣寫,否則會出錯
                                "table": []# 資料表
                            }
                        ], 
                        "column": ["*"],# 需要同步的列,要和 reader 中的欄位一致
                        "preSql": [],# 同步前操作,是 sql 語句
                        "postSql": [],# 同後前操作,是 sql 語句
                        "session": [] # 設定 session,是 sql 語句
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": 1 # 指定併發數,目前不知道什麼作用,有知道的可以告知下
            }
        }
    }
}

job.json 示例

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "datax2",
                        "password": "datax2",
                        "connection": [
                            {
                                "jdbcUrl": [
                                    "jdbc:mysql://192.168.0.174:3306/datax2?useUnicode=true&characterEncoding=utf8"
                                ],
                                "table": [
                                    "user"
                                ]
                            }
                        ],
                        "column": [
                            "*"
                        ]
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "username": "datax",
                        "password": "datax",
                        "writeMode": "insert",
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://192.168.0.174:3306/datax?useUnicode=true&characterEncoding=utf8",
                                "table": [
                                    "user"
                                ]
                            }
                        ],
                        "column": [
                            "*"
                        ]
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": 2
            }
        }
    }
}

增量同步建議

對於增量同步資料,建議每張表有單獨的 job.json 配置檔案,記錄上次同步的最大的 ID,在 reader.where 進行判斷 id > last_max_sync_id
where 示例,適用於單表的情況:

{
    "parameter": {
        "where": " id > last_max_sync_id "
    }
}

針對失敗資料的處理方式

Datax 在同步過程中,失敗的資料會寫入到 /datax/log/ 檔案中,並認定為 髒資料,可以從日誌 髒資料 中抽離出失敗資料的內容組成 sql 語句,或者找出 主鍵ID 再去查詢同步。

失敗資料日誌內容如下:

2022-11-22 09:52:50.696 [0-0-0-writer] ERROR StdoutPluginCollector - 髒資料: 
{
    "exception":"Incorrect integer value: 'inno' for column 'id' at row 1",
    "record":[
        {
            "byteSize":8,
            "index":0,
            "rawData":"inno",
            "type":"STRING"
        },
        {
            "byteSize":32,
            "index":1,
            "rawData":"9ddfaac20670c9sda5s1d5a587fc40f104",
            "type":"STRING"
        },
        {
            "byteSize":14,
            "index":2,
            "rawData":"手持裝置呼叫",
            "type":"STRING"
        },
        {
            "byteSize":4,
            "index":3,
            "rawData":9243,
            "type":"LONG"
        },
        {
            "byteSize":3,
            "index":4,
            "rawData":441,
            "type":"LONG"
        },
        {
            "byteSize":5,
            "index":5,
            "rawData":"admin",
            "type":"STRING"
        },
        {
            "byteSize":32,
            "index":6,
            "rawData":"49b1d2b5ds1d5a1s1d5a7414890ad2",
            "type":"STRING"
        },
        {
            "byteSize":1,
            "index":7,
            "rawData":1,
            "type":"LONG"
        },
        {
            "byteSize":61,
            "index":8,
            "rawData":"[[\"app_id\", \"=\", \"yuan\"], [\"id_name\", \"like\", \"%天華%\"]]",
            "type":"STRING"
        },
        {
            "byteSize":127,
            "index":9,
            "rawData":"SELECT COUNT(*) AS count FROM `device_request_history` WHERE  `app_id` = 'yuan'  AND `id_name` LIKE '%天華%' LIMIT 1",
            "type":"STRING"
        },
        {
            "byteSize":8,
            "index":10,
            "rawData":1668575331000,
            "type":"DATE"
        }
    ],
    "type":"writer"
}

關於讀取檢視資料到本地的方式

檢視讀取問題

Datax 可以從 reader 中讀取檢視資料,但是無法讀取 writer 中的檢視資料結構元資訊,為了確保資料能夠同步成功,需要先校驗資料表結構一致性, Datax 需要判斷寫入目的表的資料結構是否和讀取源資料表的結構一致。

針對檢視讀取問題處理方案

可以在目的資料庫中新建資料表,新建資料表的結構和源資料檢視的結構一致,這樣 Datax 在校驗資料表結構和檢視結構一致性時就可以透過。

20000000 條資料實測案例

同步方案

為了方便測試,將 2 千萬條資料按照 10 次進行同步(按照自己的實際情況來,可以一次性進行同步)。

方案劃分

id > 0 and id <= 2000000
id > 2000000 and id <= 4000000
id > 4000000 and id <= 6000000
id > 6000000 and id <= 8000000
id > 8000000 and id <= 10000000
id > 10000000 and id <= 12000000
id > 12000000 and id <= 14000000
id > 14000000 and id <= 16000000
id > 16000000 and id <= 18000000
id > 18000000 and id <= 20000000

id > 0 and id <= 2000000

這個 id 之間資料有斷層。缺少 144 條資料。

2022-11-23 14:58:06.418 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2022-11-23 14:53:34
任務結束時刻                    : 2022-11-23 14:58:06
任務總計耗時                    :                271s
任務平均流量                    :            1.28MB/s
記錄寫入速度                    :           7406rec/s
讀出記錄總數                    :             1999856
讀寫失敗總數                    :                   0

id > 2000000 and id <= 4000000

2022-11-23 15:03:39.879 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2022-11-23 14:59:08
任務結束時刻                    : 2022-11-23 15:03:39
任務總計耗時                    :                271s
任務平均流量                    :            1.28MB/s
記錄寫入速度                    :           7407rec/s
讀出記錄總數                    :             2000000
讀寫失敗總數                    :                   0

id > 4000000 and id <= 6000000

這個 id 之間資料有斷層。缺少 13 條資料。

2022-11-23 15:09:38.418 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2022-11-23 15:04:56
任務結束時刻                    : 2022-11-23 15:09:38
任務總計耗時                    :                282s
任務平均流量                    :            1.24MB/s
記錄寫入速度                    :           7142rec/s
讀出記錄總數                    :             1999987
讀寫失敗總數                    :                   0

id > 6000000 and id <= 8000000

2022-11-23 15:17:05.814 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2022-11-23 15:12:14
任務結束時刻                    : 2022-11-23 15:17:05
任務總計耗時                    :                291s
任務平均流量                    :            1.19MB/s
記錄寫入速度                    :           6896rec/s
讀出記錄總數                    :             2000000
讀寫失敗總數                    :                   0

id > 8000000 and id <= 10000000

2022-11-23 15:22:41.729 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2022-11-23 15:17:30
任務結束時刻                    : 2022-11-23 15:22:41
任務總計耗時                    :                311s
任務平均流量                    :            1.12MB/s
記錄寫入速度                    :           6451rec/s
讀出記錄總數                    :             2000000
讀寫失敗總數                    :                   0

id > 10000000 and id <= 12000000

這個 id 之間資料有斷層。缺少 462 條資料。

2022-11-23 15:29:08.710 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2022-11-23 15:23:56
任務結束時刻                    : 2022-11-23 15:29:08
任務總計耗時                    :                311s
任務平均流量                    :            1.12MB/s
記錄寫入速度                    :           6450rec/s
讀出記錄總數                    :             1999538
讀寫失敗總數                    :                   0

id > 12000000 and id <= 14000000

2022-11-23 15:34:23.699 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2022-11-23 15:29:42
任務結束時刻                    : 2022-11-23 15:34:23
任務總計耗時                    :                281s
任務平均流量                    :            1.24MB/s
記錄寫入速度                    :           7142rec/s
讀出記錄總數                    :             2000000
讀寫失敗總數                    :                   0

id > 14000000 and id <= 16000000

2022-11-23 15:39:16.394 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2022-11-23 15:34:54
任務結束時刻                    : 2022-11-23 15:39:16
任務總計耗時                    :                261s
任務平均流量                    :            1.33MB/s
記錄寫入速度                    :           7692rec/s
讀出記錄總數                    :             2000000
讀寫失敗總數                    :                   0

id > 16000000 and id <= 18000000

2022-11-23 15:45:19.011 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2022-11-23 15:40:07
任務結束時刻                    : 2022-11-23 15:45:19
任務總計耗時                    :                311s
任務平均流量                    :            1.12MB/s
記錄寫入速度                    :           6451rec/s
讀出記錄總數                    :             2000000
讀寫失敗總數                    :                   0

id > 18000000 and id <= 20000000

2022-11-23 15:51:07.983 [job-0] INFO  JobContainer -
任務啟動時刻                    : 2022-11-23 15:45:56
任務結束時刻                    : 2022-11-23 15:51:07
任務總計耗時                    :                311s
任務平均流量                    :            1.09MB/s
記錄寫入速度                    :           6276rec/s
讀出記錄總數                    :             1945569
讀寫失敗總數                    :                   0

相關文章