Hiriver —— MySQL 数据变化的监控与分发框架
时间:2025-11-05 15:54:25 出处:IT科技阅读(143)

什么是数据hiriver?
hiriver是纯java开发的、高性能的变化、基于解析mysql row base binlog技术实现的控分用于监控mysql数据变化并分发这些变化的框架。它提供了一套完整的发框框架,内置数据监控线程和数据消费线程,数据对外提供简单的变化Consumer接口,开发者可以根据自己的控分业务场景自行实现Consumer接口,而不不必关心线程问题。发框
实现原理
hiriver实现了mysql主从复制协议,数据把自己伪装成一个mysql的变化从库,在接收到binlog后按照mysql binlog协议进行解析,控分由此获取mysql的发框数据变化。由于基于mysql的数据主从复制协议,它监控数据变化特别快,变化理论上与mysql本身的控分主从同步一样快,甚至更快。同时与在应用层监控数据变化不同,它不需要考虑事务是否成功问题。当然,***限制***是网站模板mysql binlog的方式必须是***row***方式。
名字的由来
hiriver是hidden river的简称,中文名称”暗渠”,用于隐喻在数据库的后面导流数据,而不必要在应用层做任何控制。
支持mysql的版本
hiriver支持mysql 5.6.9+和 mysql5.1+版本。
强烈推荐 使用5.6.9+版本,并使用binlog file name + position的方式处理同步点。 虽然5.6.9+版本提供 gtid 功能,它是用于表示事务的唯一的id,理论上,基于它可以实现HA功能,当mysql出现故障时可以自动从一台mysql从库切换到另一台,并且不会丢失或者重复数据, 但是 在实际的使用过程中gtid依然存在bug,并不稳定,而且存在多个gtid时很难找到mysql认识的初始同步点。 mysql5.6.9之前的版本,b2b供应网必须binlog file name和在该文件中的偏移位置作为同步点。javadoc
hiriver组件
mysql-proto组件
使用教程
quickstart
总体说明
hiriver模块组主要由2个组件和一个示例组成:mysql-proto、hiriver和hiriver-sample mysql-proto实现了mysql的client-server协议,包括Text protocol和主从复制协议。Text protocol是从mysql 正常 读取数据的协议,它是mysql jdbc驱动背后的协议。主从复制协议顾名思义就是实现主从之间复制数据的协议。 hiriver是基于mysql-proto组件封装的监听mysql变化、记录同步点、控制数据消费的上层应用框架。它是hiriver业务流程的实现。它需要与spirng集成使用 hiriver-sample一个使用hirvier的示例准备数据库环境
1.创建自己的mysql 5.6.28
2.开启row base和gtid 模式(如果使用gtid作为同步点,必须开启)
log-bin=mysql-bin binlog_format=Row log-slave-updates=ON enforce_gtid_consistency=true gtid_mode=ON3.创建自己的复制账号,创建repl database和一张表,并在表示写入数据
快速使用-binlogname + 偏移地址模式
1.下载代码,找到hiriver-sample模块,它是服务器租用一个基于spring的web应用,有3 spring xml配置文件,分别是:
spring-boot.xml # spring容器描述入口文件 spring-bin.xml # binlogname + 偏移地址模式 spring-gtid.xml # gtid模式2.修改示例中hiriver-sample.properties的参数,修改数据库相关属性、初始同步点、同步点存储路径和表名过滤黑、白名单配置
3.初始化同步点使用channel.0000.binlog和channel.0000.binlog.pos属性,可以通过执行
show master status命令获取对应信息

修改后如图:

4.修改spring-boot.xml中的***一行为:
<import resource="classpath:spring/spring-binlog.xml"/>5.使用tomcat/jetty或maven jetty插件运行示例即可
快速使用-gtid模式
下载代码,找到hiriver-sample模块,它是一个基于spring的web应用,有3 spring xml配置文件,分别是:
spring-boot.xml # spring容器描述入口文件 spring-bin.xml # binlogname + 偏移地址模式 spring-gtid.xml # gtid模式2.修改示例中hiriver-sample.properties的参数,修改数据库相关属性、初始同步点、同步点存储路径和表名过滤黑、白名单配置,其中channel_0000.gtid参数的配置需要从mysql中查询数获取,执行
show master status命令,得到如下结果:

