构建EMQ连接Kafka的插件,实现消息由MQTT Broker传递至Kafka
本文提供了两种方式使EMQ桥接Kafka,一种是自己构建Kafka插件,另一种是安装企业版EMQ在里面配置桥接Kafka即可。
* [构建Kafka插件——环境准备]
(1)make:
sudo apt-get install make
(2)git:
sudo apt-get install git
(3)由于需指定Erlang R21.2+ 版本,因此选择手动安装:
方式一:网上下载安装包安装
参考文档:
Ubuntu16.0.4安装erlang21.1.1
Ubuntu16.04 安装Erlang(rabbitmq安装第一步)
方式二:编译安装
- 环境准备
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
sudo apt-get install libssl-dev
sudo apt-get install m4
sudo apt-get install unixodbc unixodbc-dev
# sudo apt-get install freeglut3-dev libwxgtk3.0-dev
sudo apt-get install xsltproc
sudo apt-get install fop
sudo apt-get install tk8.5
下载erlang源码压缩包,
http://erlang.org/download/otp_src_21.2.tar.gz
解压otp_src_21.2.tar.gz
tar -zxvf otp_src_21.2.tar.gz
创建Erlang目录
mkdir /home/user/erlang/otp_src_21.2
进入otp_src_21.2,执行configure命令并设置安装后的位置
./configure --prefix=/home/user/erlang/otp_src_21.2
拓展知识:Linux ./configure --prefix 命令是什么意思?
执行编译,安装
make && make install
最后检验一下是否安装正确:
bin/erl
退出命令:halt().
配置环境变量
sudo vim /etc/profile
export ERLANG_HOME=/home/user_1/erlang/otp_src_21.2
export PATH=$ERLANG_HOME/bin:$PATH
生效变量:source /etc/prfile
拓展知识:
Linux 命令详解(三)./configure、make、make install 命令
参考文章:
Linux环境CentOS7安装Erlang环境
Ubuntu16.04 安装Erlang(楼主亲测,真实有效)
1、编译安装EMQ X
(1)获取源码
$ git clone -b v3.0.1 https://github.com/emqx/emqx-rel.git
注:本次选用EMQX的3.0.1版本
(2)设置环境变量
$ export EMQX_DEPS_DEFAULT_VSN=v3.0.1
(3)编译
$ cd emqx-rel && make
参考文档:
编译安装EMQ X
2、构建Kafka插件
参考文档:
【跟我一起搭建物联网平台】6、EMQX之Kafka插件编译安装
EMQ集成Kafka插件编写过程 emq_plugin_kafka
便捷方式
* [Other:获取企业版EMQ桥接Kafka]
进入:EMQ官网
注册一个账号后,可以获取一个月企业版EMQ的使用权。
(1)创建Kafka主题
先创建Kafka主题
$ bin/kafka-topics --create --bootstrap-server localhost:9092 --topic emqx-test --partitions 1 --replication-factor 1
(2)创建资源
打开 EMQ X Dashboard,进入左侧菜单的 资源 页面,点击 新建 按钮,键入 Kafka 服务器信息进行资源创建。
EMQ X 集群中节点所在网络环境可能互不相同,资源创建成功后点击列表中 状态按钮,查看各个节点资源连接状况,如果节点上资源不可用,请检查配置是否正确、网络连通性,并点击 重连 按钮手动重连。
(3)定义消息筛选规则
进入左侧菜单的 规则 页面,点击 新建 按钮,进行规则创建。这里选择触发事件 消息发布,在消息发布时触发该规则进行数据处理。
选定触发事件后,我们可在界面上看到可选字段及示例 SQL:
筛选字段信息
规则引擎使用 SQL 语句进行 处理/整型 终端消息或连接事件等。本次提取只payload中的信息,其余client_id等信息不取。
SELECT
payload
FROM
"message.publish"
WHERE
topic =~ 'test'
其中=~
为主题通配符可对topic中的test
主题进行筛选。
点击Test测试
添加相应动作,桥接Kafka
SQL 条件输入输出无误后,我们继续添加相应动作,配置写入 SQL 语句,将筛选结果桥接到 Kafka。
点击响应动作中的 添加 按钮,选择 桥接数据到Kafka 动作,选取刚刚选定的资源,Kafka 主题填写上文创建的emqx-test
(4)MQTT客户端发送消息测试
订阅test主题
发送publish
消费者查看
$ bin/kafka-console-consumer --bootstrap-server localhost:9092 --from-beginning --topic emqx-test
完成测试
进入Plugins,点击emqx_bridge_kafka的Config进行配置
成功开启
配置 Kafka 集群地址
## Kafka 服务器地址
## bridge.kafka.servers = 127.0.0.1:9092,127.0.0.2:9092,127.0.0.3:9092
bridge.kafka.servers = 127.0.0.1:9092
## Kafka 分区策略。可选值: per_partition | per_broker
bridge.kafka.connection_strategy = per_partition
bridge.kafka.min_metadata_refresh_interval = 5S
## Produce 写类型。可选值: sync | async
bridge.kafka.produce = sync
bridge.kafka.produce.sync_timeout = 3S
## 指定 replayq 在磁盘上存储消息的基本目录。
## 如果该配置项缺失活着设置为 undefined, replayq 将以使用内存的
## 的方式工作。也就是说,消息不在磁盘上排队 -- 在这种情况下,send
## 和 send_async API 的调用者负责处理在应用程序、网络或 kafka
## 干扰时可能丢失的消息。
## bridge.kafka.replayq_dir = /tmp/emqx_bridge_kafka/
## default=10MB, replayq 分段大小。
## bridge.kafka.producer.replayq_seg_bytes = 10MB
## producer required_acks. 可选值: all_isr | leader_only | none.
bridge.kafka.producer.required_acks = none
## default=10000. leader 在回复 producer 前等待副本的超时时间。
bridge.kafka.producer.ack_timeout = 10S
## 收集到一次 produce 请求中的最大字节数
bridge.kafka.producer.max_batch_bytes = 1024KB
## 收集到一次 produce 请求中的最少字节数
bridge.kafka.producer.min_batch_bytes = 0
## 在没有接收到上次请求的 ack 的情况下,可以提前发送的 batch 数。
## 如果消息必须严格按照顺序传递,则必须为0。
bridge.kafka.producer.max_send_ahead = 0
## 默认为无压缩
## bridge.kafka.producer.compression = no_compression
## 默认值为 base64, 可选值: base64 | plain
## bridge.kafka.encode_payload_type = base64
## bridge.kafka.sock.buffer = 32KB
## bridge.kafka.sock.recbuf = 32KB
bridge.kafka.sock.sndbuf = 1MB
## bridge.kafka.sock.read_packets = 20
配置 Kafka 桥接规则
## Bridge Kafka Hooks
## ${topic}: the kafka topics to which the messages will be published.
## ${filter}: the mqtt topic (may contain wildcard) on which the action will be performed.
## Client Connected Record Hook
bridge.kafka.hook.client.connected.1 = {"topic": "client_connected"}
## Client Disconnected Record Hook
bridge.kafka.hook.client.disconnected.1 = {"topic": "client_disconnected"}
## Session Subscribed Record Hook
bridge.kafka.hook.session.subscribed.1 = {"filter": "#", "topic": "session_subscribed"}
## Session Unsubscribed Record Hook
bridge.kafka.hook.session.unsubscribed.1 = {"filter": "#", "topic": "session_unsubscribed"}
## Message Publish Record Hook
bridge.kafka.hook.message.publish.1 = {"filter": "#", "topic": "message_publish"}
## Message Delivered Record Hook
bridge.kafka.hook.message.delivered.1 = {"filter": "#", "topic": "message_delivered"}
## Message Acked Record Hook
bridge.kafka.hook.message.acked.1 = {"filter": "#", "topic": "message_acked"}
## More Configures
## partitioner strategy:
## Option: random | roundrobin | first_key_dispatch
## Example: bridge.kafka.hook.message.publish.1 = {"filter":"#", "topic":"message_publish", "strategy":"random"}
## key:
## Option: ${clientid} | ${username}
## Example: bridge.kafka.hook.message.publish.1 = {"filter":"#", "topic":"message_publish", "key":"${clientid}"}
## format:
## Option: json | json
## Example: bridge.kafka.hook.message.publish.1 = {"filter":"#", "topic":"message_publish", "format":"json"}
参考文档:
EMQ X桥接转发
EMQ X 规则引擎系列(一):数据桥接到消息队列(Kafka)
EMQ X Enterprise (MQTT Broker) + Apache Kafka 构建高性能物联网消息处理后台