分布式集群項(xiàng)目中同步DB數(shù)據(jù)的解決方案之Canal

業(yè)務(wù)場(chǎng)景描述

在我們的項(xiàng)目中有些配置信息持久化在數(shù)據(jù)庫(kù)中株旷,這些配置信息又是在系統(tǒng)啟動(dòng)后自動(dòng)加載并緩存在local或者Redis中,但如果后臺(tái)運(yùn)營(yíng)系統(tǒng)進(jìn)行了相應(yīng)更新配置操作尔邓,我們需要實(shí)現(xiàn)“熱部署”或“熱插拔”等功能的話晾剖,我們有哪些方案可以實(shí)現(xiàn)呢?單機(jī)項(xiàng)目就非常簡(jiǎn)單了梯嗽,但分布式集群的項(xiàng)目怎么辦呢齿尽?

分布式集群的項(xiàng)目之間同步數(shù)據(jù),我們來(lái)講一下有哪些方案解決灯节。

方案一:項(xiàng)目程序中對(duì)DB進(jìn)行操作后循头,留一個(gè)后門接口進(jìn)行刷新操作,針對(duì)不同機(jī)器的IP進(jìn)行輪詢或點(diǎn)對(duì)點(diǎn)刷新同步操作炎疆。其簡(jiǎn)單卡骂,就是再次進(jìn)行一次DB查詢操作,該接口的安全性也需要留神形入,比較low全跨。

方案二:項(xiàng)目程序中對(duì)DB進(jìn)行操作時(shí),通過(guò)切面或者自帶調(diào)用一個(gè)異步方法將數(shù)據(jù)發(fā)送給MQ或者緩存Redis等中間件亿遂,再由另一個(gè)程序去監(jiān)聽(tīng)并讀入到本地緩存或者公共緩存浓若。其簡(jiǎn)單但不穩(wěn)定盒使,如果忘了通知或者通知MQ失敗了或者事務(wù)回滾了,要謹(jǐn)慎和想完全其處理邏輯七嫌。

方案三:使用阿里的Canal等成熟的基于數(shù)據(jù)庫(kù)日志增量訂閱&消費(fèi)的中間件進(jìn)行獨(dú)立有效的數(shù)據(jù)同步少办。其簡(jiǎn)單,可獨(dú)立立項(xiàng)诵原,更解耦更成熟英妓,但缺點(diǎn)是屬于Java方向,暫時(shí)支持的數(shù)據(jù)庫(kù)為MySQL绍赛,后文也將重點(diǎn)介紹這個(gè)方案蔓纠。

方案四:使用成熟的分布式系統(tǒng)的協(xié)調(diào)中間件Zookeeper等的環(huán)境變量進(jìn)行簡(jiǎn)單配置信息管理。

以上所說(shuō)的四種方案吗蚌,可以相互結(jié)合使用腿倚,也可以單獨(dú)使用,沒(méi)有最終的方案蚯妇,只有適合不是適合而已敷燎,因人而異。

方案一和二的主要是在代碼層面和主流的消息或緩存中間件之間的搭配箩言,方案四主要是增加相關(guān)環(huán)境變量屬性硬贯,我們就不多說(shuō)了,接下來(lái)我們還是重點(diǎn)介紹一下方案三陨收。

Canal是阿里巴巴團(tuán)隊(duì)基于數(shù)據(jù)庫(kù)日志增量訂閱&消費(fèi)的框架饭豹。純java開(kāi)發(fā)的,基于數(shù)據(jù)庫(kù)增量日志解析务漩,提供增量數(shù)據(jù)訂閱&消費(fèi)拄衰,目前主要支持了MySQL。

Github:https://github.com/alibaba/canal

Canal的工作原理

原理相對(duì)比較簡(jiǎn)單饵骨,你也可以舉一反三封裝其他DB中間件:

Canal模擬MySQL slave的交互協(xié)議翘悉,偽裝自己為MySQL slave,向MySQL master發(fā)送dump協(xié)議

MySQL master收到dump請(qǐng)求宏悦,開(kāi)始推送binary log給slave(也就是Canal)

Canal解析binary log對(duì)象(原始為byte流)

Canal的安裝及使用

Canal的原理是基于MySQL binlog技術(shù)镐确,所以這里一定需要開(kāi)啟MySQL的binlog寫入功能,建議配置binlog模式為row饼煞。

修改MySQL配置:vim ./etc/mysql/my.cnf

[mysqld]

log-bin=mysql-bin #添加這一行就ok

binlog-format=ROW #選擇row模式

server_id=1 #配置mysql replaction需要定義,不能和Canal的slaveId重復(fù)

Canal的原理是模擬自己為MySQL slave诗越,所以這里一定需要做為MySQL slave的相關(guān)權(quán)限砖瞧。

CREATE USER canal IDENTIFIED BY 'canal';

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';

-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;

FLUSH PRIVILEGES;

下載最新Release版本:https://github.com/alibaba/canal/releases/download/canal-1.0.22/canal.deployer-1.0.22.tar.gz

