使用Docker搭建RabbitMQ集群并用HAProxy实现负载均衡

文章目录

        • 1、Docker安装
        • 2、RabbitMQ集群搭建
          • 2.1、RabbitMQ集群基础知识
            • 2.1.1、集群中的节点
            • 2.1.2、集群模式
          • 2.2、创建RabbitMQ容器
          • 2.3、将节点添加到集群中
          • 2.4、建置镜像模式集群
          • 2.5、其他说明
        • 3、HAProxy实现负载均衡

1、Docker安装

Docker安装过程,这里使用的是Docker Desktop,直接在官网下载完以后安装就好;具体的过程就不介绍了,与安装其他软件差不太多。

2、RabbitMQ集群搭建

2.1、RabbitMQ集群基础知识
2.1.1、集群中的节点

Rabbit MQ集群中的节点分为内存节点(RAM)磁盘节点(disk,消息持久化),每一个集群中都至少有一个磁盘节点;

2.1.2、集群模式

RabbitMQ的集群有两种模式:普通模式(默认)镜像模式

普通模式
集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节点,对于消费者来说,若消息进入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消息从A中取出,并经过B发送给消费者。

适合于消息无需持久化的场景,如日志队列。当队列非持久化,且创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化,只能等故障节点恢复。
缺点:无法解决单点故障问题。

镜像模式
与普通模式不同之处时消息实体会主动在镜像节点间同步,而不是在取数据时临时拉取,高可用;镜像集群模式可以保证集群只要不全部宕机,数据就不会丢失,当相对于性能来说,镜像集群模式会比普通集群模式多出消耗数据的传输。

2.2、创建RabbitMQ容器

Docker Desktop安装完以后,就可以在PowerShell中执行Docker脚本了,这里创建三个RabbitMQ的节点,使用Docker来拉取镜像,创建容器的过程如下:

# RabbitMQ01
docker run --name rabbitmq01 --hostname rabbitmq01 -v rabbimq01:/var/lib/rabbitmq  -d  -p 15672:15672 -p 5672:5672  -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management
# RabbitMQ02
docker run --name rabbitmq02 --hostname rabbitmq02 -v rabbimq02:/var/lib/rabbitmq -d  -p 15673:15672 -p 5673:5672 --link rabbitmq01:rabbitmq01  -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management
# RabbitMQ03
docker run --name rabbitmq03 --hostname rabbitmq03 -v rabbimq03:/var/lib/rabbitmq -d  -p 15674:15672 -p 5674:5672 --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02  -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management

Note:

a、创建时要注意使用--hostname来创建主机名称;
b、RABBITMQ_ERLANG_COOKIE 起到节点认证的作用,且集群内所有节点的值必须相同,集群部署时需要同步该值;
c、--link(docker容器间互联的方法):单方向的互联,先启动的容器只能用IP地址连接后启动的容器,后启动的容器可通过IP地址、容器名、别名进行连接。

完成以上的内容以后三个RabbitMQ的节点就算时创建完成了。

2.3、将节点添加到集群中

将节点添加到集群的命令如下:

	#进入rabbitmq01容器,重新初始化一下,如果是新安装则reset可以忽略重置。
	docker exec -it rabbitmq01 bash
	rabbitmqctl stop_app
	rabbitmqctl reset
	rabbitmqctl start_app
	exit

	#进入rabbitmq02容器,重新初始化一下,将02节点加入到集群中
	docker exec -it rabbitmq02 bash
	rabbitmqctl stop_app
	rabbitmqctl reset
	rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #参数“--ram”表示设置为内存节点,忽略该参数默认为磁盘节点。  rabbit@rabbitmq01 为设置的主节点rabbitmq01
	rabbitmqctl start_app
	exit

	#进入rabbitmq03容器,重新初始化一下,将03节点加入到集群中
	docker exec -it rabbitmq03 bash
	rabbitmqctl stop_app
	rabbitmqctl reset
	rabbitmqctl join_cluster --ram rabbit@rabbitmq01
	rabbitmqctl start_app
	exit

