• rabbitmq单机部署、集群部署、haproxy+keepalived 的高可用负载均衡环境搭建


    环境准备

    服务器IP

    服务器 IP hostname
    rabbit-50 192.168.86.50 node0
    rabbit-51 192.168.86.51 node1
    rabbit-52 192.168.86.52 node2

    单机模式部署

    1. 根据服务器的内核下载对应的 Erlang 版本、rabbitmq 的版本,并且将两个文件上传到服务器 /opt 目录下

      uname -r
      

      image-20210720101305916

    2. 安装依赖 socat、logrorate

      yum install socat logrotate -y
      
    3. 安装依赖 Erlang

      cd /opt #进入上传目录
      rpm -ivh erlang-23.3.4.4-1.el7.x86_64.rpm
      
    4. 安装 rabbitmq

      rpm -ivh rabbitmq-server-3.8.19-1.el7.noarch.rpm
      
    5. 设置开机自启动

      chkconfig rabbitmq-server on
      
    6. 安装rabbitmq_management 插件用于前台管理

      rabbitmq-plugins enable rabbitmq_management
      
    7. 创建一个超级管理员用户,并且赋权

      rabbitmqctl add_user root s3crEt 
      rabbitmqctl set_user_tags root administrator
      rabbitmqctl set_permissions --vhost '/' root '.*' '.*' '.*'  
      
    8. 启动、停止、查看状态

      /sbin/service rabbitmq-server status #查看状态
      /sbin/service rabbitmq-server start #启动
      /sbin/service rabbitmq-server stop #停止
      
    9. 前台浏览器访问 http://localhost:15672

    集群模式部署

    1. 修改三台机器的主机名称: vi /etc/hostname

    2. 配置各个节点的hosts文件,让各个节点能够互相识别对方: vi /etc/host

      192.168.86.50 node0
      192.168.86.51 node1
      192.168.86.52 node2
      
    3. 重启服务器

    4. 按照单机模式部署的步骤,每台机器从第1步执行到第6步结束

    5. 确保每个服务器的 erlang.cookie 文件使用的是同一个值,在node0执行以下命令:

      scp /var/lib/rabbitmq/.erlang.cookie root@node1:/var/lib/rabbitmq/.erlang.cookie
      scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie
      
      
    6. 启动 rabbitmq 服务,在三台机器上执行以下命令

      systemctl start rabbitmq-server
      
    7. 在 node1 执行以下命令

      rabbitmqctl join_cluster rabbit@node0
      rabbitmqctl start_app
      
    8. 在node2执行以下命令

      rabbitmqctl join_cluster rabbit@node1
      rabbitmqctl start_app
      
    9. 查看集群状态

      rabbitmqctl cluster_status
      
    10. 创建用户及赋权

      rabbitmqctl add_user admin 123   #创建用户
      rabbitmqctl set_user_tags admin administrator  #设置用户角色
      rabbitmqctl set_permissions -p '/' admin '.*' '.*' '.*'  #设置用户权限
      
    11. 随便打开一个节点的管理界面查看集群状态:

      image-20210802114710618

    使用 haproxy + keepalived 实现高可用负载均衡

    架构图

    image-20210802141226041

    安装 haproxy

    1. 在集群部署的基础上执行以下操作

    2. 在 node0 和 node1 下载安装 haproxy

      yum install haproxy
      
    3. 修改 node0 和 node1 的 haproxy.cfg : vi /etc/haproxy/haproxy.cfg

      # 绑定配置
      listen rabbitmq_admin
          bind :15673
          balance roundrobin
          server node0 node0:15672
          server node1 node1:15672
          server node2 node2:15672
      
      # 绑定配置
      listen rabbitmq_cluster
          bind :5673
          # 采用加权轮询的机制进行负载均衡
          balance roundrobin
          # RabbitMQ 集群节点配置
          #每隔 5 秒进行一次健康检查,如果连续两次的检查结果都是正常,则认为该节点可用,此时可以将客户端的请求轮询到该节点上;如果连续 3 次的检查结果都不正常,则认为该节点不可用。weight 用于指定节点在轮询过程中的权重
          server node0 node0:5672 check inter 5000 rise 2 fall 3 weight 1
          server node1 node0:5672 check inter 5000 rise 2 fall 3 weight 1
          server node2 node0:5672 check inter 5000 rise 2 fall 3 weight 1
      
      # 配置监控页面
      listen monitor
          bind :8100
          mode http
          option httplog
          stats enable
          stats uri /stats
          stats refresh 5s
          stats auth admin:123
      
    4. 在两个节点启动 haproxy

      haproxy -f /etc/haproxy/haproxy.cfg
      ps -ef | grep haproxy
      
    5. 访问地址 http://192.168.86.50:15673/stats

    6. 监控地址 http://192.168.86.50:8100/stats

      image-20210802141105143

    安装 keepalived

    1. 下载 keepalived ,并且上传到 /opt 目录下

    2. 安装依赖之后进行编译

      #安装依赖
      yum -y install libnl libnl-devel
      yum install gcc gcc-c++ openssl openssl-devel -y
      yum update glib* -y
      
      #解压
      cd /opt
      tar -zxvf keepalived-2.2.2.tar.gz
      
      #编译安装
      mkdir /opt/keepalived-2.2.2/build
      cd /opt/keepalived-2.2.2/build
      ../configure --prefix=/usr/local/keepalived-2.2.2
      make && make install
      
    3. 环境配置

      # 创建目录
      mkdir /etc/keepalived
      
      # 备份
      cp /usr/local/keepalived-2.2.2/etc/keepalived/keepalived.conf /usr/local/keepalived-2.2.2/etc/keepalived/keepalived.conf_bak
      
      # 链接
      ln -s /usr/local/keepalived-2.2.2/etc/keepalived/keepalived.conf /etc/keepalived/
      
    4. 将所有 Keepalived 脚本拷贝到 /etc/init.d/ 目录下:

      # 编译目录中的脚本
      cp /opt/keepalived-2.2.2/keepalived/etc/init.d/keepalived /etc/init.d/
      # 安装目录中的脚本
      cp /usr/local/keepalived-2.2.2/etc/sysconfig/keepalived /etc/sysconfig/
      cp /usr/local/keepalived-2.2.2/sbin/keepalived /usr/sbin/
      
    5. 设置开机自启动:

      chmod +x /etc/init.d/keepalived
      chkconfig --add keepalived
      systemctl enable keepalived.service
      
    6. 配置 Keepalived,注意主备的不同之处:

      vi /etc/keepalived/keepalived.conf
      

      内容如下:

      global_defs {
         # 路由id,主备节点不能相同,node0 为 rabbit-0,node1 为 rabbit-1
         router_id rabbit-0
      }
      
      # 自定义监控脚本
      vrrp_script chk_haproxy {
          # 脚本位置
          script "/etc/keepalived/haproxy_check.sh" 
          # 脚本执行的时间间隔
          interval 5 
          weight 10
      }
      
      vrrp_instance VI_1 {
          # Keepalived的角色,MASTER 表示主节点,BACKUP 表示备份节点
          # node0 为 MASTER ,node1 为 BACKUP
          state MASTER  
          # 指定监测的网卡,可以使用 ifconfig 进行查看
          interface ens33
          # 虚拟路由的id,主备节点需要设置为相同
          virtual_router_id 1
          # 优先级,主节点的优先级需要设置比备份节点高
          # node0 为 100, node1 为 80
          priority 100 
          # 设置主备之间的检查时间,单位为秒 
          advert_int 1 
          # 定义验证类型和密码
          authentication { 
              auth_type PASS
              auth_pass 123456
          }
      
          # 调用上面自定义的监控脚本
          track_script {
              chk_haproxy
          }
      
          virtual_ipaddress {
              # 虚拟IP地址,可以设置多个
              192.168.86.53  
          }
      }
      
    7. 编写HAProxy状态检测脚本

      # 创建存放检测脚本的日志目录
      mkdir -p /usr/local/keepalived-2.2.2/log
      
      # 创建检测脚本
      vi /etc/keepalived/haproxy_check.sh
      

      ​ 内容如下:

      #!/bin/bash
      
      LOGFILE="/usr/local/keepalived-2.2.2/log/haproxy-check.log"
      echo "[$(date)]:check_haproxy status" >> $LOGFILE
      
      # 判断haproxy是否已经启动
      HAProxyStatusA=`ps -C haproxy --no-header|wc -l`
      if [ $HAProxyStatusA -eq 0 ];then
          echo "[$(date)]:启动haproxy服务......" >> $LOGFILE
          # 如果没有启动,则启动
          /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg >> $LOGFILE 2>&1
      fi
      
      # 睡眠5秒以便haproxy完全启动
      sleep5
      
      # 如果haproxy还是没有启动,此时需要将本机的keepalived服务停掉,以便让VIP自动漂移到另外一台haproxy
      HAProxyStatusB=`ps -C haproxy --no-header|wc -l`
      if [ $HAProxyStatusB eq 0 ];then
          echo "[$(date)]:haproxy启动失败,睡眼5秒后haproxy服务还是没有启动,现在关闭keepalived服务,以便让VIP自动漂移到另外一台haproxy" >> $LOGFILE
          systemctl stop keepalived
      fi
      
    8. 为脚本赋予执行权限

      chmod +x /etc/keepalived/haproxy_check.sh
      
    9. 设置开启自启动

      # 将编译目录中的keepalived脚本复制到/etc/init.d/目录下
      cp /opt/keepalived-2.2.2/keepalived/etc/init.d/keepalived /etc/init.d/
      
      # 将安装目录中的keepalived脚本复制到/etc/sysconfig/目录下
      cp /usr/local/keepalived-2.2.2/etc/sysconfig/keepalived /etc/sysconfig/
      
      # 将安装目录中的keepalived脚本链接到/usr/sbin/目录下
      ln -s /usr/local/keepalived-2.2.2/sbin/keepalived /usr/sbin/
      
      
      chmod +x /etc/init.d/keepalived
      chkconfig --add keepalived
      systemctl enable keepalived.service
      
    10. 启动服务

      systemctl start keepalived
      

      image-20210802192322108

    11. 测试

      a. 访问 http://192.168.86.53:15673/

      b. 关闭主机(可以使用kill命令),观察从机状态

      image-20210802193437073

      c. 访问 http://192.168.86.53:15673/

      d. 重启启动主机的 keepalived ,可以发现 vip 重新飘回主机

    常见问题

    1. 如何解除集群节点?

      #node1 上执行
      rabbitmqctl stop_app
      rabbitmqctl reset
      rabbitmqctl start_app
      rabbitmqctl cluster_status
      #node0 上执行
      rabbitmqctl forget_cluster_node rabbit@node1
      

    参考文档

    曹伟雄 RabbitMQ——基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用负载均衡集群

    -- 整理于网络,加上自己的理解,大家一起学习,进步就好
  • 相关阅读:
    Array对象
    属性描述对象
    Object对象
    console对象与控制台
    编程风格
    错误处理机制
    13、百钱买百鸡之数学优化
    12、c程序中编程,统计一行中数字字符的个数。
    10、输入某年某月某日,判断这一天是这一年的第几天?
    9、c语言输入一个整数怎么分别输出它的每位上的数字
  • 原文地址:https://www.cnblogs.com/shulipeng/p/15089343.html
Copyright © 2020-2023  润新知