当前位置:首页 > 系统 > CentOS7安装RabbitMQ集群

CentOS7安装RabbitMQ集群

系统11个月前 (12-15)

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节点


本站所有文章均可随意转载,转载时请保留原文链接及作者。

本文链接:https://www.vos.cn/os/468.html

相关文章

hMailServer添加DMARC协议

hMailServer添加DMARC协议

DMARC”是Domain-based Message Authentication, Reporting and Conformance的英文首字母缩写。DMARC协议是有效解决信头From伪造而诞...

解压出现gzip: stdin: not in gzip format

解压出现gzip: stdin: not in gzip format

今天解压quagga的tar包的时候一直提示gzip: stdin: not in gzip format的错误查看文件也是tar文件没问题最后试了下去掉z参数就好了tar -xvf&nbs...

批处理启动系统服务

批处理启动系统服务

新安装的Excel Server有问题,服务状态可以查看到是开机自启的,但是无效果,经过测试手动在服务中启动ES服务,是可以正常启动的,所以需要批处理来负责开机重新将ES服务启动@echo ...

轻松使用设置当前已关闭你的背景

轻松使用设置当前已关闭你的背景

突然没有背景壁纸了,检查发现显示“轻松使用”设置当前已关闭你的背景打开windows设置--轻松使用其他选项-显示windows背景-打开...

IIS7中出现An error occurred on the server when processing the URL

IIS7中出现An error occurred on the server when processing the URL

本地调试asp的网站,IIS提示An error occurred on the server when processing the URL. Please contact the system a...

修复升级EVE-NG后无法正常打开问题

修复升级EVE-NG后无法正常打开问题

升级流程Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.9.40-eve-ng-ukms+ x86_64) * Documentation:  ...