RabbitMQ
MQ(Message Queue,消息队列)是一款消息中间件,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步。
集群原理
rabbitmq 是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证)来实现的,所以部署rabbitmq分布式集群时要先安装erlang,并把其中一个服务的cookie复制到另外的节点。
rabbitmq集群中,各个rabbitmq为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般的,均应建立为磁盘节点,为了防止机器重启后的消息消失;
RabbitMQ的Cluster集群模式一般分为两种, 普通模式和镜像模式 。消息队列通过rabbitmq HA镜像队列进行消息队列实体复制。普通模式下, 以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
镜像模式下, 将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
系统环境
主机名 | 操作系统 | IP地址 | 用途 |
---|---|---|---|
rabbitmq01 | Centos 7.3 x86_64 | 192.168.96.23 | 磁盘节点 |
rabbitmq02 | Centos 7.3 x86_64 | 192.168.96.21 | 内存节点 |
rabbitmq03 | Centos 7.3 x86_64 | 192.168.96.22 | 内存节点 |
开始部署
以下1-8为安装部署步骤,三台服务器一致
1.关闭防火墙及Selinux
setenforce 0
systemctl stop firewalld
2.分别修改三台服务器的主机名
#rabbitmq01服务器
vim /etc/hostname
rabbitmq01
#rabbitmq02服务器
vim /etc/hostname
rabbitmq02
#rabbitmq03服务器
vim /etc/hostname
rabbitmq03
3.分别修改三台服务器的hosts文件
vim /etc/hosts
192.168.96.23 rabbitmq01
192.168.96.21 rabbitmq02
192.168.96.22 rabbitmq03
4.安装最新repo源
yum -y install epel-release
5.安装rabbitmq-server软件包
yum -y install rabbitmq-server
6.查看已安装的插件
rabbitmq-plugins list
7.启动管理服务
rabbitmq-plugins enable rabbitmq_management
8.分别启动rabbitmq服务
systemctl start rabbitmq-server
rabbitmq集群部署
1.先停止rabbitmq服务
systemctl stop rabbitmq-server
2.进入cookie文件目录
cd /var/lib/rabbitmq/
3.编辑.erlang.cookie文件序列号(各节点需要有相同序列号值)
vim .erlang.cookie
4.再启动rabbitmq服务
systemctl start rabbitmq-server
5.停止rabbitmq应用
rabbitmqctl stop_app
6.将rabbitmq02加入rabbitmq01,使它们成为一个集群
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
7.启动rabbitmq应用
rabbitmqctl start_app
8.分别查看rabbitmq服务器状态
rabbitmqctl cluster_status