[喵咪MQ(3)]RabbitMQ集群安装配置
[喵咪MQ(3)]RabbitMQ集群安装配置
在各项生产环境使用中,容灾总是一个很重要的话题,如果单点故障会导致整个系统奔溃或者是丢失数据是不是好气好气的,领导会追着你问这是怎么了?你只能说是我们没有经验什么什么组件故障了,这个是低级玩法,高级玩法是配置好集群容灾,告诉老板死一两台机器宕机了没有事没有影响,所以我们今天就来讲讲RabbitMQ的集群模式...
附上:
喵了个咪的博客:w-blog.cn
RabbitMQ官网 :http://www.rabbitmq.com/
1.配置集群
RabbitMQ通过ssh通道进行集群直接的链接,这里准备了两台服务器分别如下
- 192.168.0.1 主机名 RabbitMQ-1
- 192.168.0.1 主机名 RabbitMQ-2
首先我们需要在这两台机器上配置好互相的host可以通过主机名进行访问
vim /etc/hosts
内网地址 RabbitMQ-1
内网地址 RabbitMQ-2
service network restart
#在 RabbitMQ-1 能通:
ping RabbitMQ-2
#在 RabbitMQ-2 能通:
ping RabbitMQ-1
1.1 配置 Erlang Cookie
当我们可以ping通之后我们需要设置一下 Erlang Cookie 让两台机器保持同样的 Cookie 才能顺利的建立集群
- 先启动双方的RabbitMQ
- 复制 RabbitMQ-1 中 /var/lib/rabbitmq/.erlang.cookie 文件中的值
- 粘贴到 RabbitMQ-2 /var/lib/rabbitmq/.erlang.cookie中 使用:wq! 保存
- 重启RabbitMQ-2 RabbitMQ服务
1.2 join服务器建立关联
Cookie我们已经配置好了 接下来需要把两个集群关联起来
对 RabbitMQ-1 节点做如下操作
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
这个是用来在rabbitmq1上执行的,这个也可以不执行,直接在节点服务器执行下边的脚本,不过得保证这个rabbitmq服务是正常启动的.
RabbitMQ-2 节点服务配置脚本
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@RabbitMQ-1
rabbitmqctl start_app
1.3 查看集群状态
可以通过 rabbitmqctl cluster_status 查看到如下状态证明集群已经配置成功
[root@Sunmi-RabbitMQ-1 ~]# rabbitmqctl cluster_status
Cluster status of node ‘rabbit@Sunmi-RabbitMQ-1’ …
[{nodes,[{disc,[‘rabbit@Sunmi-RabbitMQ-1’]},
{ram,[‘rabbit@Sunmi-RabbitMQ-2’]}]},
{running_nodes,[‘rabbit@Sunmi-RabbitMQ-2’,’rabbit@Sunmi-RabbitMQ-1’]},
{cluster_name,<<“rabbit@Sunmi-RabbitMQ-1”>>},
{partitions,[]},
{alarms,[{‘rabbit@Sunmi-RabbitMQ-2’,[]},{‘rabbit@Sunmi-RabbitMQ-1’,[]}]}]
注意:建立好集群之后需要重新配置一下用户 配置的用户会影响整个集群
2. 集群的各项模式
关于RabbitMQ 集群有两大模式需要说明,一个是磁盘模式或内存模式,一个是普通模式和镜像模式,我们先说磁盘和内存模式
2.1 磁盘和内存模式
磁盘模式故名思议,磁盘模式就是把数据持久化到磁盘让整个服务重启时数据也不会丢,缺点是I/O吞吐依赖磁盘性能
内存模式也就是把数据存在内存空间中读取写入速度非常快,缺点是当重启服务内存中的数据会丢失
可以通过web管理界面看到各个节点的运行模式,也可以通过命令来改变节点运行模式但是注意集群中必须有一个磁盘节点才能运行
2.2 普通模式和镜像模式
普通模式就是默认模式,我们现在集群有 A B 两台服务器,这个时候向A写入了一条数据,然后连接B去读取这条数据,B会先找到A去获取这条数据然后返回给用户,B并不存储向A写入的数据,反过来也是如此向B写入数据不会再A存储
这样看起来并没有什么问题,集群不就是这样吗?但是会产生两个问题
- A 节点会去找B节点获取数据 ,如果B节点死了怎么办
- 数据只在B节点存储B节点是内存模式不就丢了吗
第二点比较好解决,都用磁盘模式,写都只写磁盘模式的节点,虽然会降低性能但是没法解决第一个问题,B节点死了数据就没有来源了,这个时候就需要镜像模式出手了
镜像模式会在所有节点之间同步数据,也就是集群中有一个节点存活就能正常的使用下去,一般我们会用磁盘节点专门做持久化,内存节点提供使用
配置镜像模式只需要在主节点运行如下命令:
- p 之后加上你需要的Vhost
rabbitmqctl set_policy -p / ha-all “^” ‘{“ha-mode”:”all”}’
在web管理界面队列里面也能够判断出来数据存储在几个节点上
不要盲目追求镜像模式,镜像模式节点之间同步数据也会带来开销所以更具场景来做出合理的判断
3 总结
关于RabbitMQ的介绍,单机模式,集群模式的博文以及列举完了,在之后又在使用RabbitMQ的心得以及一些有意思的地方,也会分享出啦和大家一起学习讨论,多谢大家的支持本小节就到这里了....
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!
- 主备切换的准备工作(r7笔记第83天)
- Java设计模式-外观模式
- Java设计模式-组合模式
- 使用shell批量监控磁盘坏块(二) (r7笔记第80天)
- JavaWeb10-request&response你不得不学(1)
- dg的奇怪问题终结和分区问题答疑 (r7笔记第77天)
- 最近让我焦灼的四个问题(有解) (r7笔记第76天)
- JavaWeb10-reques;response你不得不学(2)
- 很多人比较纠结的约束和索引的关系(r7笔记第75天)
- JavaWeb09-Servlet(Java真正的全栈开发)
- JavaWeb08-XML,tomcat,HTTP轻松入门
- JavaWeb07-JDBC(Java真正的全栈开发)
- 编程思想 之「操作符」
- Hyperledger fabric Chaincode 开发详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
- laravel 查询数据库获取结果实现判断是否为空
- 浅析PHP中的 inet_pton 网络函数
- php解压缩zip和rar压缩包文件的方法
- laradock环境docker-compose操作详解
- laravel中的fillable和guarded属性详解
- PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
- Laravel 6 将新增为指定队列任务设置中间件的功能
- Python生成器传参数及返回值原理解析
- PHP Swoole异步MySQL客户端实现方法示例
- PHP实现微信公众号验证Token的示例代码
- Laravel框架之解决前端显示图片问题
- thinkPHP5.1框架中Request类四种调用方式示例
- Python TestSuite生成测试报告过程解析
- PHP goto语句用法实例