我的mqtt协议和emqttd开源项目个人理解(10) - 建立高可用集群,负载均衡haproxy

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 我的mqtt协议和emqttd开源项目个人理解(10) - 建立高可用集群,负载均衡haproxy

方案1:Nginx+Keepalived+emq+MySQL双机热备,MySQL用于数据持久化


方案2(推荐):HAProxy+Keepalived+emq+MySQL双机热备


方案3:HAProxy+confd+emq+etcd

image.png



问:我还有一个疑问,使用了nginx或者haproxy真的能提升性能吗?那nginx或haproxy本身服务器岂不是压力山大,所有数据都要经过它转发。

答:它不需要处理,仅仅是转发。但是nginx不行,性能比较好的软件负载均衡是LVS。如果软件性能那么好,F5就不会卖那么贵了。还有,4层负载,DR模式回包不用经过负载,这在下行流量大的业务场景里性能不错了。



haproxy参考配置1:https://github.com/lelylan/haproxy-mqtt


https://github.com/lelylan/haproxy-mqtt/blob/master/haproxy.cfg

global
  ulimit-n 99999
  maxconn 99999
  maxpipes 99999
  tune.maxaccept 500
  log 127.0.0.1 local0
  log 127.0.0.1 local1 notice
  chroot /var/lib/haproxy
  user haproxy
  group haproxy
defaults
  log global
  mode http
  option dontlognull
  timeout connect 5000ms
  timeout client 50000ms
  timeout server 50000ms
  errorfile 400 /etc/haproxy/errors/400.http
  errorfile 403 /etc/haproxy/errors/403.http
  errorfile 408 /etc/haproxy/errors/408.http
  errorfile 500 /etc/haproxy/errors/500.http
  errorfile 502 /etc/haproxy/errors/502.http
  errorfile 503 /etc/haproxy/errors/503.http
  errorfile 504 /etc/haproxy/errors/504.http
listen stats :80
  stats enable
  stats uri / # must be present to see the logs
  stats auth admin:admin
listen mqtt
  bind *:1883
  bind *:8883 ssl crt /certs/lelylan-mqtt.pem
  mode tcp
  #Use this to avoid the connection loss when client subscribed for a topic and its idle for sometime
  option clitcpka # For TCP keep-alive
  timeout client 3h #By default TCP keep-alive interval is 2hours in OS kernal, 'cat /proc/sys/net/ipv4/tcp_keepalive_time'
  timeout server 3h #By default TCP keep-alive interval is 2hours in OS kernal
  option tcplog
  balance leastconn
  server mosca_1 178.62.122.204:1883 check
  server mosca_2 178.62.104.172:1883 check

参考配置2:


global //全局配置
      tune.ssl.default-dh-param 2048
defaults //默认初始配置,listen没有指定情况下使用该值,不然会被listen覆盖
       log 127.0.0.1 local3
       mode http                       #所处理的类别 (#7层 http;4层tcp  )
       maxconn 10000                   #最大连接数
       option dontlognull              #不记录健康检查的日志信息
       option redispatch               #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
       #stats refresh 30                #统计页面刷新间隔
       retries 3                       #3次连接失败就认为服务不可用,也可以通过后面设置
       balance roundrobin              #默认的负载均衡的方式,轮询方式
      #balance source                  #默认的负载均衡的方式,类似nginx的ip_hash
      #balance leastconn               #默认的负载均衡的方式,最小连接
       timeout connect 5000                 #连接超时
       timeout client 50000                #客户端超时
       timeout server 50000                #服务器超时
       timeout check 2000              #心跳检测超时
listen mqtt-ssl
    #bind *:1883
    bind *:8883 ssl crt /etc/ssl/emqttd/emq.pem no-sslv3
    mode tcp
    option clitcpka
    maxconn 50000
    timeout check 5000
    balance leastconn
    server emq1 192.168.0.1:1883 check inter 10000 fall 2 rise 5 weight 1
    server emq2 192.168.0.2:1883 check inter 10000 fall 2 rise 5 weight 1


以下是emq的官方文档介绍:


EMQ 2.2正式支持MQTT协议多{敏感词}配置,支持HAProxy的Proxy Protocol V1/V2。新增Web Hook插件(emq-web-hook)、Lua Hook插件(emq-lua-hook)。


MQTT协议{敏感词}配置



一个EMQ节点可配置多个MQTT协议监听端口,例如下述配置external, internal{敏感词},分别用于设备连接与内部通信:


                        -------

-- External TCP 1883 --> |     |

                        | EMQ | -- Internal TCP 2883 --> Service

-- External SSL 8883-->  |     |

                        -------


EMQ 2.2 版本etc/emq.conf{敏感词}配置方式:


listener.tcp.${name}= 127.0.0.1:2883

listener.tcp.${name}.acceptors = 16

listener.tcp.${name}.max_clients = 102400


Proxy Protocol V1/2支持


