mysql获取最好成绩对应数据的其他项_开源数据同步神器——canal
前言
如今大型的IT系統(tǒng)中,都會(huì)使用分布式的方式,同時(shí)會(huì)有非常多的中間件,如redis、消息隊(duì)列、大數(shù)據(jù)存儲(chǔ)等,但是實(shí)際核心的數(shù)據(jù)存儲(chǔ)依然是存儲(chǔ)在數(shù)據(jù)庫(kù),作為使用最廣泛的數(shù)據(jù)庫(kù),如何將mysql的數(shù)據(jù)與中間件的數(shù)據(jù)進(jìn)行同步,既能確保數(shù)據(jù)的一致性、及時(shí)性,也能做到代碼無(wú)侵入的方式呢?如果有這樣的一個(gè)需求,數(shù)據(jù)修改后,需要及時(shí)的將mysql中的數(shù)據(jù)更新到elasticsearch,我們會(huì)怎么進(jìn)行實(shí)現(xiàn)呢?
數(shù)據(jù)同步方案選擇
針對(duì)上文的需求,經(jīng)過(guò)思考,初步有如下的一些方案:
- 代碼實(shí)現(xiàn)
- 針對(duì)代碼中進(jìn)行數(shù)據(jù)庫(kù)的增刪改操作時(shí),同時(shí)進(jìn)行elasticsearch的增刪改操作。
- mybatis實(shí)現(xiàn)
- 通過(guò)mybatis plugin進(jìn)行實(shí)現(xiàn),截取sql語(yǔ)句進(jìn)行分析, 針對(duì)insert、update、delete的語(yǔ)句進(jìn)行處理。顯然,這些操作如果都是單條數(shù)據(jù)的操作,是很容易處理的。但是,實(shí)際開(kāi)發(fā)中,總是會(huì)有一些批量的更新或者刪除操作,這時(shí)候,就很難進(jìn)行處理了。
- Aop實(shí)現(xiàn)
- 不管是通過(guò)哪種Aop方式,根據(jù)制定的規(guī)則,如規(guī)范方法名,注解等進(jìn)行切面處理,但依然還是會(huì)出現(xiàn)無(wú)法處理批量操作數(shù)據(jù)的問(wèn)題。
- logstash
- logstash類(lèi)似的同步組件提供的文件和數(shù)據(jù)同步的功能,可以進(jìn)行數(shù)據(jù)的同步,只需要簡(jiǎn)單的配置就能將mysql數(shù)據(jù)同步到elasticsearch,但是logstash的原理是每秒進(jìn)行一次增量數(shù)據(jù)查詢(xún),將結(jié)果同步到elasticsearch,實(shí)時(shí)性要求特別高的,可能無(wú)法滿(mǎn)足要求。且此方案的性能不是很好,造成資源的浪費(fèi)。
代碼實(shí)現(xiàn):技術(shù)難度低,侵入性強(qiáng),實(shí)時(shí)性高。
基于mybatis:有一定的技術(shù)難度,但是無(wú)法覆蓋所有的場(chǎng)景
Aop實(shí)現(xiàn):技術(shù)難度低,半侵入性,需要規(guī)范代碼,依然無(wú)法覆蓋所有的場(chǎng)景
logstash:技術(shù)難度低,無(wú)侵入性,無(wú)需開(kāi)發(fā),但會(huì)造成資源浪費(fèi)。
那么是否有什么更好的方式進(jìn)行處理嗎?mysql binlog同步,實(shí)時(shí)性強(qiáng),對(duì)于應(yīng)用無(wú)任何侵入性,且性能更好,不會(huì)造成資源浪費(fèi),那么就有了我今天的主角——canal
canal
介紹
canal 是阿里巴巴的一個(gè)開(kāi)源項(xiàng)目,基于java實(shí)現(xiàn),整體已經(jīng)在很多大型的互聯(lián)網(wǎng)項(xiàng)目生產(chǎn)環(huán)境中使用,包括阿里、美團(tuán)等都有廣泛的應(yīng)用,是一個(gè)非常成熟的數(shù)據(jù)庫(kù)同步方案,基礎(chǔ)的使用只需要進(jìn)行簡(jiǎn)單的配置即可。
canal是通過(guò)模擬成為mysql 的slave的方式,監(jiān)聽(tīng)mysql 的binlog日志來(lái)獲取數(shù)據(jù),binlog設(shè)置為row模式以后,不僅能獲取到執(zhí)行的每一個(gè)增刪改的腳本,同時(shí)還能獲取到修改前和修改后的數(shù)據(jù),基于這個(gè)特性,canal就能高性能的獲取到mysql數(shù)據(jù)數(shù)據(jù)的變更。
使用
canal的介紹在官網(wǎng)有非常詳細(xì)的說(shuō)明,如果想了解更多,大家可以移步官網(wǎng)(https://github.com/alibaba/canal)了解。我這里補(bǔ)充下使用中不太容易理解部分。
canal的部署主要分為server端和client端。
server端部署好以后,可以直接監(jiān)聽(tīng)mysql binlog,因?yàn)閟erver端是把自己模擬成了mysql slave,所以,只能接受數(shù)據(jù),沒(méi)有進(jìn)行任何邏輯的處理,具體的邏輯處理,需要client端進(jìn)行處理。
client端一般是需要大家進(jìn)行簡(jiǎn)單的開(kāi)發(fā)。https://github.com/alibaba/canal/wiki/ClientAPI 有一個(gè)簡(jiǎn)單的示例,很容易理解。
canal Adapter
為了便于大家的使用,官方做了一個(gè)獨(dú)立的組件Adapter,Adapter是可以將canal server端獲取的數(shù)據(jù)轉(zhuǎn)換成幾個(gè)常用的中間件數(shù)據(jù)源,現(xiàn)在支持kafka、rocketmq、hbase、elasticsearch,針對(duì)這幾個(gè)中間件的支持,直接配置即可,無(wú)需開(kāi)發(fā)。上文中,如果需要將mysql的數(shù)據(jù)同步到elasticsearch,直接運(yùn)行 canal Adapter,修改相關(guān)的配置即可。
常見(jiàn)問(wèn)題
- 無(wú)法接收到數(shù)據(jù),程序也沒(méi)有報(bào)錯(cuò)?
- 一定要確保mysql的binlog模式為row模式,canal原理是解析Binlog文件,并且直接中文件中獲取數(shù)據(jù)的。
- Adapter 使用無(wú)法同步數(shù)據(jù)?
- 按照官方文檔,檢查配置項(xiàng),如sql的大小寫(xiě),字段的大小寫(xiě)可能都會(huì)有影響,如果還無(wú)法搞定,可以自己獲取代碼調(diào)試下,Adapter的代碼還是比較容易看懂的。
canal Adapter elasticsearch 改造
因?yàn)橛辛薱anal和canal Adapter這個(gè)神器,同步到elasticsearch、hbase等問(wèn)題都解決了,但是自己的開(kāi)發(fā)的過(guò)程中發(fā)現(xiàn),Adapter使用還是有些問(wèn)題,因?yàn)橄仁褂玫氖莈lasticsearch同步功能,所以對(duì)elasticsearch進(jìn)行了一些改造:
elasticsearch初始化
一個(gè)全新的elasticsearch無(wú)法使用,因?yàn)闆](méi)有創(chuàng)建elasticsearch index和mapping,增加了對(duì)應(yīng)的功能。 elasticsearch配置文件mapping節(jié)點(diǎn)增加兩個(gè)參數(shù):
enablefieldmap: true fieldmap: id: "text" BuildingId: "text" HouseNum: "text" Floors: "text" IdProjectInfo: "text" HouseDigitNum: "text" BuildingNum: "text" BuildingName: "text" Name: "text" projectid: "text" bIdProjectInfo: "text" cinitid: "text" pCommunityId: "text"enablefieldmap 是否需要自動(dòng)生成fieldmap,默認(rèn)為false,如果需要啟動(dòng)的時(shí)候就生成這設(shè)置為true,并且設(shè)置 fieldmap,類(lèi)似elasticsearch mapping中每個(gè)字段的類(lèi)型。
esconfig bug處理
代碼中獲取binlog的日志處理時(shí),必須要獲取數(shù)據(jù)庫(kù)名,但是當(dāng)獲取binlog為type query時(shí),是無(wú)法獲取 數(shù)據(jù)庫(kù)名的,此處有bug,導(dǎo)致出現(xiàn) "Outer adapter write failed" ,且未輸出錯(cuò)誤日志,修復(fù)此bug.
后續(xù)計(jì)劃
- 增加rabbit MQ的支持
- 增加redis的支持
源碼
源碼地址:https://github.com/itmifen/canal
總結(jié)
以上是生活随笔為你收集整理的mysql获取最好成绩对应数据的其他项_开源数据同步神器——canal的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华为鸿蒙系统HarmonyOS手机,华为
- 下一篇: linux cmake编译源码,linu