这是一个范围,你只需要使用
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插件运行示例即可
详细参数说明
底层socket控制参数(使用TransportConfig类描述)

binlog读取参数(DefaultChannelStream类)


数据库配置


重点类说明
底层通信类
binlog dump类(BinlogStreamBlockingTransportImpl)
实现mysql binlog dump协议,负责与mysql建立socket连接,完成用户名密码验证后,执行数据dump命令,并持续的读取、解析mysql binlog event数据。
数据库数据读取类(TextProtocolBlockingTransportImpl)
mysql文本协议的实现,mysql文本协议即jdbc背后的协议,主要用于执行sql读取数据,也可以执行一些其他的命令,比如读取表定义的元数据等,之所以不使用mysql jdbc是由于两个原因:一是不想引入一个第三方包,降低依赖性;二是mysql的文本协议支持更多指令,比如COM_FIELD_LIST指令方便的获取到表字段是否为空、是否是索引字段等信息,而jdbc是个通用的api,并没有暴露这些指令实现。
表名过滤类 (BlackWhiteNameListTableFilter)
支持黑白名单的过滤实现。 按照表名进行过滤时,表名格式为database.table(可以为正则),以逗号分隔.
当白名单和黑名单同时存在时,只有不在黑名单中同时在白名单中存在的才起作用.
e.g,在properties文件中描述
白名单:filert_white=test.account,test.user_sharding
*白名单:filert_black=test.*bak
binlog row event数据描述类(BinlogDataSet)
binlog数据是二进制数据,它遵循mysql rowbase binlog协议,在协议内部event作为一个基本单位用于描述数据库的变更,这里的“变更”不仅仅是数据的修改,也可能是事务的开启、结束,表的变更等,在hiriver里我们仅仅关注表数据的变更,BinlogDataSet用于描述一条或多条数据的变化,类似于jdbc的RowSet。BinlogDataSet 包括:
channelId sourceHostUrl,该数据来自哪个数据库 gtId, 该数据所在的事务的gtid,在不支持gtid模式下,为null binlogPos, 当前数据所在事务的binlogfile + pos,无论哪种模式,一定补位null isStartTransEvent, 当前是否一个事务的开启 isPositionStoreTrigger,当前是否一个事务的结束,当时true时需要记录同步点。 rowDataMap, 行数据,每一行使用BinlogResultRow描述 columnDefMap, 类定义描述BinlogResultRow内部是有二个列表,一个记录变更之前的数据,另一个记录变更之后的数据。
数据消费类 (Consumer)
描述消费BinlogDataSet数据的接口,这个留给业务实现方来实现。
binlog流(DefaultChannelStream)
mysql binlog dump被抽象成一个流,每一个流仅仅针对一个mysql实例,这个流称之为ChannelStream, ChannelStream负责源源不断的从mysql实例读取数据并过滤、解析和消费。
DefaultChannelStream是ChannelStream的缺省实现,在内部它开启了2条线程:provider和consumer线程,provider线程负责从数据库读取数据,识别事务、根据表名过滤、解析成BinlogDataSet并放入ChannelBuffer;consumer线程负责从ChannelBuffer读取数据并调用Consumer进行数据消费。
当provider线程产生数据的速度大于consumer线程消费数据的速度时,数据会被积压在ChannelBuffer中,为了防止内存被打爆,ChannelBuffer需要实现成有界的,当ChannelBuffer达到上限时会阻塞provider线程产生新数据。
数据缓存类 (DefaultChannelBuffer)
ChannelStream中provider和consumer线程的数据通信基础,它是ChannelBuffer的缺省实现。谨记,需要配置上限。
事务识别类(TransactionRecognizer)
用于识别事务的开启、结束,并且记录当前事务的开始位置。针对gtid和binlog file name + pos两种模式,提供2种实现:GTIDTransactionRecognizer和BinlogNameAndPosTransactionRecognizer。
猜你喜欢
- 荒野行动电脑手柄设置教程(一步步教你如何设置电脑手柄来玩荒野行动)
- 算力“神器”加持,第四代英特尔至强可扩展处理器为本土业务创新加速
- Dell PowerEdge新一代服务器正式发布:立足企业需求打造端到端的产品和解决方案,助推企业数字化转型
- 绿色算力助推双碳落地,新华三携手英特尔共话“可持续”
- 在 Windows 中把时间设置正确了过后,回到在 Ubuntu 后系统的时间又不一样了,在 Ubuntu中把时间设置正确后进入 Windows 后,时间又不一致了。 出现这种情况的原因是 Windows 和 Ubuntu它们在默认情况下看待硬件时间(主板上的BOIS显示的时间)的方式不一样。 知道了问题存在的原因,我们就来解决这个问题。这个是一个关于时间的问题,我们就先来了解一下关于时间的概念UTC即Universal Time Coordinated,协调世界时GMT即Greenwich Mean Time,格林尼治平时Windows 与 Linux 缺省看待系统硬件时间的方式是不一样的: * Windows把系统硬件时间当作本地时间(local time),即操作系统中显示的时间跟BIOS中显示的时间是一样的。 * Linux/Unix/Mac把硬件时间当作 UTC,操作系统中显示的时间是硬件时间经过换算得来的,比如说北京时间是GMT+8,则系统中显示时间是硬件时间+8。这 样,当PC中同时有多系统共存时,就出现了问题。假如你的 Ubuntu 和 Windows 中设置的时区都为北京时间东八区,而你在 Ubuntu中把当前系统时间更改为9:00AM。则此时硬件中存储的实际C时间是1:00AM。这时你重启进入Windows后,你会发现 windows系统中显示的时间是 1:00AM,比 Ubuntu 中慢了八个小时。同理,你在 Windows中更改或用网络同步了系统时间后,再到Ubuntu中去看,系统就会快了8小时。在实行夏令时的地区,情况可能会更复杂些。在ubunut下联网后时间还未能自动调整过来, 可用一下方法修改:让 Windows 把硬件时间当作 UTC开始->运行->CMD,打开命令行程序(Vista则要以管理员方式打开命令行程序方可有权限访问注册表),在命令行中输入下面命令并回车Reg add HKLMSYSTEMCurrentControlSetControlTimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1====================================================================Ubuntu中不使用UTC时间,而启用本地时间编辑/etc/default/rcS把其中的内容“UTC=yes”改成“UTC=no“,保存后重启系统就可以了
- 光纤连接器都有哪些类型?该如何选择
- 数据中心外包(DCO)的好处与挑战、实施指南
- 数据中心准备好迎接生成式人工智能了吗?
- 当我们安装好Tomcat使用后发现,每次启动都需要在终端中手动键入sudo /var/tomcat/bin/startup.sh,那么我们怎么解决这个问题呢 以下是我的解决方案: 1.首先打开终端,输入su,接着输入ROOT的密码获得ROOT权限。进入/etc文件夹(使用cd /etc命令) 2.打开rc.local文件(在/etc目录下使用vi rc.local命令) 3.rc.local文件内容默认如下 #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will exit 0 on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. /var/tomcat/bin/startup.sh exit 0 4.红色内容为我们手动添加的内容,这里指的是tomcat启动项,那么如何更改呢,首先键入A 进入INSERT模式,移动光标到红色位置输入准确路径,按ESC退出INSERT模式,光标移动到行尾,键入:wq保存文件 至此,我们已经解决这个问题,重启Ubuntu我们发现已经可以自动访问Tomcat下的内容了