RabbitMQ集群部署、高可用和持久化
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集群部署、高可用和持久化的更多相关文章
- Quartz学习笔记:集群部署&高可用
Quartz学习笔记:集群部署&高可用 集群部署 一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点.这就意味着你必须对每个节点分别启动或停止.Quartz集群 ...
- 消息中间件-RabbitMQ集群和高可用
多机多节点集群部署 一. 环境准备 准备三台安装好RabbitMQ 的机器,安装方法见 安装步骤 10.10.1.41 10.10.1.42 10.10.1.43 提示:如果使用虚拟机,可以在一台VM ...
- RabbitMQ集群和高可用配置
概述 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionScript.XMPP. ...
- RabbitMQ 集群与高可用配置
集群概述 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送 ...
- (转)RabbitMQ 集群与高可用配置
集群概述 环境 配置步骤 集群概述 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务 ...
- centos7 rabbitmq集群搭建+高可用
环境 [root@node1 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@node1 ~]# uname -r -.el ...
- kubernetes集群部署高可用Postgresql的Stolon方案
目录 前言 ....前言 本文选用Stolon的方式搭建Postgresql高可用方案,主要为Harbor提供高可用数据库,Harbor搭建可查看kubernetes搭建Harbor无坑及Harbor ...
- Rabbitmq安装、集群与高可用配置
历史: RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多 ...
- Centos6.9下RabbitMQ集群部署记录
之前简单介绍了CentOS下单机部署RabbltMQ环境的操作记录,下面详细说下RabbitMQ集群知识,RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言, ...
- 15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程
* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...
随机推荐
- Flutter -------- 网络请求之HttpClient
今天来说说Flutter中的网络请求,HttpClient网络请求,包含get,post get var data; _get() async { Map newTitle; var response ...
- git如何删除远程tag?
答: 分为两步: 1. 删除本地tag git tag -d tag-name 2. 删除远程tag git push origin :refs/tags/tag-name
- shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)
shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查) Shell脚本与MySQL数据库交互(增删改查) # 环境准备:安装mariadb 数据库 [ro ...
- 001——Angular环境搭建、运行项目、搭建项目
1.安装node.js 和cnpm 2.cnpm install -g @angular/cli 安装angular脚手架: 3.ng new angulardemo cd angulardemo ...
- java 时间的原生操作和工具类操作
package com.xc.test.dateoperation; import org.apache.commons.lang3.time.DateFormatUtils; import org. ...
- SharpGL学习笔记(一) 平台构建与Opengl的hello World (转)
(一)平台构建与Opengl的hello World OpenGL就是3d绘图的API,微软针和它竞争推出D3D,也就是玩游戏时最常见的DirectorX组件中的3d功能. 所以不要指望windows ...
- new (std::nothrow) 与 new
普通new一个异常的类型std::bad_alloc.这个是标准适应性态. 在早期C++的舞台上,这个性态和现在的非常不同:new将返回0来指出一个失败,和malloc()非常相似. 在内存不足时,n ...
- 【PV和PVC】kubernetes存储 persistent volume(持久化硬盘)和 persistent volume claim(持久化硬盘请求)
报错:pod has unbound immediate PersistentVolumeClaims (repeated 11 times) pv没有满足pvc需求 https://www.cnbl ...
- 单元测试-测试技术(Unit Test)
1.1白盒测试和单元测试的区别的论述: 1) 单元测试和白盒测试是不同的,虽然单元测试和白盒测试都是关注功能,虽然他们都需要代码支持,但是级别不同, 白盒测试关注的是类中一个方法的功能是更小的单位,但 ...
- Django:bootstrap table自定义查询实现
参考:https://jalena.bcsytv.com/archives/tag/bootstrap 背景: bootstrap table在客户端分页方式下,自带有简易的搜索功能,但是功能太单一, ...