1. 概要
在实际生产中,单一的服务提供者是不够强壮和稳定的,今天我们就通过实例来完成RabbitMQ集群与负载的搭建。
2.配置虚拟机
准备3台机器或者虚拟机,一台作为Nginx服务器,剩余两台机器我们搭建RabbitMQ 集群。
三台机器:
服务器名称 |IP地址
Nginx 192.168.153.131
RMQ-1 192.168.153.134
RMQ-2 192.168.153.132
以上操作 都是在 【192.168.153.134】和【192.168.153.132】两台机器上完成的,请注意。
- 修改hostname
vim /etc/hostname 服务器名称为 RMQ-1 RMQ-2
- 修改hosts文件
vim /etc/hosts
192.168.153.134 RMQ-1
192.168.153.132 RMQ-2
- 开发端口
开放 4369、5672、15672、25672四个端口。
4369:提供erlang的发现端口
25672:提供erlang的底层通讯端口
5672:提供应用连接的开放端口
15672:提供可视化服务的开放端口
可以执行命令 也可以到可视化界面进行编辑
开放端口的命令如下:
#放开4369端口
firewall-cmd --zone=public --add-port=4369/tcp --permanent
#放开5672端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
#放开15672端口
firewall-cmd --zone=public --add-port=15672/tcp --permanent
#放开25672端口
firewall-cmd --zone=public --add-port=25672/tcp --permanent
#刷新防火墙服务
firewall-cmd --reload - 安装RabbitMQ
安装过程请参考 《RabbitMQ实战-浅议与安装(一)》,再次就不做赘述了。 - 重启服务器
以上操作,两台服务器操作的内容都是相同的,操作无误后,将两台机器都进行重启。
3.搭建集群
3.1同步erlang.cookie
.erlang.cookie是erlang分布式系统的token文件,集群内服务器只有持有相同的token才能进行通信。
执行命令 find / -name *.cookie 检索
打开/var/lib/rabbitmq/.erlang.cookie 我们可以得到token的值
为了保证其他服务器内容一致 我们通过命令讲此文件拷贝到其他机器中
(1)scp /var/lib/rabbitmq/.erlang.cookie 192.168.153.132:/var/lib/rabbitmq/
(2)提示是否操作 输入 yes
(3)输入192.168.153.132 root的密码
(4)完成 copy
(5)两台机器分别执行命令 chmod 400 /var/lib/rabbitmq/.erlang.cookie 对文件进行授权
(6)重启这两台服务器。
3.2 加入集群
我们要把RMQ-2加入到RMQ-1的集群中,所以我们先要找到RMQ-1的集群名称 如图 集群名称为 rabbit@RMQ-1
之后的操作 我们在RMQ-2上进行操作。
#停止RMQ-2的rabbitMQ应用
rabbitmqctl stop_app
#加入集群
rabbitmqctl join_cluster rabbit@RMQ-1
#启动服务
rabbitmqctl start_app
验证一下我们集群是否搭建成功,打开这两台机器的任何一台机器,在浏览器输入http://localhost:15672,会发现节点部分可以看到已经变为两个节点,证明集群搭建成功。
4.搭建负载
通过以上的操作,我们已经具备了一个集群,这两台机器上的RabbitMQ是实时同步的,一台机器接收到消息,另外一台机器也可同时接到消息。那么如果应用只对一台机器的RabbitMQ进行消息交互,那另外一台机器势必就会产生空闲;同理,如果这台机器上的RabbitMQ崩溃,那应用就无法访问另外一台机器的RabbitMQ,造成项目服务中断。那我们应该如何解决这个问题呢?接下来我们就通过使用Nginx代理服务来进行RabbitMQ负载搭建。
网络上有很多类似的教程,是通过HAProxy来做负载均衡器的,今天我们讲一下如何通过Nginx来搭建RabbitMQ的负载均衡。RabbitMQ的负载是TCP/IP模式的,所以选择Nginx需要注意其版本,Nginx是在1.9这个版本开始支持TCP/IP的相应转发的。
Nginx的安装步骤请见 《安装Tengine-优化版的nginx》.
- 创建RabbitMQ用户
这里需要大家注意的是,RabbitMQ的原始用户是guest,这个用户只允许本机访问,所以我们需要给他新增一个用户,保证能够有外网访问的权限。如图,我们创建一个用户 fygs 密码 123456,我们以后就通过这个用户进行外网的访问。
- 开放端口
我们需要在nginx服务器开放一个端口,我们这里为了方便记忆,端口定义为5672。
#开放端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
#刷新防火墙服务
firewall-cmd --reload - 修改nginx配置文件
我们修改nginx服务器上nginx的配置文件【nginx.conf】。
#配置文件增加如下内容
server {
listen 5672; #=====================》监听5672端口
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
default_type application/octet-stream;
# default_type 'text/html';
charset utf-8;
location /{
root /root;
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
client_max_body_size 30m; #允许客户端请求的最大单文件字节数
proxy_connect_timeout 60s;
proxy_read_timeout 5400s;
proxy_send_timeout 5400s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://server-5672; #=====================》配置的节点
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#=====================》配置节点
upstream server-5672 {
#RMQ-1
server 192.168.153.134:5672 max_fails=1 fail_timeout=20s;
#RMQ-2
server 192.168.153.132:5672 max_fails=1 fail_timeout=20s;
}
执行命令 ./nginx -s reload 使配置文件生效。
通过对nginx配置文件的修改,我们加入了对端口5672的监听,当监听到对5672端口访问的时候,向RMQ-1和RMQ-2进行分发,实现负载均衡,应用只需要访问nginx服务器的【IP:5672】 就可以进行负载的访问。
以上就是我们本次RabbitMQ实战系列的全部内容,后续应该会增加一些实用的小技巧,有机会再增加进来,希望这份笔记对你们能有所帮助,祝大家学习愉快。