复习下RabbitMQ的经典模型:
RabbitMQ最瞩目的几个特性就是这几个,首先是异步化的,可以大大提高系统的抗峰值能力。然后就是解耦。接下来是伸缩性,可以按需scaleout,比如rabbitmq的node可以很方便的加入。最终一致性解决了分布式系统的CAP定理的问题。
RabbitMQ集群基本概念
Rabbit模式大概分为以下三种:单主机模式、普通集群模式、镜像集群模式。
-
单主机模式:
- RabbitMQ服务运行在单独的一台主机中,通常生产环境不使用该模式,性能有限,并且如果服务器宕机服务将完全不可用。
-
普通集群模式
-
一说到集群问题瞬间变得复杂多了。首先对于Queue来说消息实体只存在于其中一个节点,集群中其他节点仅有相同的元数据,即队列结构。
-
当消息进入A节点的Queue中后,Consumer从B节点拉取消息时,RabbitMQ会临时在两个节点间进行消息传输,把A中的消息实体取出并经过B发送给Consumer。所以Consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立Queue。否则Consumer如果只连接一个节点区消息会造成该节点的性能瓶颈。
-
该模式存在一个问题就是当其中一个节点故障后,其他节点无法取到故障节点中还未消费的消息。如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,那就杯具了!
-
-
镜像集群模式
- 前面讲到RabbitMQ的普通集群模式不同节点间只同步队列结构不同步消息。镜像模式会把队列结构和消息都存在于多个节点,属于RabbitMQ的HA方案。其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大量消耗。所以这种模式应用于可靠性要求较高的场合中。
-
内存节点与磁盘节点
- RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。不过,如前文所述,如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是会放在磁盘。原则上一个集群至少有一个磁盘节点。在实际使用中会发现所谓的磁盘节点是只用来存储集群的配置信息,也就是说如果集群中没有磁盘节点,当所有节点关机后集群的配置信息就会丢失。在进行性能测试时两个模式的节点订阅发布消息的性能没有太大差距。
--------------------------------------------------------------------------------------------------------------------
本次搭建的高可用方案:
两节点镜像,使用HAproxy进行负载均衡
服务器信息:
CentOS7.4
mq1:192.168.166.21
mq2:192.168.166.22
负载虚拟IP :192.168.166.29
拓扑图如下:
本次只涉及RabbitMQ的配置,HAproxy的负载本文暂不提及。
yum源的安装参考:centos安装网络repo源及错误说明
--------------------------------------------------------------------------------------------------------------------
1、安装RabbitMQ
# yum install rabbitmq-server
2、启动服务
#rabbitmq-server -detached 启动rabbitmq,-detached代表后台守护进程方式启动。
3、查看服务状态
#rabbitmqctl status
4、其他相关命令
启动服务:rabbitmq-server-detached【 /usr/local/rabbitmq/sbin/rabbitmq-server-detached 】
查看状态:rabbitmqctl status 【 /usr/local/rabbitmq/sbin/rabbitmqctl status 】
关闭服务:rabbitmqctl stop 【 /usr/local/rabbitmq/sbin/rabbitmqctl stop 】
列出角色:rabbitmqctl list_users
马上就可以图形化啦~~
5、配置网页插件
# rabbitmq-plugins enable rabbitmq_management
6、输入服务器IP:15672 就可以看到RabbitMQ的WEB管理页面了
7、配置web的账号密码
rabbitmqctl add_user rabbitmq Redhat//添加用户,后面两个参数分别是用户名和密码,我这都用superrd了。
rabbitmqctl set_permissions-p/rabbitmq".*"".*"".*"//添加权限
rabbitmqctl set_user_tagsrabbitmqadministrator//修改用户角色
多么友善的界面,下面进行集群配置~~
8、镜像队列是基于普通的集群模式的,所以先配置普通集群
8.1、
修改 /etc/hosts
加入集群 3 个节点的描述:
192.168.166.21 mq01 192.168.166.22 mq02
8.2、设置 Erlang Cookie
RB的集群是依附于Erlang的集群来工作的,所以必须先构建起Erlang的集群景象,
各个节点的这个文件必须要保持一致。
Erlang Cookie 文件:/var/lib/rabbitmq/.erlang.cookie。这里将 mq01 的该文件复制到 mq02,由于这个文件权限是 400,所以需要先修改 mq02中的该文件权限为 777:
[mq02]# chmod 777 /var/lib/rabbitmq/.erlang.cookie
然后将 mq01 中的该文件拷贝到 mq02最后将权限和所属用户/组修改回来:
[mq01]#scp
/var/lib/rabbitmq/.erlang.cookie 192.168.166.22:
/var/lib/rabbitmq/
[mq02]# chmod 400 /var/lib/rabbitmq/.erlang.cookie [mq02]# chown rabbitmq /var/lib/rabbitmq/.erlang.cookie [mq02]# chgrp rabbitmq /var/lib/rabbitmq/.erlang.cookie
8.3、使用 -detached 参数运行各节点
# rabbitmqctl stop # rabbitmq-server -detached
8.4、 组成集群
将 mq02 与 mq01 组成集群:
mq02 # rabbitmqctl stop_appmq02 # rabbitmqctl join_cluster rabbit@mq01mq02 # rabbitmqctl start_app
此时 mq02 会自动建立连接;如果要使用内存节点,则可以使用
mq02 # rabbitmqctl join_cluster --ram rabbit@node1 加入集群。
为了提高性能,不需要两个节点都是disc的节点,所以我们需要启动一个节点为RAM模式。
#rabbitmqctl change_cluster_node_type ram
集群配置好后,可以在 RabbitMQ
任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。
apply to all:对队列和交换器
pattern ^ :任意
ha-mode exactly :指定镜像个数
ha-params 2 :镜像个数为2个
ha-sync-mode automatic :同步方式为自动
组合起来说:policy 的名称为monitor,对于队列和交换器名称为任意的所有队列与交换器进行镜像,并且在集群个数为2个,队列交换器消息自动同步。
10、配置镜像集群队列(在mq页面配置)
模拟单台故障
故障恢复后,镜像自动生成。
小插曲:
为什么要用erlang来搞rabbitmq,而是它真的很适合信息交换之类的软件。erlang是爱立信公司开发的专门用来开发高性能信息交换机的,想想也会觉得那些软件的性能和稳定性要求是极高的。RabbitMQ的节点发现和互连真的很方便,这在erlang的虚拟机中就集成了,而且具有高度容错能力。
请参考这个: http://www.rabbitmq.com/networking.html 默认的 client端通信口5672 管理口15672 server间内部通信口25672 erlang发现口:4369 如果用其它协议,还有其它口,参加上述网址的文档说明。
参考文章: