Rabbitmq安装
Rabbitmq安装
一、Rabbitmq介绍
基于AMQP协议,erlang语言开发,是部署最广泛的开源消息中间件,是最受欢迎的开源消息中间件之一。
AMQP 协议advanced message queuing protocol
在2003年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题。
AMQP是一种协议,是一个进程间传递异步消息的网络协议
Broker:消息中间件,AMQP实体,接收和分发消息的应用,RabbitMQ 的服务就是一个Message Broker
Virtual host: 虚拟主机,出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念,当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue
Connection: 连接,publisher/consumer和broker之间的TCP连接,断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题
Channel: 通道,如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
Exchange: 交换机,message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:
- direct (point-to-point):点对点模式, 点对点模式Message中的routing key如果和Binding中的binding key一致,Direct exchange则将message发到对应的queue中;
- topic (publish-subscribe):发布-订阅模式, 根据routing key,及通配规则,Topic exchange将分发到目标queue中;
- fanout (multicast):多播模式每个发到Fanout类型Exchange的message都会分到所有绑定的queue上去。
Queue: 队列,消息最终被送到这里等待consumer取走一个message可以被同时拷贝到多个queue中;
Binding: 绑定exchange和queue之间的虚拟连接,binding中可以包含routing key,Binding信息被保存到exchange中的查询表中,用于message的分发依据
二、Rabbitmq下载安装
官网:https://www.rabbitmq.com/
下载地址:https://www.rabbitmq.com/download.html
因为Rabbitmq是基于erlang语言开发,无论什么平台,都需要先安装erlang
注意rabbitmq和errlang的版本对应关系
https://www.rabbitmq.com/which-erlang.html
2.1 Windows下载安装
下载地址:https://www.rabbitmq.com/install-windows.html
erlang下载地址:https://erlang.org/download/otp_versions_tree.html
两个软件一路无脑下一步即可,先安装erlang,再按照rabbitmq
2.2 Centos 7.5上安装之rpm包安装
rabbitmq下载地址:https://www.rabbitmq.com/install-rpm.html#downloads
erlang下载地址:https://www.erlang.org/downloads
往下拉,找到Solutions,点击,来到
https://www.erlang-solutions.com/downloads/
然后选择Erlang OTP的CentOS版本
# 1 安装上传下载软件
yum install -y lrzsz
# 2 把centos7文件夹下两个软件拖入
# 3 安装erlang
rpm -ivh esl-erlang_24.0-1_centos_7_amd64.rpm
# 如果报错误
错误:依赖检测失败:
libodbc.so.2()(64bit)
# 安装unixODBC
yum -y install unixODBC
# 查看安装的erlang
rpm -qa | grep erlang
# 卸载
rpm -e esl-erlang-23.3.1-1.x86_64
# 4 安装rabbitmq-server
rpm -ivh rabbitmq-server-3.8.16-1.el7.noarch.rpm
# 如果报错
错误:依赖检测失败:
socat 被 rabbitmq-server-3.8.16-1.el7.noarch 需要
# 安装socat
yum install socat
2.3 Docker安装
# 安装好Docker,执行下面命令
docker pull rabbitmq:management
docker run -di --name Myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management
# 浏览器访问:
http://127.0.0.1:15672
# 输入用户名:admin 密码:admin ,进入到管理控制台
三、配置web管理插件
3.1 centos7配置
# 1 安装web管理插件
rabbitmq-plugins enable rabbitmq_management
# 2 新建配置文件(https://github.com/rabbitmq/rabbitmq-server/blob/master/deps/rabbit/docs/rabbitmq.conf.example)
cd /etc/rabbitmq
vi rabbitmq.conf
# 复制官方提供的配置文件
## 注意:把下面注释解开,才能从非本地访问web
## Uncomment the following line if you want to allow access to the guest user from anywhere on the network.
loopback_users.guest = false
# 3 启动RabbitMQ的服务
systemctl start rabbitmq-server
systemctl restart rabbitmq-server
systemctl stop rabbitmq-server
# 4 登录到web管理
http://127.0.0.1:15672/
# 5 用户名密码
用户名:admin
密码:admin
# 6 查看命令帮助
rabbitmqctl help
3.2 windows配置
# 1 安装web管理插件
rabbitmq-service.bat enable rabbitmq_management
# 2 启动服务
rabbitmq-server.bat
# 3 访问web管理页面
http://127.0.0.1:15672/
# 4 使用用户登录
用户名:admin
密码:admin
四、用户设置
rabbitmqctl add_user randy 123456
# 设置用户为administrator角色
rabbitmqctl set_user_tags randy administrator
# 设置权限
rabbitmqctl set_permissions -p "/" root ".*" ".*" ".*"
# 然后重启rabbiMQ服务
systemctl reatart rabbitmq-server
# 然后可以使用刚才的用户远程连接rabbitmq server了。
五、集群搭建
5.1普通集群(副本集群)
All data/state required for the operation of a RabbitMQ broker is replicated across all nodes. An exception to this are message queues, which by default reside on one node, though they are visible and reachable from all nodes. To replicate queues across nodes in a cluster 默认情况下:RabbitMQ代理操作所需的所有数据/状态都将跨所有节点复制。这方面的一个例外是消息队列,默认情况下,消息队列位于一个节点上,尽管它们可以从所有节点看到和访问
普通集群主节点必须可用,可以同步交换机和队列,但是队列中的消息只能看到,不能同步
核心解决问题: 当集群中某一时刻master节点宕机,可以对Quene中信息,进行备份
搭建
# 1 集群规划
mq1: 10.0.0.100 mq1 master 主节点
mq2: 10.0.0.101 mq2 repl1 副本节点
mq3: 10.0.0.103 mq3 repl2 副本节点
# 2 克隆三台机器主机名和ip映射(建立集群时仅支持按主机名创建,所以我们加好映射)
vim /etc/hosts
# 分别在三台机器上加入(直接通过主机名就可以ping通)
10.0.0.100 mq1
10.0.0.101 mq2
10.0.0.103 mq3
# 3 修改3个节点的主机名(分别在三台机器上)
hostname mq1
hostname mq2
hostname mq3
# 4 分别在三台机器上安装相同版本的rabbitmq-server,并启动(启动就会生成cookie)
启动查看管理web页面能看到,但是不是集群状态
查看集群状态也是孤立的
rabbitmqctl cluster_status
现在我们全停掉(3台机器都停掉)
# 5 三个机器安装rabbitmq,并同步cookie文件,在mq1上执行:(启动一遍,cookie才会有)
cat /var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@mq2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@mq3:/var/lib/rabbitmq/
# 6 查看cookie是否一致:
mq1: cat /var/lib/rabbitmq/.erlang.cookie
mq2: cat /var/lib/rabbitmq/.erlang.cookie
mq3: cat /var/lib/rabbitmq/.erlang.cookie
# 7 后台启动rabbitmq所有节点执行如下命令,启动成功访问管理界面(三台机器都启动,老版本web页面看不到,新版本能看到):
rabbitmq-server -detached
# 8 在mq2和mq3上分别执行加入集群命令:
1.关闭 rabbitmqctl stop_app
2.加入集群 rabbitmqctl join_cluster rabbit@mq1 # 仅支持写主机名
3.启动服务 rabbitmqctl start_app
# 9 查看集群状态,任意节点执行:
rabbitmqctl cluster_status
# 10 如果出现如下显示,集群搭建成功:
Cluster status of node rabbit@mq1 ...
Basics
Cluster name: rabbit@mq1
Disk Nodes
rabbit@mq1
rabbit@mq2
rabbit@mq3
Running Nodes
rabbit@mq1
rabbit@mq2
rabbit@mq3
# 11 登录管理界面,展示如下状态:
注意:如果启动不了,删除/var/lib/rabbitmq/mnesia下的所有问题重新操作
测试集群
- 在主节点写操作,从节点是会跟着同步(只同步交换机和队列,队列内数据不同步)
- 比如我们在主节点新建一个交换机(exchange)
- 我们可以看到其他节点也会出现lqz这个交换机
- 我们新建queue,名字为test_queue,让test_queue和exchange绑定
- 我们可以看到,其他节点的lqz交换机也跟test_queue绑定了
-
队列的数据是不能同步的
-
我们发布一条消息
-
在queue中可以看到消息
# 1 现在我们挂掉从节点是可以的
# 在mq2上执行
rabbitmqctl stop_app
# 再启动(集群不受影响),再发布消息也是可以的,只要主节点活着就可以
rabbitmqctl start_app
# 5 挂掉主节点,整个服务就不能用了
# 在mq1上执行
rabbitmqctl stop_app
# 集群不能用了(两个从节点不能对外提供服务),如果消息是不持久化的消息,主节点挂了,消息就没了
# 发布消息可以发布到主,从节点;消费消息也可以从主从节点消费
rabbitmqctl start_app
5.2镜像集群
This guide covers mirroring (queue contents replication) of classic queues --摘自官网
By default, contents of a queue within a RabbitMQ cluster are located on a single node (the node on which the queue was declared). This is in contrast to exchanges and bindings, which can always be considered to be on all nodes. Queues can optionally be made mirrored across multiple nodes. --摘自官网 镜像队列机制就是将队列在三个节点之间设置主从关系,消息会在三个节点之间进行自动同步,且如果其中一个节点不可用,并不会导致消息丢失或服务不可用的情况,提升MQ集群的整体高可用性。
通过镜像,把队列同步到任意一个节点,即便主挂了,从节点也可以提供服务
搭建
# 0.策略说明
rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
all:表示在集群中所有的节点上进行镜像
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic(自动)和manual(手动)
priority:可选参数,policy的优先级
# 1.查看当前策略(可以在任意节点上执行)
rabbitmqctl list_policies
# 2.添加策略
rabbitmqctl set_policy ha-all '^lqz' '{"ha-mode":"all","ha-sync-mode":"automatic"}'
# 说明:策略正则表达式为 “^” 表示所有匹配所有队列名称 ^lqz:匹配lqz开头队列
rabbitmqctl set_policy ha-all '^' '{"ha-mode":"all","ha-sync-mode":"automatic"}'
# 对所有队列都做同步
# 3.删除策略
rabbitmqctl clear_policy ha-all
# 4.测试集群
停掉主节点,其他节点依然可以提供服务