EMQ 集群通常部署在负载均衡器(LB)后面,典型架构:


             -----

             |   |

             | L | --TCP 1883--> EMQ

--SSL 8883--> |   |                |

             | B | --TCP 1883--> EMQ

             |   |

             -----

HAProxy、NGINX等常用的负载均衡器(LB),一般通过Proxy Protocol协议传递TCP连接源地址、源端口给EMQ。


EMQ 2.2 版本的{敏感词}开启Proxy Protocol支持:


## Proxy Protocol V1/2

## listener.tcp.${name}.proxy_protocol = on

## listener.tcp.${name}.proxy_protocol_timeout = 3s

Web Hook插件


新增WebHook插件: emq-web-hook ,支持在MQTT客户端上下线、消息发布订阅时触发WebHook回调。



Lua Hook插件


新增Lua Hook插件: emq-lua-hook ,支持Lua脚本注册EMQ扩展钩子来开发插件。



改进认证链设计


EMQ 2.2 版本改进认证链设计,当前认证模块返回ignore(例如用户名不存在等情况下),认证请求将继续转发后面认证模块:


          -------------           ------------           -------------

Client --> | Redis认证 | -ignore-> | HTTP认证 | -ignore-> | MySQL认证 |

          -------------           ------------           -------------

                |                       |                       |

               \|/                     \|/                     \|/

          allow | deny            allow | deny            allow | deny


支持bcrypt密码Hash


EMQ 2.2 版本支持bcrypt密码Hash方式,例如Redis认证插件配置:


auth.redis.password_hash = bcrypt

etc/emq.conf配置变更


'mqtt.queue.*' 配置变更为 'mqtt.mqueue.*'



emq-dashboard


WebSocket页面支持Unsubscribe



---



https://www.haproxy.com/


http://nginx.org/


http://www.linuxvirtualserver.org/


http://www.keepalived.org/


物联网架构成长之路(10)-Nginx负载均衡


物联网架构成长之路(9)-双机热备Keepalived了解

物联网架构成长之路(8)-EMQ-Hook了解、连接Kafka发送消息


http://www.cnblogs.com/wunaozai/tag/%E7%89%A9%E8%81%94%E7%BD%91/ 物联网架构之路总目录


Confd+etcd实现高可用自动发现


MQTT haproxy 负载均衡代理服务


emqtt集群 ,使用haproxy做tcp负载均衡服务器



相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
3天前
|
负载均衡 监控 网络协议
使用haproxy实现负载均衡集群
【4月更文挑战第14天】HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,快速并且可靠的一种解决方案。
8 1
|
1月前
|
监控 网络性能优化 网络安全
【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
34 1
|
2月前
|
物联网 Linux 开发工具
MQTT协议接入问题之连接失败如何解决
MQTT接入是指将设备或应用通过MQTT协议接入到消息服务器,以实现数据的发布和订阅;本合集着眼于MQTT接入的流程、配置指导以及常见接入问题的解决方法,帮助用户实现稳定可靠的消息交换。
136 2
|
2月前
|
JSON 物联网 开发工具
MQTT协议问题之如何搭建物联网空调的服务器
MQTT协议是一个轻量级的消息传输协议,设计用于物联网(IoT)环境中设备间的通信;本合集将详细阐述MQTT协议的基本原理、特性以及各种实际应用场景,供用户学习和参考。
79 1
|
2月前
|
JSON 网络协议 物联网
MQTT协议问题之消息类型分类如何解决
MQTT协议是一个轻量级的消息传输协议,设计用于物联网(IoT)环境中设备间的通信;本合集将详细阐述MQTT协议的基本原理、特性以及各种实际应用场景,供用户学习和参考。
49 3
|
2月前
|
消息中间件 网络协议 物联网
MQTT协议问题之阿里云物联网服务器断开如何解决
MQTT协议是一个轻量级的消息传输协议,设计用于物联网(IoT)环境中设备间的通信;本合集将详细阐述MQTT协议的基本原理、特性以及各种实际应用场景,供用户学习和参考。
130 1
|
2月前
|
存储 监控 物联网
MQTT协议问题之OTA升级包下载如何解决
MQTT协议是一个轻量级的消息传输协议,设计用于物联网(IoT)环境中设备间的通信;本合集将详细阐述MQTT协议的基本原理、特性以及各种实际应用场景,供用户学习和参考。
108 3
|
16天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
31 0
|
3月前
|
负载均衡 应用服务中间件 nginx
百度搜索:蓝易云【Nginx和tomcat实现负载均衡教程】
至此,你已经成功地使用Nginx和Tomcat实现了负载均衡。Nginx将根据配置的负载均衡策略将客户端请求分发到多个Tomcat服务器上,以提高系统的性能和可用性。请注意,在实际生产环境中,还需要进行其他配置和优化,如健康检查、会话保持等,以满足具体的需求。
34 0
|
6天前
|
负载均衡 应用服务中间件 nginx
Nginx 负载均衡
Nginx 负载均衡
21 2