mqtt haproxy 代理及负载搭建
目录
mqtt 分布集群搭建
haproxy 安装配置
解压
安装
配置haproxy.cfg
启动haproxy
配置mqtt
测试
负载配置说明
负载均衡算法
ACL规则定义
全局配置
默认配置
统计页面配置
设置haproxy 错误页面
frontend前端配置
backend后端配置
haproxy监测页面参数
mqtt 分布集群搭建
详情请参照emqtt 分布集群及节点桥接搭建
haproxy 安装配置
解压
cd /home/hylink/
tar zxvf haproxy-1.8.12.tar.gz
cd zxvf haproxy-1.8.12
安装
make TARGET=linux2628 ARCH=x86_64 PREFIX=/home/hylink/haproxy
make install PREFIX=/home/hylink/haproxy
#参数说明
TARGET=linux26 #内核版本,使用uname -r查看内核,如:2.6.18-371.el5,此时该参数就为linux26;kernel 大于2.6.28的用:TARGET=linux2628
ARCH=x86_64 #系统位数
PREFIX=/home/hylink/haproxy /home/hylink/haproxy为haprpxy安装路径
配置haproxy.cfg
sudo gedit /home/hylink/haproxy/sbin/haproxy.cfg
添加以下内容
globallog 127.0.0.1 local0log 127.0.0.1 local1 noticedaemonnbproc 2maxconn 51200pidfile /home/hylink/haproxy/sbin/haproxy.pid defaultslog globalmode httpoption httplogoption dontlognullretries 3option abortonclosetimeout connect 5000mstimeout client 30000mstimeout server 60000msbalance roundrobinlisten statsbind *:9080mode httpoption httplogmaxconn 10stats refresh 30sstats uri /statsstats realm Haproxy Managerstats hide-versionstats admin if TRUE
启动haproxy
/home/hylink/haproxy/sbin/haproxy -f /home/hylink/haproxy/sbin/haproxy.cfg
出现以下异常
[WARNING] 227/155234 (4947) : Proxy 'stats': in multi-process mode, stats will be limited to process assigned to the current request.
[WARNING] 227/155234 (4947) : Proxy 'stats': stats admin will not work correctly in multi-process mode.
[WARNING] 227/155234 (4947) : [/home/hylink/haproxy/sbin/haproxy.main()] Cannot raise FD limit to 102411, limit is 4096.
[WARNING] 227/155234 (4947) : [/home/hylink/haproxy/sbin/haproxy.main()] FD limit (4096) too low for maxconn=51200/maxsock=102411. Please raise 'ulimit-n' to 102411 or more to avoid any trouble.
解决方案:系统里的能打开的文件描述符太小,程序里的比较大,只要将系统里的FD重新调大就好
1、修改/etc/security/limits.conf,通过
vi /etc/security/limits.conf
修改其内容,在文件最后加入(数值也可以自己定义):
* soft nofile = 32768
* hard nofile = 65536
2、修改/etc/profile,通过
vi /etc/profile
修改,在最后加入以下内容
ulimit -n 32768
3、切换用户
su - root
source /etc/profile
在root用户下继续执行
/home/hylink/haproxy/sbin/haproxy -f /home/hylink/haproxy/sbin/haproxy.cfg
启动haproxy,访问:http://172.19.12.231:9080/stats 进入统计页面,至此haproxy搭建完毕。
配置mqtt
执行
./bin/emqttd_ctl cluster status
查看集群信息
执行
vim /home/hylink/haproxy/sbin/haproxy.cfg
添加以下内容
listen mqttbind *:1890mode tcpmaxconn 50000option clitcpka # For TCP keep-alivetimeout 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 kernaloption tcplogbalance leastconnserver emq1 172.19.12.231:1883 check inter 10000 fall 2 rise 5 weight 1server emq2 172.19.12.207:1883 check inter 10000 fall 2 rise 5 weight 1
重启haproxy
访问:http://172.19.12.231:9080/stats
测试
分别用两台机器的客户端连接代理机器的1890端口。
这个客户端分别被分配到不同的机器上
接收消息效果
负载配置说明
负载均衡算法
一、roundrobin,表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法。该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
二、static-rr,表示根据权重,建议关注;每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权限是无效的。另外,它对服务器的数量没有限制。
三、leastconn,表示最少连接者先处理,建议关注;leastconn建议用于长会话服务,例如LDAP、SQL、TSE等,而不适合短会话协议。如HTTP.该算法是动态的,对于实例启动慢的服务器权重会在运行中调整。
四、source,表示根据请求源IP,建议关注;对请求源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
只要服务器正常,同一个客户端IP地址总是访问同一个服务器。如果哈希的结果随可用服务器数量而变化,那么客户端会定向到不同的服务器;
该算法一般用于不能插入cookie的Tcp模式。它还可以用于广域网上为拒绝使用会话cookie的客户端提供最有效的粘连;
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
五、uri,表示根据请求的URI;表示根据请求的URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
只要服务器正常,同一个URI地址总是访问同一个服务器。
一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端;
该算法一般用于后端是缓存服务器;
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
六、url_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name
在HTTP GET请求的查询串中查找<param>中指定的URL参数,基本上可以锁定使用特制的URL到特定的负载均衡器节点的要求;
该算法一般用于将同一个用户的信息发送到同一个后端服务器;
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
七、hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
在每个HTTP请求中查找HTTP头<name>,HTTP头<name>将被看作在每个HTTP请求,并针对特定的节点;
如果缺少头或者头没有任何值,则用roundrobin代替;
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
八、rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
为每个进来的TCP请求查询并哈希RDP cookie<name>;
该机制用于退化的持久模式,可以使同一个用户或者同一个会话ID总是发送给同一台服务器。
如果没有cookie,则使用roundrobin算法代替;
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据“hash-type”的变化做调整。
#其实这些算法各有各的用法,我们平时应用得比较多的应该是roundrobin、source和lestconn。
ACL规则定义
########ACL策略定义#########################
1、#如果请求的域名满足正则表达式返回true -i是忽略大小写
acl denali_policy hdr_reg(host) -i ^(www.inbank.com|image.inbank.com)$
2、#如果请求域名满足www.inbank.com 返回 true -i是忽略大小写
acl tm_policy hdr_dom(host) -i www.inbank.com
3、#在请求url中包含sip_apiname=,则此控制策略返回true,否则为false
acl invalid_req url_sub -i sip_apiname=#定义一个名为invalid_req的策略
4、#在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false
acl timetask_req url_dir -i timetask
5、#当请求的header中Content-length等于0时返回 true
acl missing_cl hdr_cnt(Content-length) eq 0
#########ACL策略匹配相应###################
1、#当请求中header中Content-length等于0 阻止请求返回403
block if missing_cl
2、#block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。
block if !invalid_req || timetask_req
3、#当满足denali_policy的策略时使用denali_server的backend
use_backend denali_server if denali_policy
4、#当满足tm_policy的策略时使用tm_server的backend
use_backend tm_server if tm_policy
5、#reqisetbe关键字定义,根据定义的关键字选择backend
reqisetbe ^Host:\ img dynamic
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic
reqisetbe ^[^\ ]*\ /admin/stats stats
6、#以上都不满足的时候使用默认mms_server的backend
default_backend mms
全局配置
###########全局配置#########
global
log 127.0.0.1 local0 #[日志输出配置,所有日志都记录在本机,通过local0输出]
log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warringinfo debug]
daemon #以后台形式运行harpoxy
nbproc 1 #设置进程数量
maxconn 4096 #默认最大连接数,需考虑ulimit-n限制
#user haproxy #运行haproxy的用户
#group haproxy #运行haproxy的用户所在的组
#pidfile /var/run/haproxy.pid #haproxy 进程PID文件
#ulimit-n 819200 #ulimit 的数量限制
#chroot /usr/share/haproxy #chroot运行路径
#debug #haproxy 调试级别,建议只在开启单进程的时候调试
#quiet
默认配置
########默认配置############
defaults
log global
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
option httplog #日志类别,采用httplog
option dontlognull #不记录健康检查日志信息
retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
#option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
#option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
maxconn 4096 #默认的最大连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
#timeout check 2000 #心跳检测超时
#timeout http-keep-alive10s #默认持久连接超时时间
#timeout http-request 10s #默认http请求超时时间
#timeout queue 1m #默认队列超时时间
balance roundrobin #设置默认负载均衡方式,轮询方式
#balance source #设置默认负载均衡方式,类似于nginx的ip_hash
#balnace leastconn #设置默认负载均衡方式,最小连接数
统计页面配置
########统计页面配置########
listen stats
bind 0.0.0.0:1080 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
mode http #http的7层模式
option httplog #采用http日志格式
#log 127.0.0.1 local0 err #错误日志记录
maxconn 10 #默认的最大连接数
stats refresh 30s #统计页面自动刷新时间
stats uri /stats #统计页面url
stats realm XingCloud\ Haproxy #统计页面密码框上提示文本
stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名
stats auth Frank:Frank #设置监控页面的用户和密码:Frank
stats hide-version #隐藏统计页面上HAProxy的版本信息
stats admin if TRUE #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)
设置haproxy 错误页面
########设置haproxy 错误页面#####
#errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
#errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
#errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
#errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
#errorfile 504 /home/haproxy/haproxy/errorfiles/504.http
frontend前端配置
########frontend前端配置##############
frontend main
bind *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
acl web hdr(host) -i www.abc.com #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则,。
acl img hdr(host) -i img.abc.com #如果访问img.abc.com这个域名,就触发img规则。
use_backend webserver if web #如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域。
use_backend imgserver if img #如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域。
default_backend dynamic #不满足则响应backend的默认页面
backend后端配置
########backend后端配置##############
backend webserver #webserver作用域
mode http
balance roundrobin #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
option httpchk /index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它
server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3
server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3
#cookie 1表示serverid为1,check inter 1500 是检测心跳频率
#rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
backend imgserver
mode http
option httpchk /index.php
balance roundrobin
server img01 192.168.137.101:80 check inter 2000 fall 3
server img02 192.168.137.102:80 check inter 2000 fall 3
backend dynamic
balance roundrobin
server test1 192.168.1.23:80 check maxconn 2000
server test2 192.168.1.24:80 check maxconn 2000
listen tcptest
bind 0.0.0.0:5222
mode tcp
option tcplog #采用tcp日志格式
balance source
#log 127.0.0.1 local0 debug
server s1 192.168.100.204:7222 weight 1
server s2 192.168.100.208:7222 weight 1
haproxy监测页面参数
Queue
Cur: current queued requests //当前的队列请求数量
Max:max queued requests //最大的队列请求数量
Limit: //队列限制数量
Session rate(每秒的连接回话)列表:
scur: current sessions //每秒的当前回话的限制数量
smax: max sessions //每秒的新的最大的回话量
slim: sessions limit //每秒的新回话的限制数量
Sessions
Total: //总共回话量
Cur: //当前的回话
Max: //最大回话
Limit: //回话限制
Lbtot: total number of times a server was selected //选中一台服务器所用的总时间
Bytes
In: //网络的字节数输入总量
Out: //网络的字节数输出总量
Denied
Req: denied requests//拒绝请求量
Resp:denied responses //拒绝回应
Errors
Req:request errors //错误请求
Conn:connection errors //错误的连接
Resp: response errors (among which srv_abrt) ///错误的回应
Warnings
Retr: retries (warning) //重新尝试
Redis:redispatches (warning) //再次发送
Server列表:
Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
LastChk: 持续检查后端服务器的时间
Wght: (weight) : //权重
Act: server is active (server), number of active servers (backend) //活动链接数量
Bck: server is backup (server), number of backup servers (backend) //backup://备份的服务器数量
Down: //后端服务器连接后都是down的数量
Downtime: downtime: total downtime (in seconds) //总的downtime 时间
Throttle: warm up status //设备变热状态
mqtt haproxy 代理及负载搭建相关推荐
- 利用Haproxy实现http和TCP反向代理和负载均衡(入门和技术验证)
系统访问量上去遇到了性能瓶颈,解决方法一般都是从两个方向入手Scale Up 和Scale Out.Scale Up适用于哪些钱多的系统,因为Scale Up其实就是直接升级硬件,CPU.内存.IO哪 ...
- Haproxy群集+Nginx负载均衡+Tomcat架构搭建
文章目录 Haproxy群集+Nginx负载均衡+Tomcat 一.Nginx+Tomcat 1.tomcat1搭建 1)准备工作 2)安装JDK,配置tomcat环境变量 ①rpm安装JDK ②配置 ...
- Nginx反向代理,负载均衡,Redis集群 Twemproxy,redis session共享,keepalived高可用-搭建千万级网站系统
Nginx反向代理,负载均衡,redis session共享,keepalived高可用-搭建千万级系统架构 1.安装Nginx 安装机器IP地址为: 192.168.91.129 (主) 192.1 ...
- Nginx、Haproxy、LVS负载均衡从原理到部署(一)
先说些题外话,我记得51博客的号早就注册了,之前只是不间断上来看看别人写的技术文章涨涨见识,自己后面开始接触到运维这块,就想到把平时学的一些相关技术记录到博客上来,只是方便自己可以随时上网回顾,由于多 ...
- Nginx反向代理与负载均衡应用实践
本链接转载自:https://www.cnblogs.com/chensiqiqi/p/9162926.html 仅供自学使用. 1.1 集群简介 简单地说,集群就是指一组(若干个)相互独立的计算机, ...
- nginx 反向代理与负载均衡应用实践
集群介绍 集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器.这些服务器之间可以彼此通信,协同向 ...
- nginx反向代理及负载均衡使用详解
nginx反向代理及负载均衡使用说明 文章目录 nginx反向代理及负载均衡使用说明 集群介绍 负载均衡架构图 为什么要使用集群 集群种类 负载均衡概念说明 压力测试 反响代理概念说明 反向代理图解 ...
- 从0开始,在Linux中配置Nginx反向代理、负载均衡、session共享、动静分离
写这篇文章花费了我近一周的时间,参考网上许多优秀的博客文章,我不敢说写的很好,至少很全很详细.本文先介绍原理部分,然后再进行实战操作,我认为这样才会有更深的理解,不过这也导致了文章篇幅很长.但是,如果 ...
- Haproxy代理配置---传输层
Haproxy简介: 1.HAProxy 是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy特 ...
最新文章
- Redis 笔记(14)— 持久化及数据恢复(数据持久方式 RDB 和 AOF、数据恢复、混合持久化)
- android 在 ListView 的 item 中插入 GridView 仿微信朋友圈图片显示。
- ModelSim几种不同的版本的区别
- 【Java从0到架构师,mysql视频教程推荐
- dubbo+zookeeper+spring实例
- Windows Phone开发(25):启动器与选择器之WebBrowserTask
- boost::hana::greater用法的测试程序
- Redis实战(四):redis的消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU
- 当c语言表达式中同时有字符 整数,c语言第2章数据类型、运算符与表达式a.ppt
- 怎样才能找到一份AI领域的好工作?
- python+Django学习资源汇总-更新中
- 获得1.5亿区块链投资后,矩阵元怎么做区块链?
- 利用caffe的Python接口生成prototxt文件
- 犹太人成功和浪漫的秘诀(.html)
- 如何创建一个javaWeb项目
- 基于51单片机的数字气压计
- Android开发TextvView实现镂空字体效果
- 爬虫爬取学校通知信息(python))
- 我爱机器学习 机器学习干货站- 资源
- 儿童语言发育迟缓分类中C群d是指,语言发育迟缓的定义及常见表现
热门文章
- LLVM | 编译器框架
- linux下载edk2链接文件
- CSDN、博客园、简书、oschina、Iteye各大社区现状
- Tampermonkey下载安装教程及脚本分享
- 推荐一个记事本程序(替代windows记事本)
- 可视化指标计算公式_股票交易数据可视化:技术分析常用指标绘制
- pdf从结构新建书签_PDF怎么加书签与目录:
- 计算机之父阿兰·图灵(图灵诞辰104周年)
- win10系统 jdk8 安装闪退 解决方案
- Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection brok