概述
如果一个集群中有3个节点,那么所有的客户端都与其中的单个节点node01建立tcp连接,那么node01的网络负载必然会大大增加而显得难以承受,其他节点又由于没有那么多的负载而造成硬件资源浪费,所以负载均衡尤为重要。
客户端与集群建立的TCP连接不是与集群中所有的节点建立连接,而是挑选其中一个节点建立连接。
引入负载均衡之后,各个客户端的连接就可以分摊到集群的各个节点之中。
负载均衡(load balance)是一种计算机网络技术,用于在多个计算机、网络连接、CPU、磁盘驱动器或则其他资源中分配负载,以达到最佳资源使用、最大化吞吐率、最小响应时间及避免过载的目的。使用负载均衡器的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。
负载均衡通常分为软件负载均衡和硬件负载均衡两种。
客户端内部实现负载均衡
对于RabbitMQ来说在客户端连接时简单地使用负载均衡算法来实现负载均衡。负载均衡的方法有:
- 轮询法
- 加权轮询法:不同的后端服务器的配置可能和当前系统的负载并不相同,因此他们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请求,对于配置低、负载高的集群,给其分配较低的权重,降低其系统负载,按照请求顺序和权重分配到后端。
- 随机法:通过随机算法,根据后端的服务器的列表大小值来随机选取其中的一台服务器进行访问。随着客户端调用服务端的次数增多,其实实际效果越来越接近与平均分配调用量到后端的每一台服务器,也就是轮询的结果。
- 加权随机法:与加权轮询法一样,加权随机法也根据后端机器的配置、系统的负载分配不同的权重。不同的是,他按照权重随机请求后端服务器,而非顺序。
- 源地址哈希法(IP hash):思想是根据获取的客户端IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客户端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
- 最小连接数法:由于后端服务器的配置不尽相同,对于请求的处理有快有慢,他根据后端服务器当前的链接情况,动态地选取其中当前挤压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负载合理地分流到每一台服务器。
使用Haproxy实现负载均衡
HAProxy提供高可用性,负载均衡及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费快速并且可靠的一种解决方案,有许多知名的互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。
demo是在docker上运行3个容器组成的RabbitMQ集群,运行一个Haproxy的容器进行负载均衡。
docker 拉取haproxy。
[root@localhost ~]# docker search haproxy
[root@localhost ~]# docker pull haproxy
HAProxy配置文件
相关环境配置信息
名称 | 地址 | 端口 |
---|---|---|
HAProxy | 192.168.0.200 | 5671 |
rabbit-node01 | 192.168.0.200 | 5672 |
rabbit-node02 | 192.168.0.200 | 5673 |
rabbit-node03 | 192.168.0.200 | 5674 |
在docker的宿主机上编写haproxy.cfg
文件
[root@localhost ~]# cat /opt/haproxy.cfg
# 全局配置
global
#定义全局的syslog服务器
log 127.0.0.1 local0 info
#每个haproxy进程可以接受的最多并发数
maxconn 4096
#让haproxy以守护进程的方式工作于后台
daemon
#默认参数的配置部分
defaults
log global
#工作模式 http ,tcp 是 4 层,http是 7 层
mode tcp
option tcplog
option dontlognull
#健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
retries 3
maxconn 2000
#ha服务器与后端服务器连接超时时间
timeout connect 5s
#客户端超时
timeout client 120s
#服务端超时
timeout server 120s
listen rabbitmq_cluster
#监听地址
bind :5671
#工作模式
mode tcp
#负载均衡方法轮询
balance roundrobin
server rabbit-node01 192.168.0.200:5672 check inter 5000 rise 2 fall 3 weight 1
server rabbit-node02 192.168.0.200:5673 check inter 5000 rise 2 fall 3 weight 1
server rabbit-node03 192.168.0.200:5674 check inter 5000 rise 2 fall 3 weight 1
listen monitor
bind :8100
mode http
option httplog
stats enable
stats uri /stats
stats refresh 5s
启动容器
[root@localhost opt]# docker run -d -p 5671:5671 -p 8100:8100 --hostname haproxy --name haproxy -v /opt/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy
3f5b36082c697f93c2cefb915fc05deca41949030d92295a59fc622d317db3f8
[root@localhost opt]#
参数:后台运行、将本地5671端口和容器5671端口关联、将本地8100端口和容器8100端口相关联、容器hostname为haproxy、容器名称为haproxy、挂载本地/opt/haproxy.cfg
文件到容器内部/usr/local/etc/haproxy/haproxy.cfg
权限为read only、使用haproxy镜像。
生效配置文件
[root@localhost ~]# docker exec -it haproxy bash
root@haproxy:/#
root@haproxy:/# haproxy -f /usr/local/etc/haproxy/haproxy.cfg
root@haproxy:/#
查看HAProxy数据统计页面
浏览器访问地址http://192.168.0.200:8100/stats