自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Hiriver —— MySQL 數(shù)據(jù)變化的監(jiān)控與分發(fā)框架

數(shù)據(jù)庫(kù) MySQL
hiriver是純java開發(fā)的、高性能的、基于解析mysql row base binlog技術(shù)實(shí)現(xiàn)的用于監(jiān)控mysql數(shù)據(jù)變化并分發(fā)這些變化的框架。

[[192733]]

什么是hiriver?

hiriver是純java開發(fā)的、高性能的、基于解析mysql row base binlog技術(shù)實(shí)現(xiàn)的用于監(jiān)控mysql數(shù)據(jù)變化并分發(fā)這些變化的框架。它提供了一套完整的框架,內(nèi)置數(shù)據(jù)監(jiān)控線程和數(shù)據(jù)消費(fèi)線程,對(duì)外提供簡(jiǎn)單的Consumer接口,開發(fā)者可以根據(jù)自己的業(yè)務(wù)場(chǎng)景自行實(shí)現(xiàn)Consumer接口,而不不必關(guān)心線程問(wèn)題。

實(shí)現(xiàn)原理

hiriver實(shí)現(xiàn)了mysql主從復(fù)制協(xié)議,把自己偽裝成一個(gè)mysql的從庫(kù),在接收到binlog后按照mysql binlog協(xié)議進(jìn)行解析,由此獲取mysql的數(shù)據(jù)變化。由于基于mysql的主從復(fù)制協(xié)議,它監(jiān)控?cái)?shù)據(jù)變化特別快,理論上與mysql本身的主從同步一樣快,甚至更快。同時(shí)與在應(yīng)用層監(jiān)控?cái)?shù)據(jù)變化不同,它不需要考慮事務(wù)是否成功問(wèn)題。當(dāng)然,***限制***是mysql binlog的方式必須是***row***方式。

名字的由來(lái)

hiriver是hidden river的簡(jiǎn)稱,中文名稱”暗渠”,用于隱喻在數(shù)據(jù)庫(kù)的后面導(dǎo)流數(shù)據(jù),而不必要在應(yīng)用層做任何控制。

支持mysql的版本

hiriver支持mysql 5.6.9+和 mysql5.1+版本。

  • 強(qiáng)烈推薦 使用5.6.9+版本,并使用binlog file name + position的方式處理同步點(diǎn)。
  • 雖然5.6.9+版本提供 gtid 功能,它是用于表示事務(wù)的唯一的id,理論上,基于它可以實(shí)現(xiàn)HA功能,當(dāng)mysql出現(xiàn)故障時(shí)可以自動(dòng)從一臺(tái)mysql從庫(kù)切換到另一臺(tái),并且不會(huì)丟失或者重復(fù)數(shù)據(jù), 但是 在實(shí)際的使用過(guò)程中g(shù)tid依然存在bug,并不穩(wěn)定,而且存在多個(gè)gtid時(shí)很難找到mysql認(rèn)識(shí)的初始同步點(diǎn)。
  • mysql5.6.9之前的版本,必須binlog file name和在該文件中的偏移位置作為同步點(diǎn)。

javadoc

hiriver組件

mysql-proto組件

使用教程

quickstart

總體說(shuō)明

  1. hiriver模塊組主要由2個(gè)組件和一個(gè)示例組成:mysql-proto、hiriver和hiriver-sample
  2. mysql-proto實(shí)現(xiàn)了mysql的client-server協(xié)議,包括Text protocol和主從復(fù)制協(xié)議。Text protocol是從mysql 正常 讀取數(shù)據(jù)的協(xié)議,它是mysql jdbc驅(qū)動(dòng)背后的協(xié)議。主從復(fù)制協(xié)議顧名思義就是實(shí)現(xiàn)主從之間復(fù)制數(shù)據(jù)的協(xié)議。
  3. hiriver是基于mysql-proto組件封裝的監(jiān)聽mysql變化、記錄同步點(diǎn)、控制數(shù)據(jù)消費(fèi)的上層應(yīng)用框架。它是hiriver業(yè)務(wù)流程的實(shí)現(xiàn)。它需要與spirng集成使用
  4. hiriver-sample一個(gè)使用hirvier的示例

準(zhǔn)備數(shù)據(jù)庫(kù)環(huán)境

1.創(chuàng)建自己的mysql 5.6.28

2.開啟row base和gtid 模式(如果使用gtid作為同步點(diǎn),必須開啟)

  1. log-bin=mysql-bin 
  2. binlog_format=Row 
  3. log-slave-updates=ON 
  4. enforce_gtid_consistency=true 
  5. gtid_mode=ON 

3.創(chuàng)建自己的復(fù)制賬號(hào),創(chuàng)建repl database和一張表,并在表示寫入數(shù)據(jù)

快速使用-binlogname + 偏移地址模式

