rabbitmq高可用实现

需求背景

1.业务按需求将一些功能拆分成异步任务,将消息放入队列进行处理。
2.rabbitmq消息队列的使用,要求保证服务随时可用,并保证消息队列内的消息不丢失。
rabibtmq在整个业务中的地位不比mysql低,高可用不可或缺。

rabbitmq集群

rabbitmq简单介绍:

  基于erlang语言开发,而erlang是一门分布式语言开发,适用于集群开发;rabbitmq自身也提供了多种集群方案:http://www.rabbitmq.com/ha.html

  1.集群管理:没有明显的主从,主要的是disk和ram节点的区别
  2.做集群的需求:不支持跨网段(erlang限制)
  3.集群类型:普通集群、镜像集群
    普通集群:结构同步,消息实体只存在一个节点中,但consumer在非消息节点获取是,节点间存在消息拉取,易产生性能瓶颈。
    镜像集群:集群中一个master,负责调度,处理消息实体,其他节点保存一份数据到本地;性能主要靠master承载。
  4.持久化,分两部分:
    Rabbitmq服务器配置持久化:默认的就是持久化(disc类型);
    代码持久化:默认情况下,代码创建的消息队列和存放在队列里的消息都是非持久化的,需要在建立队列时指定:

import pika

username="guest"
password="guest"
user_pawd = pika.PlainCredentials(username,password)

connection = pika.BlockingConnection(pika.ConnectionParameters(‘localhost‘,5672,credentials=user_pawd))
channel = connection.channel()
channel.queue_declare(queue=‘develop‘,durable=True)      //持久化
channel.basic_publish(exchange=‘‘,routing_key=‘develop‘,body="Hello World",properties=pika.BasicProperties(delivery_mode=2,))
print "product a message to queue:queue1\tuse ‘# rabbitmqctl list_queues‘ to ckeck"
connection.close()

镜像集群搭建

1.时间同步,节点互通;节点hosts配置,能互相解析
  10.11.45.1 node1 //用来做主节点
  10.11.45.2 node2
2.节点cookie同步
  /var/lib/rabbitmq/.erlang.cookie //文件内容可随意
3.保证节点rabbitqm-server都启动,默认都是主节点

# systemctl start rabbitmq-server.service

4.将节点node2加入到集群中(node1所在的集群),原节点中的队列会被清空。此时可以互相查看对方队列的信息,但未同步到本地。Exchange和binding会互相同步。

# rabbitmqctl stop_app
# rabbitmqctl join_cluster  [email protected]
# rabbitmqctl start_app

# rabbitmqctl cluster_status         //查看集群状态


5.设置镜像:作用是把master上面的队列同步到本地,在master宕机后一样可以维持队列。

# rabbitmqctl  set_policy ha-1  "^ha\."  ‘{"ha-mode":"all"}‘        //将ha开头的队列都镜像到所有节点上。
# rabbitmqctl  set_policy ha-2  "^cinder"  ‘{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}‘     //将cinder开头的队列镜像到任意两个节点,并自动同步

设置policy时的相关参数:
ha-mode:
  exactly:指定数量的节点,需要配合ha-params(num类型)使用
  nodes:指定特定镜像的节点,需要配合ha-params(string类型)使用
  all:镜像到所有节点

也可以通过web管理界面设置:

集群问题,很难遇到

1.网络分区(脑裂),主要受erlang语言影响
  判断依据:# rabbitmqctl cluster_status 结果中的partitions部分不为空

  可用配置项:
    ignore:默认,不处理网络分区,适用于网络状况好的集群
    autoheal:各分区协商后重启客户端连接最少分区的节点,恢复集群
    pause_minority:分区发生后判断自己所在分区内节点是否超过集群总节点数一半,如果没有超过则暂停这些节点(保证 CP,总节点数为奇数个)

keepalive高可用

1.安装:

# yum install keepalive ipsrv


2.配置:对外提供VIP 10.11.45.100
根据节点调整优先级大小,越大越优;节点间互相指定单播地址

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id mq_1
}

vrrp_script check_mq {
    script "/etc/keepalived/check_mq.sh"
    interval 20
    weight -5
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 94
    advert_int 1
    unicast_src_ip 10.11.45.1
    unicast_peer {
        10.11.45.2
    }
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        10.11.45.100
    }
    track_script {
        check_mq
    }
    preempt_delay 10
}

  
3.检查脚本(/etc/keepalived/check_mq.sh):

#!/bin/bash
A=`rabbitmqctl status|wc -l`
if [ $A -lt  40 ];then
        /bin/systemctl stop rabbitmq-server.service
        /bin/systemctl stop  keepalived.service
        exit 1
fi

  
4.启动keepalived,查看VIP和日志

# systemctl start keepalived
# ip addr
# tailf /var/log/messages

  

集群中注意点:

1.开机不自启:keepalive和rabbitmq服务都设置成开机不自启动,手动启动减少风险。
2.服务启动顺序:rabbitmq集群同步后在启动keepalive。
  

故障处理

情形1:一个失效,一个存活(集群依旧可用,存活的保持为主)

1.业务低峰期启动失效的rabbitmq,自动同步队列,恢复队列集群。
2.配置并验证失效的keepalived优先级低于存活那台,不抢占VIP,保持VIP和rabbitmq主为同一台。
3.启动keepalived,高可用集群恢复。

情形2:两台均失效(集群失效,重大故障)

