RabbitMQ的安装及集群的搭建

      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-modeha-params说明
all 队列镜像到集群内的所有节点
exactlycount队列镜像到集群内指定数量的节点。如果集群内的节点数少于此值,队列将会镜像到所有节点;如果集群内的节点数大于此值,如果一个包含了镜像的节点停止了,它也不会再其他新的节点创建镜像队列。
nodesnodename队列镜像到指定节点,如果指定的节点不存在集群中,则会报错,当队列进行创建时,如果指定节点不在线,则队列会被创建在客户端所连接的节点上。

       我们在对比下普通队列集群和镜像队列集群的区别:

       1.镜像队列模式相对于普通队列模式,镜像模式会占用更多的带宽来进行同步,因为它会将队列中的所有数据同步到其他镜像上面,因此镜像队列的吞吐量会低于普通队列模式。

       2.普通队列模式不能实现高可用,某个节点宕机后,这个节点上的消息就无法在被消费,需要等待节点启动后才能再被消费。

       更多的细节可以参考https://www.rabbitmq.com/clustering.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值