RabbitMQ高可用集群搭建 + flash项目 + celery

您所在的位置:网站首页 rabbitmq加入集群 RabbitMQ高可用集群搭建 + flash项目 + celery

RabbitMQ高可用集群搭建 + flash项目 + celery

#RabbitMQ高可用集群搭建 + flash项目 + celery| 来源: 网络整理| 查看: 265

1 集群简介1.1 集群架构

当单台 RabbitMQ 服务器的处理消息的能力达到瓶颈时,此时可以通过 RabbitMQ 集群来进行扩展,从而达到提升吞吐量的目的。RabbitMQ 集群是一个或多个节点的逻辑分组,集群中的每个节点都是对等的,每个节点共享所有的用户,虚拟主机,队列,交换器,绑定关系,运行时参数和其他分布式状态等信息。一个高可用,负载均衡的 RabbitMQ 集群架构应类似下图:

img

这里对上面的集群架构做一下解释说明:

​ 首先一个基本的 RabbitMQ 集群不是高可用的,虽然集群共享队列,但在默认情况下,消息只会被路由到某一个节点的符合条件的队列上,并不会同步到其他节点的相同队列上。假设消息路由到 node1 的 my-queue 队列上,但是 node1 突然宕机了,那么消息就会丢失,想要解决这个问题,需要开启队列镜像,将集群中的队列彼此之间进行镜像,此时消息就会被拷贝到处于同一个镜像分组中的所有队列上。

​ 其次 RabbitMQ 集群本身并没有提供负载均衡的功能,也就是说对于一个三节点的集群,每个节点的负载可能都是不相同的,想要解决这个问题可以通过硬件负载均衡或者软件负载均衡的方式,这里我们选择使用 HAProxy 来进行负载均衡,当然也可以使用其他负载均衡中间件,如LVS等。HAProxy 同时支持四层和七层负载均衡,并基于单一进程的事件驱动模型,因此它可以支持非常高的井发连接数。

接着假设我们只采用一台 HAProxy ,那么它就存在明显的单点故障的问题,所以至少需要两台 HAProxy ,同时这两台 HAProxy 之间需要能够自动进行故障转移,通常的解决方案就是 KeepAlived 。KeepAlived 采用 VRRP (Virtual Router Redundancy Protocol,虚拟路由冗余协议) 来解决单点失效的问题,它通常由一组一备两个节点组成,同一时间内只有主节点会提供对外服务,并同时提供一个虚拟的 IP 地址 (Virtual Internet Protocol Address ,简称 VIP) 。 如果主节点故障,那么备份节点会自动接管 VIP 并成为新的主节点 ,直到原有的主节点恢复。

1.2 部署情况

下面我们开始进行搭建,这里我使用三台主机,主机名分别为 node11, node12 和 node13,其功能分配如下:

2 RabbitMQ服务搭建1 前置条件 官网:https://www.rabbitmq.com/ RabbitMQ是一个开源的遵循AMQP协议实现的基于Erlang语言编写,支持多种客户端(语言)。用于在分布式系统中存储消息,转发消息,具有高可用,高可扩性,易用性等特征。 RabbitMQ 由 Erlang 语言所编写,所以在安装 RabbitMQ 前需要安装 Erlang 。两者的版本兼容关系如下。本篇文章选用的 RabbitMQ 版本为 3.9.5Erlang 版本为 23.3.4.11-1.:

```Python 两者兼容关系:https://www.rabbitmq.com/which-erlang.html 官方安装文档:https://www.rabbitmq.com/install-rpm.html#downloads 系统版本:CentOS 7.X 提供两种安装方式,但是注意两者依赖要统一

https://github.com/rabbitmq/erlang-rpm/releases?page=3 ```

2 下载安装包2.1 下载RabbitMQRabbitMQ下载地址:https://www.rabbitmq.com/download.html Rabbitmq安装:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.9.5 2.2 Erlang

Erlang官网:https://www.erlang-solutions.com/downloads/# 下载Erlang地址:http://www.rpmfind.net/linux/rpm2html/search.php?query=erlang 下载Erlang地址:Releases · rabbitmq/erlang-rpm · GitHub

2.3 开始安装# 1-安装依赖 yum install -y make gcc gcc-c++ m4 openssl openssl-devel ncurses-devel unixODBC unixODBC-devel java java-devel socat # 2-安装rabbitmq yum localinstall rabbitmq-server-3.9.5-1.el7.noarch.rpm # 3-安装erlang # 运行下面的命令来将key导入 rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc yum localinstall erlang-23.3.4.11-1.el7.x86_64.rpm # 4-如何运行 systemctl start rabbitmq-server # 5-添加web管理插件 rabbitmq-plugins enable rabbitmq_management3 访问RabbitMQ

