OpenStack RabbitMQ集群

管理手册

 

1 引言... 1

1.1 目的... 1

1.2 说明... 1

1.3 MQ.. 1

1.4 概念... 1

1.5 MQ 特点... 2

1.6 工作流程... 2

1.7 系统环境... 3

2 RabbitMQ 部署... 4

2.1 系统环境基本配置... 4

2.2RabbitMA 配置... 4

2.3RabbitMQ 集群配置... 6

3 RabbitMQ集群验证... 9

3.1Nova 配置MQ HA. 9

3.2RabbitMQ HA      验证... 9

3.3RabbitMQ 恢复... 11

4 RabbitMQ知识普及... 12

4.1RabbitMQ 用户 权限... 12

4.2RabbitMQ 集群... 12

4.3RabbitMQ 查询... 13

4.4RabbitMQ 其他... 13

5 FAQ.. 14

5.1RabbitMQ 集群-网络分区... 14

6 参考... 16

6.1URL 参考... 16



第1章 引言

1.1 目的

实现OpenStack RabbitMQ消息高可用性,实现MQ的负载均衡,缓解MQ压力,提高性能

1.2 说明

Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群景象。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中(本人采用的是yum 安装),文件是400的权限。所以必须包管各节点cookie对峙一致,不然节点之间就无法通信

1.3 MQ

MQ全称为Message Queue, 消息队列MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。其中较为成熟的MQ产品有IBM WEBSPHERE MQ

1.4 概念

Broker:简单来说就是消息队列服务器实体。
    Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
    Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
    Binding:绑定,它的作用就是把exchangequeue按照路由规则绑定起来。
    Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
    vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
    producer:消息生产者,就是投递消息的程序。
    consumer:消息消费者,就是接受消息的程序。
    channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

1.5 MQ 特点

MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQJMS类似,但不同的是JMSSUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。

在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

1.6 工作流程

OpenStack RabbitMQ 集群-后续整理_第1张图片

 

消息队列的使用过程大概如下:

(1)客户端连接到消息队列服务器,打开一个channel。
  (2)客户端声明一个exchange,并设置相关属性。
  (3)客户端声明一个queue,并设置相关属性。
  (4)客户端使用routing key,在exchange和queue之间建立好绑定关系。
  (5)客户端投递消息到exchange。

 

Exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。

 

Exchange也有几个类型,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。对key进行模式匹配后进行投递的叫做Topic交换机,符号”#”匹配一个或多个词,符号”*”匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。还有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。

 

RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括3个部分:
  (1)exchange持久化,在声明时指定durable => 1
  (2)queue持久化,在声明时指定durable => 1
  (3)消息持久化,在投递时指定delivery_mode=> 2(1是非持久化)

 

如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定

1.7 系统环境

角色

主机名

IP地址

系统版本

MQ Node

rabbit@athController

192.168.8.180

CentOS6.5 + RabbitMQ3.1.5

MQ Node

rabbit@athBackup87

192.168.8.87

CentOS6.5 + RabbitMQ3.1.5

MQ Node

rabbit@athBackup53

192.168.8.53

CentOS6.5 + RabbitMQ3.1.5

 

第2章 RabbitMQ部署

本环境用于测试,采用三台节点作为MQ 的集群,系统OS采用的是CentOS 6.5 x64,该技术服务于OpenStack,卸载CenOS 自带MQ产品QPID ,采用的是RabbitMQ 作为我们的首选高级消息队列服务

2.1 系统环境基本配置

1)install epel yum

a)     wgethttp://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm

b)    rpm -vihepel-release-6-8.noarch.rpm

2)install rabbitMQ

a)     yum -y install rabbitmq-server

3)Configure /etc/hosts

a)     192.168.8.180athController.8.180.abs.com.cn athController

b)    192.168.8.53athBackup53.abs.com.cn athBackup53

c)     192.168.8.87athBackup87.abs.com.cn athBackup87

4)Configure /etc/sysconfig/network setting(Setting hostnamelogin other node Configure)

a)     sed -i 's/HOSTNAME=.*/HOSTNAME=hostname /' /etc/sysconf/network

5)Disabled selinux Configure and iptables

a)     sed -i's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

b)    service iptables stop

c)     chkconfig –level 123456iptables off

6)以上操作,在三台节点同时执行操作

2.2 RabbitMA 配置

1)   Configure /etc/rabbitmq/rabbitmq.config

 

[root@athControllerrabbitmq]# cat rabbitmq.config

% Thisfile managed by Puppet

%Template Path: rabbitmq/templates/rabbitmq.config

[

{rabbit,[

{default_user,<<"guest">>},

{default_pass,<<"guest">>}

]},

{kernel,[

 

]}

].

% EOF

