RabbitMQ之集群搭建
1.RabbitMQ集群模式
RabbitMQ集群中节点包括内存节点(RAM)、磁盘节点(Disk,消息持久化),集群中至少有一个Disk节点。
2.普通模式(默认)
对于普通模式,集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节点。对于消费者来说,若消息进入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消息从A中取出,并经过B发送给消费者。
应用场景:该模式各适合于消息无需持久化的场合,如日志队列。当队列非持久化,且创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化,只能等故障节点恢复。
3.镜像模式
与普通模式不同之处是消息实体会主动在镜像节点间同步,而不是在取数据时临时拉取,高可用;该模式下,mirror queue有一套选举算法,即1个master、n个slaver,生产者、消费者的请求都会转至master。
应用场景:可靠性要求较高场合,如下单、库存队列。
缺点:若镜像队列过多,且消息体量大,集群内部网络带宽将会被此种同步通讯所消耗。
PS:(1)镜像集群也是基于普通集群,即只有先搭建普通集群,然后才能设置镜像队列。(2)若消费过程中,master挂掉,则选举新master,若未来得及确认,则可能会重复消费。
2.Erlang安装(官网)
RmpFusion软件仓库安装
RabbitMQ通过ELang(air-lang)开发,故需先安装ErLang,其许多相关依赖并不在yum软件仓库中,需从第三方软件仓库中获取,此处选择RmpFusion 。
yum install epel-release
rpm -ivh https://download1.rpmfusion.org/free/el/updates/6/i386/rpmfusion-free-release-6-1.noarch.rpm
Elang安装
sudo yum install erlang
验证
erl -v
3.RabbitMQ安装
RabbitMQ安装(3.7.4版本)
rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
rpm -ivh https://bintray.com/rabbitmq/rabbitmq-server-rpm/download_file?file_path=rabbitmq-server-3.7.4-1.el7.noarch.rpm
PS:安装过程中提示socat被rabbitmq-server依赖,故需要先安装socat
yum install socat
启动RabbitMQ
rabbitmq-server -detached 或者
rabbitmq-server start
RabbitMQ-Management安装
rabbitmq-plugins enable rabbitmq_management
新增账户
rabbitmqctl add_user mq 123456
rabbitmqctl set_user_tags mq administrator
4.集群搭建(官网地址)
1.集群配置
编号 IP 宿主OS 硬件配置 hostname
1 192.*.*.147 CentOs 7.4.1708
CPU:4core,Inter i5-4590,3.3GHz
Memory:16G
rabbit1
2 192.*.*140 CentOs 7.4.1708
CPU:4core,Inter i5-4590,3.3GHz
Memory:8G
rabbit2
3 192.*.*.6 CentOs 7.4.1708
CPU:4core,Inter i5-4570,3.2GHz
Memory:16G
rabbit3
PS:需要保证各节点通过hostname可以ping通
可修改/etc/hosts
2.普通集群
Step1:集群节点(对等)通信---erlang Cookie
erlang分布式的每个节点上要保持相同的.erlang.cookie文件,文件路径:/var/lib/rabbitmq/.erlang.cookie
Step2:将rabbit2加入到rabbit1(RAM节点,默认Disk节点)
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit1 <span style="background-color:rgb(255,204,0);">--ram</span>
rabbitmqctl start_app
Step3:同上,将rabbit3加入到rabbit1(Disk节点)
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app
PS:若希望修改节点类型,则(需要先Stop)
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
3.镜像集群
Policy(各节点均会同步)
RabbitMQ提供"ha-mode"和"ha-params(可选)",组合情况如下:
配置
有两种配置方式:rabbitmqctl或者Rabbit Management,如
rabbitmqctl set_policy-p/ha-all"^"'{"ha-mode":"all"}'
rabbitmqctl set_policy productsyncinfo-ha ".*\.ProductSyncInfo\..*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
5.其他
1.常用命令
rabbitmq-server -detached 启动RabbitMQ节点
rabbitmqctl start_app 启动RabbitMQ应用,而不是节点
rabbitmqctl stop_app 停止
rabbitmqctl status 查看状态
rabbitmqctl add_user mq 123456
rabbitmqctl set_user_tags mq administrator 新增账户
rabbitmq-plugins enable rabbitmq_management 启用RabbitMQ_Management
rabbitmqctl cluster_status 集群状态
rabbitmqctl forget_cluster_node rabbit@rabbit3 节点摘除
rabbitmqctl reset application重置
2.异常处理
在搭建集群过程中,若节点异常退出且无法再次加入集群时:
(1)rm /var/lib/rabbitmq/mnesia--->该文件夹保存着集群信息;
(2)rabbitmq-service stop--->若未执行第一步,会提示异常;
{"init terminating in do_boot",{error,{inconsistent_cluster,"Node rabbit@rabbit2 thinks it's clustered with node rabbit@rabbit3, but rabbit@rabbit3 disagrees"}}}
init terminating in do_boot ({error,{inconsistent_cluster,Node rabbit@rabbit2 thinks it's clustered with node rabbit@rabbit3, but rabbit@rabbit3 disagrees}})
(3)在节点(rabbit1)中摘除该节点;
(4)重启RabbitMQ,并加入集群。
---------------------
原文:https://blog.csdn.net/jinyidong/article/details/80003362
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二篇
https://mp.weixin.qq.com/s/cjz26W-06xsNauteKLs6hw
rabbitMQ模式大概分为以下三种:单主机模式、普通集群模式、镜像集群模式
1、单主机模式:
rabbitMQ服务运行在单独的一台主机种,通常生产环境不适用该模式,性能有限,并且如果服务器宕机服务将完全不可用
2、普通集群模式:
一说到集群问题瞬间变得复杂多了。首先对于Queue来说消息实体只存在于其中一个节点,集群中其他节点仅有相同的元数据,即队列结构。
当消息进入A节点的Queue后,Consumer从B节点拉取消息时,rabbitMQ会临时在两个节点间进行消息传输,把A中的消息实体取出来并经过B发送给Consumer。所以Consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立Queue。否则Consumer如果只连接一个节点取消息会造成该节点的性能瓶颈。
该模式存在一个问题就是当其中一个节点故障后,其他节点无法取到故障节点中还未消费的消息。如果做了消息持久化,那么得等A节点恢复,然后才可被消费,如果没有持久化得话,那就悲剧了
3、镜像集群模式:
rabbitMQ的普通集群模式不同于节点间只同步队列结构不同步消息。镜像模式会把队列结构和消息都存在于多个节点,属于rabbitMQ的HA方案。其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量得消息进入,集群内部得网络带宽将会被这种同步通讯大量消耗。所以这种模式应用于可靠性要求较高得场合中。
rabbitmq集群节点:内存节点与磁盘节点
rabbitMQ得集群节点包括内存节点、磁盘节点。内存节点就是将所有得数据存放在内存,磁盘节点将数据存放在磁盘,如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是会放在磁盘。原则上一个集群至少有一个磁盘节点。在实际使用中会发现所谓的磁盘节点是只用来存储集群的配置信息,也就是说如果集群中没有磁盘节点,当所有节点关机后集群的配置信息就会丢失。在进行性能测试时两个模式的节点订阅发布消息的性能没有太大差异
本文是两台服务器搭建的rabbitmq镜像集群,其实就是从单主机模式--->普通集群模式--->镜像集群模式的搭建过程
一、服务器基本配置:
服务器(prod01)
IP:172.17.47.219
主机名:prd01
内核:CentOS Linux release 7.4.1708 (Core)
hosts文件修改:echo '172.17.73.215 prd02' >> /etc/hosts
服务器(prod02)
IP:172.17.73.215
主机名:prd02
内核:CentOS Linux release 7.4.1708 (Core)
hosts文件修改:echo '172.17.47.219 prd01' >> /etc/hosts
二、安装依赖(prd01、prd02都需要安装,安装步骤一样)
yum -y install make ncurses-devel gcc gcc-c++unixODBC unixODBC-devel openssl openssl-devel
三、安装rabbitmq依赖的erlang环境(prd01、prd02都需要安装,安装步骤一样)
cd /usr/local/src/
wget http://erlang.org/download/otp_src_19.3.tar.gz
tar xf otp_src_19.3.tar.gz
cd otp_src_19.3
./configure --prefix=/usr/local/erlang--enable-smp-support --enable-threads --enable-sctp --enable-kernel-poll --enable-hipe --with-ssl
make && make install
vim /etc/profile
ERL_HOME=/usr/local/erlang
PATH=$ERL_HOME/bin:$PATH
export ERL_HOME PATH
source /etc/profile
四、安装rabbitmq
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/rabbitmq_v3_6_6/rabbitmq-server-generic-unix-3.6.6.tar.xz
tar xfrabbitmq-server-generic-unix-3.6.6.tar.xz
mkdir /data/application
mv rabbitmq_server-3.6.6/data/application/rabbitmq3.6
五、启动
cd /data/application/rabbitmq3.6/
./sbin/rabbitmq-server -detached
./sbin/rabbitmq-plugins enablerabbitmq_management
六、添加用户,设置角色,授权
./sbin/rabbitmqctl add_user user password
./sbin/rabbitmqctl set_user_tags user administrator
./sbin/rabbitmqctl set_permissions -p / user ".*" ".*" ".*"
七、登陆
浏览器输入ip:port
以上rabbitmq已将安装成功,这里只展示了其中一台服务器的rabbitmq安装,两台步骤一样,不做多余展示,大家发现与本人之前发表的rabbitmq单点安装(一)步骤一样,没错是一样的,不一样的在后面,以下内容需要注意了!!!!
八、erlang cookie准备
同步每个节点cookie
Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang集群中各节点是通过一个magic cookie来实现的
找到erlang cookie文件的位置,官方在介绍集群的文档中提到过.erlang.cookie一般会存在这两个地址:第一个是$home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在${home}目录下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下,文件是400权限,必须保证各节点cookie保持一致,否则节点之间就无法通信。
将prd01的.erlang.cookie文件内容复制到prd02,复制方式很多,请自行选择
Prd01内容:
cat .erlang.cookie
ZVTEFVBWNCJDTXNTIPXY
备份prd02上面的.erlang.cookie文件
mv .erlang.cookie .erlang.cookie_prd02
替换为prd01的内容
cat.erlang.cookie
ZVTEFVBWNCJDTXNTIPXY
修改权限(两台都要保证为400)
chmod 400 .erlang.cookie
九、集群
rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用
将prd02加入到prd01,在rpd02上操作
./sbin/rabbitmqctl stop_app
磁盘节点(默认): ./sbin/rabbitmqctl join_cluster rabbit@prd01
内存节点:./sbin/rabbitmqctl join_cluster --ram rabbit@prd01
启动prod02上面rabbitmq的应用
./sbin/rabbitmqctl start_app
十、集群访问
加入集群之后prd02创建的用户无法登陆访问了,需要用prd01创建的用户访问
使用prod01的ip:port访问:
使用prod02的ip:port访问:
十一、集群常用命令
脱离集群
./sbin/rabbitmqctl stop_app
./sbin/rabbitmqctl reset
./sbin/rabbitmqctl start_app
查看集群状态,可以在rabbitMQ任意节点执行查看集群状态:
./sbin/rabbitmqctl cluster_status
十二、镜像集群设置
部署好了普通模式的集群,但因为节点间只同步队列结构并不进行消息的同步,对于一些可靠性要求较高的场景需要对队列中的消息也同步到所有节点。
使用Rabbit镜像功能,需要基于rabbitmq策略来实现,策略是用来控制和修改群集范围的某个vhost队列行为和Exchange行为,在cluster中任意节点启用策略,策略会自动同步到集群节点。
策略的修改可以通过命令也可以通过WEB,我是通过WEB来修改的,非常简单。
Pattern:“^” 表示匹配所有队列名称。”^log” 是指同步”log”开头的队列名称。
ha-mode:“all”代表同步到所以节点。
到这里RabbitMQ搭建好了,可以用阿里云的slb、Haproxy等其他做负载均衡
RabbitMQ之集群搭建的更多相关文章
- RabbitMQ入门教程(十四):RabbitMQ单机集群搭建
原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...
- RabbitMQ单机集群搭建出现Error: unable to perform an operation on node 'rabbit1@ClusterNode1'
参考链接:https://www.cnblogs.com/daryl/archive/2017/10/13/7645749.html 全部步骤和参考链接相同. 前八部都正常,在第九步会报错Error: ...
- rabbitmq普通集群搭建详细步骤
由于工作需求,需要安装rabbitmq,学习之余,记录一下安装过程 准备基础编译环境yum install gcc glibc-devel make ncurses-devel openssl-dev ...
- RabbitMQ镜像集群搭建
RabbitMQ 官网 https://www.rabbitmq.com/ 小编使用的系统环境是CentOS7.4 系统 IP hostname CentOS7.4 1.1.1.1 hostname0 ...
- rabbitmq+haproxy+keepalived实现高可用集群搭建
项目需要搭建rabbitmq的高可用集群,最近在学习搭建过程,在这里记录下可以跟大家一起互相交流(这里只是记录了学习之后自己的搭建过程,许多原理的东西没有细说). 搭建环境 CentOS7 64位 R ...
- RabbitMQ集群搭建和使用
一.环境准备 1.选择RabbitMQ的版本 http://www.rabbitmq.com/changelog.html 注: 不同版本的Linux选择的RabbitMQ版本也不同,参照 http: ...
- RabbitMQ高级指南:从配置、使用到高可用集群搭建
本文大纲: 1. RabbitMQ简介 2. RabbitMQ安装与配置 3. C# 如何使用RabbitMQ 4. 几种Exchange模式 5. RPC 远程过程调用 6. RabbitMQ高可用 ...
- rabbitmq集群搭建方法简介(测试机linux centos)【转】
本文将介绍四台机器搭建rabbitmq集群: rabbitmq IP和主机名(每台机器已安装RabbitMQ 3.5.6, Erlang 18.1) 192.168.87.73 localhost73 ...
- rabbitMQ 安装,集群搭建, 编码
RabbitMQ 一.背景 命令行工具: http://www.rabbitmq.com/man/rabbitmqctl.1.man.html 介绍入门文章: http://blog.csdn.net ...
随机推荐
- Luogu P2055 [ZJOI2009]假期的宿舍
一道网络有关的问题,还是一句话 网络流重在建模! 这里主要讲两种算法. 1.二分图匹配: 分析题意,我们可以知道题目要求是让所有留在学校的人都能有床睡 而 所有留在学校的人=本校不回家的人+外校的人: ...
- Luogu P1983 车站分级
(一周没写过随笔了) 这道题有坑! 看到题目,发现这么明显(??)的要求顺序,还有什么想法,拓扑! 将每条路范围内等级大于等于它的点(不能重复(坑点1))和它连一条边,注意起点终点都要有(坑点2),然 ...
- lm393
电压比较芯片,供电电压和输出电压一致.
- 洛咕 P3700 [CQOI2017]小Q的表格
洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...
- Python中类和对象在内存中是如何保存?
类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图: 如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值 ...
- SSIS 包配置
在商业智能解决方案中,SSIS工程有两种部署模式:工程部署(project deployment)和包部署(package deployment),默认是工程部署模式,在Package的管理上,工程部 ...
- Unity 角色场景传送功能
传送触发器 using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine. ...
- 大厂面试官:Java工程师的“十项全能”
想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是一个合格Java软件工程师所要具备的. 一.专业技能 熟练的 ...
- Linux内核分析 实验三:跟踪分析Linux内核的启动过程
贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...
- Linux 信号:signal 与 sigaction
0.Linux下查看支持的信号列表: france@Ubuntux64:~$ kill -l ) SIGHUP ) SIGINT ) SIGQUIT ) SIGILL ) SIGTRAP ) SIGA ...