默认情况下,访问RabbitMQ服务的用户名和密码都是"guest",这个账户有限制,默认只能通过本地网络(如localhost)访问,远程网络访问受限,使用默认的用户 guest / guest (此也为管理员用户)登陆,会发现无法登陆,报错:User can only log in via localhost。那是因为默认是限制了guest用户只能在本机登陆,也就是只能登陆localhost:15672。所以在实现生产和消费消息之前,需要另外添加一个用户,并设置相应的访问权限

# 1-添加新用户,用户名为"root",密码为"root" rabbitmqctl add_user admin 123456 # 2-为admin用户设置所有权限 rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" # 3-设置用户为管理员角色 rabbitmqctl set_user_tags admin administrator3 RabbitMQ 集群搭建3.1 初始化环境

分别修改各个虚拟机主机名

hostnamectl set-hostname node11

修改每台机器的 /etc/hosts 文件

cat >> /etc/hosts 3.6 配置镜像队列3.6.1 开启镜像队列

这里我们为所有队列开启镜像配置,其语法如下:

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'3.6.2 复制系数

在上面我们指定了 ha-mode 的值为 all ,代表消息会被同步到所有节点的相同队列中。这里我们之所以这样配置,因为我们本身只有三个节点,因此复制操作的性能开销比较小。如果你的集群有很多节点,那么此时复制的性能开销就比较大,此时需要选择合适的复制系数。通常可以遵循过半写原则,即对于一个节点数为 n 的集群,只需要同步到 n/2+1 个节点上即可。此时需要同时修改镜像策略为 exactly,并指定复制系数 ha-params,示例命令如下:

rabbitmqctl set_policy ha-two "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

除此之外,RabbitMQ 还支持使用正则表达式来过滤需要进行镜像操作的队列,示例如下:

rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'

此时只会对 ha 开头的队列进行镜像。更多镜像队列的配置说明,可以参考官方文档:Highly Available (Mirrored) Queues

3.6.3 查看镜像状态

配置完成后,可以通过 Web UI 界面查看任意队列的镜像状态,情况如下:

3.7 集群的关闭与重启

没有一个直接的命令可以关闭整个集群,需要逐一进行关闭。但是需要保证在重启时,最后关闭的节点最先被启动。如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的那个节点启动,默认进行 10 次连接尝试,超时时间为 30 秒,如果依然没有等到,则该节点启动失败。

这带来的一个问题是,假设在一个三节点的集群当中,关闭的顺序为 node11,node12,node13,如果 node11 因为故障暂时没法恢复,此时 node12 和 node13 就无法启动。想要解决这个问题,可以先将 node11 节点进行剔除,命令如下:

# 此时需要加上 -offline 参数,它允许节点在自身没有启动的情况下将其他节点剔除。 rabbitmqctl forget_cluster_node rabbit@node11 --offline3.8 解除集群

重置当前节点

# 1.停止服务 rabbitmqctl stop_app # 2.重置集群状态 rabbitmqctl reset # 3.重启服务 rabbitmqctl start_app

重新加入集群

# 1.停止服务 rabbitmqctl stop_app # 2.重置状态 rabbitmqctl reset # 3.节点加入 rabbitmqctl join_cluster rabbit@rabbit-node1 # 4.重启服务 rabbitmqctl start_app

完成后重新检查 RabbitMQ 集群状态

rabbitmqctl cluster_status

除了在当前节点重置集群外,还可在集群其他正常节点将节点踢出集群

rabbitmqctl forget_cluster_node [email protected] 变更节点类型

我们可以将节点的类型从RAM更改为Disk,反之亦然。假设我们想要反转rabbit@node12和rabbit@node13的类型,将前者从RAM节点转换为磁盘节点,而后者从磁盘节点转换为RAM节点。为此,我们可以使用change_cluster_node_type命令。必须首先停止节点。

# 1.停止服务 rabbitmqctl stop_app # 2.变更类型 ram disc rabbitmqctl change_cluster_node_type disc # 3.重启服务 rabbitmqctl start_app3.10 清除 RabbitMQ 节点配置# 如果遇到不能正常退出直接kill进程 systemctl stop rabbitmq-server # 查看进程 ps aux|grep rabbitmq # 清楚节点rabbitmq配置 rm -rf /var/lib/rabbitmq/mnesia4 HAProxy 环境搭建

