一、RabbitMQ集群搭建
1.1 RabbitMQ集群概述
通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。
这些节点通过 RabbitMQ HA 队列(镜像队列)进行消息队列结构复制。本方案中搭建 2 个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务。
1.2 安装 Erlang、RabbitMQ
Rabbitmq在Linux下安装再次不再赘述,回头我会单起一篇讲述Rabbitmq安装部署。
1.3 修改 /etc/hosts
cd /etc/hosts 目录修改host文件
10.73.8.17 d5kl-slh1 10.72.8.17 d5kl-slh2
1.4 设置 Erlang Cookie
RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过源安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通过源码安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。
.erlang.cookie默认权限是400,所以需要先修改d5kl-slh1、d5kl-slh2中的该文件权限为 777 查看d5kl-slh1中cookie文件里的内容:
chmod 777 .erlang.cookie vi .erlang.cookie
然后将文件复制到 d5kl-slh2节点的.erlang.cookie文件中。修改完之后,将权限还原为400
chmod 400 .erlang.cookie
1.5 使用detached参数,在后台启动Rabbit Node
要先停止现有的Rabbitmq-server,再重新在后台支行
rabbitmqctl stop --停止rabbitmq-server rabbitmq-server -detached --添加detached参数 rabbitmqctl cluster_status -- 查看各节点状态 如d5kl-slh1节点 rabbitmqctl cluster_status Cluster status of node rabbit@d5kl-slh1... [{nodes,[{disc,[rabbit@d5kl-slh1]}]}, {running_nodes,[rabbit@d5kl-slh1]}, {cluster_name,<<"rabbit@d5kl-slh1">>}, {partitions,[]}, {alarms,[{rabbit@d5kl-slh1,[]}]}]
1.6 将d5kl-slh1、d5kl-slh2组成集群
因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。
d5kl-slh2节点配置
rabbitmqctl stop_app --关闭应用 rabbitmqctl join_cluster rabbit@d5kl-slh1 --将d5kl-slh2节点加入到d5kl-slh1集群 rabbitmqctl start_app --开启app
如果要使用内存节点,则可以使用以下命令:
将该命令rabbitmqctl join_cluster rabbit@d5kl-slh1修改为 rabbitmqctl join_cluster --ram rabbit@d5kl-slh1
集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。d5kl-slh1节点状态
rabbitmqctl cluster_status Cluster status of node 'rabbit@d5kl-slh1' ... [{nodes,[{disc,['rabbit@d5kl-slh1','rabbit@d5kl-slh2']}]}, {running_nodes,['rabbit@d5kl-slh2','rabbit@d5kl-slh1']}, {cluster_name,<<"rabbit@d5kl-slh2">>}, {partitions,[]}, {alarms,[{'rabbit@d5kl-slh2',[]},{'rabbit@d5kl-slh1',[]}]}]
d5kl-slh2节点状态
rabbitmqctl cluster_status Cluster status of node 'rabbit@d5kl-slh2' ... [{nodes,[{disc,['rabbit@d5kl-slh1','rabbit@d5kl-slh2']}]}, {running_nodes,['rabbit@d5kl-slh1','rabbit@d5kl-slh2']}, {cluster_name,<<"rabbit@d5kl-slh2">>}, {partitions,[]}, {alarms,[{'rabbit@d5kl-slh1',[nodedown]},{'rabbit@d5kl-slh2',[]}]}]
同时在Web管理工具中也可以看到效果
1.7 RabbitMQ镜像功能
使用Rabbit镜像功能,需要基于RabbitMQ策略来实现,策略是用来控制和修改群集范围的某个vhost队列行为和Exchange行为
rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}' 这行命令在vhost名称为hrsystem创建了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 “^” 表示所有匹配所有队列名称。 例如下面的命令,^message 这个规则要根据自己修改,这个是指同步"message"开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为"^"。 rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'
二、软件负载均衡软件HAProxy
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。HAProxy支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。
HAProxy的特点是:
- HAProxy是支持虚拟主机的,,并能支持上万级别的连接;
- 能够补充Nginx的一些缺点比如Session的保持,cookie的引导等工作;
- 支持url检测后端的服务器出问题的检测会有很好的帮助;
- 它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
- HAProxy可以对mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS,所以我向大家推荐LVS+Keepalived;
- 能够提供4层,7层代理。HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量,7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求 (request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则;
- HAProxy的算法现在也越来越多了,具体有如下8种:
- roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
- static-rr,表示根据权重,建议关注;
- leastconn,表示最少连接者先处理,建议关注;
- source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
- ri,表示根据请求的URI;
- rl_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name;
- hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
- rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
准备单独一台机器安装
现以10.74.8.17为例
2.1 安装epel
yum install epel
2.2 安装HAProxy
yum install haproxy
2.3 配置HAProxy
vim /etc/haproxy/haproxy.cfg
Global settings
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats
Defaults Setting
defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000
haproxy 监控页面
listen private_monitoring :8100 mode http option httplog stats enable #设置haproxy监控地址为http://localhost:8100/stats stats uri /stats stats refresh 30s #添加用户名密码认证 stats auth admin:1234
将RabbitMQ的管理界面也放在HAProxy
listen rabbitmq_admin 0.0.0.0:15672 server node1 10.73.8.17:15672 server node2 10.72.8.17:15672
在HAProxy监听Rabbitmq5672端口
listen rabbitmq_cluster 0.0.0.0:5673 mode tcp option tcplog #timeout client 3h #timeout server 3h option clitcpka balance roundrobin --负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数) server node1 10.73.8.17:5672 check inter 5s rise 2 fall 3 #check inter 2000 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用 server node2 10.72.8.17:5672 check inter 5s rise 2 fall 3
三、参考文章
- RabbitMQ3.6.3集群搭建+HAProxy1.6做负载均衡 http://www.cnblogs.com/lion.net/p/5725474.html
- haproxy使用详解 http://ljbaby.blog.51cto.com/10002758/1689459
- RabbitMQ分布式集群架构和高可用性(HA)http://blog.csdn.net/woogeyu/article/details/51119101