1.下載代碼,找到hiriver-sample模塊,它是一個(gè)基于spring的web應(yīng)用,有3 spring xml配置文件,分別是:

  1. spring-boot.xml # spring容器描述入口文件 
  1. spring-bin.xml # binlogname + 偏移地址模式 
  1. spring-gtid.xml # gtid模式 

2.修改示例中hiriver-sample.properties的參數(shù),修改數(shù)據(jù)庫(kù)相關(guān)屬性、初始同步點(diǎn)、同步點(diǎn)存儲(chǔ)路徑和表名過(guò)濾黑、白名單配置

3.初始化同步點(diǎn)使用channel.0000.binlog和channel.0000.binlog.pos屬性,可以通過(guò)執(zhí)行

  1. show master status 

命令獲取對(duì)應(yīng)信息

修改后如圖:

4.修改spring-boot.xml中的***一行為:

  1. <import resource="classpath:spring/spring-binlog.xml"/> 

5.使用tomcat/jetty或maven jetty插件運(yùn)行示例即可

快速使用-gtid模式

下載代碼,找到hiriver-sample模塊,它是一個(gè)基于spring的web應(yīng)用,有3 spring xml配置文件,分別是:

  1. spring-boot.xml # spring容器描述入口文件 
  1. spring-bin.xml # binlogname + 偏移地址模式 
  1. spring-gtid.xml # gtid模式 

2.修改示例中hiriver-sample.properties的參數(shù),修改數(shù)據(jù)庫(kù)相關(guān)屬性、初始同步點(diǎn)、同步點(diǎn)存儲(chǔ)路徑和表名過(guò)濾黑、白名單配置,其中channel_0000.gtid參數(shù)的配置需要從mysql中查詢數(shù)獲取,執(zhí)行

  1. show master status 

命令,得到如下結(jié)果:

這是一個(gè)范圍,你只需要使用

  1. 8c80613e-ac5b-11e5-b170-148044d6636f:1 or 8c80613e-ac5b-11e5-b170-148044d6636f:8 

即可.修改后如圖:

修改spring-boot.xml中的***一行為: <import resource="classpath:spring/spring-gtid.xml"/>

使用tomcat/jetty或maven jetty插件運(yùn)行示例即可

詳細(xì)參數(shù)說(shuō)明

底層socket控制參數(shù)(使用TransportConfig類描述)

binlog讀取參數(shù)(DefaultChannelStream類)

數(shù)據(jù)庫(kù)配置

重點(diǎn)類說(shuō)明

底層通信類

binlog dump類(BinlogStreamBlockingTransportImpl)

實(shí)現(xiàn)mysql binlog dump協(xié)議,負(fù)責(zé)與mysql建立socket連接,完成用戶名密碼驗(yàn)證后,執(zhí)行數(shù)據(jù)dump命令,并持續(xù)的讀取、解析mysql binlog event數(shù)據(jù)。

數(shù)據(jù)庫(kù)數(shù)據(jù)讀取類(TextProtocolBlockingTransportImpl)

mysql文本協(xié)議的實(shí)現(xiàn),mysql文本協(xié)議即jdbc背后的協(xié)議,主要用于執(zhí)行sql讀取數(shù)據(jù),也可以執(zhí)行一些其他的命令,比如讀取表定義的元數(shù)據(jù)等,之所以不使用mysql jdbc是由于兩個(gè)原因:一是不想引入一個(gè)第三方包,降低依賴性;二是mysql的文本協(xié)議支持更多指令,比如COM_FIELD_LIST指令方便的獲取到表字段是否為空、是否是索引字段等信息,而jdbc是個(gè)通用的api,并沒(méi)有暴露這些指令實(shí)現(xiàn)。

表名過(guò)濾類 (BlackWhiteNameListTableFilter)

支持黑白名單的過(guò)濾實(shí)現(xiàn)。 按照表名進(jìn)行過(guò)濾時(shí),表名格式為database.table(可以為正則),以逗號(hào)分隔.

當(dāng)白名單和黑名單同時(shí)存在時(shí),只有不在黑名單中同時(shí)在白名單中存在的才起作用.

e.g,在properties文件中描述

白名單:filert_white=test.account,test.user_sharding*

白名單:filert_black=test.*bak

binlog row event數(shù)據(jù)描述類(BinlogDataSet)

