RabbitMQ集群及负载均衡搭建

一、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

你可能感兴趣的:(JAVA)