解壓相關(guān)文件并進(jìn)行config配置:

解壓指令:

mkdir ~/tmp/canal

tar zxvf canal.deployer-1.0.22.tar.gz -C ~/tmp/canal

目錄結(jié)構(gòu):

修改配置:vi ~/tmp/canal/conf/example/instance.properties

啟動(dòng)Cannal和查看相關(guān)日志:

啟動(dòng):sh ~/tmp/canal/bin/startup.sh

查看日志:tail -f ~/tmp/canal/logs/canal/canal.log

tail -f ~/tmp/canal/logs/example/example.log

停止:sh ~/tmp/canal/bin/stop.sh

Java-Maven項(xiàng)目集成及Demo:

1. 添加pom依賴:

com.alibaba.otter

canal.client

1.0.12

2. 代碼:參考https://github.com/alibaba/canal/wiki/ClientExample

運(yùn)行后,會(huì)輸出empty嚷狞,并一直在讀瓤榇佟:

3. Test表:

CREATE TABLE `test1` (

`id` int(11) NOT NULL,

`name` varchar(45) NOT NULL,

`scoure` decimal(10,2) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

4. 進(jìn)行簡(jiǎn)單Insert荣堰,Update語(yǔ)句操作后:

INSERT INTO `canalTest`.`test1` (`id`, `name`, `scoure`) VALUES ('6', 'niefei', '0.0');

UPDATE `canalTest`.`test1` SET `scoure`='100' WHERE `id`='6';

我們可以看到我們的監(jiān)聽(tīng)程序監(jiān)聽(tīng)了相關(guān)數(shù)據(jù)信息:

這樣看我已經(jīng)可以獲取想要的全部信息了,接下來(lái)就是對(duì)你想要的“表”竭翠,“字段”等進(jìn)行相關(guān)獲取及封裝進(jìn)行操作了振坚,后面也可以解析數(shù)據(jù)后放到公共的Redis中等,監(jiān)聽(tīng)也可以放在一個(gè)獨(dú)立或者放在本身項(xiàng)目中就隨你了斋扰。

我們現(xiàn)在是Canal單機(jī)的配置渡八,其也支持集群方式部署,目前看單機(jī)已滿足我們的業(yè)務(wù)需求传货。

Canal還能做什么屎鳍?

數(shù)據(jù)庫(kù)鏡像

數(shù)據(jù)庫(kù)實(shí)時(shí)備份

多級(jí)索引 (賣家和買家各自分庫(kù)索引)

search build

業(yè)務(wù)cache刷新

價(jià)格變化等重要業(yè)務(wù)消息

我們這邊主要介紹的是通過(guò)監(jiān)聽(tīng)獲取DB的數(shù)據(jù)進(jìn)行業(yè)務(wù)cache刷新,你有興趣的話可以參考以下相關(guān)文檔使用其更多功能问裕。

更多文檔可參考文獻(xiàn):

Canal的介紹:https://github.com/alibaba/canal/wiki

MySQL的Binlay Log介紹:http://dev.mysql.com/doc/refman/5.5/en/binary-log.html

Redis介紹:http://redis.io/documentation

RabbitMQ介紹:http://www.rabbitmq.com/documentation.html

ActiveMQ介紹:http://activemq.apache.org/

RocketMQ介紹:https://github.com/alibaba/RocketMQ


本文作者:聶飛(點(diǎn)融黑幫)逮壁,目前就職于點(diǎn)融網(wǎng)Fintech團(tuán)隊(duì),努力用技術(shù)讓身邊的人過(guò)得更好粮宛,典型的天蝎座man窥淆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巍杈,隨后出現(xiàn)的幾起案子祖乳,更是在濱河造成了極大的恐慌,老刑警劉巖秉氧,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眷昆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡汁咏,警方通過(guò)查閱死者的電腦和手機(jī)亚斋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)攘滩,“玉大人帅刊,你說(shuō)我怎么就攤上這事∑剩” “怎么了赖瞒?”我有些...
    開(kāi)封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蚤假。 經(jīng)常有香客問(wèn)我栏饮,道長(zhǎng),這世上最難降的妖魔是什么磷仰? 我笑而不...
    開(kāi)封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任袍嬉,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伺通。我一直安慰自己箍土,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布罐监。 她就那樣靜靜地躺著吴藻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弓柱。 梳的紋絲不亂的頭發(fā)上沟堡,一...
    開(kāi)封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音吆你,去河邊找鬼弦叶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妇多,可吹牛的內(nèi)容都是我干的伤哺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼者祖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼立莉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起七问,我...
    開(kāi)封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蜓耻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后械巡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刹淌,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年讥耗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了有勾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡古程,死狀恐怖蔼卡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挣磨,我是刑警寧澤雇逞,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站茁裙,受9級(jí)特大地震影響塘砸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呜达,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一谣蠢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧查近,春花似錦眉踱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至戈泼,卻和暖如春婿禽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背大猛。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工扭倾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挽绩。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓膛壹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親唉堪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子模聋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容