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

簡介

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

DataX介紹

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

框架設計

datax_framework_new
datax_framework_new

DataX自己做爲離線數據同步框架,採用Framework + plugin架構構建。將數據源讀取和寫入抽象成爲Reader/Writer插件,歸入到整個同步框架中。linux

  • 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}

也能夠本身下載源碼安裝,不過須要安裝mavengit

$ 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/ ,結構以下:github

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

配置

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

{
"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,而後使用shell

{
"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

同步結束,顯示日誌以下: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

這樣就說明成功啦vim

進階

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

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

相關文章
相關標籤/搜索