1.通过查日志、监控等记录找出后宕机的节点(比如是node2)。
2.启动后宕机节点(node2)的rabbitmq,确认消息是否丢失。
3.启动另一台rabbitmq(node1),恢复队列集群。
4.调整两台keepalived的优先级别:node2 > node1。
5.启动node2上面的keepalived,确认占用VIP。
6.启动node1上的keepalived,高可用集群恢复。

原文地址:http://blog.51cto.com/11424123/2088023

时间: 2024-08-03 05:05:57

rabbitmq高可用实现的相关文章

RabbitMQ(四):使用Docker构建RabbitMQ高可用负载均衡集群

本文使用Docker搭建RabbitMQ集群,然后使用HAProxy做负载均衡,最后使用KeepAlived实现集群高可用,从而搭建起来一个完成了RabbitMQ高可用负载均衡集群.受限于自身条件,本文使用VMware虚拟机的克隆功能克隆了两台服务器进行操作,仅作为一个demo,开发中可根据实际情况进行调整. 首先看下RabbitMQ高可用负载均衡集群长什么样子: 使用Docker构建RabbitMQ高可用负载均衡集群大概分为三个步骤: 启动多个(3个为例)RabbitMQ,构建RabbitMQ

RabbitMQ 高可用集群搭建及电商平台使用经验总结

面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue policy设置 两个不错的RabbitMQ plugin 大型应用插件(Sharding.Rederation) Queue镜像失败手动同步 各集群配置同步方式(RabbitMQ export\import) 客户端连接方式(尽量采用AMQP组来动态链接) RabbitMQ 产线二次产品化封装(消息补偿.发送消息持久化.异常处理.监控页面.重复

RabbitMQ高可用方案总结

RabbitMQ的集群方案有以下几种: 1.普通的集群 exchange,buindling再所有的节点上都会保存一份,但是queue只会存储在其中的一个节点上,但是所有的节点都会存储一份queue的meta信息.因为这样有两个好处: 1)存储空间.如果每一个节点上都有全部的消息,有多少个节点就会有多少个消息总量的copy.加入一个队列的消息占用的空间是1G,那么三个节点就是3G 2) 性能.消息需要在节点之间传输会有很大的网络开销.如果消息设置了durable即持久化,还会增加很大的磁盘负载 

企业私有云之rabbitmq高可用

默认openstack使用rabbitmq做信息队列,如果想是云高可用,那么需要对每个涉及的组件都进行高可用配置,本文主要介绍如何使用rabbitmq做高可用. 高可用的方法为: 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收. 这些节点通过 RabbitMQ HA 队列(镜像队列)进行消息队列结构复制.本方案中搭建 3 个节点,并且都是磁盘节点(

LVS+KeepAlived,RabbitMQ高可用负载均衡

最近团队准备对项目进行重构,其中用到了RabbitMQ,也考虑了几个方案,下边着重介绍在项目中即将采用的方案.关于RabbitMQ就不在这里详细说明,具体查看 RabbitMQ中文手册.直接看架构图: 如图所示: 前端采用keepalived+lvs实现高可用负载均衡, RabbitMQ HA 队列(镜像队列)进行消息队列结构复制.本方案中搭建两个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务.任务处理进程同时监控

RabbitMQ 高可用集群搭建

面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue policy设置 两个不错的RabbitMQ plugin 大型应用插件(Sharding.Rederation) Queue镜像失败手动同步 各集群配置同步方式(RabbitMQ export\import) 客户端连接方式(尽量采用AMQP组来动态链接) RabbitMQ 产线二次产品化封装(消息补偿.发送消息持久化.异常处理.监控页面.重复

使用glusterfs 作为 kubernetes PersistentVolume PersistentVolumeClaim 持久化仓库,高可用Rabbitmq,高可用mysql,高可用redis

glusterfs 怎么集群,网上一搜铺天盖地的 可利用这个特点做单节点高可用,因为K8S 哪怕节点宕机了 master 会在随意一台节点把挂掉的复活 当然我是在自己的环境下跑,经过网络的glusterfs,数据传输,等都有一定的性能损耗,对网络要求也特别高 小文件存储性能也不高等问题. 这里记录一下rabbitmq 单机高可用情景,mysql,mongodb, redis 等,万变不离其宗 事先创建好了 volume,卷名为 env-dev 随便找个客户机挂载 mount -t gluster

RabbitMQ 高可用之镜像队列

如果RabbitMQ集群只有一个broker节点,那么该节点的失效将导致整个服务临时性的不可用,并且可能会导致message的丢失(尤其是在非持久化message存储于非持久化queue中的时候).可以将所有message都设置为持久化,并且使用持久化的queue,但是这样仍然无法避免由于缓存导致的问题:因为message在发送之后和被写入磁盘并执行fsync之间存在一个虽然短暂但是会产生问题的时间窗.通过publisher的confirm机制能够确保客户端知道哪些message已经存入磁盘,尽

rabbitmq高可用

1.全局图 客户端通过VIP建立通信链路:通信链路通过Keeaplived的Master节点路由到对应的HAProxy之上:HAProxy通过负载均衡算法将负载分发到集群中的各个节点之上.正常情况下客户端的连接通过图中左侧部分进行负载分发.当Keepalived的Master节点挂掉或者HAProxy挂掉无法恢复,那么Backup提升为Master,客户端的连接通过图中右侧部分进行负载分发.如果你追求要更高的可靠性,可以加入多个Backup角色的Keepalived节点来实现一主多从的多机热备.