CentOS7上通过HAproxy+Keepalived部署RabbitMQ集群

参考:

https://blog.csdn.net/sj349781478/article/details/78845852

https://blog.csdn.net/sj349781478/article/details/78862315

https://www.jianshu.com/p/6376936845ff

两台机器,IP地址规划:

Master:192.168.174.140

Backup: 192.168.174.141

虚拟IP【VIP】:192.168.174.150

1、在两台机器上分别执行如下命令,安装RabbiMQ服务:

官方网站强烈建议使用Package Cloud或Bintray这两种方式安装

这里采用第一种方式即Package Cloud方式,安装官网:http://www.rabbitmq.com/install-rpm.html#package-cloud

 分别执行如下命令导入相关的认证key:

# import the new PackageCloud key that will be used starting December 1st, 2018 (GMT)
rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey

# import the old PackageCloud key that will be discontinued on December 1st, 2018 (GMT)
rpm --import https://packagecloud.io/gpg.key

然后安装rabbitMQ的yum源,地址:https://packagecloud.io/rabbitmq/rabbitmq-server/install#bash-rpm

curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash

完成后末尾输出如下:

 然而此时并不能安装成功,因为RabbitMQ依赖于Erlang

 所以还需要安装Erlang

执行如下命令,导入Erlang的yum源,地址:https://packagecloud.io/rabbitmq/erlang/install#bash-rpm

curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash

完成后末尾输出:

 上面全部都准备就绪可以安装Erlang,再安装RabbitMQ了

yum -y install erlang
yum -y install rabbitmq-server

添加RabbitMQ开机启动:

chkconfig rabbitmq-server on
或者
systemctl enable rabbitmq-server

查看是否开启开机启动:

systemctl list-unit-files | grep enable

 

启动RabbitMQ Server或者关闭

systemctl start rabbitmq-server.service
或者
rabbitmqctl start_app

对应的关闭
systemctl stop rabbitmq-server.service
或者
rabbitmqctl stop_app

查看RabbitMQ的状态

rabbitmqctl  status

 

RabbitMQ提供了一个Web界面的控制台,通过 IP:15672 访问,这里遇到一个坑,死活访问不了,两种情况

1:没有启动Web界面的插件

启用插件命令:

rabbitmq-plugins enable rabbitmq_management

如果发现还是访问不了,那就是防火墙问题了,LZ在这里查了老久【建议在学习的时候,使用Linux,安装好第一件事情就是把防火墙关了,同时设置为开机不重启】

关闭防火墙并设置开机禁用:

systemctl stop firewalld
systemctl disable firewalld

然后再去访问:192.168.174.140:15672

然后添加用户,配置权限和角色【 默认账户 guest/guest】可以在命令行通过rabbitmqctl  list_users查看

#添加用户,后面两个参数分别是用户名和密码
rabbitmqctl add_user cuit cuit  
#添加权限
rabbitmqctl set_permissions cuit".*"".*"".*" 
#修改用户角色
rabbitmqctl set_user_tags cuit administrator 

然后登录

然后以同样的步骤安装第二台机器

分别修改一下两台机器的主机映射,使用vi编辑/etc/hosts文件,保存退出

vi /etc/hosts 

192.168.174.140 rmq-master-node

192.168.174.141 rmq-backup-node

RabbitMQ的集群是依附于Erlang的集群来工作的,所以必须先构建起Erlang的集群镜像,各个节点的这个文件必须要保持一致。

Erlang Cookie 文件:/var/lib/rabbitmq/.erlang.cookie。这里将 rmq-master-node 140机器的该文件远程复制到 rmq-backup-node 141机器上

使用scp命令,可以配置SSH远程免密码登录,就不用每次输入密码了

SSH远程免密码登录参考:https://blog.csdn.net/weixin_42465125/article/details/88370270

scp -r /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/.erlang.cookie

可以使用cat命令,确认一下,两台机器的.erlang.cookie的值是不是一致的

组成集群。在rmq-backup-node 141机器上先停止RabbitMQ服务,然后加入集群,然后在启动,执行命令如下:

rabbitmqctl stop_app 
rabbitmqctl join_cluster rabbit@rmq-master-node
rabbitmqctl start_app

如果使用这个命令rabbitmqctl stop_app 报下面这个错误,可以尝试使用:systemctl stop rabbitmq-server.service 停止

将备用节点加入集群,报错请往下看

注意到没有,这里的机器的主机名已经发生变化,在之前的操作都是可以的,但是在加入集群这里如果主机名没有修改成/etc/hosts里面IP对应的主机名,执行这一步是会报错的,所以修改一下主机名,然后重启一下

首先修改140主节点机器

vi /etc/hostname

141备用节点:

然后reboot两台机器

再在备用节点上面执行加入集群的操作,由于我们前面设置了开机启动的,所以在备用机上先stop掉RabbitMQ服务在执行加入集群的操作,下面是启动的情况,添加集群报的错,还有提示的

为了提高性能,不需要两个节点都是disc的节点,所以我们可以启动一个节点为RAM模式,在主节点执行下面的命令

