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由四个部分组成:
- name: 名称,可以使用任何名称,但是推荐使用没有空格的ASCII字符
- pattern: 正则表达式,用于匹配队列的名字
- definition: 一组key/value,对应队列和交互机的参数
- priority: 优先级,当多个policy匹配一个队列时,最高优先级的policy生效
配置policy有三种方法
2.1 网页UI配置
现在来实战一下,用web页面进行操作
首先配置vhost,表示一个独立的空间,账号策略队列都在这个vhost里面,不受其他影响。这是还没有配置vhost的界面,所有的操作都在根目录下 ,点击Add a new virtual host,添加一个vhost
再添加一个policy,作用于所有队列
最后新建一个队列,可以看到我们的策略已经生效了,点一下队列名字看一下
两个镜像,完美
2.2 API配置
在使用API的时候要进行身份验证,如果是用curl,要用下面的命令
curl -i -u user:password url
用postman,在Authorization选项卡里,选择Basic Auth,填写用户名和密码
配置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}'