binlog數(shù)據(jù)是二進(jìn)制數(shù)據(jù),它遵循mysql rowbase binlog協(xié)議,在協(xié)議內(nèi)部event作為一個(gè)基本單位用于描述數(shù)據(jù)庫(kù)的變更,這里的“變更”不僅僅是數(shù)據(jù)的修改,也可能是事務(wù)的開啟、結(jié)束,表的變更等,在hiriver里我們僅僅關(guān)注表數(shù)據(jù)的變更,BinlogDataSet用于描述一條或多條數(shù)據(jù)的變化,類似于jdbc的RowSet。BinlogDataSet 包括:

  1. channelId
  2. sourceHostUrl,該數(shù)據(jù)來(lái)自哪個(gè)數(shù)據(jù)庫(kù)
  3. gtId, 該數(shù)據(jù)所在的事務(wù)的gtid,在不支持gtid模式下,為null
  4. binlogPos, 當(dāng)前數(shù)據(jù)所在事務(wù)的binlogfile + pos,無(wú)論哪種模式,一定補(bǔ)位null
  5. isStartTransEvent, 當(dāng)前是否一個(gè)事務(wù)的開啟
  6. isPositionStoreTrigger,當(dāng)前是否一個(gè)事務(wù)的結(jié)束,當(dāng)時(shí)true時(shí)需要記錄同步點(diǎn)。
  7. rowDataMap, 行數(shù)據(jù),每一行使用BinlogResultRow描述
  8. columnDefMap, 類定義描述

BinlogResultRow內(nèi)部是有二個(gè)列表,一個(gè)記錄變更之前的數(shù)據(jù),另一個(gè)記錄變更之后的數(shù)據(jù)。

數(shù)據(jù)消費(fèi)類 (Consumer)

描述消費(fèi)BinlogDataSet數(shù)據(jù)的接口,這個(gè)留給業(yè)務(wù)實(shí)現(xiàn)方來(lái)實(shí)現(xiàn)。

binlog流(DefaultChannelStream)

mysql binlog dump被抽象成一個(gè)流,每一個(gè)流僅僅針對(duì)一個(gè)mysql實(shí)例,這個(gè)流稱之為ChannelStream, ChannelStream負(fù)責(zé)源源不斷的從mysql實(shí)例讀取數(shù)據(jù)并過(guò)濾、解析和消費(fèi)。

DefaultChannelStream是ChannelStream的缺省實(shí)現(xiàn),在內(nèi)部它開啟了2條線程:provider和consumer線程,provider線程負(fù)責(zé)從數(shù)據(jù)庫(kù)讀取數(shù)據(jù),識(shí)別事務(wù)、根據(jù)表名過(guò)濾、解析成BinlogDataSet并放入ChannelBuffer;consumer線程負(fù)責(zé)從ChannelBuffer讀取數(shù)據(jù)并調(diào)用Consumer進(jìn)行數(shù)據(jù)消費(fèi)。

當(dāng)provider線程產(chǎn)生數(shù)據(jù)的速度大于consumer線程消費(fèi)數(shù)據(jù)的速度時(shí),數(shù)據(jù)會(huì)被積壓在ChannelBuffer中,為了防止內(nèi)存被打爆,ChannelBuffer需要實(shí)現(xiàn)成有界的,當(dāng)ChannelBuffer達(dá)到上限時(shí)會(huì)阻塞provider線程產(chǎn)生新數(shù)據(jù)。

數(shù)據(jù)緩存類 (DefaultChannelBuffer)

ChannelStream中provider和consumer線程的數(shù)據(jù)通信基礎(chǔ),它是ChannelBuffer的缺省實(shí)現(xiàn)。謹(jǐn)記,需要配置上限。

事務(wù)識(shí)別類(TransactionRecognizer)

用于識(shí)別事務(wù)的開啟、結(jié)束,并且記錄當(dāng)前事務(wù)的開始位置。針對(duì)gtid和binlog file name + pos兩種模式,提供2種實(shí)現(xiàn):GTIDTransactionRecognizer和BinlogNameAndPosTransactionRecognizer。

責(zé)任編輯:武曉燕 來(lái)源: 36大數(shù)據(jù)
相關(guān)推薦

2009-04-21 08:46:02

GoogleAndroid移動(dòng)OS

2018-07-08 06:54:15

Java雙重分發(fā)Visitor

2020-12-02 13:19:47

Shell監(jiān)控文件Linux

2024-05-11 11:18:21

Kafka監(jiān)控框架

2023-06-26 08:22:00

2023-03-04 20:50:19

MySQL字典InnoDB

2019-12-31 21:26:54

系統(tǒng)安全網(wǎng)絡(luò)攻擊Linux

2019-12-31 14:00:35

LinuxNginx腳本語(yǔ)言

2018-03-06 10:03:10

微信數(shù)據(jù)監(jiān)控

2019-08-02 11:09:16

大數(shù)據(jù)零售商離婚

2011-12-27 09:37:40

服務(wù)器性能監(jiān)控

2021-08-19 09:00:12

監(jiān)控文件Python

2013-08-29 09:20:32

百度Clouda輕應(yīng)用

2020-02-19 14:17:59

RSAC 2020網(wǎng)絡(luò)安全信息安全

2010-05-19 17:25:06

布線測(cè)試

2019-07-22 10:45:31

2021-09-18 15:05:58

MySQL數(shù)據(jù)庫(kù)監(jiān)控

2009-07-01 10:41:28

Web框架工作機(jī)會(huì)

2023-03-14 07:31:17

EoscGo語(yǔ)言

2023-04-03 08:39:33

中間件go語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)