完成以上步骤以后,一个普通模式的集群就已经搭建完成了。

2.4、建置镜像模式集群

接下来将集群变更为镜像模式,使用的命令如下:

#随便进入一个容器
docker exec -it rabbitmq01 bash
#设置策略匹配所有名称是amp开头的队列都存储在2个节点上的命令如下
rabbitmqctl set_policy -p / ha "^amp*" '{"ha-mode":"exactly","ha-params":2}'
#或者
#设置策略匹配所有名称的队列都进行高可用配置
rabbitmqctl set_policy -p / ha "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
#查询策略
rabbitmqctl list_policies -p / #查看vhost下的所有的策略(policies )

# 使用set policy 命令设置镜像队列策略:
rabbitmqctl set_policy -p [virtualhost] [Name] [Pattern] [Definition]  [Priority]
# virtualhost: 虚拟机名称
# Name:策略名称
# Pattern:正则表达式
# Definition:策略定义
# Priority:优先级

至此,集群的镜像模式也搭建完成。
这时访问http://localhost:15673以后就可以显示如下的画面,所有的节点信息都会显示
使用Docker搭建RabbitMQ集群并用HAProxy实现负载均衡_第1张图片

2.5、其他说明

以上的操作完成了RabbitMQ集群的搭建,但是在SpringBoot中对于集群的访问时,是按照配置的顺序执行的,只有第一个建立连接的节点挂掉以后才会去与第二个建立连接。如果要实现节点之间的负载均衡,就需要用到下面提到的代理工具HAProxy。

3、HAProxy实现负载均衡

建置HAProxy的过程如下,首先进行HAProxy配置文档的配置:

#logging options
global
	log 127.0.0.1 local0 info
	maxconn 5120
	chroot /usr/local/etc/haproxy
	uid 99
	gid 99
	daemon
	pidfile /var/run/haproxy.pid

defaults
	log global
	#使用4层代理模式,”mode http”为7层代理模式
	mode tcp
	#if you set mode to tcp,then you nust change tcplog into httplog
	option tcplog
	option dontlognull
	retries 3
	maxconn 2000
	timeout connect 5s
    #客户端空闲超时时间为 60秒 则HA 发起重连机制
    timeout client 60s
    #服务器端链接超时时间为 15秒 则HA 发起重连机制
    timeout server 15s
	#front-end IP for consumers and producters

listen rabbitmq_cluster
	bind 0.0.0.0:5679
	#配置TCP模式
	mode tcp
	#简单的轮询
	balance roundrobin
	#rabbitmq集群节点配置 
	#inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
	# 192.168.1.19 是主机的地址
    server rabbitmq02 192.168.1.19:5673 check inter 5000 rise 2 fall 2
    server rabbitmq03 192.168.1.19:5674 check inter 5000 rise 2 fall 2
	server rabbitmq01 192.168.1.19:5675 check inter 5000 rise 2 fall 2
#配置haproxy web监控,查看统计信息
listen stats
	bind 0.0.0.0:8100
	mode http
	option httplog
	stats enable
	#设置haproxy监控地址为http://127.0.0.1:8100/rabbitmq-stats
	stats uri /rabbitmq-stats
	stats refresh 5s
	stats auth admin:123456

关于HAProxy配置相关的更多内容可以参考:HAproxy的配置详解

建置HAProxy容器:

docker run -d --name haproxy8100 -p 5679:5679 -p 8100:8100 -v d:/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg  haproxy:1.9.6

然后在浏览器中输入http://localhost:8100/rabbitmq-stats 访问,画面如下:
使用Docker搭建RabbitMQ集群并用HAProxy实现负载均衡_第2张图片
这样就可以看到配置的三个节点以及当前的状态。

你可能感兴趣的:(rabbitmq,docker)