CentOS7安装RabbitMQ集群

使用yum方式安装RabbitMQ集群,RabbiMQ集群很方便,因为Erlang为分布式语言,但其本身并不支持负载均衡,可以使用HAproxy实现。这里首先搭建RabbitMQ集群的普通模式,在普通模式的基础上再配置镜像模式实现高可用,内存节点无疑速度更快,因此在集群前增加haproxy做负载均衡,让客户端 (consumer、producer)连接访问内存节点,而磁盘模式的节点,由于磁盘IO相对较慢,因此仅做数据备份使用


        IP            节点名

192.168.3.210  rabbitmq1

192.168.3.220    rabbitmq2

192.168.3.230  rabbitmq3


RabbitMQ模式大概分为以下三种:

(1)单一模式

最简单的非集群模式,就是一台机器部署多个RabbitMQ服务

(2)普通模式

对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象

(3)镜像模式

把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的高可用方案,在对业务可靠性要求较高的场合中比较适用


系统准备

#修改计算机名
#主节点1
hostnamectl --static set-hostname RabbitMQ1 && su
#主节点2
hostnamectl --static set-hostname RabbitMQ2 && su
#主节点3
hostnamectl --static set-hostname RabbitMQ3 && su

#关闭防火墙和修改内核参数
setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
systemctl stop firewalld.service && systemctl disable firewalld.service && systemctl status firewalld.service

#添加hosts
cat >>/etc/hosts <<EOF
192.168.3.210 RabbitMQ1
192.168.3.220 RabbitMQ2
192.168.3.230 RabbitMQ3
EOF

#免密分发
ssh-keygen -t rsa -b 1200
ssh-copy-id -i ~/.ssh/id_rsa.pub root@RabbitMQ1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@RabbitMQ2
ssh-copy-id -i ~/.ssh/id_rsa.pub root@RabbitMQ3
scp -p /etc/hosts root@RabbitMQ2:/etc/hosts
scp -p /etc/hosts root@RabbitMQ3:/etc/hosts


安装RabbitMQ

curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
yum install erlang rabbitmq-server -y
systemctl enable rabbitmq-server && systemctl start rabbitmq-server.service && systemctl status rabbitmq-server.service


创建集群

#使用相同的Erlang Cookie
ls -a /var/lib/rabbitmq/
scp -p /var/lib/rabbitmq/.erlang.cookie root@RabbitMQ2:/var/lib/rabbitmq
scp -p /var/lib/rabbitmq/.erlang.cookie root@RabbitMQ3:/var/lib/rabbitmq
systemctl stop rabbitmq-server && systemctl start rabbitmq-server && systemctl status rabbitmq-server.service
ss -tunlp|grep 5672

CentOS7安装RabbitMQ集群


内存节点(RAM):内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中

磁盘节点(Disk):将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启RabbitMQ的时候,丢失系统的配置信息


1)RabbitMQ要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复, 或者可以设置两个磁盘节点,以保持有一个是可用的

2)内存节点虽然不写入磁盘,但是它执行比磁盘节点要好

3)如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失

#节点2和3已磁盘节点加入集群
rabbitmqctl stop_app                
rabbitmqctl reset                        
rabbitmqctl join_cluster rabbit@RabbitMQ1
rabbitmqctl start_app  
rabbitmqctl cluster_status

CentOS7安装RabbitMQ集群


#节点1改为内存节点
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
rabbitmqctl cluster_status

CentOS7安装RabbitMQ集群


#开启web管理控制台和开启MQTT协议
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins enable rabbitmq_mqtt
systemctl stop rabbitmq-server && systemctl start rabbitmq-server

#集群创建用户
rabbitmqctl add_user vos vospassword     
rabbitmqctl set_permissions vos ".*" ".*" ".*"    
rabbitmqctl set_user_tags vos administrator  
systemctl restart rabbitmq-server

CentOS7安装RabbitMQ集群

上面配置为RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。镜像模式和普通模式之间相对比,镜像模式提供高可用性,普通模式会提供更高的吞吐量。


配置策略

#在集群中如果某个节点挂掉,整个集群还是可以正常工作的,但是挂掉的那个节点的消息就清空了,这种情况在生产环境中是不可接受的,所以需要用到镜像功能,也就是主从配置
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
#复制匹配到的队列到集群中的任意两个或多个节点,而不是到所有节点,并进行自动同步
#rabbitmqctl set_policy ha-all "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
#复制匹配到的队列到集群中的指定节点
#rabbitmqctl set_policy ha-all "^" '{"ha-mode":"nodes","ha-params":["rabbit@rabbitram1","rabbit@rabbitram2"]}'