[root@athControllerrabbitmq]#

 

2)   Configure/etc/rabbitmq/rabbitmq-env.config

[root@athController rabbitmq]# cat/opt/rabbitmq-env.conf

RABBITMQ_NODE_PORT=5672

[root@athController rabbitmq]#

 

3)    Create .erlang.cookie,consistent

 

[root@athControllerrabbitmq]# vim /var/lib/rabbitmq/.erlang.cookie

YAGISQRAHKOFCZMWRFMT

[root@athController rabbitmq]# chmod 400  /var/lib/rabbitmq/.erlang.cookie

[root@athController rabbitmq]#chown rabbitmq:rabbitmq/var/lib/rabbitmq/.erlang.cookie

 

4)   Restart rabitmq-server

a)     Service rabbitmq-server restart

5)   Check RabbitMQ server and Addautostart

 

 

[root@athControllernova]# netstat -tnpl|grep 5672

tcp       0      0 0.0.0.0:15672   0.0.0.0:* LISTEN      26946/beam.smp

tcp       0      0 0.0.0.0:55672   0.0.0.0:* LISTEN      26946/beam.smp

tcp       0      0 0.0.0.0:5672    0.0.0.0:* LISTEN      26946/beam.smp

[root@athController nova]#chkconfig –level 123456 rabbitmq-server on

 

6)   三台节点同时配置并启动MQ 服务

2.3 RabbitMQ 集群配置

1)主节点配置

[root@athControllernova] rabbitmqctl stop_app

[root@athController nova] rabbitmqctl reset

 

[root@athController nova]

/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management

[root@athController nova]

/usr/lib/rabbitmq/bin/rabbitmq-plugins  enable rabbitmq_management_agent

[root@athController nova] rabbitmqctl start_app

 

 

2)节点配置

[root@athControllerrabbitmq] rabbitmqctl stop_app

[root@athControllerrabbitmq] rabbitmqctl reset

[root@athControllerrabbitmq] rabbitmqctl start_app

 

[root@athControllerrabbitmq]

/usr/lib/rabbitmq/bin/rabbitmq-pluginsenable rabbitmq_management

[root@athControllerrabbitmq]

/usr/lib/rabbitmq/bin/rabbitmq-plugins  enable rabbitmq_management_agent

[root@athController rabbitmq] rabbitmqctl join_cluster--ram athController

[root@athControllernova] rabbitmqctl start_app

    3)    添加RabbitMQ 用户 (三台机器同时配置)

           rabbitmqctl add_user username guest

           rabbitmqctl change_password guest guest

    4)    RabbitMQ镜像设置

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

    3)    浏览RabbitMQ WEB 监控

        

OpenStack RabbitMQ 集群-后续整理_第2张图片

OpenStack RabbitMQ 集群-后续整理_第3张图片

OpenStack RabbitMQ 集群-后续整理_第4张图片

OpenStack RabbitMQ 集群-后续整理_第5张图片

OpenStack RabbitMQ 集群-后续整理_第6张图片




第3章 RabbitMQ集群验证

3.1 Nova 配置MQ HA

1)NovaRabbitMQ配置

[root@athControllernova]# cat /etc/nova/nova.conf|grep rabbit

rabbit_host=192.168.8.180

rabbit_port=5672

rabbit_hosts=192.168.8.180:5672,192.168.8.53:5672,192.168.8.87:5672

rabbit_use_ssl=False

rabbit_userid=guest

rabbit_password=guest

rabbit_virtual_host=/

rabbit_retry_interval=1

rabbit_retry_backoff=2

rabbit_max_retries=0

rabbit_ha_queues=True

[root@athController nova]#

 

3.2 RabbitMQ HA 验证

2)stop RabbitMQ 集群

a)     [root@athController nova]#/etc/init.d/rabbitmq-server stop

b)    Stopping rabbitmq-server:rabbitmq-server.

c)     [root@athController nova]#

3)RabbitMQ 监控报警

OpenStack RabbitMQ 集群-后续整理_第7张图片


4)Nova 错误日志

OpenStack RabbitMQ 集群-后续整理_第8张图片


5)192.168.8.535672接管消息队列,已正常工作

wKiom1Psy5XwDjTvAAMlPjXnUyk945.jpg

   6)依次停止8.53:5672 消息服务,8.87:5672 正常接管

OpenStack RabbitMQ 集群-后续整理_第9张图片

3.3 RabbitMQ 恢复

1)   主节点恢复启动MQ

[root@athControllernova]# /etc/init.d/rabbitmq-server start

Startingrabbitmq-server: SUCCESS

rabbitmq-server.

[root@athController nova]#

2)   RabbitMQ 监控显示

OpenStack RabbitMQ 集群-后续整理_第10张图片

