RabbitMQ两种集群模式配置管理

一、RabbitMQ集群的两种模式

1)普通模式:默认的集群模式。

2)镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案

普通模式:默认的集群模式

RabbitMQ集群中节点包括内存节点、磁盘节点。内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘上。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。那么内存节点的性能只能体现在资源管理上,比如增加或删除队列(queue),虚拟主机(vrtual hosts),交换机(exchange)等,发送和接受message速度同磁盘节点一样。一个集群至少要有一个磁盘节点。一个rabbitmq集群中可以共享user,vhost,exchange等,所有的数据和状态都是必须在所有节点上复制的,对于queue根据集群模式不同,应该有不同的表现。在集群模式下只要有任何一个节点能够工作,RabbitMQ集群对外就能提供服务。

默认的集群模式,queue创建之后,如果没有其它policy,则queue就会按照普通模式集群。对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构,但队列的元数据仅保存有一份,即创建该队列的rabbitmq节点(A节点),当A节点宕机,你可以去其B节点查看,./rabbitmqctl list_queues发现该队列已经丢失,但声明的exchange还存在。

当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer,所以consumer应平均连接每一个节点,从中取消息。该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。如果做了队列持久化或消息持久化,那么得等A节点恢复,然后才可被消费,并且在A节点恢复之前其它节点不能再创建A节点已经创建过的持久队列;如果没有持久化的话,消息就会失丢。这种模式更适合非持久化队列,只有该队列是非持久的,客户端才能重新连接到集群里的其他节点,并重新创建队列。假如该队列是持久化的,那么唯一办法是将故障节点恢复起来。

为什么RabbitMQ不将队列复制到集群里每个节点呢?这与它的集群的设计本意相冲突,集群的设计目的就是增加更多节点时,能线性的增加性能(CPU、内存)和容量(内存、磁盘)。当然RabbitMQ新版本集群也支持队列复制(有个选项可以配置)。比如在有五个节点的集群里,可以指定某个队列的内容在2个节点上进行存储,从而在性能与高可用性之间取得一个平衡(应该就是指镜像模式)。

镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案

该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置policy,然后客户端创建队列的时候,rabbitmq集群根据“队列名称”自动设置是普通集群模式或镜像队列。

二、RabbitMQ普通集群配置

1、每台主机均安装 rabbitmq

环境:

主机名 :ip
mq-161 : 10.100.0.161
mq-162 : 10.100.0.162
mq-163 : 10.100.0.163

ubuntu系统

install  rabbitmq-server  # 直接搞定

以下centos系统

1)Install Erlang

# For EL5:
rpm -Uvh http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
# For EL6:
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# For EL7:
rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm

yum install erlang

2)Install RabbitMQ Server

rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
yum install rabbitmq-server-3.6.5-1.noarch.rpm

3)use RabbitMQ Server

chkconfig rabbitmq-server on
service rabbitmq-server stop/start
2、RabbitMQ集群搭建

1)RabbitMQ集群搭建

均同步主机的/etc/hosts文件

10.100.0.161        mq-161
10.100.0.162        mq-162
10.100.0.163        mq-163

同步erlang.cookie文件,集群主机统一,通过Erlang的分布式特性(通过magic cookie认证节点)进行RabbitMQ集群,各RabbitMQ服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。

root@mq-161:~ # cat /var/lib/rabbitmq/.erlang.cookie 
WJLPTHZIMFLJRTOGPYNA
root@mq-162:~ # cat /var/lib/rabbitmq/.erlang.cookie 
WJLPTHZIMFLJRTOGPYNA
root@mq-163:~ # cat /var/lib/rabbitmq/.erlang.cookie 
WJLPTHZIMFLJRTOGPYNA

编译安装,普通用户启动的话,.erlang.cookie文件会在宿主目录下生成

在mq-161节点上查看集群信息,此时集群中应只有自己。

root@mq-161:~ # rabbitmqctl cluster_status
Cluster status of node 'rabbit@mq-161' ...
[
{nodes,[{disc,['rabbit@mq-161']}]},
#集群中的节点,disc表示为磁盘模式,ram表示为内存模式
{running_nodes,['rabbit@mq-161']},
#正在运行的集群节点
{cluster_name,<<"rabbit@mq-161">>},
#集群的名称
{partitions,[]}
]
...done.

下面将mq-161、mq-162、mq-163组成集群:

mq-162加入mq-161节点。

root@mq-162:~ # rabbitmqctl stop_app
root@mq-162:~ # rabbitmqctl join_cluster rabbit@mq-161
root@mq-162:~ # rabbitmqctl start_app

mq-163加入mq-161节点。

root@mq-163:~ # rabbitmqctl stop_app
root@mq-163:~ # rabbitmqctl join_cluster rabbit@mq-161 --ram
root@mq-163:~ # rabbitmqctl start_app

