簡介
cupid-go是一個消息同步補償工具,多平臺,高性能,內存小,適用于在canal
這類的實時同步數據中間件之外的同步補償工具,也適用于實時緩存這類的及時更新工具,對數據同步進行雙保險,一般canal
的延遲在毫秒左右,cupid
建議設置在秒左右,做補償專用,canal
的消費端嵌入業務代碼可以更方便開發和消費,cupid
作為更通用的補償方案,所以建議不要嵌入業務代碼,補償機制采用http回調來保證,失敗會重試直到成功,若回調失敗會通知(目前采用pushbear
微信即時通知,簡單即時)。
項目采用go編寫,并且已打包好windows
,linux
,mac
版本,可直接到項目里直接下載使用,文件大小大約2M左右,占用內存10M左右,即下即用,不依賴環境。
cupid-go,mac-windows,linux下載地址
項目壓測
對線上520w的表數據進行測試,大約25分鐘處理加回調完成(回調完全成功不存在重試),內存消耗維持在10MB以下,vmRSS在11MB左右
項目地址
項目使用
只需按照模版根據自身需要修改一個json文件,然后啟動即可
模版文件大致如下
{
"workerNumber": 3, //最低值3,前2個進程是manager和callback進程,之后的才是處理進程
"logDir": "/tmp", //日志目錄,進程日志會打印到該目錄下
"failureJobRetrySecond": 10, //失敗隊列重試間隔
"src": {
"dsn": "user:password@tcp(127.0.0.1:3306)/db?charset=utf8",//數據庫dsn配置
"table": "user",//我們關注的數據庫表
"byColumn": "number",//通過該字段對應des的byColumn,進行比對
"insert": true, //是否關注insert的數據
"insertIntervalMillisecond": 2000, //檢查insert更新的間隔時間,單位毫秒
"update": true, //是否關注update數據,若為false,則下面update開頭的字段可以不用
"updateColumn": "update_time", //update為true時必填,更新的字段名,需要添加索引,不然會掃描全表
"updateIntervalMillisecond": 2000, //update為true時必填,檢查update更新的間隔時間,單位毫秒
"updateScanSecond": 5, //update為true時必填,獲取數據的時間間隔,當前時間減去updateScanSecond設的時間為開始時間,當前時間為結束時間
"updateTimeFormate": "Y-m-d H:i:s", //update為true時必填,數據庫里數據更新字段的時間格式
"cacheFilePath": "/tmp", //若進程有異常退出或者重啟,會把當前的遍歷信息記錄到緩存文件中,重啟時直接讀取緩存文件
"pushbearSendKey": "9724-73bdacb319007f53f83d0123"http://若需要pushbear推送微信消息,在這填寫
},
"des": [//des是一個數組,意味著我們可同時比對多個數據表
{
"dsn": "user:password@tcp(127.0.0.1:3306)/db2?charset=utf8",//數據庫dsn配置
"table": "user",//我們同步的數據庫表
"columns": { //關注和同步表的字段對應關系
"number": "number",
"name": "name",
"avatar": "avatar"
},
"byColumn": "number",//與src的byColumn相呼應,形成關聯關系來比對
"callbackNotification": {
"url" : "127.0.0.1:20000/test/callback"http://當數據不同步時的回調地址
}
}
]
}
在項目里有一個testConfig.json文件,可直接修改使用
啟動命令
./cupid -c /tmp/myConfig.json -s 1
-
-c 或者
--configPath
(必須): config配置的路徑,需要絕對路徑 ,對config配置有問題可以看文檔或者testConfig.json -
-s或者
--startId
(非必須): 起始的數據庫表id, 優先級: shell命令傳入的start_id > 默認值1
幫助命令
./cupid -h
數據重試
當數據回調失敗或處理失敗時,會將數據放入失敗隊列,等待重試,若此時進程退出,數據會持久化到硬盤中,等待下次啟動重試
進程正常退出或異常退出
會將所有失敗隊列里的任務持久化到本地文件中,以便下次啟動時重新推入失敗隊列重試,持久化配置參見config.json
錯誤數據回調
當數據比對后發現數據存在異常時,會采用http回調,需要在json里配置,回調采用的是POST
形式,Content-Type 為 application/json
{
"type" : 1,
"srcColumn" : {
"column1": "1",
"column2": "2",
"column3": null
}
}
- type, 指的是變更類型,insert是1,update是2
- srcColumn, 指的是源數據列,會把整個源數據傳給你, 需要注意的一點 srcColumn傳的值若有的都是string類型,沒有則是null
微信推送
微信推送采用pushbear
, 一個基于微信模板的一對多消息送達服務,使用簡單,高效,只需要申請一個key即可。
supervisord 管理
該項目比較適合搭配supervisord使用,基本上配置文件應該如下
[program:cupid.synchronization-compensation-tool]
directory=/tmp
command=/tmp/cupid -c /tmp/myConfig.json -s 1
numprocs=1
autorestart=true
stopsignal=TERM
stopwaitsecs=2
killasgroup=true
user=nobody
stdout_logfile=/tmp/cupid.synchronization-compensation-tool.log
redirect_stderr=true
loglevel=debug
如果你不用supervisord, 建議重啟進程時使用kill -s SIGTERM $master_pid
注意事項
- config.json里的
updateColumn
,需要先添加索引,不然會掃描全表 - 回調接口時,傳的srcColumn, 指的是源數據列,會把整個源數據傳給你, 需要注意的一點 srcColumn傳的值若有的都是string類型,沒有則是null
- 所有在自定義時間間隔失敗重試隊列超過三次仍未成功的任務會推送到10分鐘重試隊列里
最后
- 求各位大大的 愛心 和 star
- 若有任何問題可直接評論,私信或者github