OpenStack RabbitMQ 集群-后续整理_第11张图片



第4章 RabbitMQ知识普及

4.1 RabbitMQ 用户权限

1)创建用户,配置密码

a)     add_user

2)删除用户

a)     delete_user

3)改变用户密码

a)     change_password

4)清除用户密码

a)     clear_password

5)设置用户权限

a)     set_user_tags

b)    rabbitmqctl set_user_tags rootadministrator

6)查询用户权限

a)     list_users

4.2 RabbitMQ 集群

1)添加RabbitMQ 节点加入集群

a)     join_cluster [--ram]

2)查看集群状态   

a)     cluster_status

3)修改集群node 存储方式

a)     change_cluster_node_type disc |ram

b)    rabbitmqctl change_cluster_node_typeram

4)跟新集群节点

a)     update_cluster_nodesclusternode

5)RabbitMQ同步消息队列

a)     sync_queue queue

b)    rabbitmqctl sync_queue  compute

4.3 RabbitMQ 查询

1)查询消息队列信息

a)     list_queues [-p] [ ...]

2)查询消息交换机信息

a)     list_exchanges [-p] [ ...]

3)查询exchanges 队列直接bind 信息

a)     list_bindings [-p] [ ...]

4)查询消息连接信息,如果是集群,将显示node bind信息

a)     list_connections[ ...]

4.4 RabbitMQ 其他

1)   RabbitMQ 进程停止

a)     stop []

b)    service rabbitmq-srver

2)   RabbitMQ 应用停止与启动

a)     stop_app start_app

3)   RabbitMQ 重置/强制重置节点到原始状态

a)     reset , force_reset

4)   查看RabbitMQ 基础信息

5)   Rabbbitmqctl status

第5章 FAQ

5.1 RabbitMQ 集群-网络分区

1)   RabbitMQ 集群网络分区问题

    OpenStack RabbitMQ 集群-后续整理_第12张图片

abbitMQ clusters do not tolerate network partitions well. If you are thinking of clusteringacross a WAN, don't. You shoulduse federation or the shovel instead.

rabbitmq一共有三种处理方式:ignoreautohealpause_minority。默认的处理方式是ignore,即什么也不做

1)  ignore 默认处理方式

 [root@athControllerrabbitmq]# cat rabbitmq.config

% This file managed by Puppet

% Template Path: rabbitmq/templates/rabbitmq.config

[

  {rabbit, [

    {default_user,<<"guest">>},

    {default_pass,<<"guest">>},

    {tcp_listeners,[5672]},

   {cluster_partition_handling, ignore}

  ]},

  {kernel, [

   

  ]}

].

% EOF

[root@athController rabbitmq]#

 

2)  autoheal的处理方式:简单来讲就是当网络分区恢复后,rabbitmq各分区彼此进行协商,分区中客户端连接数最多的为胜者,其余的全部会进行重启,这样也就恢复到同步的状态了

3)  pause_minority的处理方式:rabbitmq节点感知集群中其他节点down掉时,会判断自己在集群中处于多数派还是少数派,也就是判断与自己形成集群的节点个数在整个集群中的比例是否超过一半。如果是多数派,则正常工作,如果是少数派,则会停止rabbit应用并不断检测直到自己成为多数派的一员后再次启动rabbit应用。注意:这种处理方式集群通常由奇数个节点组成。在CAP中,优先保证了CP

 

RabbitMQ 集群的网络分区容错性并不是非常高,在网络经常发生分区时会有些问题,最明显的就是脑裂问题,官方给出的处理方式

Clustering and Network Partitions

RabbitMQ clusters do not tolerate network partitions well. Ifyou are thinking of clustering across a WAN, don't. You should use federation or the shovel instead.

However, sometimes accidents happen. This page documents how todetect network partitions, some of the bad effects that may happen duringpartitions, and how to recover from them.

RabbitMQ stores information about queues, exchanges, bindingsetc in Erlang's distributed database, Mnesia.Many of the details of what happens around network partitions are related to Mnesia'sbehaviour.

 

第6章 参考

6.1 URL 参考

http://www.rabbitmq.com/ha.html

http://www.rabbitmq.com/shovel.html

http://www.rabbitmq.com/partitions.html

http://www.rabbitmq.com/partitions.html

http://www.rabbitmq.com/clustering.html

http://www.bbtang.info/linux/fuwu/610.html

http://www.rabbitmq.com/federation.html

http://baike.baidu.com/view/4095865.htm?fr=aladdin

http://www.kankanews.com/ICkengine/archives/71918.shtml

http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2014-January/033412.html

http://rabbitmq.1065348.n5.nabble.com/Node-statistics-not-available-v3-2-0-td32937.html