RabbitMQ 安装和使用

1、安装依赖环境

在 http://www.rabbitmq.com/which-erlang.html 页面查看安装rabbitmq需要安装erlang对应的版本

在 https://github.com/rabbitmq/erlang-rpm/releases 页面找到需要下载的erlang版本,`erlang-*.centos.x86_64.rpm`就是centos版本的。

复制下载地址后,使用wget命令下载,wget -P /home/download https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.3/erlang-21.2.3-1.el7.centos.x86_64.rpm

安装 Erlang sudo rpm -Uvh /home/download/erlang-21.2.3-1.el7.centos.x86_64.rpm

安装时如果提示‘libcrypto.so.10(OPENSSL_1.0.2)(64bit) is needed’则需要下载 openssl-libs-1.0.2k-16.el7.x86_64.rpm,地址http://rpmfind.net/linux/centos/7.6.1810/os/x86_64/Packages/openssl-libs-1.0.2k-16.el7.x86_64.rpm,然后升级一下 rpm -ivh openssl-libs-1.0.2k-16.el7.x86_64.rpm --force

安装 socat  sudo yum install -y socat

2、安装RabbitMQ

在官方下载页面http://www.rabbitmq.com/download.html)找到CentOS7版本的下载链接,下载rpm安装包

wget -P /home/download https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9/rabbitmq-server-3.7.9-1.el7.noarch.rpm

可以在https://github.com/rabbitmq/rabbitmq-server/tags下载历史版本

添加环境配置 vi /etc/rabbitmq/rabbitmq-env.conf ,没有目录时先创建对应的目录, 添加 NODENAME=rabbit@localhost

安装 sudo rpm -Uvh /home/download/rabbitmq-server-3.7.9-1.el7.noarch.rpm

3、基本操作

启动服务  sudo systemctl start rabbitmq-server

查看状态 sudo systemctl status rabbitmq-server

停止服务 sudo systemctl stop rabbitmq-server

设置开机启动 sudo systemctl enable rabbitmq-server

开启Web管理插件 rabbitmq-plugins enable rabbitmq_management,rabbitmq有一个默认的guest用户,但只能通过localhost访问,所以需要添加一个能够远程访问的用户

添加用户 rabbitmqctl add_user admin admin

为用户分配操作权限 rabbitmqctl set_user_tags admin administrator

为用户分配资源权限 rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

4、防火墙添加端口

sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent
sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent

重启防火墙 sudo firewall-cmd --reload

多机多节点集群部署

1、准备三台安装好RabbitMQ 的机器,ip分别为192.168.5.125、192.168.5.135、192.168.5.145

2、修改hosts文件,sudo vim /etc/hosts,三台机器分别都添加如下配置,可以通过sudo scp /etc/hosts root@192.168.5.135:/etc/复制到node2

192.168.5.125 node1

192.168.5.135 node2

192.168.5.145 node3

3、修改对应主机的hostname hostnamectl set-hostname 名字(重启后仍有效)

4、将192.168.5.125上的/var/lib/rabbitmq/.erlang.cookie文件复制到另外两台机器上

5、给每台机器的防火墙添加端口

6、 启动每台机器的RabbitMQ,sudo systemctl start rabbitmq-server或者 rabbitmq-server -detached

7、 将192.168.5.135加入到集群,停止RabbitMQ 应用 rabbitmqctl stop_app, 重置RabbitMQ 设置  rabbitmqctl reset 加入到集群  rabbitmqctl join_cluster rabbit@node1 --ram

启动RabbitMQ 应用 rabbitmqctl start_app

8、查看集群状态,看到`running_nodes,[rabbit@node1,rabbit@node2]`表示节点启动成功  rabbitmqctl cluster_status

9、在管理端界面界面查看

镜像队列模式集群

镜像队列属于RabbitMQ 的高可用方案,见:https://www.rabbitmq.com/ha.html#mirroring-arguments

通过前面的步骤搭建的集群属于普通模式集群,是通过共享元数据实现集群

开启镜像队列模式需要在管理页面添加策略,添加方式:

1. 进入管理页面 选择默认虚拟主机"/" -> Admin -> Policies(在页面右侧)-> Add / update a policy

2. 在表单中填入:

name:ha-all  策略名称,如果使用已有的名称,保存后将会修改原来的信息

Apply to:Queues 策略应用到什么对象上

Pattern:^ 策略应用到对象时,对象名称的匹配规则(正则表达式)

Priority: 0 优先级,数值越大,优先级越高,相同优先级取最后一个

Definition:策略定义的类容,对于镜像队列的配置来说,只需要包含3个部分: `ha-mode` 、`ha-params` 和 `ha-sync-mode`。其中,`ha-sync-mode`是同步的方式,自动还是手动,默认是自动。`ha-mode` 和 `ha-params` 组合使用。组合方式如下:

  |all | (empty) | 队列镜像到集群类所有节点 |

  | exactly | count | 队列镜像到集群内指定数量的节点。如果集群内节点数少于此值,队列将会镜像到所有节点。如果大于此值,而且一个包含镜像的节点停止,则新的镜像不会在其它节点创建。 |

  | nodes | nodename | 队列镜像到指定节点,指定的节点不在集群中不会报错。当队列申明时,如果指定的节点不在线,则队列会被创建在客户端所连接的节点上。 |

镜像队列模式相比较普通模式,镜像模式会占用更多的带宽来进行同步,所以镜像队列的吞吐量会低于普通模式,但普通模式不能实现高可用,某个节点挂了后,这个节点上的消息将无法被消费,需要等待节点启动后才能被消费。

除了镜像队列模式,还可以借助插件 shovel、federation来实现高可用,但是不常用,下面是两种方式的区别

持久化

RabbitMQ消息持久化分为消息持久化、队列持久化和交换器持久化,不管持久化还是非持久化消息都可以被写入磁盘,区别在于重启后消息是否还存在

队列持久化是通过定义队列是durable参数指定的,交换器持久化和队列持久化一样,也是通过在定义时durable参数指定,消息持久化是通过消息的属性deliverymode来设置是否持久化
RabbitMQ内存/磁盘控制:内存使用超过阈值后,Rabbit会暂时阻塞客户端的连接,停止接收消息,可以通过管理命令临时调整阈值

rabbitmqctl set_vm_memery_high_watermark <fraction> ,fraction为内存阈值,默认为0.4;

或者通过改配置文件在/etc/rabbitmq/rabbitmq.conf添加 vm_memery_high_watermark.relative = 0.5(相对值) /absolute = 1GB (绝对值)

内存换页:在某个rabbitmq节点内存到达阈值之前,它会尝试将队列中的消息换页到磁盘以释放内存空间,持久化和非持久化的消息都会被转储到磁盘中,同时会将持久化的消息在内存中清除,内存换页阈值设置 vm_memery_high_watermark_paging_ratio=0.75

磁盘阈值:当磁盘剩余空间小于默认值时,RabbitMQ同样会阻塞生产者,默认值为50M,但是并不能完全消除RabbitMQ崩溃的可能性(因为磁盘扫描是有时间间隔的)。

管理命令 rabbitmq set_disk_free_limit <8GB> /mem_relative 2.0(与内存的相对比值)

配置文件 disk_free_limit.relative =2.0 /disk_free_limit.absolute = 50M

最后提一下rabbimq的 插件机制, rabbitmq_plugins list 命令查看插件, rabbitmq_plugins enable 插件名字 来启用插件

RabbitMQ集群部署、高可用和持久化的更多相关文章

  1. Quartz学习笔记:集群部署&高可用

    Quartz学习笔记:集群部署&高可用 集群部署 一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点.这就意味着你必须对每个节点分别启动或停止.Quartz集群 ...

  2. 消息中间件-RabbitMQ集群和高可用

    多机多节点集群部署 一. 环境准备 准备三台安装好RabbitMQ 的机器,安装方法见 安装步骤 10.10.1.41 10.10.1.42 10.10.1.43 提示:如果使用虚拟机,可以在一台VM ...

  3. RabbitMQ集群和高可用配置

    概述 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionScript.XMPP. ...

  4. RabbitMQ 集群与高可用配置

    集群概述 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送 ...

  5. (转)RabbitMQ 集群与高可用配置

    集群概述 环境 配置步骤 集群概述 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务 ...

  6. centos7 rabbitmq集群搭建+高可用

    环境 [root@node1 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@node1 ~]# uname -r -.el ...

  7. kubernetes集群部署高可用Postgresql的Stolon方案

    目录 前言 ....前言 本文选用Stolon的方式搭建Postgresql高可用方案,主要为Harbor提供高可用数据库,Harbor搭建可查看kubernetes搭建Harbor无坑及Harbor ...

  8. Rabbitmq安装、集群与高可用配置

    历史: RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多 ...

  9. Centos6.9下RabbitMQ集群部署记录

    之前简单介绍了CentOS下单机部署RabbltMQ环境的操作记录,下面详细说下RabbitMQ集群知识,RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言, ...

  10. 15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...

随机推荐

  1. Flutter -------- 网络请求之HttpClient

    今天来说说Flutter中的网络请求,HttpClient网络请求,包含get,post get var data; _get() async { Map newTitle; var response ...

  2. git如何删除远程tag?

    答: 分为两步: 1. 删除本地tag git tag -d tag-name 2. 删除远程tag git push origin :refs/tags/tag-name

  3. shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)

    shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查) Shell脚本与MySQL数据库交互(增删改查) # 环境准备:安装mariadb 数据库 [ro ...

  4. 001——Angular环境搭建、运行项目、搭建项目

    1.安装node.js 和cnpm 2.cnpm install -g @angular/cli   安装angular脚手架: 3.ng new angulardemo cd angulardemo ...

  5. java 时间的原生操作和工具类操作

    package com.xc.test.dateoperation; import org.apache.commons.lang3.time.DateFormatUtils; import org. ...

  6. SharpGL学习笔记(一) 平台构建与Opengl的hello World (转)

    (一)平台构建与Opengl的hello World OpenGL就是3d绘图的API,微软针和它竞争推出D3D,也就是玩游戏时最常见的DirectorX组件中的3d功能. 所以不要指望windows ...

  7. new (std::nothrow) 与 new

    普通new一个异常的类型std::bad_alloc.这个是标准适应性态. 在早期C++的舞台上,这个性态和现在的非常不同:new将返回0来指出一个失败,和malloc()非常相似. 在内存不足时,n ...

  8. 【PV和PVC】kubernetes存储 persistent volume(持久化硬盘)和 persistent volume claim(持久化硬盘请求)

    报错:pod has unbound immediate PersistentVolumeClaims (repeated 11 times) pv没有满足pvc需求 https://www.cnbl ...

  9. 单元测试-测试技术(Unit Test)

    1.1白盒测试和单元测试的区别的论述: 1) 单元测试和白盒测试是不同的,虽然单元测试和白盒测试都是关注功能,虽然他们都需要代码支持,但是级别不同, 白盒测试关注的是类中一个方法的功能是更小的单位,但 ...

  10. Django:bootstrap table自定义查询实现

    参考:https://jalena.bcsytv.com/archives/tag/bootstrap 背景: bootstrap table在客户端分页方式下,自带有简易的搜索功能,但是功能太单一, ...