Centos6下RabbitMQ学习(二)——镜像队列实现高可用

镜像队列是比较常用的实现RabbitMQ高可用方式,官方文档还提到了另外一种高可用方式High availability with Pacemaker and DRBD,但是它自己都说了"This part documents a technique for achieving active-passive high availability with RabbitMQ. Mirrored queues can be easier to use and do not impose a delay at failover."

1 mirror队列

默认启动集群后,每一条消息队列只存在于一个单点服务器中,如果这台服务器狗带,那数据就丢失了

可以用镜像队列来解决这个问题,即一个消息队列存在多个服务器里,当然需要性能上的代价

关于镜像队列的官方文档https://www.rabbitmq.com/ha.html

每个镜像队列,都包括一个master和若干个mirror,每次操作会首先在master队列上进行,其次才轮到其他mirror。如果master挂了,最老的已完成同步的mirror会被提升为master,也可以提升未同步的mirror,这取决于配置。如果配置不允许未同步的mirror成为master,那master一挂就后继无人,队列就狗带了

所谓同步,就是指一台机器新启动后,等到队列内容与master节点完全相同,就称为同步完成

举个例子,master节点的队列中有消息1和消息2,这时候启动一台mirror,mirror的队列是空的;插入消息3,master的队列是消息1、2、3,mirror的队列是消息3,并未同步成功;然后取出消息1和消息2,master和mirror的队列只含有消息3,就是同步完成了

官方建议一个队列的镜像数最好是集群的半数加一,例如三点集群,镜像队列存在于两个节点

2 配置mirror队列

在配置一个队列进入镜像模式时,需要两个参数,ha-mode和ha-params,一共有三种镜像模式,参数如下

模式(ha-mode) 参数(ha-params) 说明
exactly count 指定备份个数,如果count为1,表示只有一个master的情况
all 所有集群中的节点都存有一个队列mirror
nodes 节点列表 指定的节点列表上都有一个队列mirror

配置一个队列是通过policy完成批量配置的,一个policy可以匹配多个队列(只要符合匹配规则),所以批量化地修改配置非常方便,policy由四个部分组成:

  1. name: 名称,可以使用任何名称,但是推荐使用没有空格的ASCII字符
  2. pattern: 正则表达式,用于匹配队列的名字
  3. definition: 一组key/value,对应队列和交互机的参数
  4. priority: 优先级,当多个policy匹配一个队列时,最高优先级的policy生效

配置policy有三种方法

2.1 网页UI配置

现在来实战一下,用web页面进行操作

首先配置vhost,表示一个独立的空间,账号策略队列都在这个vhost里面,不受其他影响。这是还没有配置vhost的界面,所有的操作都在根目录下 ,点击Add a new virtual host,添加一个vhost

Centos6下RabbitMQ学习(二)——镜像队列实现高可用_第1张图片再添加一个policy,作用于所有队列

Centos6下RabbitMQ学习(二)——镜像队列实现高可用_第2张图片

最后新建一个队列,可以看到我们的策略已经生效了,点一下队列名字看一下

两个镜像,完美

 

Centos6下RabbitMQ学习(二)——镜像队列实现高可用_第3张图片

2.2 API配置

在使用API的时候要进行身份验证,如果是用curl,要用下面的命令

curl -i -u user:password url

 用postman,在Authorization选项卡里,选择Basic Auth,填写用户名和密码

Centos6下RabbitMQ学习(二)——镜像队列实现高可用_第4张图片

配置policy的API是/api/policies/vhost/name,最后一个name是你要添加的policy名,vhost替换为要添加policy的vhost名字,支持get、put、delete

现在虚拟主机/下面有一个名为hello的队列,为他新建一条policy

 发送json到api/policies/%2f/apply-all-mirror,动作是put

{
    "pattern":"hello",
    "definition":{
        "ha-mode": "exactly",
        "ha-params": 2
    },
    "priority":1,
    "apply-to":"queues"
}

看一下页面上,多了一个新增的policy

hello队列已经进入镜像模式

 

2.3 命令行配置

命令行配置很简单,一条命令搞定,下面是用命令行配置了一条和2.2完全相同的policy

./rabbitmqctl set_policy -p / --priority 1 --apply-to queues apply-all-mirror hello '{"ha-mode": "exactly","ha-params":2}'

 

你可能感兴趣的:(RabbitMQ,高可用,镜像队列,RabbitMQ学习)