rabbitmq采用的是erlang语音开发的,因此必须要有erlang的支持才可以进行运用,因此我们首先要去安装erlang环境,在Linux中可以通过下面的命令获取到erlang
wget -P /home/download https://github.com/rabbitmq/erlang-rpm/releases/tag/v21.2.3/erlang-21.2.3-1.el7.centos.x86_64.rpm
但是恼火的是这样下载的时候很慢,可能是自己网络的问题,最后自己去手动下载,然后在上传到Linux上面进行安装,在进行下载erlang之前,我们还必须了解erlang和rabbitmq版本的映射关系,可以通过官网地址https://www.rabbitmq.com/which-erlang.html去了解对比下,不然版本不对也会出错的,然后在到https://github.com/rabbitmq/erlang-rpm/releases找到自己需要下载的版本。erlang安装命令是
rpm -Uvh /home/download/erlang-21.2.3-1.el7.centos.x86_64.rpm
还需要注意的是安装rabbitmq之前必须安装socat的socket工具,如下:
yum install -y socat
对应上面的erlang版本,我们对应获取及安装的rabbitmq版本安装如下:
wget -P /home/download/https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9/rabbitmq-server-3.7.9-1.el7.noarch.rpm
rpm -Uvh /home/download/rabbitmq-server-3.7.9-1.el7.noarch.rpm
安装完rabbitmq后,我们就可以通过命令
whereis rabbitmq
来查看rabbitmq的安装路径,默认安装在了/usr/lib/rabbitmq /etc/rabbitmq这两个路径里面,具体的实现可以点击进去看,接下来我们启动rabbitmq,通过命令
systemctl start rabbitmq-server
进行启动,启动后我们可以通过命令
systemctl status rabbitmq-server
来查看rabbitmq的状态,如果需要停止rabbitmq,则可以通过命令
systemctl stop rabbitmq-server
来停止rabbitmq的运行,当然一般情况下我们都是开机就需要启动rabbitmq来作为中间件使用的,因此需要默认的启动服务器时同时启动rabbitmq,通过以下命令来开机启动rabbitmq
systemctl enable rabbitmq-server
通过以上步骤我们就完成了单机单个rabbitmq的安装,为了能够使用rabbitmq的插件功能,我们需要开启rabbitmq的插件功能,方式如下:
rabbitmq-plugins enable rabbitmq_management
默认情况下安装完rabbitmq的用户是guest,但是它只能通过localhost进行访问,因此我们需要新增一个用户来进行远程访问,方式如下:
rabbitmqctl add_user admin admin
给新增的admin用户赋予操作权限:
rabbitmqctl set_user_tags admin administrator
同时赋予资源的操作权限:
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
安装完成后,因为需要在外网访问,所以我们需要在防火墙中将对应的端口提供出去,我这里的是firewall防火墙,方式如下:
# 客户端端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
# 访问rabbitmq 管理页面的端口
firewall-cmd --zone=public --add-port=15672/tcp --permanent
# 是erlang映射守护进程端口,用来跟踪节点的监听名称地址,在集群中起到类似DNS的作用
firewall-cmd --zone=public --add-port=4369/tcp --permanent
# 用于节点和cli(Command Line Tools)工具通信,一般和4369端口一起使用。
firewall-cmd --zone=public --add-port=25672/tcp --permanent
重启防火墙:
firewall-cmd --reload
完成以上步骤后就可以就可以进行正常的单机单rabbitmq访问操作了。接下来我们看下单机部署启动多个rabbitmq实例的集群实现,首先将在路径配置文件etc/rabbitmq/rabbitmq-env.conf中将当前单机的节点名称修改为rabbit1,即配置如下:
NODENAME=rabbit1
然后将当前的已经启动了的rabbitmq服务停止:
systemctl stop rabbitmq-server
然后通过以下方式进行节点的启动:
rabbitmq-server -detached
然后依次启动第二个第三个节点:
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
RABBITMQ_NODE_PORT=5675 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15675}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
接下来就是将第二个节点和第三个节点加入到集群中,因为方式相同,因此只贴出第二个节点的加入方式:
# 停止rabbt2节点
rabbitmqctl -n rabbit2 stop_app
# 重置rabbit2节点
rabbitmqctl -n rabbit2 reset
#将rabbit2节点加入到rabbit1节点
rabbitmqctl -n rabbit2 join_cluster rabbit1
# 重启rabbit2节点
rabbitmqctl -n rabbit2 start_app
做完上面的步骤后,可以通过命令
rabbitmqctl cluster_status
来查看当前集群的信息,如下:
Cluster status of node rabbit1@localhost ...
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]}]},
{running_nodes,[rabbit2@localhost,rabbit3@localhost,rabbit1@localhost]},
{cluster_name,<<"rabbit1@localhost">>},
{partitions,[]},
{alarms,[{rabbit2@localhost,[]},
{rabbit3@localhost,[]},
{rabbit1@localhost,[]}]}]
当然,我们还可以通过访问web的方式来进行查看,如图
还有最重要的一件事情就是把端口号给添加到防火墙中,特别是集群端口号4369,然后重启防火墙。我们在客户端,这里是指使用springboot的方式,就可以在通过这样的方式添加链接地址
spring:
rabbitmq:
addresses: 192.168.0.106:5672,192.168.0.106:5673,192.168.0.106:5675
针对多机部署,我们准备了3台设备,ip分别是192.168.0.106,192.168.0.107,192.168.0.108,安装单机的rabbitmq步骤在上面,我们先修改192.168.0.106机器的hosts文件
vi etc/hosts
添加IP地址及节点名称:
192.168.0.106 node1
192.168.0.107 node2
192.168.0.108 node3
修改对应的主机的hostname:
#106
hostnamectl set-hostname node1
#107
hostnamectl set-hostname node2
#108
hostnamectl set-hostname node3
将192.168.0.106的hosts文件复制到其他2台机器上
scp etc/hosts root@node2:/etc/
scp etc/hosts root@node3:/etc/
注意的是:root代表对应机器的用户名,如果提示需要输入密码就把密码输入就OK了。
接下来需要将下面的文件复制到另外2台机器上:
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq
同理在单机部署多个节点实例一样,也需要给每台rabbit定义一个名称,定义的上传参考上面的定义,这里就不在粘贴代码了,定义完成后重启rabbitmq
systemctl restart rabbitmq-server
然后接下来就是把端口添加到防火墙,然后重启防火墙了,方法在前面以及提及,也不再粘贴代码,加入集群的方式和单机多实例的方式也一样。这样就完成了所有的多机器集群节点的搭建。如果在服务器关闭后,只需要按照上面的步骤重新加入其它2个实例节点就可以了。
上面的方式只是实现了集群的搭建,但是并没有实现真正的高可用,因为上面搭建的集群都是通过共享元数据实现集群的,一旦某一台机器宕机后,其上的数据就有可能丢失掉,最大的可能就是其上的数据不能再被访问到,因此我们需要通过rabbitmq提供的镜像队列模式集群来提供高可用,开启镜像队列集群需要在web界面进行,路径如图:
图片上的参数说明如下:
name::策略名称,如果是已经存在的名称,则会覆盖掉原来的配置。
pattern:策略应用到对象上时,对象名称的匹配规则,规则是正则表达式。
apply to:策略应用到说明对象上,是queue,还是exchange,或者同时应用到两者上面。
priority:优先级,数值越大,优先级越高,相同优先级,取最后一个策略。
definition:策略定义的内容,对于镜像队列只需要包含ha-mode、ha-params和ha-sync-mode,其中ha-sync-mode是同步方式,分为自动同步automatic和手动同步manual,默认是automatic,其他两种方式的是组合一起使用的,其组合方式如下:
ha-mode | ha-params | 说明 |
all | 队列镜像到集群内的所有节点 | |
exactly | count | 队列镜像到集群内指定数量的节点。如果集群内的节点数少于此值,队列将会镜像到所有节点;如果集群内的节点数大于此值,如果一个包含了镜像的节点停止了,它也不会再其他新的节点创建镜像队列。 |
nodes | nodename | 队列镜像到指定节点,如果指定的节点不存在集群中,则会报错,当队列进行创建时,如果指定节点不在线,则队列会被创建在客户端所连接的节点上。 |
我们在对比下普通队列集群和镜像队列集群的区别:
1.镜像队列模式相对于普通队列模式,镜像模式会占用更多的带宽来进行同步,因为它会将队列中的所有数据同步到其他镜像上面,因此镜像队列的吞吐量会低于普通队列模式。
2.普通队列模式不能实现高可用,某个节点宕机后,这个节点上的消息就无法在被消费,需要等待节点启动后才能再被消费。
更多的细节可以参考https://www.rabbitmq.com/clustering.html。