RabbitMQ集群概述
RabbitMQ模式大概分为以下三种:
(1)单一模式。
(2)普通模式(默认的集群模式)。
(3)镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用),要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用
RabbitMQ特点:
RabbitMQ的集群节点包括内存节点、磁盘节点。RabbitMQ支持消息的持久化也就是数据写在磁盘上,最合适的方案就是既有内存节点,又有磁盘节点。
实验环境
安装准备
采用源码安装
#修改主机名,安装依赖环境(都改)
[root@ramq1 ~]# vim /etc/hosts
[root@ramq1 ~]# cd /etc/yum.repos.d/ ---------修改yum源为本地
[root@ramq1 yum.repos.d]# rm -rf *
[root@ramq1 yum.repos.d]# vim local.repo
[root@ramq1 yum.repos.d]# mount /dev/cdrom /mnt
[root@ramq1 ~]# yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
#安装erlang环境
[root@ramq1 ~]# wget http://erlang.org/download/otp_src_21.3.tar.gz
[root@ramq1~]#wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-generic-unix-3.7.14.tar.xz
[root@ramq1 ~]# tar -zxvf otp_src_21.3.tar.gz
[root@ramq1 ~]# cd otp_src_21.3/
[root@ramq3 otp_src_21.3]# ./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe
[root@ramq2 otp_src_21.3]# echo $?
0
[root@ramq2 otp_src_21.3]# make && make install
#安装rabbitmq环境
[root@ramq1 ~]# xz -d rabbitmq-server-generic-unix-3.7.14.tar.xz
[root@ramq1 ~]# tar -xvf rabbitmq-server-generic-unix-3.7.14.tar
[root@ramq1 ~]# mv rabbitmq_server-3.7.14/ /usr/local/rabbitmq
#设置环境变量
[root@ramq1 ~]# vim /etc/profile
[root@ramq1 ~]# source /etc/profile
#配置rabbitmq
rm -rf /var/lib/rabbitmq/mnesia/
这个目录,为rabbitmq数据库,有时异常情况出现时,可删除该目录,重新对rabbitmq进行设置即可
[root@ramq1 ~]# rabbitmq-server -detached -------以后台运行方式启动一定要先启动
[root@ramq1 ~]# rabbitmqctl add_user admin jia1314 --------添加admin用户密码为jia1314
[root@ramq1 ~]# rabbitmqctl set_user_tags admin administrator --------为admin用户设置为管理员
[root@ramq1 ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" -----将admin设置为允许远程登录用户
[root@ramq1 ~]# rabbitmq-plugins enable rabbitmq_management -------启动web管理插件
[root@ramq3 ~]# netstat -lnpt|grep beam --------查看启动进程
#localhost:15672,帐号默认为guest,密码guest,此帐号默认只能在本机访问。不建议打开远程访问。你可以创建一个帐户,并设置可以远程访问的角色进行访问
#访问http://192.168.3.1:15672
普通集群搭建
[root@ramq1 ~]# cat .erlang.cookie ------查看自己的cookie
[root@ramq1 ~]# scp .erlang.cookie [email protected]:/root ----传到另外两台
[root@ramq1 ~]# scp .erlang.cookie [email protected]:/root ----通过cookie连接
#节点1开启app,节点2/3关闭app
[root@ramq2 ~]# rabbitmqctl stop_app
[root@ramq3 ~]# rabbitmqctl stop_app
[root@ramq2 ~]# rabbitmqctl join_cluster --ram rabbit@ramq1 ----加入集群
[root@ramq3 ~]# rabbitmqctl join_cluster --ram rabbit@ramq1
默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq02和mq03是内存节点,mq01是磁盘节点。
如果要使mq02、mq03都是磁盘节点,去掉–ram参数即可 如果想要更改节点类型,可以使用命令rabbitmqctl
change_cluster_node_type disc(ram),前提是必须停掉rabbit应用
[root@ramq1 ~]# rabbitmqctl cluster_status -----在node1上查看集群状态
[root@ramq2 ~]# rabbitmqctl start_app ------开启app节点
[root@ramq3 ~]# rabbitmqctl start_app
#访问http://192.168.3.1:15672
#创建队列
镜像集群搭建
上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。
镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。
#创建RabbitMQ策略
Name:策略名称
Pattern:匹配的规则,这里表示匹配a开头的队列,如果是匹配所有的队列,那就是^.
Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档
登录到节点2/3可以看到有相同的策略
#创建队列
Name:队列名称
Durability:队列是否持久化
Node:消息队列的节点
Auto delete:自动删除
Arguments:使用的策略类型
#创建消息
点ad进去
2-Persistent:表示持久化
Headers:随便填写即可
Properties:点击问号,选择一个消息ID号
Payload:消息内容
创建成功
可以看到多了一条消息
#测试
关掉ramq1,查看ramq2消息状态
[root@ramq1 ~]# rabbitmqctl stop_app
可以看到由原来的+2—>+1,ready也多了一条
再将ramq2关掉,查看ramq3消息状态
可以看到+1都没有了,如果再把ramq3关掉的话消息就真的丢了
将ramq1和ramq2重新启动
变为红色无法同步
此时需要手动进行同步
[root@ramq1 ~]# rabbitmqctl sync_queue ab
[root@ramq2 ~]# rabbitmqctl sync_queue ab
成功