yum 源安装目前版本比较低,采用源码安装方式。

4.1 下载

HAProxy 官方下载地址为:www.haproxy.org/#down ,如果这个网站无法访问,也可以从 src.fedoraproject.org/repo/pkgs/h… 上进行下载。这里我下载的是 2.x 的版本,下载后进行解压:

tar -zxvf haproxy-2.1.8.tar.gz4.2 编译

进入解压后根目录,执行下面的编译命令:

make TARGET=linux-glibc PREFIX=/usr/local/haproxy-2.1.8 make install PREFIX=/usr/local/haproxy-2.1.84.3 配置环境变量

配置环境变量:

vim /etc/profile export HAPROXY_HOME=/usr/local/haproxy-2.1.8 export PATH=$PATH:$HAPROXY_HOME/sbin

使得配置的环境变量立即生效:

source /etc/profile

检查安装是否成功:

[root@node11 ~/files]# haproxy -v HA-Proxy version 2.1.11-9da7aab 2021/01/08 - https://haproxy.org/ Status: stable branch - will stop receiving fixes around Q1 2021. Known bugs: http://www.haproxy.org/bugs/bugs-2.1.11.html Running on: Linux 3.10.0-1160.53.1.el7.x86_64 #1 SMP Fri Jan 14 13:59:45 UTC 2022 x86_644.4 负载均衡配置

新建配置文件 haproxy.cfg,这里我新建的位置为:/etc/haproxy/haproxy.cfg。

# 创建目录 mkdir /etc/haproxy # 编辑文件内容 vim /etc/haproxy/haproxy.cfg

文件内容如下:

# 全局配置 global # 日志输出配置、所有日志都记录在本机,通过 local0 进行输出 log 192.168.114.11 local0 info # 最大连接数 maxconn 4096 # 改变当前的工作目录 chroot /usr/local/haproxy-2.1.11 # 以指定的 UID 运行 haproxy 进程 uid 99 # 以指定的 GID 运行 haproxy 进程 gid 99 # 以守护进行的方式运行 daemon # 当前进程的 pid 文件存放位置 pidfile /usr/local/haproxy-2.1.11/haproxy.pid # 默认配置 defaults # 应用全局的日志配置 log global # 使用4层代理模式,7层代理模式则为"http" mode tcp # 日志类别 option tcplog # 不记录健康检查的日志信息 option dontlognull # 3次失败则认为服务不可用 retries 3 # 每个进程可用的最大连接数 maxconn 2000 # 连接超时 timeout connect 5s # 客户端超时 timeout client 30s # 服务端超时 timeout server 15s # 绑定配置 listen rabbitmq_cluster bind :5671 # 配置TCP模式 mode tcp # 采用加权轮询的机制进行负载均衡 balance roundrobin # RabbitMQ 集群节点配置 server mq-node11 node11:5672 check inter 5000 rise 2 fall 3 weight 1 server mq-node12 node12:5672 check inter 5000 rise 2 fall 3 weight 1 server mq-node13 node13: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

负载均衡的主要配置在 listen rabbitmq_cluster 下,这里指定负载均衡的方式为加权轮询,同时定义好健康检查机制:

server node1 node11:5672 check inter 5000 rise 2 fall 3 weight 1

以上配置代表对地址为 node11:5672 的 node1 节点每隔 5 秒进行一次健康检查,如果连续两次的检查结果都是正常,则认为该节点可用,此时可以将客户端的请求轮询到该节点上;如果连续 3 次的检查结果都不正常,则认为该节点不可用。weight 用于指定节点在轮询过程中的权重。

4.5 启动服务

以上搭建步骤在 node11 和 node12 上完全相同,搭建完成使用以下命令启动服务:

# 启动 haproxy -f /etc/haproxy/haproxy.cfg # 查看运行 ps aux|grep haproxy # 停止 没有killall命令, 安装yum -y install psmisc killall haproxy

开启监控页面访问端口

firewall-cmd --zone=public --add-port=8100/tcp --permanent systemctl restart firewalld.service

启动后可以在监控页面进行查看,端口为设置的 8100,完整地址为:http://192.168.114.11:8100/stats ,页面情况如下:

所有节点都为绿色,代表节点健康。此时证明 HAProxy 搭建成功,并已经对 RabbitMQ 集群进行监控。

5 Keepalived 环境搭建

