前言
rabbitMQ集群基本概念
rabbitMQ模式大概分为以下三种:单主机模式、普通集群模式、镜像集群模式
1、单主机模式:
rabbitMQ服务运行在单独的一台主机种,通常生产环境不适用该模式,性能有限,并且如果服务器宕机服务将完全不可用
2、普通集群模式:
一说到集群问题瞬间变得复杂多了。首先对于Queue来说消息实体只存在于其中一个节点,集群中其他节点仅有相同的元数据,即队列结构。
当消息进入A节点的Queue后,Consumer从B节点拉取消息时,rabbitMQ会临时在两个节点间进行消息传输,把A中的消息实体取出来并经过B发送给Consumer。所以Consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立Queue。否则Consumer如果只连接一个节点取消息会造成该节点的性能瓶颈。
该模式存在一个问题就是当其中一个节点故障后,其他节点无法取到故障节点中还未消费的消息。如果做了消息持久化,那么得等A节点恢复,然后才可被消费,如果没有持久化得话,那就悲剧了
3、镜像集群模式:
rabbitMQ的普通集群模式不同于节点间只同步队列结构不同步消息。镜像模式会把队列结构和消息都存在于多个节点,属于rabbitMQ的HA方案。其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量得消息进入,集群内部得网络带宽将会被这种同步通讯大量消耗。所以这种模式应用于可靠性要求较高得场合中。
rabbitmq集群节点:内存节点与磁盘节点
rabbitMQ得集群节点包括内存节点、磁盘节点。内存节点就是将所有得数据存放在内存,磁盘节点将数据存放在磁盘,如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是会放在磁盘。原则上一个集群至少有一个磁盘节点。在实际使用中会发现所谓的磁盘节点是只用来存储集群的配置信息,也就是说如果集群中没有磁盘节点,当所有节点关机后集群的配置信息就会丢失。在进行性能测试时两个模式的节点订阅发布消息的性能没有太大差异
本文是两台服务器搭建的rabbitmq镜像集群,其实就是从单主机模式--->普通集群模式--->镜像集群模式的搭建过程
一、服务器基本配置:
服务器(prod01)
IP:172.17.47.219
主机名:prd01
内核:CentOS Linux release 7.4.1708 (Core)
hosts文件修改:echo '172.17.73.215 prd02' >> /etc/hosts
服务器(prod02)
IP:172.17.73.215
主机名:prd02
内核:CentOS Linux release 7.4.1708 (Core)
hosts文件修改:echo '172.17.47.219 prd01' >> /etc/hosts
二、安装依赖(prd01、prd02都需要安装,安装步骤一样)
yum -y install make ncurses-devel gcc gcc-c++unixODBC unixODBC-devel openssl openssl-devel
三、安装rabbitmq依赖的erlang环境(prd01、prd02都需要安装,安装步骤一样)
cd /usr/local/src/
wget http://erlang.org/download/otp_src_19.3.tar.gz
tar xf otp_src_19.3.tar.gz
cd otp_src_19.3
./configure --prefix=/usr/local/erlang--enable-smp-support --enable-threads --enable-sctp --enable-kernel-poll --enable-hipe --with-ssl
make && make install
vim /etc/profile
ERL_HOME=/usr/local/erlang
PATH=$ERL_HOME/bin:$PATH
export ERL_HOME PATH
source /etc/profile
四、安装rabbitmq
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/rabbitmq_v3_6_6/rabbitmq-server-generic-unix-3.6.6.tar.xz
tar xfrabbitmq-server-generic-unix-3.6.6.tar.xz
mkdir /data/application
mv rabbitmq_server-3.6.6/data/application/rabbitmq3.6
五、启动
cd /data/application/rabbitmq3.6/
./sbin/rabbitmq-server -detached
./sbin/rabbitmq-plugins enablerabbitmq_management
六、添加用户,设置角色,授权
./sbin/rabbitmqctl add_user user password
./sbin/rabbitmqctl set_user_tags user administrator
./sbin/rabbitmqctl set_permissions -p / user ".*" ".*" ".*"
七、登陆
浏览器输入ip:port
以上rabbitmq已将安装成功,这里只展示了其中一台服务器的rabbitmq安装,两台步骤一样,不做多余展示,大家发现与本人之前发表的rabbitmq单点安装(一)步骤一样,没错是一样的,不一样的在后面,以下内容需要注意了!!!!
八、erlang cookie准备
同步每个节点cookie
Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang集群中各节点是通过一个magic cookie来实现的
找到erlang cookie文件的位置,官方在介绍集群的文档中提到过.erlang.cookie一般会存在这两个地址:第一个是$home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在${home}目录下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下,文件是400权限,必须保证各节点cookie保持一致,否则节点之间就无法通信。
将prd01的.erlang.cookie文件内容复制到prd02,复制方式很多,请自行选择
Prd01内容:
cat .erlang.cookie
ZVTEFVBWNCJDTXNTIPXY
备份prd02上面的.erlang.cookie文件
mv .erlang.cookie .erlang.cookie_prd02
替换为prd01的内容
cat.erlang.cookie
ZVTEFVBWNCJDTXNTIPXY
修改权限(两台都要保证为400)
chmod 400 .erlang.cookie
九、集群
rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用
将prd02加入到prd01,在rpd02上操作
./sbin/rabbitmqctl stop_app
磁盘节点(默认): ./sbin/rabbitmqctl join_cluster rabbit@prd01
内存节点:./sbin/rabbitmqctl join_cluster --ram rabbit@prd01
启动prod02上面rabbitmq的应用
./sbin/rabbitmqctl start_app
十、集群访问
加入集群之后prd02创建的用户无法登陆访问了,需要用prd01创建的用户访问
使用prod01的ip:port访问:
使用prod02的ip:port访问:
十一、集群常用命令
脱离集群
./sbin/rabbitmqctl stop_app
./sbin/rabbitmqctl reset
./sbin/rabbitmqctl start_app
查看集群状态,可以在rabbitMQ任意节点执行查看集群状态:
./sbin/rabbitmqctl cluster_status
十二、镜像集群设置
部署好了普通模式的集群,但因为节点间只同步队列结构并不进行消息的同步,对于一些可靠性要求较高的场景需要对队列中的消息也同步到所有节点。
使用Rabbit镜像功能,需要基于rabbitmq策略来实现,策略是用来控制和修改群集范围的某个vhost队列行为和Exchange行为,在cluster中任意节点启用策略,策略会自动同步到集群节点。
策略的修改可以通过命令也可以通过WEB,我是通过WEB来修改的,非常简单。
Pattern:“^” 表示匹配所有队列名称。”^log” 是指同步”log”开头的队列名称。
ha-mode:“all”代表同步到所以节点。
到这里RabbitMQ搭建好了,可以用阿里云的slb、Haproxy等其他做负载均衡