1. 开启mysql的binlog日志
mysql版本号5.7
1.1 登录mysql查看日志状态.
mysql -h 127.0.0.1 -u root -p
mysql> show variables like '%log_bin%';
以上已经打开了,如果是OFF需要进行如下操作:
1.2 linux下开启binlog
编辑文件
vi /etc/my.cnf
行尾加上
server-id=1
log-bin=mysql-bin
binlog_format = row
server-id:表示单个节点的id,单个节点可以随意写,多个节点不能重复。
log-bin:指定binlog日志文件的名字为mysql-bin,以及其存储路径
重启服务
systemctl restart mysqld.service
或者
service mysqld restart
重新登录查询开启状态
mysql> show variables like '%log_bin%';
1.3 开启mysql的远程访问权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
2. nifi实时获取mysql变更
2.1 创建处理器组
组名:MysqlToVoltDB_Timely
然后我们点击此处理器组,进行相关操作。
2.2 创建CaptureChangeMySQL
创建CaptureChangeMySQL,我们需要创建我们的缓存服务,缓存服务一块是客户端、一块是服务端(DistributedMapCacheServer)。
然后让我们的客户端连接我们的服务端。
2.2.1 创建缓存
创建DistributedMapCacheServer
创建server:
配置属性
创建DistributedMapCacheClientService
创建client:
配置属性:
Server Hostname:我们填写nifi服务的地址
Server Port:server端的端口
启动DistributedMapCacheServer与DistributedMapCacheClientService
先启动server后启动client
2.2.2 CaptureChangeMySQL绑定DistributedMapCache
然后我们设置CaptureChangeMySQL
2.3 创建RouteOnAttribute
我们创建:RouteOnAttribute 然后将其与CaptureChangeMySQL连接,然后我们启动CaptureChangeMySQL。
此时我们的cpu会标满。第一个节点需要设置调度:
Run Schedule设置为3秒
接下来我们需要配置我们的路由,使用我们的jsonPath进行路由。我们需要根据数据及其属性来进行路由。此时我们向我们的数据库插入一条数据。
我们可以看到我们监听到的数据,然后我们点击进去:
查看数据,我们可以看到type是update:
我们路由的话 需要根据属性去路由,此时我们可以看到数据的属性为:
后面我们需要根据:cdc.event.type=update/insert/delete来进行操作。
因为我们需要在RouteOnAttribute配置新变量
insert=${cdc.event.type:equals('insert')}
update=${cdc.event.type:equals('update')}
2.3 创建EvaluateJsonPath
通过解析json后拼接成sql插入到后面的数据库中:
符合insert/update我们将其转发到EvaluateJsonPath,否则进入LogAttribute
我们执行RouteOnAttribute,然后发现数据路由到下游处理器
我们需要通过jsonpath解析对应的数据,然后输出到LogAttribute查看具体数据。
{
"type" : "update",
"timestamp" : 1716309977000,
"binlog_filename" : "mysql-bin.000048",
"binlog_position" : 124411000,
"database" : "callcenter",
"table_name" : "monitor_module_connect_info",
"table_id" : 61514,
"columns" : [ {
"id" : 1,
"name" : "id",
"column_type" : 4,
"last_value" : 1,
"value" : 1
}, {
"id" : 2,
"name" : "modulename",
"column_type" : 12,
"last_value" : "dyflow01",
"value" : "dyflow01"
}, {
"id" : 3,
"name" : "modulecode",
"column_type" : 12,
"last_value" : "",
"value" : ""
}, {
"id" : 4,
"name" : "to_connectmodulename",
"column_type" : 12,
"last_value" : "httpg01",
"value" : "httpg01"
}, {
"id" : 5,
"name" : "to_connectmodulecode",
"column_type" : 12,
"last_value" : "httpg",
"value" : "httpg"
}, {
"id" : 6,
"name" : "connectstatus",
"column_type" : 4,
"last_value" : 1,
"value" : 1
}, {
"id" : 7,
"name" : "examtime",
"column_type" : 4,
"last_value" : 1715481157,
"value" : 1715481157
}, {
"id" : 8,
"name" : "createtime",
"column_type" : 93,
"last_value" : "Tue May 21 08:00:03 CST 2024",
"value" : "Tue May 21 08:00:03 CST 2024"
}, {
"id" : 9,
"name" : "modifytime",
"column_type" : 93,
"last_value" : "Tue May 21 17:22:35 CST 2024",
"value" : "Wed May 22 08:46:17 CST 2024"
} ]
}
获取字段:database、id、modulename、createtime
database=$.database
id=$.columns[0].value
modulename=$.columns[1].value
createtime=$.columns[7].value
设置为属性
然后我们执行:EvaluateJsonPath 然后查看我们的数据
具体查看我们的数据attribute时候可以看到正常.
2.4 创建ReplaceText
接下来我们使用我们提取到的attribute属性来生成我们的sql语句。我们使用:ReplaceText实现。
之间连接时候使用:matched; 此时我们ReplaceText需要使用FlowFile中的数据,将获取到的数据拼接成我们的sql语句。此时我们需要修改我们原始的数据:$1;使用nifi表达式获取我们的属性值。
insert into test(id,modulename,createtime) value(${id},${modulename},${createtime})
整体情况如下:
此时我们进行测试,测试方法:
方法一:从头到尾执行一遍;
方法二:在EvaluateJsonPath我们右键点击“view Data Provenance"
然后运行我们的ReplaceText;然后我们就可以看到数据了,此时再停止运行:EvaluateJsonPath、ReplaceText.
然后我们查看数据,发现我们的字符串,没有加单引号。
我们此时需要在我们的ReplaceText添加单引号:
insert into test(id,modulename,createtime) value(${id},'${modulename}','${createtime}')
3. 数据写入到voltdb
Apache NiFi目前确实没有直接针对VoltDB的处理器组件,但这并不意味着不能实现从NiFi向VoltDB写入数据。NiFi的强大之处在于它的灵活性和可扩展性,你可以通过以下几种方式实现数据写入VoltDB的目的:
3.1 步骤
3.1.0 在voltdb里面创建表
CREATE TABLE test (
id INTEGER,
modulename varchar(255),
createtime varchar(255)
);
进入我们的sqlcmd终端,然后创建对应的表(对应端口设置为8012)。
sqlcmd --port=8012
3.1.1 准备
首先,确保你的NiFi环境中安装了必要的JAR依赖,比如VoltDB的Java客户端库。这可能需要将VoltDB的客户端jar包放入NiFi的/lib目录下。在NiFi中创建一个新的ExecuteScript处理器,选择合适的脚本引擎(例如,如果你使用Java,就选择Jython或直接用Java);但是此时我们使用PutSQL实现。
PutSQL:通过Flowfile中的内容对数据库进行更新(flowfile包含的是一些数据库DDM语句)
3.2 创建PutSQL
3.2.1 配置putsql处理器的属性
新建配置一个连接池
PutSQL创建自连接:因为到了这里就是一个结束了,不需要下游了,可以让他自连接了就。后整体的情况如下:
4. 运行整个链路
然后我们根据我们的链路 运行整个sql,发现我们的数据已经写进去了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。