一個多平臺,輕巧,高性能mysql數據同步補償工具發布-cupid

簡介

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左右

項目地址

cupid-go

項目使用

只需按照模版根據自身需要修改一個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即可。

pushbear官網

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容