Rabbitmq群集部署
博文大纲:
一、Rabbitmq概念
二、部署单台Rabbitmq
三、部署Rabbitmq集群
四、单台节点加入或退出群集配置
一、Rabbitmq概念
RabbitMQ是一个开源的靠AMQP协议实现的服务,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
它可以使对应的客户端(client)与对应的消息中间件(broker)进行交互。消息中间件发布者(publisher)那里收到消息(发布消息的应用,也称为producer),然后将他们转发给消费者(consumers,处理消息的应用)。由于AMQP是一个网络协议,所以发布者、消费者以及消息中间件可以部署到不同的物理机器上。
Rabbitmq使用场景
消息队列在实际应用中常用在异步处理、应用解耦、流量削锋和消息通讯这四个场景。
二、部署单台Rabbitmq
注:在开始之前,主机名最好为默认的localhosts(如果不是,会在启动rabbitmq时报错,解决方法:重启主机,再启动rabbitmq)
可以自行在官网下载所需软件,也可以下载我网盘中的rpm包,然后自行上传至服务器。
下面这台服务器的IP为192.168.20.2。
[root@localhost src]# ls #确认所需RPM包erlang-18.1-1.el6.x86_64.rpmrabbitmq-server-3.6.6-1.el6.noarch.rpmsocat-1.7.3.2-2.el7.x86_64.rpm[root@localhost src]# yum -y localinstall erlang-18.1-1.el6.x86_64.rpm rabbitmq-server-3.6.6-1.el6.noarch.rpm socat-1.7.3.2-2.el7.x86_64.rpm#安装RPM包[root@localhost src]# chkconfig rabbitmq-server on #rabbitmq加入开机自启[root@localhost src]# /etc/init.d/rabbitmq-server start #启动rabbitmq服务
确定rabbitmq正在运行:
[root@localhost src]# ps -ef | grep rabbitmq
上述命令返回的结果如下:
#开启rabbitmq的web管理插件,以便可以通过浏览器进行访问[root@localhost src]# rabbitmq-plugins enable rabbitmq_management#创建登录用户[root@localhost src]# rabbitmqctl add_user admin 123.com#将创建的admin用户添加至administrator组[root@localhost src]# rabbitmqctl set_user_tags admin administrator
客户端访问rabbitmq服务器的15672端口,使用新创建的admin用户进行登录,登录成功后显示如下:
能够访问成功,表示单台rabbitmq就搭建完成了。
三、部署Rabbitmq集群
Rabbitmq集群大概分为两种方式:
1、普通模式:默认的集群模式,消息的尸体只存在一个节点上;
2、镜像模式:把需要的队列做成镜像,存在于多个节点。
ha-mode:
- all:列队到所有节点;
- exatly:随机镜像到其他节点上;
- nodes:镜像到指定节点上。
集群节点模式:
1、内存节点:工作在内存上;
2、磁盘节点:工作在磁盘上;
例外:内存节点和磁盘节点共同存在,提高访问速度的同时增加数据持久化。
相比内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘来保存状态就足够了,如果集群中只有内存节点,那么节点一旦宕机,所有的状态、消息都会丢失,无法实现数据的持久化。
1、部署环境如下:
其中192.168.20.2是基于上面的单台rabbitmq来做的。
2、安装rabbitmq服务
在192.168.20.3和20.4两个节点(20.5节点后面再用到)进行以下操作,以便部署rabbitmq服务:
#上传所需rpm包[root@localhost src]# ls erlang-18.1-1.el6.x86_64.rpmrabbitmq-server-3.6.6-1.el6.noarch.rpmsocat-1.7.3.2-2.el7.x86_64.rpm#安装rabbitmq[root@localhost src]# yum -y localinstall erlang-18.1-1.el6.x86_64.rpm rabbitmq-server-3.6.6-1.el6.noarch.rpm socat-1.7.3.2-2.el7.x86_64.rpm #启动rabbitmq并加入开机自启[root@localhost src]# /etc/init.d/rabbitmq-server start[root@localhost src]# chkconfig rabbitmq-server on
3、配置主机192.168.20.2
[root@localhost ~]# tail -4 /etc/hosts #配置本地解析(主机名直接写想要自定义的即可)192.168.20.2 rabbitmq01192.168.20.3 rabbitmq02192.168.20.4 rabbitmq03192.168.20.5 rabbitmq04#将hosts文件复制到其他节点[root@localhost ~]# scp /etc/hosts root@192.168.20.3:/etc/[root@localhost ~]# scp /etc/hosts root@192.168.20.4:/etc/[root@localhost ~]# scp /etc/hosts root@192.168.20.5:/etc/#将rabbitmq01的cookie节点信息复制到其他需要加入群集的节点#部署群集的时候需要节点cookie信息一致[root@localhost ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.20.3:/var/lib/rabbitmq/[root@localhost ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.20.4:/var/lib/rabbitmq/
4、重启所有要加入群集的节点服务器
在所有要加入群集的服务器上执行以下命令进行重启(包括rabbitmq01)。
[root@localhost ~]# init 6 #重启后就会发现主机名已经更改为hosts文件中定义的了
若重启的时后被卡在某个界面,那么需要强制重启。
[root@rabbitmq01 ~]# ps -ef | grep rabbit #重启后确定已经启动
5、在rabbitmq01上配置群集
[root@rabbitmq01 ~]# rabbitmqctl stop_app #停止rabbitmq节点服务[root@rabbitmq01 ~]# rabbitmqctl reset #重置rabbitmq节点[root@rabbitmq01 ~]# rabbitmqctl start_app #启动rabbit节点服务Starting node rabbit@rabbitmq01 ... #复制返回的节点名称
6、配置rabbitmq02、03加入rabbitmq01群集
[root@rabbitmq02 ~]# rabbitmqctl stop_app #停止节点服务[root@rabbitmq02 ~]# rabbitmqctl reset #重置节点[root@rabbitmq02 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #以内存方式加入群集,后面是复制的rabbitmq01的节点名[root@rabbitmq02 ~]# rabbitmqctl start_app [root@rabbitmq02 ~]# rabbitmq-plugins enable rabbitmq_management
7、在rabbitmq01上查看节点状态
[root@rabbitmq01 ~]# rabbitmqctl cluster_status #查看节点状态Cluster status of node rabbit@rabbitmq01 ...[{nodes,[{disc,[rabbit@rabbitmq01]}, {ram,[rabbit@rabbitmq03,rabbit@rabbitmq02]}]}, {running_nodes,[rabbit@rabbitmq03,rabbit@rabbitmq02,rabbit@rabbitmq01]}, {cluster_name,<<"rabbit@rabbitmq01">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq03,[]}, {rabbit@rabbitmq02,[]}, {rabbit@rabbitmq01,[]}]}]# rabbit01工作模式为磁盘节点;rabbit02和03为内存节点模式# running_nodes:正在运行的节点# cluster_name:节点名称# alarms:发生问题时rabbit01、02、03会进行报警
8、在rabbitmq创建管理用户并加入管理组
由于节点被reset重置了,所以用户也需要重新创建。
[root@rabbitmq01 ~]# rabbitmqctl add_user admin 123.com[root@rabbitmq01 ~]# rabbitmqctl set_user_tags admin administrator
9、登录web界面访问
群集内任意节点的IP+15672端口都可以进行登录:
可以在下面的页面看到群集节点的信息:
10、配置web界面添加Vhost
进入创建的虚拟主机:
然后配置如下:
设置完成后再次查看虚拟主机:
设置匹配策略:
发布消息:
设置发布消息内容:
然后刷新当前页面,即可看到在当前虚拟主机中的队列总数:
四、单台节点加入或退出群集配置
1、节点加入群集
由于我在上面部署群集时,hosts文件已经可以解析群集内的节点,所以这里就省略解析了
#在节点192.168.20.5服务器上安装rabbitmq并配置[root@localhost src]# yum -y localinstall erlang-18.1-1.el6.x86_64.rpm rabbitmq-server-3.6.6-1.el6.noarch.rpm socat-1.7.3.2-2.el7.x86_64.rpm [root@localhost src]# chkconfig rabbitmq-server on[root@localhost src]# /etc/init.d/rabbitmq-server start#将群集中的cookie信息复制到本地[root@localhost src]# scp root@rabbitmq01:/var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/[root@localhost src]# init 6 #重启本机#加入群集[root@rabbitmq04 ~]# rabbitmqctl stop_app[root@rabbitmq04 ~]# rabbitmqctl reset[root@rabbitmq04 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01#以内存运行的方式加入群集,若要以磁盘的方式加入,省略"--ram"选项即可[root@rabbitmq04 ~]# rabbitmqctl start_app#开启web管理页面[root@rabbitmq04 ~]# rabbitmq-plugins enable rabbitmq_management
查看web界面,确认rabbitmq04加入到群集:
2、单节点退出群集
1)先在rabbitmq04上面停止节点
[root@rabbitmq04 ~]# rabbitmqctl stop_app
2)回到主节点rabbitmq01上删除节点
[root@rabbitmq04 ~]# rabbitmqctl -n rabbit@rabbitmq01 forget_cluster_node rabbit@rabbitmq04# -n:指定节点名称# forget_cluster_node:后面跟要删除的节点名称
-------- 本文至此结束,感谢阅读 --------