标签:mamicode restart 传输 消费 客户端 system img 客户端连接 role
部署 RabbitMQ Cluster? 消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等。其能在不同平台之间进行通信,常用来屏蔽各种平台协议之间的特性,实现应用程序之间的协同。优点在于能够在客户端和服务器之间进行同步和异步的连接,并且在任何时刻都可以将消息进行传送和转发,是分布式系统中非常重要的组件,主要用来解决应用耦合、异步通信、流量削峰等问题。
可靠性
灵活的路由
扩展性
高可用信
多种协议
多语言客户端
管理界面
插件机制
启动监控管理器:rabbitmq-plugins enable rabbitmq_management
关闭监控管理器:rabbitmq-plugins disable rabbitmq_management
启动rabbitmq:rabbitmq-service start
关闭rabbitmq:rabbitmq-service stop
查看所有的队列:rabbitmqctl list_queues
清除所有的队列:rabbitmqctl reset
关闭应用:rabbitmqctl stop_app
启动应用:rabbitmqctl start_app
添加用户:rabbitmqctl add_user username password
分配角色:rabbitmqctl set_user_tags username administrator
新增虚拟主机:rabbitmqctl add_vhost vhost_name
将新虚拟主机授权给新用户:rabbitmqctl set_permissions -p vhost_name username “.*” “.*” “.*”
(后面三个”*”代表用户拥有配置、写、读全部权限)
RabbitMQ是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证)来实现的,所以部署Rabbitmq分布式集群时要先安装Erlang,并把其中一个服务的cookie复制到另外的节点。
RabbitMQ集群中,各个RabbitMQ为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般的,均应建立为磁盘节点,为了防止机器重启后的消息消失;
RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过RabbitMQ HA镜像队列进行消息队列实体复制
消息中间件RabbitMQ,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步。
详细如下:
3台centos7操作系统,ip分别为:
192.168.11.131
192.168.11.134
192.168.11.133
hostnamectl --static set-hostname rabbitmq1
hostnamectl --static set-hostname rabbitmq2
hostnamectl --static set-hostname rabbitmq3
注:3台都做
vim /etc/hosts
192.168.11.131 rabbitmq1
192.168.11.134 rabbitmq2
192.168.11.133 rabbitmq3
ping rabbitmq1
ping rabbitmq2
ping rabbitmq3
注:3台都安装
yum install erlang
注:3台都安装
yum install -y socat
注:3台都安装
yum -y install rabbitmq-server
注:3台都做
systemctl start rabbitmq-server.service
systemctl stop rabbitmq-server.service
systemctl enable rabbitmq-server.service
systemctl restart rabbitmq-server.service
systemctl status rabbitmq-server.service
安装启动后其实还不能在其它机器访问,rabbitmq 默认的 guest 账号只能在本地机器访问, 如果想在其它机器访问必须配置其它账号
配置管理员账号:
可以创建管理员用户,负责整个 MQ 的运维
[root@rabbitmq1 ~]# rabbitmqctl add_user admin admin
赋予其 administrator 角色
[root@rabbitmq1 ~]# rabbitmqctl set_user_tags admin administrator
创建和赋角色完成后查看并确认
[root@rabbitmq1 ~]# rabbitmqctl list_users
rabbitmq-plugins enable rabbitmq_management
启动服务:[root@rabbitmq1 ~]# systemctl restart rabbitmq-server.service
网页访问 http://ip:15672
在 RabbitMQ 中可以虚拟消息服务器 VirtualHost,每个 VirtualHost 相当月一个相对独立的 RabbitMQ 服务器,每个 VirtualHost 之间是相互隔离的。exchange、queue、message 不能互通。 在 RabbitMQ 中无法通过 AMQP 创建 VirtualHost,可以通过以下命令来创建
rabbitmqctl add_vhost [vhostname]
例:创建虚拟主机test
[root@rabbitmq1 ~]# rabbitmqctl add_vhost test
rabbitmqctl add_user superrd superrd
set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
rabbitmqctl set_permissions -p / admin ‘.*‘ ‘.*‘ ‘.*‘
其中,.* 的位置分别用正则表达式来匹配特定的资源,如:
‘^(amq.gen.*|amq.default)$‘
可以匹配 server 生成的和默认的 exchange,’^$’不匹配任何资源
示例:我们赋予 superrd 在“/”下面的全部资源的配置和读写权限。
rabbitmqctl set_permissions -p / superrd ".*" ".*" ".*"
注意”/”代表 virtual host 为“/”这个“/”和 linux 里的根目录是有区别的并不是 virtual host 为“/”可以访问所以的 virtual host,把这个“/”理解成字符串就行。
需要注意的是 RabbitMQ 会缓存每个 connection 或 channel 的权限验证结果、因此权限发生变化后需要重连才能生效。
rabbitmqctl list_user_permissions admin
rabbitmqctl list_permissions -p /
rabbitmqctl set_user_tags [user] [role]
RabbitMQ 中的角色分为如下五类:none、management、policymaker、monitoring、administrator
官方解释如下:
management
User can access the management plugin
policymaker
User can access the management plugin and manage policies and parameters for the vhosts they have access to.
monitoring
User can access the management plugin and see all connections and channels as well as node-related information.
administrator
User can do everything monitoring can do, manage users, vhosts and permissions, close other user’s connections, and manage policies and parameters for all vhosts.
如下示例将 superrd 设置成 administrator 角色。
rabbitmqctl set_user_tags superrd administrator
在上述的 3 台机器上安装 rabbitmq 完成之后,你可以看到你的机器中有如下 1 个文件。路径在 $HOME 中或者在 /var/lib/rabbitmq 中,文件名称为.erlang.cookie, 他是一个隐藏文件。那么这文件存储的内容是什么,是做什么用的呢?
RabbitMQ 的集群是依赖 erlang 集群,而 erlang 集群是通过这个 cookie 进行通信认证的,因此我们做集群的第一步就是干 cookie。
1、必须使集群中也就是rabbitmq2,rabbitmq3这两台机器的.erlang.cookie 文件中 cookie 值一致,且权限为 owner 只读。chmod 600 /var/lib/rabbitmq/.erlang.cookie
[root@rabbitmq1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
CDHWOZUUIDSSLRYVTHER
[root@rabbitmq1 ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 21 May 25 10:47 /var/lib/rabbitmq/.erlang.cookie
[root@rabbitmq1 ~]#scp /var/lib/rabbitmq/.erlang.cookie rabbitmq2://var/lib/rabbitmq/
[root@rabbitmq1 ~]#scp /var/lib/rabbitmq/.erlang.cookie rabbitmq3://var/lib/rabbitmq/
[root@rabbitmq2 ~]# systemctl restart rabbitmq-server.service
[root@rabbitmq2 ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 21 May 25 10:48 /var/lib/rabbitmq/.erlang.cookie
[root@rabbitmq3 ~]# systemctl restart rabbitmq-server.service
[root@rabbitmq3 ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 21 May 25 10:48 /var/lib/rabbitmq/.erlang.cookie
[root@rabbitmq3 ~]# rabbitmqctl stop_app
[root@rabbitmq1 ~]# systemctl restart rabbitmq-server.service
2、查看集群状态
[root@rabbitmq1 rabbitmq]# rabbitmqctl status
3、重启 rabbitmq1机器中 rabbitmq 的服务 在 rabbitmq2,rabbitmq3 分别执行
rabbitmqctl stop_app #关闭应用
rabbitmqctl join_cluster --ram rabbit@rabbitmq1 #将rabbitmq2/3节点加入到rabbitmq1集群
rabbitmqctl start_app #起应用
rabbitmq-plugins enable rabbitmq_management #导入rabbitmq的管理界面
systemctl restart rabbitmq-server.service #重启rabbitmq服务
[root@rabbitmq1 ~]# systemctl restart rabbitmq-server.service
获取集群状态信息:
[root@rabbitmq1 ~]# rabbitmqctl cluster_status
4、打开网页管理页面查看 nodes
这一节要参考的文档是:<http://www.rabbitmq.com/ha.html>
首先镜像模式要依赖policy模块,这个模块是做什么用的呢?
policy中文来说是政策,策略的意思,那么他就是要设置,那些Exchanges或者queue的数据需要复制,同步,如何复制同步?对就是做这些的。
这里有点内容的,我先上例子慢慢说:
[root@rabbitmq1 ~]# rabbitmqctl set_policy ha-all "^" ‘{"ha-mode":"all"}‘
参数意思为:
ha-all:为策略名称。
^:为匹配符,只有一个^代表匹配所有,^zlh为匹配名称为zlh的exchanges或者queue。
ha-mode:为匹配类型,他分为3种模式:
例:
标签:mamicode restart 传输 消费 客户端 system img 客户端连接 role
原文地址:https://blog.51cto.com/14237756/2400055