rabbitmqctl change_cluster_node_type  ram

先stop掉在执行

查看集群状态

rabbitmqctl cluster_status

现在RabbitMQ的集群已经配置好,下面来配置高可用

 两节点安装haproxy

yum -y install haproxy

配置两节点的haproxy配置文件,在末尾追加

扩展:Windows远程编辑Linux文件参考https://blog.csdn.net/weixin_42465125/article/details/88398976

直接使用vi编辑
vi /etc/haproxy/haproxy.cfg 之后添加:【注意修改IP和认证的用户名和密码】更多配置另行学习配置

listen rabbitmq_cluster
    bind 0.0.0.0:56722
    mode tcp
    option tcplog
    balance roundrobin
    server rmq-master-node 192.168.174.140:56722 check inter 5000 rise 2 fall 2
    server rmq-backup-node 192.168.174.141:56722 check inter 5000 rise 2 fall 2

listen admin_stats
    stats  enable
    bind  *:9090
    mode  http
    option  httplog
    log  global
    maxconn  10
    stats  refresh 30s
    stats  uri /haproxy  #访问的URL context-path
    stats  realm haproxy
    stats  auth admin:123456 # 访问的用户名和密码
    stats  hide-version

分别启动两台haproxy,有坑,往下看 

巨坑错误:各种配置改了都起不来

 解决方法一:

vim /etc/sysctl.conf

net.ipv4.ip_nonlocal_bind=1

然后sysctl -p成功启动

解决方法二:

setsebool -P haproxy_connect_any=1

参考地址:https://www.cnblogs.com/aguncn/p/10493170.html

 成功启动

访问一下:http://192.168.174.140:9090/haproxyhttp://192.168.174.141:9090/haproxy 输入用户名和密码

两节点安装keepalived服务

yum -y install keepalived

配置主节点rmq-maste-node的Keepalived的配置

vi /etc/keepalived/keepalived.conf

global_defs {
  router_id rmq-master-node
}

vrrp_script chk_haproxy
{
  script "/etc/keepalived/script/haproxy_check.sh" # 脚本位置
  interval 2
  timeout 2
  fall 3
}

vrrp_instance haproxy {
  state  MASTER # 主节点
  interface  ens33
  virtual_router_id  29
  priority  150  # 权重
  authentication
  {
    auth_type PASS
    auth_pass 29
  }
  virtual_ipaddress
  {
    192.168.174.150 # 虚拟IP,即VIP
  }
  track_script
  {
    chk_haproxy
  }
  notify_master "/etc/keepalived/script/haproxy_master.sh"
}

修改备用节点rmq-backup-node的Keepalived的配置。和主节点很像,只是state和priority不同

global_defs {
  router_id rmq-backup-node
}

vrrp_script chk_haproxy
{
  script "/etc/keepalived/script/haproxy_check.sh"
  interval 2
  timeout 2
  fall 3
}

vrrp_instance haproxy {
  state  BACKUP # 备节点
  interface  ens33
  virtual_router_id  29
  priority  100  # 权重
  authentication
  {
    auth_type PASS
    auth_pass 29
  }
  virtual_ipaddress
  {
    192.168.174.150 # 虚拟IP,即VIP
  }
  track_script
  {
    chk_haproxy
  }
  notify_master "/etc/keepalived/script/haproxy_master.sh"
}

haproxy_master.sh和haproxy_check.sh两个脚本的内容

建立这个没有的目录,mkdir -p /etc/keepalived/scripts && cd /etc/keepalived/scripts

vi haproxy_master.sh

 #!/bin/bash
 LOGFILE="/var/log/keepalived-haproxy-state.log"
 echo "Being Master ..." >> $LOGFILE

vi haproxy_check.sh

#!/bin/bash
LOGFILE="/var/log/keepalived-haproxy-state.log"
date >> $LOGFILE
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
	echo "fail: check_haproxy status" >> $LOGFILE
	exit 1
else
	echo "success: check_haproxy status" >> $LOGFILE
	exit 0
fi

添加执行权限

 chmod +x *.sh

分别两台启动keepalived,并设置开机启动

systemctl start keepalived.service
systemctl enable keepalived.service

最后就是测试高可用好不好使了:

首先测试VIP访问是否可以:http://192.168.174.150:15672

同样其他IP访问也是可以的:http://192.168.174.140:15672  http://192.168.174.141:15672

这里中途还遇到一个诡异的问题,就是之前已经添加了一个cuit/cuit的用户名和密码,结果后面不见了,不能登录了,然后又建了一遍用户

1)关闭主keepalived,VIP是否切换至备机,VIP访问RabbitMQ web界面(验证keepalived高可用)

2)关闭主HAproxy,VIP是否切换至备机,业务是否正常,恢复原状;(验证HAproxy高可用)

3)关闭后台服务器rmq-master-node,VIP访问RabbitMQ web界面。(验证HAproxy状态检查)

********************************* 不积跬步无以至千里,不积小流无以成江海 *********************************

猜你喜欢

转载自blog.csdn.net/weixin_42465125/article/details/88368784