设为首页 收藏本站
查看: 7843|回复: 0

[经验分享] OpenStack RabbitMQ 集群-后续整理

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-8-15 09:13:42 | 显示全部楼层 |阅读模式
[url=]第1章 引言... 1[/url]
[url=]1.1 目的... 1[/url]
[url=]1.2 说明... 1[/url]
[url=]1.3 MQ.. 1[/url]
[url=]1.4 概念... 1[/url]
[url=]1.5 MQ 特点... 2[/url]
[url=]1.6 工作流程... 2[/url]
[url=]1.7 系统环境... 3[/url]
[url=]第2章 RabbitMQ 部署... 4[/url]
[url=]2.1 系统环境基本配置... 4[/url]
[url=]2.2RabbitMA 配置... 4[/url]
[url=]2.3RabbitMQ 集群配置... 6[/url]
[url=]第3章 RabbitMQ集群验证... 9[/url]
[url=]3.1Nova 配置MQ HA. 9[/url]
[url=]3.2RabbitMQ HA      验证... 9[/url]
[url=]3.3RabbitMQ 恢复... 11[/url]
[url=]第4章 RabbitMQ知识普及... 12[/url]
[url=]4.1RabbitMQ 用户 权限... 12[/url]
[url=]4.2RabbitMQ 集群... 12[/url]
[url=]4.3RabbitMQ 查询... 13[/url]
[url=]4.4RabbitMQ 其他... 13[/url]
[url=]第5章 FAQ.. 14[/url]
[url=]5.1RabbitMQ 集群-网络分区... 14[/url]
[url=]第6章 参考... 16[/url]
[url=]6.1URL 参考... 16[/url]


第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:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
    Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
    vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
    producer:消息生产者,就是投递消息的程序。
    consumer:消息消费者,就是接受消息的程序。
    channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
1.5 MQ 特点
MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
1.6 工作流程
wKiom1Psyn_yO0eZAAOYXouw0Kg100.jpg

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

(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
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 hostname,login 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

[iyunv@athControllerrabbitmq]# cat rabbitmq.config
% Thisfile managed by Puppet
%Template Path: rabbitmq/templates/rabbitmq.config
[
{rabbit,[
{default_user,<<"guest">>},
{default_pass,<<"guest">>}
]},
{kernel,[

]}
].
% EOF
[iyunv@athControllerrabbitmq]#

2)   Configure/etc/rabbitmq/rabbitmq-env.config
[iyunv@athController rabbitmq]# cat/opt/rabbitmq-env.conf
RABBITMQ_NODE_PORT=5672
[iyunv@athController rabbitmq]#

3)    Create .erlang.cookie,consistent

[iyunv@athControllerrabbitmq]# vim /var/lib/rabbitmq/.erlang.cookie
YAGISQRAHKOFCZMWRFMT
[iyunv@athController rabbitmq]# chmod 400  /var/lib/rabbitmq/.erlang.cookie
[iyunv@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


[iyunv@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
[iyunv@athController nova]#chkconfig –level 123456 rabbitmq-server on

6)   三台节点同时配置并启动MQ 服务
2.3 RabbitMQ 集群配置
1)主节点配置
[iyunv@athControllernova] rabbitmqctl stop_app
[iyunv@athController nova] rabbitmqctl reset

[iyunv@athController nova]
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
[iyunv@athController nova]
/usr/lib/rabbitmq/bin/rabbitmq-plugins  enable rabbitmq_management_agent
[iyunv@athController nova] rabbitmqctl start_app


2)节点配置
[iyunv@athControllerrabbitmq] rabbitmqctl stop_app
[iyunv@athControllerrabbitmq] rabbitmqctl reset
[iyunv@athControllerrabbitmq] rabbitmqctl start_app

[iyunv@athControllerrabbitmq]
/usr/lib/rabbitmq/bin/rabbitmq-pluginsenable rabbitmq_management
[iyunv@athControllerrabbitmq]
/usr/lib/rabbitmq/bin/rabbitmq-plugins  enable rabbitmq_management_agent
[iyunv@athController rabbitmq] rabbitmqctl join_cluster--ram athController
[iyunv@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 监控

wKioL1Psy-TRNy51AANl2AJj148397.jpg
wKiom1Psys2RInmLAAFzqly4r8o310.jpg
wKioL1Psy-uSmMloAASfxKvmO0g649.jpg
wKiom1PsytaAJpXsAASYCCAEnv4562.jpg
wKiom1PsytnRDidnAANCNMiYIDU548.jpg



第3章 RabbitMQ集群验证3.1 Nova 配置MQ HA
1)NovaRabbitMQ配置
[iyunv@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
[iyunv@athController nova]#

3.2 RabbitMQ HA 验证
2)stop RabbitMQ 集群
a)     [iyunv@athController nova]#/etc/init.d/rabbitmq-server stop
b)    Stopping rabbitmq-server:rabbitmq-server.
c)     [iyunv@athController nova]#
3)RabbitMQ 监控报警
wKioL1PszC7ywn0vAAIdzXlD828414.jpg

4)Nova 错误日志
wKioL1PszGnTHxKPAAvGN0rXA7M946.jpg

5)192.168.8.53:5672接管消息队列,已正常工作
wKiom1Psy5XwDjTvAAMlPjXnUyk945.jpg
   6)依次停止8.53:5672 消息服务,8.87:5672 正常接管
wKioL1PszMjTyRHRAAcA8qUrjb0324.jpg
3.3 RabbitMQ 恢复
1)   主节点恢复启动MQ
[iyunv@athControllernova]# /etc/init.d/rabbitmq-server start
Startingrabbitmq-server: SUCCESS
rabbitmq-server.
[iyunv@athController nova]#
2)   RabbitMQ 监控显示
wKiom1Psy8nCKUgaAAJhvpqD0OA354.jpg
wKioL1PszOShxW5uAALVC_VI1bU882.jpg

第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章 FAQ5.1 RabbitMQ 集群-网络分区
1)   RabbitMQ 集群网络分区问题
    wKioL1PszPmgfIa-AAGcTR5ll3o119.jpg
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一共有三种处理方式:ignore,autoheal,pause_minority。默认的处理方式是ignore,即什么也不做
1)  ignore 默认处理方式
[iyunv@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
[iyunv@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




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-23885-1-1.html 上篇帖子: openstack分布式安装 下篇帖子: 多线程之Openstack novnc 改造,缓解Nova压力
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表