Haproxy负载均衡

节点1和节点2

yum install epel-release -y
yum install haproxy -y 
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

cat > /etc/haproxy/haproxy.cfg << "EOF"
global
  log 127.0.0.1 local0 notice
  maxconn 10000
  user haproxy
  group haproxy

defaults
  timeout connect 5s
  timeout client 100s
  timeout server 100s

#RabbitMQ服务代理  
listen rabbitmq
  bind 0.0.0.0:5673
  mode tcp
  balance roundrobin
  server rabbitmq1 192.168.3.210:5672 check inter 5s rise 2 fall 3
  server rabbitmq2 192.168.3.220:5672 check inter 5s rise 2 fall 3

#RabbitMQ管理界面
listen rabbitmq_management
    bind 0.0.0.0:15673
    server node1 192.168.3.210:15672
    server node2 192.168.3.220:15672
    server node3 192.168.3.230:15672

#HAProxy监控页面
listen stats :9000
  mode http
  stats enable
  stats hide-version
  stats realm Haproxy\ Statistics
  stats uri /
  stats auth vos:vospassword
EOF
	
执行
systemctl start haproxy && systemctl status haproxy 
netstat -anupt | grep haproxy

CentOS7安装RabbitMQ集群


Keepalived实现主备

节点1和节点2

yum install keepalived -y 
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak


监控脚本

cat > /etc/keepalived/check_haproxy.sh << "EOF"
#!/bin/bash
LOGFILE="/var/log/keepalived-haproxy-status.log"
date >> $LOGFILE
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
    echo "warning: restart haproxy" >> $LOGFILE
    haproxy -f /etc/haproxy/haproxy.cfg
    sleep 2

    if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
        echo "fail: check_haproxy status" >> $LOGFILE
        systemctl stop keepalived
    fi
else
    echo "success: check_haproxy status" >> $LOGFILE
fi
EOF
执行chmod +x /etc/keepalived/check_haproxy.sh


节点1配置

cat > /etc/keepalived/keepalived.conf << "EOF"
#全局设置
global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict   
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#检测任务
vrrp_script check_haproxy {
  script "/etc/keepalived/check_haproxy.sh"
  interval 2
  weight 5
}

#虚拟组
vrrp_instance haproxy {
  state MASTER
  interface ens33
  virtual_router_id 50
  priority 100
  advert_int 1
  unicast_src_ip 192.168.3.210 
  unicast_peer {
    192.168.3.220 
  }
  authentication {
    auth_type PASS
    auth_pass vospassword
  }
  #虚拟IP地址
  virtual_ipaddress {
    192.168.3.200
  }
  #检测脚本
  track_script {
    check_haproxy
  }
}
EOF

执行systemctl enable keepalived && systemctl start keepalived && systemctl status keepalived


节点2配置

cat > /etc/keepalived/keepalived.conf << "EOF"
#全局设置
global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   # vrrp_strict   
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#检测任务
vrrp_script check_haproxy {
  script "/etc/keepalived/check_haproxy.sh" 
  interval 2
  weight 5
}

#虚拟组
vrrp_instance haproxy {
  state BACKUP
  interface ens33
  virtual_router_id 50
  priority 99
  advert_int 1
  unicast_src_ip 192.168.3.220 
  unicast_peer {
    192.168.3.210 
  }
  authentication {
    auth_type PASS
    auth_pass vospassword
  }
  #虚拟IP地址
  virtual_ipaddress {
    192.168.3.200
  }
  #检测脚本
  track_script {
    check_haproxy
  }
}
EOF

执行systemctl enable keepalived && systemctl start keepalived && systemctl status keepalived

CentOS7安装RabbitMQ集群


业务地址

#RabbitMQ负载均衡端口
5673


#HAProxy监控 
http://192.168.3.200:9000

CentOS7安装RabbitMQ集群


#RabbitMQ管理页面
http://192.168.3.200:15673

CentOS7安装RabbitMQ集群


测试

CentOS7安装RabbitMQ集群

rabbitmq网页管理端Queues--Add queue


CentOS7安装RabbitMQ集群

已经同步到mirrors节点



更新日期: 2020年12月15日
文章标签: Linux
文章链接: https://www.vos.cn/os/468.html  
版权说明:如非注明,本站文章均为vOS原创,转载请注明出处和附带本文链接。