Centos7 部署 VerneMQ 高可用集群

Posted 地表最强菜鸡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Centos7 部署 VerneMQ 高可用集群相关的知识,希望对你有一定的参考价值。

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 高可用集群介绍完成。

以上是关于Centos7 部署 VerneMQ 高可用集群的主要内容,如果未能解决你的问题,请参考以下文章

MHA-结合MySQL半同步复制高可用集群(Centos7)

Centos7 RKE部署高可用k8s集群

centos7部署postgresql集群高可用 patroni + etcd 之patroni篇

Centos7.6部署k8s v1.16.4高可用集群(主备模式)

Centos7.6部署k8s v1.16.4高可用集群(主备模式)

vernemq 集群 docker-compose 搭建简单试用