RabbitMQ高可用集群化
原创
©著作权归作者所有:来自51CTO博客作者蹊源的奇思妙想的原创作品,请联系作者获取转载授权,否则将追究法律责任
RabbitMQ有三种模式
- 单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。
- 普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。(消息同步采用被动拉取的模式)
- 镜像模式:把需要的队列做成镜像队列,存在与多个节点属于RabbitMQ的HA方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步。(消息同步采用主动推送的模式)
RabbitMQ使用了那些端口号
- client端通信口5672
- 管理口15672
- server间内部通信口25672
- erlang发现口:4369
集群化的实现
第一步:保证.erlang.cookie一致
在$HOME中或者在/var/lib/rabbitmq中,文件名称为.erlang.cookie,他是一个隐藏文件。 erlang集群是通过这个cookie进行通信认证的,因此我们做集群的第一步就是干cookie。 所以要保证集群中所有节点中.erlang.cookie文件中cookie值一致,且权限为owner只读。
cd /var/lib/rabbitmq
cat .erlang.cookie
chmod 600 .erlang.cookie
第二步 配置/etc/host
192.168.25.100 master
192.168.25.101 cluster
#通过查看rabbitmq状态验证
rabbitmqctl status -n rabbit@master
rabbitmqctl status -n rabbit@clutser
第三步 建立集群
rabbitmqctl stop_app(注意硬盘节点先不要执行)
rabbitmqctl join_cluster --ram rabbit@master(连接到任意一个已经加入集群的节点均可)
rabbitmqctl start_app
rabbitmqctl cluster_status //查看集群状态
//RAM是磁盘节点,Disc是内存节点(默认)
//在RabbitMQ集群里,必须至少有一个磁盘节点存在(磁盘节点用来存储集群状态)。
内存节点将所有的队列,交换器,绑定关系,用户,权限,和vhost的元数据信息保存在内存中,而磁盘节点将这些信息保存在磁盘中。
内存节点性能更优但不安全,所以单节点时只有磁盘节点,集群环境中可以有内存节点,但至少有一个是节点是磁盘节点。
第四步 设置成镜像模式(根据业务需要选择是否设定)
#在集群任意节点
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
结合Haproxy实现RabbitMQ负载均衡
HAProxy 安装在服务器上,安装命令:
rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm//
yum -y install haproxy
配置 HAProxy:
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
vi /etc/haproxy/haproxy.cfg
将下面的配置添加到/etc/haproxy/haproxy.cfg文件中:
global
log 127.0.0.1 local0 info
log 127.0.0.1 local1 notice
daemon
maxconn 4096
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option abortonclose
maxconn 4096
timeout connect 5000ms
timeout client 3000ms
timeout server 3000ms
balance roundrobin
listen private_monitoring
bind 0.0.0.0:8100 #Haproxy负载均衡信息
mode http
option httplog
stats refresh 5s
stats uri /stats
stats realm Haproxy
stats auth admin:admin #Haproxy用户即密码
listen rabbitmq_admin
bind 0.0.0.0:8102 #RabbitMQ集群 对外提供服务的接口
server master master:15672
server cluster cluster:15672
listen rabbitmq_cluster
bind 0.0.0.0:8101 #RabbitMQ Server Web 管理界面(基于负载均衡)
mode tcp
option tcplog
balance roundrobin
timeout client 3h
timeout server 3h
server master master:5672 check inter 5000 rise 2 fall 3 #5672端口是节点之间用来通讯的端口
server cluster cluster:5672 check inter 5000 rise 2 fall 3
然后启动 HAProxy:
service haproxy start 启动
service haproxy stop 停止
service haproxy restart 重启