rabbitmq单机与集群模式的部署
单机部署
安装版本说明:erlang 20.3 – 21.x rabbitmq 3.7.13
修改主机名和host文件
hostnamectl set-hostname mq1
vim /etc/hosts
192.168.3.71 mq1
192.168.3.72 mq2
192.168.3.73 mq3
由于RabbitMQ是基于Erlang(面向高并发的语言)语言开发,所以在安装RabbitMQ之前,需要先安装Erlang。
安装Erlang
yum -y install socat
rpm -ivh erlang-20.3.8.25-1.el7.x86_64.rpm
使用以下命令检查Erlang版本
erl -version
得到如下输出:
[root@mq1 ~]# erl -version
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 9.3.3.14
安装RabbitMQ
rpm -ivh rabbitmq-server-3.7.13-1.el7.noarch.rpm
修改配置文件
cp /usr/share/doc/rabbitmq-server-3.7.13/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
vim /etc/rabbitmq/rabbitmq.config # 把61行注释取消 删除的61行 %% 和结尾的 ,
59 %% Uncomment the following line if you want to allow access to the
60 %% guest user from anywhere on the network.
61 {loopback_users, []}
启动rabbitmq
systemctl start rabbitmq-server
启动RabbitMQ Web管理控制台
rabbitmq-plugins enable rabbitmq_management
查看集群状态 如果报错 断开xshell 从新打开一个终端
[root@mq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq1 ...
[{nodes,[{disc,[rabbit@mq1]}]},
{running_nodes,[rabbit@mq1]},
{cluster_name,<<"rabbit@mq1">>},
{partitions,[]},
{alarms,[{rabbit@mq1,[]}]}]
访问web界面 http://192.168.3.71:15672
默认的账号密码为:guest/guest
常用命令:
查看所有的队列
rabbitmqctl list_queues
清除所有的队列
rabbitmqctl reset
添加用户
rabbitmqctl add_user admin StrongPassword
分配角色
rabbitmqctl set_user_tags admin administrator
新增虚拟主机
rabbitmqctl add_vhost vhost_name
将新增虚拟主机授权给新用户 后面三个 * 代表用户拥有 配置 写 读 全部权限
rabbitmqctl set_permissions -p vhost_name admin “.*” “.*” “.*”
查看用户列表
rabbitmqctl list_users
集群部署
修改主机名和host文件
hostnamectl set-hostname mq1
cat << EOF >> /etc/hosts
192.168.3.71 mq1
192.168.3.72 mq2
192.168.3.73 mq3
EOF
由于RabbitMQ是基于Erlang(面向高并发的语言)语言开发,所以在安装RabbitMQ之前,需要先安装Erlang。
安装Erlang
yum -y install socat # 安装erlang依赖
rpm -ivh erlang-20.3.8.25-1.el7.x86_64.rpm
使用以下命令检查Erlang版本
erl -version
得到如下输出:
[root@mq1 ~]# erl -version
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 9.3.3.14
安装RabbitMQ
rpm -ivh rabbitmq-server-3.7.13-1.el7.noarch.rpm
修改配置文件
cp /usr/share/doc/rabbitmq-server-3.7.13/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
vim /etc/rabbitmq/rabbitmq.config # 把61行注释取消 删除的61行 %% 和结尾的 ,
59 %% Uncomment the following line if you want to allow access to the
60 %% guest user from anywhere on the network.
61 {loopback_users, []}
启动RabbitMQ Web管理控制台
rabbitmq-plugins enable rabbitmq_management
RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookiel以获得认证来实现分布式,所以部署Rabbitmq分布式集群时要先安装Erlang,并把其中一个服务的cookie
复制到另外的节点。
mq1启动服务
systemctl start rabbitmq-server.service
mq1发送erlang.cookie到其他节点配置集群
scp /var/lib/rabbitmq/.erlang.cookie mq2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie mq3:/var/lib/rabbitmq/.erlang.cookie
mq2和mq3重启服务,停止应用,并以ram的方式加入mq1节点,之后启动应用
systemctl start rabbitmq-server.service
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@mq1
rabbitmqctl start_app
检查集群的状态
[root@mq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq1 ...
[{nodes,[{disc,[rabbit@mq1]},{ram,[rabbit@mq3,rabbit@mq2]}]},
{running_nodes,[rabbit@mq3,rabbit@mq2,rabbit@mq1]},
{cluster_name,<<"rabbit@mq1">>},
{partitions,[]},
{alarms,[{rabbit@mq3,[]},{rabbit@mq2,[]},{rabbit@mq1,[]}]}]
每个节点添加管理员
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
访问每个节点查看集群状态
RabbitMQ集群中,各个RabbitMQ为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般都建立为磁盘节点,为了防止机器重启后的消息消失;
更改节点类型(内存型或磁盘型)
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc 或 rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
从集群移除节点(或者重置节点)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl cluster_status
从某个节点移除集群中其他节点
rabbitmqctl forget_cluster_node rabbit@node3
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl cluster_status
普通模式:
默认的集群模式,以两个节点(rabbit1、rabbit2)为例说明。消息实体只存在其中一个节点 rabbit1 或者 rabbit2,rabbit1 和 rabbit2 两个节点仅有相同的元数据,就是队列的结构。当消息进入 rabbit1 节点的队列(Queue)后,当消费者从 rabbit2 节点消费时,集群会临时在 rabbit1 和 rabbit2 节点间传递消息,把 rabbit1 节点下队列的消息实体取出,然后通过 rabbit2 发送给消费者。所以消费者需要尽量连接每一个节点,同时,需要将同一个逻辑队列,在多个节点都建立。不然消费者连 rabbit1 或 rabbit2 节点,出口却只有 rabbit1,而且当 rabbit1 节点故障后,rabbit2 节点无法取到 rabbit1 节点中还未消费的消息。如果做了消息持久化,还可以等 rabbit1 节点恢复后继续消费;如果没有持久化就会消息丢失消息。
镜像模式:
将队列变为镜像队列,存在于多个节点。消息实体会主动在节点之间同步,不会像普通模式,在消费者消费数据时才临时读取。缺点 —— 集群内部的同步会占用大量带宽。
设置的镜像队列可以通过开启的网页的管理端Admin->Policies,也可以通过命令
rabbitmqctl set_policy ha-all '^' '{"ha-mode":"all"}'
说明:策略正则表达式为'^'表示所有匹配所有队列名称 ^hello:匹配hello开头队列
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 set_policy ha-all '^' '{"ha-mode":"all"}'
2.查看当前策略
[root@mq1 ~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ ha-all ^ all {"ha-mode":"all"} 0
3.删除策略
rabbitmqctl clear_policy ha-all