業(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窥淆。