高可用數據同步方案-SqlServer遷移Mysql實戰


簡介

隨着業務量的上升,以前的架構已經不滿足業務的發展,數據作為業務中最重要的一環,需要有更好的架構作為支撐。目前我司有sql server轉mysql的需求,所以結合當前業務,我挑選了阿里雲開源的一個很好用的同步工具DataX

DataX介紹

DataX 是一個異構數據源離線同步工具,致力於實現包括關系型數據庫(MySQL、Oracle等)、HDFS、Hive、MaxCompute(原ODPS)、HBase、FTP等各種異構數據源之間穩定高效的數據同步功能。

框架設計

datax_framework_new
datax_framework_new

DataX本身作為離線數據同步框架,采用Framework + plugin架構構建。將數據源讀取和寫入抽象成為Reader/Writer插件,納入到整個同步框架中。

  • Reader:Reader為數據采集模塊,負責采集數據源的數據,將數據發送給Framework。
  • Writer: Writer為數據寫入模塊,負責不斷向Framework取數據,並將數據寫入到目的端。
  • Framework:Framework用於連接reader和writer,作為兩者的數據傳輸通道,並處理緩沖,流控,並發,數據轉換等核心技術問題。

實戰

下載安裝部署

$ wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
$ tar zxvf datax.tar.gz
$ sudo chmod -R 755 {YOUR_DATAX_HOME}

也可以自己下載源碼安裝,不過需要安裝maven

$ git clone git@github.com:alibaba/DataX.git
$ cd {DataX_source_code_home}
$ mvn -U clean package assembly:assembly -Dmaven.test.skip=true

打包成功后的DataX包位於 {DataX_source_code_home}/target/datax/datax/ ,結構如下:

$ cd {DataX_source_code_home}
$ ls ./target/datax/datax/
bin conf job lib log log_perf plugin

配置

你需要編寫一個基本信息配置文件,文件包括原庫到寫入庫的表字段對應關系。基本信息包括

{
"job": {
"content": [
{
"reader": { //讀入庫配置,比如說是sql server
"name": "", //數據源名稱,別瞎寫
"parameter": {} //數據庫配置信息
},
"writer": { //寫入庫配置,比如說是mysql
"name": "", //數據源名稱,別瞎寫
"parameter": {} //數據庫配置信息
}
}
],
"setting": { //基本設置
"speed": { //流量控制
"channel": 1, //同步時候的並發數
"byte": 104857600 //同步時候的字節大小,影響速度
},
"errorLimit": { //臟數據控制
"record": 10, //臟數據最大記錄數閾值
"percentage": 0.05 //臟數據占比閾值
}
}
}
}

下面給一個配置demo,大家根據自己的需要修改demo,然后使用

{
"job": {
"setting": {
"speed": {
"byte": 1073741824
}
},
"content": [
{
"reader": {
"name": "sqlserverreader",
"parameter": {
"username": "root", //自己根據需要修改數據庫用戶名
"password": "admin", //密碼
"where": "",
"connection": [
{
"querySql": [
"SELECT Id,MyReasonId,MyProductType,MyReason FROM dbo.MyReason WITH ( NOLOCK )"
],//全量sql,根據自己需要寫增量sql也可以
"jdbcUrl": [
"jdbc:sqlserver://192.168.1.1:1433;DatabaseName=XXXX"
]//自己根據需要修改數據庫連接
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert", //寫入模式,這里寫插入
"username": "root",//自己根據需要修改數據庫用戶名
"password": "admin",//密碼
"column": [
"id", //注意與上面的列一一對應
"my_reason_id",
"my_product_type",
"my_reason"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://192.168.1.2:3306/XXX?useUnicode=true&characterEncoding=utf-8",
"table": [
"my_reason"
]
}
]
}
}
}
]
}
}

編輯好之后,放到新建work目錄里面,然后存為mssql_to_mysql.json,下面就可以運行了

運行

$ cd {YOUR_DATAX_HOME}/bin
$ python datax.py ../work/mssql_to_mysql.json

同步結束,顯示日志如下:

...
2015-12-17 11:20:25.263 [job-0] INFO JobContainer -
任務啟動時刻 : 2015-12-17 11:20:15
任務結束時刻 : 2015-12-17 11:20:25
任務總計耗時 : 10s
任務平均流量 : 205B/s
記錄寫入速度 : 5rec/s
讀出記錄總數 : 50
讀寫失敗總數 : 0

這樣就說明成功啦

進階

job配置

將你需要同步的增量數據放入到安裝目錄job下面,存為myjob.json,名稱隨意

linux下通過crontab命令實現

#查看crond服務是否啟動,出現以下日志表示已啟動
$/sbin/service crond status
crond (pid 30742) is running...
  • 第一步:創建作業的配置文件(json格式) 參考上節內容。這里假設已配置好MySQL到ODPS的配置文件mysql2odps.json

  • 第二步:列出列出crontab文件,命令: crontab -l
    (1)若出現以下日志,表示當前用戶沒有定時任務,用戶需要新建crontab文件,並提交crontab文件,參考第三步。

    $crontab -l
    no crontab for xxx

​ (2)若出現以下日志,表示當前用戶已經有正在運行的定時任務,用戶只需用命令crontab -e 來編輯crontab文件,參考第四步。 shell $ crontab -l 0,10,20,35,44,50 * * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.date +\%Y\%m\%d\%H\%M\%S2>&1

  • 第三步:若當前用戶沒有定時任務(之前從未創建過crontab任務)

    (1)創建一個新的crontab文件,如取名crondatax

    ​ 示例1:每天13點5分進行同步作業,並把運行日志輸出到目錄/home/hanfa.shf/下log.運行時間 文件中,如定時運行是在2016-3-26 13:10:13運行的,產生的日志文件名為:log.20160326131023

    $ vim crondatax
    #輸入以下內容
    5 13 * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 2>&1
    #/home/admin/datax3/bin/datax.py 表示你安裝的DataX datax.py所在目錄(請替換為您真實的絕對路徑目錄);
    #/home/admin/mysql2odps.json 表示作業的配置文件目錄(請替換為您真實的絕對路徑目錄);
    #/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 表示日志輸出位置,並以log.當前時間 命名(請替換為您真實的絕對路徑目錄)

    (2)提交你剛剛創建的crontab文件

    shell $ crontab crondatax #crondatax 你創建的crontab文件名

    (3)重啟crontab服務

    shell $ sudo /etc/init.d/crond restart Stopping crond: [ OK ] Starting crond: [ OK ]

    (4)在13點5分過后,在日志目錄會看到對應的日文件 shell $ ls -al /home/hanfa.shf/ -rw-r--r-- 1 hanfa.shf users 12062 Mar 26 13:05 log.20160326130501

  • 第四步:若當前用戶已有定時任務(想繼續增加定時任務)
    (1)編輯已有crontab文件
    示例2:每10分鍾運行一次同步任務,並把運行日志輸出到目錄/home/hanfa.shf/下log.運行時間 文件中,如定時運行是在2016-3-26 13:10:13運行的,產生的日志文件名為:log.20160326131023

    $ crontab -e
    #會進入已有crontab文件編輯界面,繼續增加定時任務即可,本示例增加以下內容,並保存
    0,10,20,30,40,50 * * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 2>&1

    (2)重啟crontab服務

$ sudo /etc/init.d/crond restart 

​ (3)用crontab -l 命令檢查是否添加成功

 $ crontab -l
5 13 * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 2>&1
0,10,20,30,40,50 * * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/h

進階內容引自官方教程 ^_^


免責聲明!

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



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