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

简介: 我的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负载均衡服务器



相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
消息中间件 存储 Apache
恭喜 Apache RocketMQ、Apache Seata 荣获 2024 开源创新榜单“年度开源项目”
近日,以“新纪天工、开物焕彩——致敬开源的力量”为活动主题的“重大科技成就发布会(首场)”在国家科技传播中心成功举办,并隆重揭晓了 2024 开源创新榜单,旨在致敬中国开源力量,传播推广开源科技成就,营造中国开源创新生态。2024 年开源创新榜单由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办,中国开发者社区承办,以王怀民院士为首组建评审委员会,进行研讨评审,面向中国开源行业领域,遴选具有创新性、贡献度和影响力的开源项目、社区、应用场景与开源事件。在评审出的 10 个年度开源项目中,Apache RocketMQ、Apache Seata 成功入选。
802 139
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
消息中间件 存储 Apache
恭喜 Apache RocketMQ 荣获 2024 开源创新榜单“年度开源项目”
恭喜 Apache RocketMQ 荣获 2024 开源创新榜单“年度开源项目”
467 1
|
存储 负载均衡 NoSQL
搭建高可用及负载均衡的Redis
通过本文介绍的高可用及负载均衡Redis架构,可以有效提升Redis服务的可靠性和性能。主从复制、哨兵模式、Redis集群以及负载均衡技术的结合,使得Redis系统在应对高并发和数据一致性方面表现出色。这些配置和技术不仅适用于小型应用,也能够支持大规模企业级应用的需求。希望本文能够为您的Redis部署提供实用指导和参考。
1113 9
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
1162 3
|
负载均衡 算法 关系型数据库
MySQL集群如何实现负载均衡?
【8月更文挑战第16天】MySQL集群如何实现负载均衡?
1166 6
|
负载均衡 算法 应用服务中间件
负载均衡技术在Web服务器集群中的应用
【8月更文第28天】随着互联网的发展和用户对Web服务需求的增长,单台服务器很难满足大规模访问的需求。为了提高系统的稳定性和扩展性,通常会采用Web服务器集群的方式。在这种架构中,负载均衡器扮演着至关重要的角色,它能够合理地分配客户端请求到不同的后端服务器上,从而实现资源的最优利用。
656 2
|
负载均衡 网络协议
使用LVS搭建集群实现负载均衡(二)安装使用
【8月更文挑战第8天】使用LVS搭建集群实现负载均衡(二)安装使用
415 5
|
存储 负载均衡 算法
使用LVS搭建集群实现负载均衡(一)
【8月更文挑战第8天】使用LVS搭建集群实现负载均衡
917 5