1.简要说明
1.1概述
VerneMQ首先是一个MQTT发布/订阅消息代理,它实现了OASIS行业标准MQTT协议;但是,VerneMQ还旨在通过提供一组与可扩展性,可靠性和高性能以及操作简单性相关的独特功能,将消息传递和物联网应用程序提升到一个新的水平;它使用无主集群技术,当不可避免的基础架构更改或维护窗口需要添加或删除节点时,没有像主节点或从节点这样的特殊节点需要考虑;它在普通硬件上水平和垂直扩展,以支持大量并发发布者和使用者,同时保持低延迟和容错能力。是物联网平台或智能产品的可靠消息中心。
1.2特性
1.VerneMQ完全开放源码,基于Apache License2.0开源协议,采用Erlang/OTP平台开发,支持故障隔离和容错,内置的可扩展指标,便于与第三方系统集成,无任何形式限制、无服务节点数量限制、无时间限制、无并发限制,并可提供商业支持
2.VerneMQ支持自定义插件,通过Lua脚本来扩充能力,也可以随时替换VerneMQ,可以在任何实现MQTT规范的broker上运行
3.数据持久化(基于LevelDB),支持基于文、数据库(PostgreSQL、MySQL、Redis和MongoDB)的身份验证和授权
4.支持数据桥接,MQTT/WebSocket/TCP/SSL连接支持,会话平衡、消息负载,避免消息过载(用于系统保护),当队列中数据大于配置量,将进行消息丢弃,支持队列数据FIFO或LIFO处理方式
5.完整的MQTTV3.1/V3.1.1及V5.0协议规范支持,支持QoS0、QoS1、QoS2服务级别,支持系统主题($SYS)、共享订阅
6.支持集群,使用无主集群技术
7.支持集成Graphite 、Prometheus监控
1.3架构
VerneMQ采用Erlang实现,Erlang旨在支持高并发和高可用性(容错)系统,数据副本采用Plumtree协议实现,MQTT中的保留消息是使用主题作为键存储在代理上的消息,每当客户端订阅该特定主题时,代理都会发送该消息的副本,设计和构建从Basho构建和打包Riak数据库的方式以及Plumtree中借鉴了很多,主题trie路由算法完全参考RabbitMQ MQTT插件,采用LevelDB作为数据持久化存储。
1.4关于MQTT
#什么是MQTT?
MQTT是一种消息队列传输协议。
MQTT协议是基于TCP的。
MQTT的优点在于以极少的代码及带宽资源,为远程设备提供可靠的消息服务。
MQTT是一种低开销的即时通讯协议。
#MQTT协议中三种身份
发布者(Publish)
代理(Broker)(服务器)
订阅者(Subscribe)
#MQTT传输的消息
主题(Topic):可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
负载(payload):可以理解为消息的内容,是指订阅者具体要使用的内容
2.安装
12 和 21 两台机器都操作
2.1目录准备
mkdir -p /opt/vernemq
cd /opt/vernemq
2.2下载rpm包
wget https://github.com/vernemq/vernemq/releases/download/1.12.3/vernemq-1.12.3.centos7.x86_64.rpm
2.3安装
rpm -ivh vernemq-1.12.3.centos7.x86_64.rpm
3.配置文件
3.1备份
cp /etc/vernemq/vernemq.conf /etc/vernemq/vernemq.conf.bak
3.2修改配置文件
10.0.61.12 配置文件,内容如下:
$ vim /etc/vernemq/vernemq.conf
accept_eula = yes
allow_anonymous = off
allow_register_during_netsplit = on
allow_publish_during_netsplit = on
allow_subscribe_during_netsplit = on
allow_unsubscribe_during_netsplit = on
allow_multiple_sessions = off
coordinate_registrations = on
max_inflight_messages = 20
max_online_messages = 1000
max_offline_messages = 1000
max_message_size = 0
upgrade_outgoing_qos = off
listener.max_connections = 10000
listener.nr_of_acceptors = 10
listener.tcp.default = 0.0.0.0:1885
listener.vmq.clustering = 0.0.0.0:44053
listener.http.default = 10.0.61.12:8787
systree_enabled = on
systree_interval = 20000
graphite_enabled = off
graphite_host = localhost
graphite_port = 2003
graphite_interval = 20000
shared_subscription_policy = prefer_local
plugins.vmq_passwd = on
plugins.vmq_acl = on
plugins.vmq_diversity = off
plugins.vmq_webhooks = off
plugins.vmq_bridge = off
topic_max_depth = 10
metadata_plugin = vmq_swc
vmq_acl.acl_file = /etc/vernemq/vmq.acl
vmq_acl.acl_reload_interval = 10
vmq_passwd.password_file = /etc/vernemq/vmq.passwd
vmq_passwd.password_reload_interval = 10
vmq_diversity.script_dir = /usr/share/vernemq/lua
vmq_bcrypt.pool_size = 1
log.console = file
log.console.level = info
log.console.file = /var/log/vernemq/console.log
log.error.file = /var/log/vernemq/error.log
log.syslog = off
log.crash = on
log.crash.file = /var/log/vernemq/crash.log
log.crash.maximum_message_size = 64KB
log.crash.size = 10MB
log.crash.rotation = $D0
log.crash.rotation.keep = 5
nodename = vmqnode1@10.0.61.12
distributed_cookie = vmq
erlang.async_threads = 64
erlang.max_ports = 262144
leveldb.maximum_memory.percent = 70
10.0.61.21 配置文件,内容如下:
$ vim /etc/vernemq/vernemq.conf
accept_eula = yes
allow_anonymous = off
allow_register_during_netsplit = on
allow_publish_during_netsplit = on
allow_subscribe_during_netsplit = on
allow_unsubscribe_during_netsplit = on
allow_multiple_sessions = off
coordinate_registrations = on
max_inflight_messages = 20
max_online_messages = 1000
max_offline_messages = 1000
max_message_size = 0
upgrade_outgoing_qos = off
listener.max_connections = 10000
listener.nr_of_acceptors = 10
listener.tcp.default = 0.0.0.0:1885
listener.vmq.clustering = 0.0.0.0:44053
listener.http.default = 10.0.61.21:8787
systree_enabled = on
systree_interval = 20000
graphite_enabled = off
graphite_host = localhost
graphite_port = 2003
graphite_interval = 20000
shared_subscription_policy = prefer_local
plugins.vmq_passwd = on
plugins.vmq_acl = on
plugins.vmq_diversity = off
plugins.vmq_webhooks = off
plugins.vmq_bridge = off
topic_max_depth = 10
metadata_plugin = vmq_swc
vmq_acl.acl_file = /etc/vernemq/vmq.acl
vmq_acl.acl_reload_interval = 10
vmq_passwd.password_file = /etc/vernemq/vmq.passwd
vmq_passwd.password_reload_interval = 10
vmq_diversity.script_dir = /usr/share/vernemq/lua
vmq_bcrypt.pool_size = 1
log.console = file
log.console.level = info
log.console.file = /var/log/vernemq/console.log
log.error.file = /var/log/vernemq/error.log
log.syslog = off
log.crash = on
log.crash.file = /var/log/vernemq/crash.log
log.crash.maximum_message_size = 64KB
log.crash.size = 10MB
log.crash.rotation = $D0
log.crash.rotation.keep = 5
nodename = vmqnode2@10.0.61.21
distributed_cookie = vmq
erlang.async_threads = 64
erlang.max_ports = 262144
leveldb.maximum_memory.percent = 70
配置文件解释:
##软件使用协议,默认是no,改为yes才能正常使用
accept_eula = yes
##是否开启匿名访问,开启匿名访问后将不验证用户名以及密码,默认为off
allow_anonymous = off
##即使VerneMQ集群不一致,也允许新的客户端连接,默认为off
allow_register_during_netsplit = off
##即使VerneMQ集群不一致,也会发布消息,默认为off
allow_publish_during_netsplit = off
##即使VerneMQ集群不一致,也允许新订阅,默认为off
allow_subscribe_during_netsplit = off
##允许客户端在 VerneMQ 集群不一致时取消订阅,默认为off
allow_unsubscribe_during_netsplit = off
##允许客户端使用同一客户端多次登录,默认为off
allow_multiple_sessions = off
##客户端注册可以以协调或不协调的方式进行;未协调的注册速度更快,并将导致具有相同客户端id的其他客户端最终断开连接,而协调的注册确保具有相同客户端id的任何其他客户端将立即断开连接,默认为on
coordinate_registrations = on
##处理的QoS1或2消息的最大数量,设置为0表示没有最大值
max_inflight_messages = 20
##队列中当前正在传输的消息上方要保留的最大消息数。默认值为1000。设置为-1表示无最大值;此选项允许控制特定客户端会话如何处理消息突发;作为一般经验法则,将此数字设置为比单个消费者需要处理的预期消息速率稍高;注意,将此值设置为0将完全阻止来自任何队列的传递
max_online_messages = 1000
##脱机队列中保留的QoS1或2消息的最大数量;默认值为1000。设置为-1表示没有最大值。如果不应脱机存储邮件,则设置为0
max_offline_messages = 1000
##此选项设置VerneMQ允许的最大MQTT大小;VerneMQ将不接受超过此大小的消息;默认值为0,这意味着接受所有有效的MQTT消息
max_message_size = 0
##如果发布的消息的QoS低于其发送的订阅的QoS,VerneMQ可以升级传出的QoS
upgrade_outgoing_qos = off
##listener.tcp.buffer_size是三个整数(sndbuf、recbuf、buffer)的列表,分别指定erlang驱动程序中的内核TCP发送缓冲区、内核TCP接收缓冲区和用户级缓冲区大小;建议使用val(用户级缓冲区)>=val(接收缓冲区),以避免由于不必要的复制而导致性能问题;如果未设置,则使用操作系统默认值
## listener.tcp.buffer_sizes = 4096,16384,32768
##定义最大并发连接数的整数或“无穷大”
listener.max_connections = 10000
##设置等待同时接受新连接的接收器的数量
listener.nr_of_acceptors = 10
##配置MQTT可连接地址以及端口
## - listener.tcp.default = 127.0.0.1:1883
## - listener.tcp.internal = 127.0.0.1:10883
## - listener.tcp.my_other_listener = 127.0.0.1:10884
##也适用于SSL侦听器和WebSocket处理程序:
## - listener.ssl.default = 127.0.0.1:8883
## - listener.ws.default = 127.0.0.1:800
## - listener.wss.default = 127.0.0.1:880
listener.tcp.default = 0.0.0.0:1885
##服务器内网ip,集群通讯端口
##如果设置成外网ip集群之间将无法通讯
listener.vmq.clustering = 0.0.0.0:44053
##web监控页面地址及端口
listener.http.default = 10.0.61.12:8787
##启用$SYSTree报表程序
systree_enabled = on
##$SYS订阅层次结构更新之间的整数毫秒数,它提供有关代理的状态信息;如果未设置,则默认为20秒;设置为0可完全禁用发布$SYS层次结构
systree_interval = 20000
##启用Graphite Reporter图形
graphite_enabled = off
##服务器主机名
graphite_host = localhost
##graphitetcp端口
graphite_port = 2003
##向graphite推送指标的时间间隔
graphite_interval = 20000
##共享订阅的分发策略;默认值为preferr_local,这将确保如果有可用的本地订户,将使用本地订户local_only将选择一个随机本地订户
shared_subscription_policy = prefer_local
##如果未开启匿名访问,就需要为Vernemq添加相关的账号密码
plugins.vmq_passwd = on
##配置topic的读写权限,默认状态下允许所有用户对所有的topic可读写;但安全和规范起见,建议规定各任务之间不同的topic并对权限加以控制
plugins.vmq_acl = on
##基于Lua的插件
plugins.vmq_diversity = off
##基于Webhook的插件
plugins.vmq_webhooks = off
##VerneMQ网桥插件
plugins.vmq_bridge = off
##限制最大主题深度
topic_max_depth = 10
##指定用于存储和复制VerneMQ元数据对象的元数据插件,为与现有部署兼容,默认值保持在vmq_plumtree,对于新的集群部署,建议从一开始就使用vmq_swc,请注意,这两种协议不兼容,因此不能混合使用集群
metadata_plugin = vmq_swc
##访问控制列表文件的路径
vmq_acl.acl_file = ./etc/vmq.acl
##设置acl重新加载间隔,值0将禁用acl文件的自动重新加载
vmq_acl.acl_reload_interval = 10
##密码文件的路径
vmq_passwd.password_file = ./etc/vmq.passwd
##设置密码重新加载间隔,值0将禁用密码文件的自动重新加载
vmq_passwd.password_reload_interval = 10
##配置vmq_dersity插件脚本目录;在脚本目录中搜索Lua脚本,这些脚本在插件启用时自动加载
vmq_diversity.script_dir = ./share/lua
##是否启用数据库
vmq_diversity.auth_postgres.enabled = off
##指定postgresql驱动程序是否应使用TLS
vmq_diversity.postgres.ssl = off
##PostgreSQL中使用的密码哈希方法
vmq_diversity.postgres.password_hash_method = crypt
##
vmq_diversity.auth_cockroachdb.enabled = off
##指定cockrachdb驱动程序是否应使用TLS
vmq_diversity.cockroachdb.ssl = on
##CockrochDB中使用的密码哈希方法
vmq_diversity.cockroachdb.password_hash_method = bcrypt
##
vmq_diversity.auth_mysql.enabled = off
##mysql中使用的密码哈希方法
vmq_diversity.mysql.password_hash_method = password
##
vmq_diversity.auth_mongodb.enabled = off
##指定mongodb驱动程序是否应使用TLS
vmq_diversity.mongodb.ssl = off
##
vmq_diversity.auth_redis.enabled = off
##pool_size指定同时允许的bcrypt操作数,auto将尝试检测所有逻辑cpu,并将池大小设置为该值,如果无法检测到逻辑CPU的数量,则使用值1
vmq_bcrypt.pool_size = 1
##发出默认日志消息的位置
##关闭:已禁用
##文件:由 log.console.file 指定的文件
##控制台:到标准输出(使用“vmq 附加直接”时可见)
##两者:log.console.file 和 standard out
log.console = file
##控制台日志的严重级别,默认为“info”
log.console.level = info
##console设置为file或both,即记录控制台消息的文件
log.console.file = ./log/console.log
##错误日志路径
log.error.file = ./log/error.log
##设置为on时,将日志输出到syslog
log.syslog = off
##启用崩溃日志
log.crash = on
##如果启用了崩溃日志,则将写入以下路径
log.crash.file = ./log/crash.log
##崩溃日志中单个消息的最大字节数
log.crash.maximum_message_size = 64KB
##旋转前崩溃日志的最大大小
log.crash.size = 10MB
##旋转崩溃日志的计划
log.crash.rotation = $D0
##要保留的循环崩溃日志数
log.crash.rotation.keep = 5
##集群中节点名称
nodename = vmqnode1@10.0.61.12
##用于分布式节点通信的Cookie,同一集群中的所有节点都应该使用相同的cookie,否则它们将无法通信
distributed_cookie = vmq
##设置异步线程池中的线程数,有效范围为0-1024;如果线程支持可用,则默认值为64
erlang.async_threads = 64
##并发端口的数量
erlang.max_ports = 262144
##分配给LevelDB的总服务器内存的百分比
leveldb.maximum_memory.percent = 70
3.3添加账号密码
如果开启了匿名访问(allow_anonymous = off),就不需要添加
$ vmq-passwd -c /etc/vernemq/vmq.passwd admin
账户:admin
密码:admin123
3.4配置topic
默认状态下允许所有用户对所有的topic可读写,但为了安全和规范起见,建议规定各任务之间不同的topic并对权限加以控制
#配置文件路径:
/etc/vernemq/vmq.acl
##topic [read|write] <topic>
#举例
user admin(用户)
topic test(主题)
topic read test(主题阅读)
topic write open_to_all(主题写入)
4.启动
4.1启动vernemq
$ systemctl start vernemq
4.2添加nginx配置
upstream vernemq{
server 10.0.61.12:8787;
server 10.0.61.21:8787;
}
server {
listen 8087;
server_name localhost;
location / {
proxy_pass http://vernemq;
proxy_next_upstream error timeout invalid_header http_500 http_403 http_404 non_idempotent;
proxy_next_upstream_timeout 0;
proxy_next_upstream_tries 0;
proxy_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
index index.html index.htm;
}
}
4.3加入集群
10.0.61.21 加入集群
$ vmq-admin cluster join discovery-node=vmqnode2@10.0.61.21
web监控页面地址
http://10.0.61.22:8087/status
查看集群信息
$ vmq-admin cluster show
到此 Centos7 部署 VerneMQ 高可用集群介绍完成。