部署rabbitMQ镜像集群实战测试

部署rabbitMQ镜像集群 版本信息 rabbit MQ: 3.8.5 Erlang: 官方建议最低21.3 推荐22.x 这里用的是23 环境准备 主机规划 主机 节点
172.16.14.3   磁盘节点  
172.16.14.4   内存节点  
172.16.14.5   磁盘节点  
内存节点: 内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。例外情况是:持久的 queue 的内容将被保存到磁盘。 磁盘节点: 将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息。 注意点: 1、内存节点由于不进行磁盘读写,它的性能比磁盘节点高。 2、集群中可以存在多个磁盘节点,磁盘节点越多整个集群可用性越好,但是集群整体性能不会线性增加,需要权衡考虑。 3、RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。 4、设置两个磁盘节点,至少有一个是可用的,可以保存元数据的更改。 下载离线包

官网安装手册(https://www.rabbitmq.com/install-generic-unix.html)

rabbit MQ:二进制版 ➜ wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.5/rabbitmq-server-generic-unix-3.8.5.tar.xz Erlang: 无依赖版 -- 该软件包剥离了一些Erlang模块和依赖项,这些对运行RabbitMQ而言不是必需的。 ➜ wget https://github.com/rabbitmq/erlang-rpm/releases/download/v22.2.8/erlang-22.2.8-1.el7.x86_64.rpm 安装离线包 # 安装erlang yum install -y yum install erlang-22.2.8-1.el7.x86_64.rpm # 解压rabbitmq xz -d rabbitmq-server-generic-unix-3.8.5.tar.xz tar -xvf rabbitmq-server-generic-unix-3.8.5.tar -C /opt hosts文件 172.16.14.3 MQ1 172.16.14.4 MQ2 172.16.14.5 MQ3 配置文件

我们要自己在$Home/etc/rabbitmq中创建rabbitmq-env.conf, 详细信息请参阅 官方配置说明

# 创建持久化目录 mkdir -p /data/rabbitmq/store mkdir -p /data/rabbitmq/logs # 创建配置文件 vim /opt/rabbitmq_server-3.8.5/etc/rabbitmq/rabbitmq-env.conf # 指定节点的名字,默认rabbit@${hostname} NODENAME=rabbit@MQ1 # 指定端口,默认5672 NODE_PORT=5672 # 配置持久目录 MNESIA_BASE=http://www.likecs.com/ahdata/rabbitmq/store # 配置日志目录 默认文件名字:${NODENAME}.log 可以用配置修改 LOG_BASE=http://www.likecs.com/ahdata/rabbitmq/logs 启用服务 常用命令 sbin/rabbitmq-server # 启动server sbin/rabbitmq-server -detached # 后台启动server sbin/rabbitmqctl status # 查看节点状态 sbin/rabbitmqctl shutdown # 停止运行的节点 sbin/rabbitmqctl stop_app # 停止mq服务 sbin/rabbitmqctl start_app # 启动mq服务 sbin/rabbitmqctl cluster_status # 查看集群状态 sbin/rabbitmqctl set_cluster_name rabbit@MQ1 # 修改集群名称 sbin/rabbitmqctl join_cluster <cluster_name> # 加入集群 sbin/rabbitmqctl change_cluster_node_type --node <node_name> [ disk | ram ] # 修改节点类型 启动rabbit cd /opt/rabbitmq_server-3.8.5/ sbin/rabbitmq-server -detached # 在后台启动应用 sbin/rabbitmqctl status # 查看节点状态 erlang.cookie

Erlang 节点间通过认证 Erlang cookie 的方式允许互相通信。因为 rabbitmqctl 使用 Erlang OTP 通信机制来和 Rabbit 节点通信,运行 rabbitmqctl 的机器和所要连接的 Rabbit 节点必须使用相同的 Erlang cookie 。否则你会得到一个错误。

cat /root/.erlang.cookie IJPCAHDPWVYSDERZDUPG # 保持cookie一致 scp /root/.erlang.cookie n218:/root/.erlang.cookie # 拷贝过去之后需要重启一下mq服务 sbin/rabbitmqctl shutdown # 停止运行的节点 sbin/rabbitmq-server -detached # 在后台启动应用 scp /root/.erlang.cookie n219:/root/.erlang.cookie # 拷贝过去之后需要重启一下mq服务 sbin/rabbitmqctl shutdown # 停止运行的节点 sbin/rabbitmq-server -detached # 在后台启动应用

现在三台机器上具有相同的 Erlang cookie 了。下面开始组建集群。

集群 基础概念

RabbitMQ 集群分为两种:

普通集群

镜像集群(普通集群的升级)

普通集群:

以两个节点(rabbit01、rabbit02)为例来进行说明。 rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构,但消息实体只存在于其中一个节点rabbit01(或者rabbit02)中。 当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。 所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。 如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgxxf.html