为了防止RabbitMQ忽然挂掉,通常考虑使用集群的方式进行搭建,保证这个服务一直运行。
准备了3台虚拟机,进行模仿一个集群
IP地址如下
主机IP | 主机名称 |
---|---|
192.168.18.129 | father-node |
192.168.18.130 | node-1 |
192.168.18.131 | node-2 |
hostname
直接进入到hostname中进行修改
vim /etc/hostname
修改完成即可
需要将以上几台主机的ip核主机名称放进到host中,使其能够相互识别
vim /etc/hosts
如图:
注意修改hosts需要在这所有主级中进行修改,不能只修改一个=
在father-node 上执行远程命令
scp /var/lib/rabbitmq/.erlang.cookie root@node1:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie
三台服务器上都执行
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@father--node
rabbitmqctl start_app
rabbitmqctl cluster_status
如下:
由此可以看到我们的三个节点都已经启动了
我们访问主节点的管理界面:
可以看到三个队列的全部状态
一般情况我们直接访问一个节点,但是这个节点忽然挂掉怎么办?你说咱们有集群但是集群无法解决你这个节点挂掉无法访问这个问题,只能解决数据保存问题。如果真的挂掉了,那么你的IDEA一直报错,他会告诉你你的Rabbit MQ链接不上。这时候我们就需要高可用
我们使用的主要还是Nginx,Nginx本身就支持高可用或者说双机热备,我们只需要对其进行一个监听即可
需要模块:–with-stream,该模块是内置的,只需要开启即可。具体往下看。
开启后我们需要重新配置
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream rabbitmq_web{
server 192.168.18.130:15672 fail_timeout=10s weight=5;
server 192.168.18.129:15672 fail_timeout=10s weight=4;
server 192.168.18.131:15672 fail_timeout=10s weight=3;
}
upstream rabbitmq_56{
server 192.168.18.130:5672 fail_timeout=10s weight=5;
server 192.168.18.131:5672 fail_timeout=10s weight=4;
server 192.168.18.129:5672 fail_timeout=10s weight=3;
}
server {
listen 13456;
server_name localhost;
location / {
proxy_pass http://rabbitmq_web;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
stream{
upstream rabbitTcp{
server 192.168.18.130:5672;
server 192.168.18.131:5672;
server 192.168.18.129:5672;
}
server{
listen 3456;
proxy_pass rabbitTcp;
}
}
监听了3456和13456端口,均使用了upsteam方法内部是根据权重进行划分。
upsteam实现了代理多个IP,其存在很多方法,我们采用的是权重方法,weight 表示权重,权重越大那么任用他的可能性就越大。主要是模拟一个服务器性能存在差异。
监听的时候不要直接监听5672、15672,否则会造成端口冲突😂
在Java代码进行编译时也是直接使用3456而不是5672
启动:
这边我们直接暴力解决,通过停止服务直接把主节点给挂了,模拟一个宕机行为
在主节点机器中输入service rabbitmq-server.service stop
输入之后查看状态:
可见已经挂掉了,直接访问地址130的地址发现可以进入同时可以看到各个主机的状态:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2fnaywEb-1663465306538)(C:/Users/19865/AppData/Roaming/Typora/typora-user-images/image-20220918085051179.png)]
我们Java配置文件不进行改变,重新启动后发现可以正常启动可以直接发送消息
发现正常执行。