最新消息: 关于Git&GitHub 版本控制你了解多少?
您现在的位置是:群英 > 开发技术 > Python语言 >
消息中间件之RabbitMQ 的高可用解析
ITPUB发表于 2021-01-15 15:29 次浏览
RabbitMQ 的高可用性
RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用的
 
RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。

1.全局图

HAproxy 来做 RabbitMQ 负载均衡和高可用,用 Keepalived 来保证 HAproxy 的高可用。
 
消息中间件之RabbitMQ 的高可用解析
 
客户端通过VIP建立通信链路;通信链路通过Keeaplived的Master节点路由到对应的HAProxy之上;HAProxy通过负载均衡算法将负载分发到集群中的各个节点之上。正常情况下客户端的连接通过图中左侧部分进行负载分发。当Keepalived的Master节点挂掉或者HAProxy挂掉无法恢复,那么Backup提升为Master,客户端的连接通过图中右侧部分进行负载分发。
如果你追求要更高的可靠性,可以加入多个Backup角色的Keepalived节点来实现一主多从的多机热备。当然这样会提升硬件资源的成本,该如何抉择需要更细致的考恒,一般情况下双机热备的配备已足够满足应用需求。
 
消息中间件之RabbitMQ 的高可用解析
 

2.首先要先安装RabbitMQ

1).首先需要安装erlang

#rpm -Uvh https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-7.noarch.rpm #yum install erlang

安装过程中会有提示,一路输入“y”即可。
2).完成后安装RabbitMQ:
先下载rpm:

#wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm

下载完成后安装:

#yum install rabbitmq-server-3.6.6-1.el7.noarch.rpm  完成后启动服务: #service rabbitmq-server start 可以查看服务状态: #service rabbitmq-server status

3.配置rabbitmq cluster

先保证各个rabbitmq节点都是可以访问的,将这两个节点连接起来形成高可用的cluster,这样我们就可以让我们的exchange、queue在这两个节点之间复制,形成高可用的queue。

cd /var/lib/rabbitmq

里面有一个隐藏文件.erlang.cookie文件,这个文件是erlang用来发现和互连的基础。
我们需要做的很简单,将两个节点中的.erlang.cookie设置成一样的。
这是erlang的约定,一样的cookie hash key他认为是合法和正确的连接。
.erlang.cookie默认是只读的,你需要修改下写入权限,然后复制粘贴下cookie  字符串即可。

chmod u+w .erlang.cookie

配置好了之后接下来配置hosts文件,erlang会使用hosts文件里的配置去发现节点。

vim /etc/hosts 10.64.16.123    l-rabbitmq1 10.64.17.11      l-rabbitmq2

保证同样的配置在所有的节点上都是相同的。
验证你配置的正确不正确你只需要在你的机器上ping,试下请求的ip是不是你配置的即可。按照DNS的请求原理,hosts是最高优先权,除非浏览器有缓存,你直接用ping就不会有问题的。
选择一个节点stop,然后连接到另外节点。
这里以节点 l-rabbitmq2为例,

rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@ l-rabbitmq1 rabbitmqctl start_app

节点已经连接成功。
默认情况下节点占用的memory是总内存的40%,可以根据自己的用途仔细研究rabbitmq的配置项。为了提高性能,不需要两个节点都是disc的节点,所以我们需要启动一个节点为RAM模式。

rabbitmqctl change_cluster_node_type  ram  (需要先停掉,才能更改)

改变l-rabbitmq2为内存节点模式。

4.mirror queue policy设置

设置成镜像队列
可以在机器上,用命令行设置,也可以在管理页面进行创建
设置policy,以ha.开头的队列将会被镜像到集群其他所有节点,一个节点挂掉然后重启后会自动同步队列消.
命令行:

rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all","ha-sync-mode":"automatic"}'               //意思表示以ha.开头的queue都会复制到各个节点 

5.Keepalived

Keepalived 的作用是检测服务器的健康状态,在所有可能出现单点故障的地方为其提供高可用。如果有一台服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的服务器从系统中剔除,当服务器工作正常后 Keepalived 自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
这里使用的实现方式是单活方式,即主节点的 HAproxy 正常运行,备节点的会被停止。当主节点的出现故障时,备节点的 HAproxy 会自动启动。当主节点的恢复后,备节点的会自动停止。
安装keepalived

 

yum -y install keepalived vim  /etc/keepalived/keepalived.conf :

主:  (10.64.16.123    l-rabbitmq1)

! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr #vrrp_strict                         #要注释掉 vrrp_garp_interval 0 vrrp_gna_interval 0 }   vrrp_script chk_haproxy {     script "service haproxy status"  # 服务探测,返回0说明服务是正常的     interval 1                       # 每隔1秒探测一次     weight -2                        # 不正常时,权重-1,即haproxy上线,权重加2;下线,权重减2 }   vrrp_instance haproxy {     state MASTER                 # 主机为MASTER,备机为BACKUP     interface eth0               # 监测网络端口,用ifconfig查看     virtual_router_id 108        # 虚拟路由标识,同一个VRRP实例要使用同一个标识,主备机必须相同     priority 100                 # 主备机取不同的优先级,确保主节点的优先级高过备用节点     advert_int 1                 # VRRP Multicast广播周期秒数  用于设定主备节点间同步检查时间间隔     authentication {         auth_type PASS           # VRRP认证方式         auth_pass 1234           # VRRP口令 主备机密码必须相同     }     track_script {               # 调用haproxy进程检测脚本,备节点不配置         chk_haproxy     }     virtual_ipaddress {         10.64.16.254             #vip     }     notify_master "/etc/keepalived/notify.sh master"      # 当前节点成为master时,通知脚本执行任务,一般用于启动某服务     notify_backup "/etc/keepalived/notify.sh backup"      # 当前节点成为backup时,通知脚本执行任务,一般用于关闭某服务 }

备: (10.64.17.11      l-rabbitmq2)

! Configuration File for keepalived   global_defs {    notification_email {      acassen@firewall.loc      failover@firewall.loc      sysadmin@firewall.loc    }    notification_email_from Alexandre.Cassen@firewall.loc    smtp_server 192.168.200.1    smtp_connect_timeout 30    router_id LVS_DEVEL    vrrp_skip_check_adv_addr    # vrrp_strict                    #要注释掉    vrrp_garp_interval 0    vrrp_gna_interval 0 }     vrrp_script chk_haproxy {     script "service haproxy status" # 服务探测,返回0说明服务是正常的     interval 1                      # 每隔1秒探测一次     weight -2                       # 不正常时,权重-1,即haproxy上线,权重加2;下线,权重减2 }   vrrp_instance haproxy {     state BACKUP            # 主机为MASTER,备机为BACKUP     interface eth0         # 监测网络端口,用ifconfig查看     virtual_router_id 108   # 虚拟路由标识,同一个VRRP实例要使用同一个标识,主备机必须相同     priority 99            # 主备机取不同的优先级,确保主节点的优先级高过备用节点     advert_int 1            # VRRP Multicast广播周期秒数  用于设定主备节点间同步检查时间间隔     authentication {         auth_type PASS      # VRRP认证方式         auth_pass 1234      # VRRP口令 主备机密码必须相同     }       virtual_ipaddress {     # VIP 漂移地址 即集群IP地址         10.64.16.254     } }

notify.sh脚本放在 /etc/keepalived/ 目录下,并赋予可执行权限。

#!/bin/bash   case "$1" in     master)         notify master         service haproxy start         exit 0     ;;     backup)         notify backup         service haproxy stop         exit 0     ;;     fault)         notify fault         service haproxy stop         exit 0     ;;     *)         echo 'Usage: `basename $0` {master|backup|fault}'         exit 1     ;; esac

启动keepalived service keepalived restartnotify.sh脚本放在/etc/keepalived/目录下,并赋予可执行权限。

6.Haproxy负载代理

利用haproxy做负载均衡
安装haproxy

yum install haproxy vim  /etc/haproxy/haproxy.cfg

在代码之后添加

#######################HAproxy监控页面######################### listen http_front         bind 0.0.0.0:1080           #监听端口         stats refresh 30s           #统计页面自动刷新时间         stats uri /haproxy?stats    #统计页面url         stats realm Haproxy Manager #统计页面密码框上提示文本         stats auth admin:1234      #统计页面用户名和密码设置         #stats hide-version         #隐藏统计页面上HAProxy的版本信息   #####################RabbitMQ的管理界面############################### listen rabbitmq_admin     bind 10.64.16.254:15673     server l-rabbitmq1 10.64.16.123:15672     server l-rabbitmq2 10.64.17.11:15672   #####################RabbitMQ服务代理########################################### listen rabbitmq_cluster 10.64.16.254:5673     mode tcp     stats enable     balance roundrobin     option tcpka     option tcplog     timeout client 3h     timeout server 3h     timeout connect 3h     #balance url_param userid     #balance url_param session_id check_post 64     #balance hdr(User-Agent)     #balance hdr(host)     #balance hdr(Host) use_domain_only     #balance rdp-cookie     #balance leastconn     #balance source //ip     server   l-rabbitmq1 10.64.16.123:5672 check inter 5s rise 2 fall 3   #check inter 2000 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用     server   l-rabbitmq2 10.64.17.11:5672 check inter 5s rise 2 fall 3


haproxy -f haproxy.cfg启动

重启动

service haproxy restart

6.搭建成功

ip a  

http://10.64.16.254:1080/haproxy?stats看一下监控页面,如果显示出正常就表明已经将 HAProxy 负载均衡配置好了。

http://10.64.16.254:15673  rabbitmq管理页面

测试

生产者

import pika connection = pika.BlockingConnection(     pika.ConnectionParameters('10.64.16.254',5673,virtual_host="/",credentials=pika.PlainCredentials(username="admin",password="1234"))  # 默认端口5672,可不写  ) channel = connection.channel() channel.queue_declare(queue='ha_1') channel.basic_publish(exchange='',routing_key='ha_1',body='haha Hello World!')  connection.close()  # 队列关闭

消费者

import pika import time connection = pika.BlockingConnection(pika.ConnectionParameters('10.64.16.254',5673,virtual_host="/",credentials=pika.PlainCredentials(username="admin",password="1234"))  # 默认端口5672,可不写 ) channel = connection.channel() channel.queue_declare(queue='ha_1') def callback(ch, method, properties, body):  # 四个参数为标准格式  print(" [x] Received %r" % body)     time.sleep(15)     ch.basic_ack(delivery_tag = method.delivery_tag)     print("done") channel.basic_consume(callback,queue='ha_1') print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()

<END>

标签:rabbitmq集群
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
相关信息推荐