接着就可以搭建 Keepalived 来解决 HAProxy 故障转移的问题。这里我在 node11 和 node12 和 node13上安装 KeepAlived ,两台主机上的搭建的步骤完全相同,只是部分配置略有不同,具体如下:

5.1 安装

Keepalived 可以使用 yum 直接安装,在 MASTER 服务器和 BACKUP 服务器执行:

yum -y install keepalived5.2 配置 MASTER 和 BACKUP确认网卡[root@node11 ~/files]# ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:c9:4a:2b brd ff:ff:ff:ff:ff:ff inet 192.168.114.11/24 brd 192.168.114.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.114.200/24 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::e7eb:fc54:5303:f90b/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: docker0: mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:de:ac:45:a1 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever

本例使用 ens33 这块网卡。

vim /etc/keepalived/keepalived.confMASTER 节点配置

完整配置如下:

global_defs { # 路由id,主备节点不能相同 router_id node1 notification_email { # email 接收方 [email protected] [email protected] [email protected] } # email 发送方 notification_email_from [email protected] # 邮件服务器, smtp 协议 smtp_server 192.168.200.1 smtp_connect_timeout 30 vrrp_skip_check_adv_addr # 使用 unicast_src_ip 需要注释 vrrp_strict,而且也可以进行 ping 测试 #vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } # 自定义监控脚本 vrrp_script chk_haproxy { # 脚本位置 script "/etc/keepalived/haproxy_check.sh" # 脚本执行的时间间隔 interval 2 weight 10 } vrrp_instance VI_1 { # Keepalived的角色,MASTER 表示主节点,BACKUP 表示备份节点 state MASTER # 指定监测的网卡,可以使用 ifconfig 进行查看 interface ens33 # 虚拟路由的id,主备节点需要设置为相同 virtual_router_id 51 # 优先级,主节点的优先级需要设置比备份节点高 priority 100 # 设置主备之间的检查时间,单位为秒 advert_int 1 # 如果两节点的上联交换机禁用了组播,则采用 vrrp 单播通告的方式 unicast_src_ip 192.168.114.11 unicast_peer { 192.168.114.12 192.168.114.13 } # 定义验证类型和密码 authentication { auth_type PASS auth_pass 123456 } # 调用上面自定义的监控脚本 track_script { chk_haproxy } virtual_ipaddress { # 虚拟IP地址,可以设置多个 192.168.114.200/24 } }

备份节点的配置与主节点基本相同,但是需要修改其 state 为 BACKUP;同时其优先级 priority 需要比主节点低。

BACKUP 节点配置

完整配置如下:

global_defs { # 路由id,主备节点不能相同 router_id node2 notification_email { # email 接收方 [email protected] [email protected] [email protected] } # email 发送方 notification_email_from [email protected] # 邮件服务器, smtp 协议 smtp_server 192.168.200.1 smtp_connect_timeout 30 vrrp_skip_check_adv_addr # 使用 unicast_src_ip 需要注释 vrrp_strict,而且也可以进行 ping 测试 #vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_haproxy { script "/etc/keepalived/haproxy_check.sh" interval 2 weight 10 } vrrp_instance VI_1 { # BACKUP 表示备份节点 state BACKUP # 指定监测的网卡 interface ens33 # 虚拟路由的id,主备节点需要设置为相同 virtual_router_id 51 # 优先级,备份节点要比主节点低 priority 50 advert_int 1 # 如果两节点的上联交换机禁用了组播,则采用 vrrp 单播通告的方式 unicast_src_ip 192.168.114.12 unicast_peer { 192.168.114.11 192.168.114.13 } authentication { auth_type PASS auth_pass 123456 } track_script { chk_haproxy } virtual_ipaddress { 192.168.114.200/24 } }5.3 配置 HAProxy 检查

以上配置定义了 Keepalived 的 MASTER 节点和 BACKUP 节点,并设置对外提供服务的虚拟 IP 为 192.168.114.200。此外最主要的是定义了通过 haproxy_check.sh 来对 HAProxy 进行监控,这个脚本需要我们自行创建,内容如下:

vim /etc/keepalived/haproxy_check.sh #!/bin/bash # 判断haproxy是否已经启动 if [ ${ps -C haproxy --no-header |wc -l} -eq 0 ] ; then #如果没有启动,则启动 haproxy -f /etc/haproxy/haproxy.cfg fi #睡眠3秒以便haproxy完全启动 sleep 3 #如果haproxy还是没有启动,此时需要将本机的keepalived服务停掉,以便让VIP自动漂移到另外一台haproxy if [ ${ps -C haproxy --no-header |wc -l} -eq 0 ] ; then systemctl stop keepalived fi

创建后为其赋予执行权限

chmod +x /etc/keepalived/haproxy_check.sh

这个脚本主要用于判断 HAProxy 服务是否正常,如果不正常且无法启动,此时就需要将本机 Keepalived 关闭,从而让虚拟 IP 漂移到备份节点。

5.4 配置并启动服务

配置 IP 转发,需要修改配置文件 /etc/sysctl.conf,默认只有 root 可以修改,分别在 MASTER 和 BACKUP上修改。

# 切换用户 su -root # 文件配置 echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf # 生效 sysctl -p

node11 和node12和node13 上启动 KeepAlived 服务,命令如下:

systemctl start keepalived systemctl enable keepalived #设置开机自动启

启动后此时 node11 为主节点,可以在 node11 上使用 ip a 命令查看到虚拟 IP 的情况:

[root@node11 ~/files]# ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:c9:4a:2b brd ff:ff:ff:ff:ff:ff inet 192.168.114.11/24 brd 192.168.114.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.114.200/24 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::e7eb:fc54:5303:f90b/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: docker0: mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:de:ac:45:a1 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever

此时只有 node11 上是存在虚拟 IP 的,而 node12上是没有的。

[root@node12 ~]# ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:66:ee:47 brd ff:ff:ff:ff:ff:ff inet 192.168.114.12/24 brd 192.168.114.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::e7eb:fc54:5303:f90b/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever inet6 fe80::497b:1252:87bc:120e/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever inet6 fe80::a422:88f5:70f4:1874/64 scope link noprefixroute valid_lft forever preferred_lft forever

漂移规则如下:

默认使用 MASTER 服务器(192.168.114.11),虚拟 IP 为 192.168.114.200,此时 MASTER 服务器会有 2 个IP。 当 MASTER 出问题时,IP 会漂移到 BACKUP 服务器(192.168.114.12),此时 BACKUP 服务器会有 2 个IP。 当 MASTER 重新启动后,虚拟 IP 又会漂移回 MASTER 服务器。

5.5 验证故障转移

这里我们验证一下故障转移,因为按照我们上面的检测脚本,如果 HAProxy 已经停止且无法重启时 KeepAlived 服务就会停止,这里我们直接使用以下工具进行验证。

安装 tcpdump 包

yum -y install tcpdump

在 MASTER 服务器上执行

[root@node11 ~/files]# tcpdump -i ens33 vrrp -n tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes 22:39:38.755672 IP 192.168.114.11 > 192.168.114.12: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20 22:39:38.755833 IP 192.168.114.11 > 192.168.114.13: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20 22:39:39.757462 IP 192.168.114.11 > 192.168.114.12: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20 22:39:39.757601 IP 192.168.114.11 > 192.168.114.13: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20

这表明 MASTER 在向 BACKUP 广播,MASTER 在线。此时虚拟 IP 时挂在 MASTER 上的,如果想退出, 按 Ctrl+C。

如果 MASTER 停止 keepalived,虚拟 IP 会漂移到 BACKUP 服务器上。 我们可以测试一下:

首先,停止 MASTER 的 keepalived

systemctl stop keepalived

然后,在 MASTER 服务器上查看 VRRP 服务

[root@node11 ~/files]# systemctl stop keepalived.service [root@node11 ~/files]# tcpdump -i ens33 vrrp -n tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes 22:39:12.685103 IP 192.168.114.13 > 192.168.114.11: VRRPv2, Advertisement, vrid 51, prio 50, authtype simple, intvl 1s, length 20 22:39:12.685281 IP 192.168.114.13 > 192.168.114.12: VRRPv2, Advertisement, vrid 51, prio 50, authtype simple, intvl 1s, length 20

这表明 MASTER 收到 BACKUP 的广播,此时虚拟 IP 时挂在 BACKUP 服务器上。

此时再次使用 ip a 分别查看,可以发现 MASTER 上的 VIP 已经漂移到 BACKUP 上,情况如下:

[root@node13 ~]# ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:53:43:75 brd ff:ff:ff:ff:ff:ff inet 192.168.114.13/24 brd 192.168.114.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.114.200/24 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::e7eb:fc54:5303:f90b/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever inet6 fe80::497b:1252:87bc:120e/64 scope link noprefixroute valid_lft forever preferred_lft forever inet6 fe80::a422:88f5:70f4:1874/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever

再次重启 MASTER 服务器,会发现 VIP 又重新漂移回 MASTER 服务器。

此时对外服务的 VIP 依然可用,代表已经成功地进行了故障转移。至此集群已经搭建成功,任何需要发送或者接受消息的客户端服务只需要连接到该 VIP 即可

5.6 配置日志

keepalived 默认将日志输出到系统日志/var/log/messages中,因为系统日志很多,查询问题时相对麻烦。

我们可以将 keepalived 的日志单独拿出来,这需要修改日志输出路径。

修改 Keepalived 配置

#注意: 此配置为可选步骤。 vim /etc/sysconfig/keepalived

更改如下 :

# Options for keepalived. See `keepalived --help' output and keepalived(8) and # keepalived.conf(5) man pages for a list of all options. Here are the most # common ones : # # --vrrp -P Only run with VRRP subsystem. # --check -C Only run with Health-checker subsystem. # --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop. # --dont-release-ipvs -I Dont remove IPVS topology on daemon stop. # --dump-conf -d Dump the configuration data. # --log-detail -D Detailed log messages. # --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON) # KEEPALIVED_OPTIONS="-D -d -S 0"

把 KEEPALIVED_OPTIONS=”-D” 修改为 KEEPALIVED_OPTIONS=”-D -d -S 0”,其中 -S 指定 syslog 的 facility

修改 /etc/rsyslog.conf 末尾添加

vim /etc/rsyslog.conf local0.* /var/log/keepalived.log

重启日志记录服务

systemctl restart rsyslog

重启 keepalived

systemctl restart keepalived

此时,可以从 /var/log/keepalived.log 查看日志了。

6 RabbitMQ集群服务宕机重启异常

机房突然停电,rabbitmq的主机异常断电,集群服务全部需要重启。但是在执行service rabbitmq-server start 启动主节点服务的时候,没有反应,服务没有启动,命令也执行卡住了。必须Ctrl+C结束进程:

# 方法一:检查端口,发现并没有5672的这个端口 netstat -anp|grep 5672 # 方法二:修改/var/log/rabbitmq权限,进去/var/log/rabbitmq/目录,发现该目录下面的文件确实存在权限不统一的问题,于是修改权限重新启动服务,还是失败: cd /var/log/rabbitmq/ chown -R rabbitmq:rabbitmq /var/log/rabbitmq/ # 方法三:删除原有的数据目录,然后重新启动服务 service rabbitmq-server start

注意,这只是主节点的处理方法,在两台从节点,需要做如下操作: 1、检查两台从节点的/var/lib/rabbitmq/.erlang.cookie文件内容是否和主节点是保持一致的 2、删除原有的数据/var/lib/rabbitmq/mnesia目录,执行rabbitmq-server -detached重新启动服务 3、在两台从节点上执行下面的命令,重新加入集群:

rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@node11 rabbitmqctl start_app7- flask项目demo测试celery下发任务

github地址:GitHub - hpf0532/flask-celery-demo

7.1 安装依赖包启动项目# 1-安装依赖 pip install -r requirments.txt # 2-配置文件为test_api/settings.py # mq地址配置的未VIP CELERY_RESULT_BACKEND='amqp://admin:[email protected]:5671//' CELERY_BROKER_URL='amqp://admin:[email protected]:5671//' # 3-启动celery celery worker -A manage:celery -l debug # 4-启动flask flask run # 5-测试 curl http://192.168.114.11:5000/api/v1/7.2 测试宕机mq一台后是否会切换# 测试结果如下 当宕机一台机器的keepalived后,vip会漂移到backup节点上,celery会执行任务 # 存在的问题待解决 celery执行任务会等mq切换完成才会执行任务,此处等待的时间比较长,可能会超时,导致执行任务失败8 参考资料

https://juejin.im/post/6844904071183220749 RabbitMQ 官方文档 —— 集群指南:http://www.rabbitmq.com/clustering.… RabbitMQ 官方文档 —— 高可用镜像队列:http://www.rabbitmq.com/ha.html HAProxy 官方配置手册:http://cbonte.github.io/haproxy-dco… KeepAlived 官方配置手册:http://www.keepalived.org/manpage.htm…

版权声明:本文为CSDN博主「请叫我longge」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

参考链接:

​ 搭建rabbitmq集群:https://blog.csdn.net/qq_28533563/article/details/107932737

​ 解决mq宕机存在的问题:https://blog.51cto.com/u_10950710/2116406

​ mq集群搭建:RabbitMQ 集群 - 简书 (jianshu.com)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3