RabbitMQ在Window下部署集群
如果在实际使用过程中,使用单台配置,万一出现意外情况,将导致我们的服务终断,因此需要搭建集群的方式来最高限度的提高服务的可用性。
1、服务器
1、操作系统:window
2、台数:3台
3、Ip和端口:192.168.1.219:5672(内存节点)
192.168.1.69:5672(内存节点)
192.168.1.98:5672(磁盘节点)
4、依赖的相关安装包
Erlang9.2、RabbitMQ-server3.7.4、Haproxy(负载均衡器)
2、安装步骤
说明:集群是利用了erlang是cookie镜像组成,并且个节点中只保存了元数据信息,即exchange、queue、binding等信息。
1、Erlang安装
在219、69、98服务器上安装
2、RabbitMQ安装
在219、69、98服务器上安装
3、配置集群
1、分别在每个集群机器上配置hosts文件,这里面试机器的IP地址和机器的名称
例如:192.168.1.98 YD008
192.168.1.69 ORRDY8XPFABBO5U
192.168.1.219 qJn48hnhidx8
2、集群时需要保证erlang的cooke各个机器一致 否则无法通信
任意选择一台集群中的机器,进入到,C:\window目录下,找到.erlang.cookie文件,复制该文件并替换其他个机器的目录:C:// users\Administrator
3、配置文件
集群配置文件(两台主机都需要配置),在路径C:\Users\Administrator\AppData\Roaming\RabbitMQ(AppData默認隐藏,需要设置显示隐藏文件)中,创建rabbitmq.config文件,内容为:[{rabbit,[{cluster_nodes,[‘rabbit@H1-PC’,’rabbit@H2-PC’]}]}].(包括最后的点)。
配置环境变量文件,在C:\Users\Administrator\AppData\Roaming\RabbitMQ路径中,创建rabbitmq-env.config
YD008中文件内容为
NODENAME=rabbit@YD008
NODE_IP_ADDRESS=192.168.1.98
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\jony\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\jony\AppData\Roaming\RabbitMQ\log
ORRDY8XPFABBO5U中文件内容为
NODENAME=rabbit@ORRDY8XPFABBO5U
NODE_IP_ADDRESS=192.168.1.69
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\jony\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\jony\AppData\Roaming\RabbitMQ\log
qJn48hnhidx8中文件内容为
NODENAME=rabbit@qJn48hnhidx8
NODE_IP_ADDRESS=192.168.1.219
NODE_PORT=5672
RABBITMQ_MNESIA_BASE=C:\Users\jony\AppData\Roaming\RabbitMQ\db
RABBITMQ_LOG_BASE=C:\Users\jony\AppData\Roaming\RabbitMQ\log
4、命令行方式
重启两台机器的rabbitmq。
(1)192.168.1.69,在控制台D:\RabbitMQ Server\rabbitmq_server-3.7.4\sbin 路径下分别执行以下语句:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
(2) 192.168.1.219,在控制台D:\RabbitMQServer\rabbitmq_server-3.7.4\sbin路径下分别执行以下语句:
rabbitmqctl stop_app
rabbitmqctl reset
rabbtimqctl join_cluster rabbit@ORRDY8XPFABBO5U
rabbitmqctl start_app
(1)192.168.1.98,在控制台D:\RabbitMQ Server\rabbitmq_server-3.7.4\sbin 路径下分别执行以下语句:
rabbitmqctl stop_app
rabbitmqctl reset
rabbtimqctl join_cluster rabbit@ORRDY8XPFABBO5U
rabbitmqctl start_app
上述命令先停掉rabbitmq应用,reset集群状态,然后调用cluster命令,将H1-PC连接到H2-PC,使两者成为一个集群,最后重启rabbitmq应用。在这个cluster命令下,H1-PC是内存节点,H2-PC是磁盘节点(RabbitMQ启动后,默认是磁盘节点)。
需要注意的是,搭建集群建议最少设置一个磁盘节点,防止机器意外关机等、丢失数据。
rabbitmq集群有两种节点 磁盘节点和内存节点。字面上了解,磁盘节点的数据存储在磁盘,内存节点的数据存储的内存中。因此存储速度方面内存节点有优势,数据安全方面磁盘节点有优势。
rabbitmq启动后默认是磁盘节点,如果要使用内存节点那么搭建集群的时候,在上方重启服务中的 rabbitmqctl join_cluster rabbit@H2-PC
命令修改为 rabbitmqctl join_cluster --ram rabbit@H2-PC,这样配置之后
192.168.0.88的节点就为内存节点了。
5、更改节点属性(附加)
更改节点属性
#rabbitmqctl stop_app –停止rabbitmq服务
#rabbitmqctl change_cluster_node_type disc/ram –更改节点为磁盘或内存节点
#rabbitmqctl start_app –开启rabbitmq服务
记录一下RabbitMQ在windows平台下安装的几个注意点- -,好记性不如烂笔头
安装过程与Linux安装一致,教程参照官网集群配置:此处只列举出几个注意点:
1.erlang的版本需要一致,新增加的节点可以选择更高版本的erlang,运行时向下兼容;erlang.cookie文件需要在集群中拷贝一致
windows操作系统中该文件位于 C:\Users\[当前操作系统登录用户]\.erlang.cookie 和 C:\Windows 目录下,切记两处都要同步
2.windows的服务列表中存在RabbitMQ的服务,保持其持续的运行状态即可,RabbitMQ的操作通过命令行完成,RabbleMQ的windows服务可以通过rabbitmq-service.bat remove\install 进行删除 安装。
3.注意集群间端口的开放,默认4369端口
4.集群中搭建完毕后发现集群存在节点状态为rabbitmq Node statistics not available异常 说明缺少插件启动,可以通过命令 rabbitmq-plugins enable rabbitmq_management将插件全部启动
5.配置RabbitMq的环境变量事可以通过设置系统环境变量完成,此步骤需要在安装RabbitMq客户端前进行配置,比如:安装rabbitmq前,设置系统环境变量RABBITMQ_BASE为D:\Data\RabbitMQ 则rabbitmq的数据和日志文件都会存到这里,也可以通过设置RABBITMQ_NODENAME设置RabbitMQ的节点名称等,参考环境变量设置
6.加入集群前需要配置本地Host DNS文件 C:\Windows\System32\drivers\etc,配置ip地址的值为集群中其他节点的主机名(启动RabbitMq时配置的RabbitMq的节点名称,默认为主机名)
镜像模式
镜像队列可以同步queue和message,当主queue挂掉,从queue中会有一个变为主queue来接替工作。
镜像队列是基于普通的集群模式的,所以你还是的先去配置普通集群,然后餐能设置镜像队列。
镜像队列设置后,会分一个主节点和多个从节点,如果主节点宕机,从节点会有一个选为主节点,原先的主节点重启后会变为从节点。Queue和message虽然会存在所有镜像队列中,但客户端读取时不论物理面连接的主节点还是从节点都是从主节点读取数据,然后主节点在将queue和message的状态同步给从节点,因此多个客户端连接不同的镜像队列不会产生同一个message被多次接收的情况。
用Hapronxy来做RabbitMQ集群的负载均衡
在RabbitMQ集群的基础上,用Haproxy来做负载均衡, H1-PC和H2-PC这两台机器已经组成一个RabbitMQ集群了,在一台新的机器上配置Haproxy来做负载均衡
推荐架构
设计架构可以如下:在一个集群里,有四台机器,其中一台使用磁盘模式,另外两台使用内存模式。2台内存模式的节点,无意速度更快,因此客户端(生产者,消费者)连接访问他们。而磁盘模式的节点,由于磁盘IO相对较慢,一次仅作数据备份使用,另外一台作为反向代理。
负载均衡器会监听5672端口,轮询我们的两个内存节点,而磁盘节点只做备份不提供给生产者,消费者使用,当然如果我们服务器资源充足情况也可以配置多个磁盘节点,这样磁盘节点出了故障也不会影响,除非同时出故障。
参考地址:https://www.cnblogs.com/flat_peach/archive/2013/04/07/3004008.html
RabbitMQ常见错误
1、集群中两个节点正常使用,当我有一个在node1节点上创建队列”QueueA”(QueueA上的master),并且Node1停止时,我无法连接到Node2中的QueueA已产生或使用消息,Node2会抛出一个错误说Node1是不可以访问的(我认为QueueA不会被复制到Node2,并且Node2不能被升级为QueueA的主控)
错误是:
解决方案:
2、
3、关于集群写入数据模式
1、rabbitmq底层,采用mnesia分布式数据库,存储数据。
2、有镜像队列的集群中msg的写入,mnesia数据库事务模式有好几种,rabbitmq采用 sync_transaction 模式写入数据,来保证各个节点数据一致。
3、虽然rmq,使用mnesia的sync_transaction模式,但是仔细研究两阶段事务提交协议,极个别情况下,也会出现,server反馈给client,master写入失败,但是其它节点写入成功的情况。也就说极个别情况,客户端会得到server写入失败的信息,实际是写入成功的。这种情况,client可能会再写一个msg。导致队列中消息重复。解决这个问题,需要消费者去保证,确定msg是否是已消费过的。
#http://my.oschina.net/hncscwc/blog/161762
#http://wqtn22.iteye.com/blog/1567715
#https://github.com/sky-big/RabbitMQ
4、DefaultBasicConsumer消费者常用的基类
RabbitMQ.Client.Events:属于客户端的各种事件和事件处理程序,包括EventingBasicConsumer,一个围绕C#事件处理程序构建的消费者实现。
Received 接收事件 队列中有消息时触发,消费消息
Registered 注册登记事件 消费者绑定队列时触发
Shutdown 关机事件 connection和channel关闭时触发事件
Unregistered 未登记事件 取消绑定时触发事件
5、生产者confirm模式
地址https://www.cnblogs.com/ylsforever/p/7773404.html
6、connectionFactory
AutomaticRecoveryEnable(ture) 设置网络异常重连
NetworkRecoveryInterval(10000)设置每10秒,重试一次
TopologyRecoveryEnable(true) 设置重新声明交换机,队列等信息
#http://www.rabbitmq.com/nightlies/rabbitmq-java-client/current-javadoc/
7、