方案1:Nginx+Keepalived+emq+MySQL双机热备,MySQL用于数据持久化
方案2(推荐):HAProxy+Keepalived+emq+MySQL双机热备
方案3:HAProxy+confd+emq+etcd
问:我还有一个疑问,使用了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)。
一个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
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
新增WebHook插件: emq-web-hook ,支持在MQTT客户端上下线、消息发布订阅时触发WebHook回调。
新增Lua Hook插件: emq-lua-hook ,支持Lua脚本注册EMQ扩展钩子来开发插件。
EMQ 2.2 版本改进认证链设计,当前认证模块返回ignore(例如用户名不存在等情况下),认证请求将继续转发后面认证模块:
------------- ------------ -------------
Client --> | Redis认证 | -ignore-> | HTTP认证 | -ignore-> | MySQL认证 |
------------- ------------ -------------
| | |
\|/ \|/ \|/
allow | deny allow | deny allow | deny
EMQ 2.2 版本支持bcrypt密码Hash方式,例如Redis认证插件配置:
auth.redis.password_hash = bcrypt
'mqtt.queue.*' 配置变更为 'mqtt.mqueue.*'
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负载均衡服务器