此时mq-162与mq-163也会自动建立连接,上面我的两个节点,其中mq-162是磁盘节点,mq-163是内存节点,但mq-161节点默认是磁盘节点(一个集群中最少要有一个磁盘节点)。如果想把mq-162由磁盘节点改成内存节点,使用如下change_cluster_node_type命令修改即可,但要先stop:

root@mq-162:~ # rabbitmqctl stop_app
Stopping node 'rabbit@mq-162' ...
...done.
root@mq-162:~ # rabbitmqctl change_cluster_node_type ram
Turning 'rabbit@mq-162' into a ram node ...
...done.
root@mq-162:~ # rabbitmqctl start_app
Starting node 'rabbit@mq-162' ...
...done.

2)允许远程用户访问

# 第一、添加mq用户并设置密码
rabbitmqctl add_user mq 123456

# 第二、设置mq用户为管理员
rabbitmqctl set_user_tags mq administrator

# 第三、设置mq用户的权限,指定允许访问的vhost以及write/read
rabbitmqctl set_permissions -p "/" mq ".*" ".*" ".*"

    Setting permissions for user "live" in vhost "/" ...
    ...done.

# 第四、查看vhost(/)允许哪些用户访问
rabbitmqctl list_permissions -p /
    Listing permissions in vhost "/" ...
    mq .* .* .*
    ...done.

# 第五、配置允许远程访问的用户,rabbitmq的guest用户默认不允许远程主机访问。
cat /etc/rabbitmq/rabbitmq.config 
    [
    {rabbit, [{tcp_listeners, [5672]}, {loopback_users, ["mq"]}]}
    ].
    # ps:主机1设置完以上这些之后,在集群内的机器都会同步此配置,但是/etc/rabbitmq/rabbitmq.config文件不会同步。

rabbitmqctl list_users
    Listing users ...
    mq  [administrator]
    ...done.
    最后,可以选择删除默认guest用户(密码也是guest)

rabbitmqctl delete_user guest

三、RabbitMQ镜像集群配置

上述配置的RabbitMQ默认集群模式,但并不包管队列的高可用性,尽管互换机、绑定这些可以复制到集群里的任何一个节点,然则队列内容不会复制。固然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能守候重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,须要创建镜像队列。

镜像队列是基于普通的集群模式的,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。

我是通过上面开启的网页的管理端来设置的镜像队列,也可以通过命令,这里先说其中的网页设置方式:

1、点击admin菜单–>右侧的Policies选项–>左侧最下下边的Add/update a policy。

2、按照图中的内容根据自己的需求填写。

3、点击Add policy添加策略。

此时你就会来你的两台rabbitmq服务器的网页管理端amind菜单下看见刚才创建的队列了,下面我们来添加一个queues队列来看看效果,这里只是测试结果,其它的先不填写。

设置镜像队列策略

在任意一个节点上执行:

root@mq-161:~ # rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。

我们去live-mq-02上查看策略。

root@mq-162:~ # rabbitmqctl list_policies
Listing policies ...
/   ha-all  all ^   {"ha-mode":"all"}   0
...done.

此时镜像集群就已经完成了,可以在任意节点上创建队列,看看其他两个节点是否会同步。


转载地址:http://www.ywnds.com/?p=4741

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ 提供了一种高可用性的集群解决方案,通过将多个 RabbitMQ 节点组成一个集群来实现。 在 RabbitMQ集群中,每个节点都是一个独立的 RabbitMQ 服务器,它们之间通过网络进行通信和数据同步。集群中的节点可以在同一台物理服务器或不同的物理服务器上运行。 以下是 RabbitMQ 集群的一些关键特点和实现方式: 1. 数据复制和同步:在集群中,消息、交换器、队列等对象会在所有节点之间进行复制和同步,以确保数据的一致性和可用性。当一个节点接收到消息后,它会将消息复制到其他节点上,以实现数据的冗余备份。 2. 负载均衡:集群中的消息会自动在各个节点之间进行分发和负载均衡。当一个节点接收到消息时,它会根据一定的策略将消息分发给其他节点,以实现消息的平衡处理和提高系统的吞吐量。 3. 高可用性:如果集群中的某个节点发生故障或宕机,其他节点可以接管其工作,并继续提供服务。这种故障转移机制确保了系统的高可用性和持续可靠的消息传递。 4. 集群模式RabbitMQ 提供了两种集群模式,即镜像队列模式队列分区模式。镜像队列模式队列的消息复制到集群中的所有节点,以实现数据的冗余备份。队列分区模式队列的消息分散到不同的节点上,以提高系统的吞吐量和并发性能。 需要注意的是,RabbitMQ集群配置需要正确地进行节点配置、网络设置和集群连接等,以确保集群的正常运行和数据的一致性。同时,集群配置还需要考虑到负载均衡、故障转移和性能调优等因素,以满足具体业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值