Haproxy实现MQ负载均衡

用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);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容