用haproxy来实现rabbitmq的反向代理与负载均衡,当然实际上我们也可以利用nginx,主流均以haproxy来做
一、基于Haproxy构建RabbitMQ反向代理
使用keepalived创建虚拟IP 让客户访问自动寻找正常工作中的haproxy,从而让haproxy负载均衡找到相应空闲的MQ
#创建镜像 (镜像需要keepalived))
# Dockerfile文件
FROM haproxy:2.3-dev3-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add keepalived
# 生成镜像
docker build -t haproxy .
二、构造dockerfile
# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
# server
haproxy_server_173_3: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: haproxy # 指定容器的镜像文件
ports: # 配置容器与宿主机的端口
- "8103:8100" # web监听端口
- "5603:5600" # 反向代理 mq 的端口
networks: ## 引入外部预先定义的网段
haproxy:
ipv4_address: 173.200.7.3 #设置ip地址
privileged: true # 让程序在root下运行
volumes:
- "/www/wwwroot/srm/05/public/haproxy:/haproxy"
- "/www/wwwroot/srm/05/public/haproxy/keepalived/3:/keepalived"
container_name: haproxy_server_173_3 # 这是容器的名称
command: haproxy -f /haproxy/haproxy.cfg
haproxy_server_173_2: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: haproxy # 指定容器的镜像文件
ports: # 配置容器与宿主机的端口
- "8102:8100"
- "5602:5600"
networks: ## 引入外部预先定义的网段
haproxy:
ipv4_address: 173.200.7.2 #设置ip地址
privileged: true
volumes:
- "/www/wwwroot/srm/05/public/haproxy:/haproxy"
- "/www/wwwroot/srm/05/public/haproxy/keepalived/2:/keepalived"
container_name: haproxy_server_173_2 # 这是容器的名称
command: haproxy -f /haproxy/haproxy.cfg
# docker run -itd --name nginx_haproxy_173_5 -v /www/wwwroot/srm/05/public/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -p 5600:5600 --network haproxy_haproxy -ip=173.200.7.5
# nginx_haproxy:
# image: nginx1.19 # 指定容器的镜像文件.
# ports: # 配置容器与宿主机的端口
# - "5600:5600"
# networks: ## 引入外部预先定义的网段
# haproxy:
# ipv4_address: 173.200.7.5 #设置ip地址
# volumes:
# - "/www/wwwroot/srm/05/public/nginx/conf:/etc/nginx"
# container_name: nginx_haproxy_173_5 # 这是容器的
# command: nginx -c /nginx/conf/nginx.conf
# 设置网络模块
networks:
# 自定义网络
haproxy:
driver: bridge
ipam: #定义网段
config:
- subnet: "173.200.7.0/24"
三、配置文件(放共享目录)
#haproxy.cfg
global
#日志输出配置,所有日志都记录在本机,通过local0输出
log 127.0.0.1 local0 info
#最大连接数
maxconn 10240
#以守护进程方式运行
daemon
defaults
#应用全局的日志配置
log global
mode http
#超时配置
timeout connect 5000
timeout client 5000
timeout server 5000
timeout check 2000
listen http_front #haproxy的客户页面
bind 0.0.0.0:8100
mode http
option httplog
stats uri /haproxy
stats auth root:0000 # web界面的用户和密码
stats refresh 5s
stats enable
listen rabbimq_ha #负载均衡的名字
bind 0.0.0.0:5600 #对外提供的虚拟的端口
option tcplog
mode tcp
#轮询算法
balance roundrobin
server rabbit1 192.168.10.251:5672 check inter 5000 rise 2 fall 2
server rabbit2 192.168.10.251:5673 check inter 5000 rise 2 fall 2
server rabbit3 192.168.10.251:5674 check inter 5000 rise 2 fall 2
# keepalived.conf
# 2
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 0000
}
virtual_ipaddress {
173.200.7.100
}
}
# 3
vrrp_instance VI_1 {
state BACKUP
interface eth0 # centos eth33 alpine系统是eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 0000
}
# 虚拟的网络ip
virtual_ipaddress {
# 一定是在 haproxy 网络ip段里面
173.200.7.100
}
}
1、登录web查看
http://192.168.10.251:8103/haproxy
账号密码: root 0000
2、进入容器运行keepalived,添加虚拟IP
keepalived -f /keepalived/keepalived.conf
# ip a 查询是否有 173.200.7.100/32 添加上
## 如果添加失败,手动添加
ifconfig eth0:0 173.200.7.100 netmask 255.255.255.0 up
四、PHP调试端口
运行 php HAProxy.php
# HAProxy.php
<?php
require "vendor/autoload.php";
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$con = new AMQPStreamConnection('173.200.7.100', 5600, 'guest', 'guest');
// var_dump($con);
$re = $con->channel();
var_dump($re);