Skip to content

Latest commit

 

History

History
296 lines (184 loc) · 9.3 KB

File metadata and controls

296 lines (184 loc) · 9.3 KB

RabbitMQ介绍

官网:https://www.rabbitmq.com

RabbitMQ是一款在全球范围内使用非常广泛的开源消息队列中间件。它轻量级、易部署、并支持多种协议。它基于Erlang开发,天生拥有高并发的能力。

RabbitMQ相关术语

  • 生产者

    产生消息的进程或服务

  • 消费者

    接收消息的进程或服务

  • 队列

    RabbitMQ是消息队列中间件,而真正储存消息数据的就是队列,队列可以有很多。

  • 交换器

    类似于网络设备交换机,它可以根据不同的关键字,将消息发送到不同的队列。

  • 虚拟主机

    虚拟主机类似于Apache的虚拟主机,如果没有虚拟主机,当RabbitMQ中的数据越来越庞大,队列越来越多,随之而来的是令人头痛的管理问题,比如队列、交换器命名冲突,它们相互影响等等。虚拟主机能够解决这些问题,而不需要我们部署多个RabbitMQ来负责不同的业务。

    虚拟主机提供了资源的逻辑分组和分隔,每一个虚拟主机本质上是mini版的RabbitMQ服务器,他们有用自己的连接、队列、绑定、交换器,更重要的是有用自己的权限机制,这有点类似服务器和运行在服务器上的虚拟机一样。

CentOS7下安装RabbitMQ(单机)

官方文档: https://www.rabbitmq.com/install-rpm.html

安装erlang

curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
yum install -y erlang

安装RabbitMQ

rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
rpm --import https://packagecloud.io/gpg.key
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
vi /etc/yum.repos.d/rabbitmq.repo  ##内容如下
[bintray-rabbitmq-server]
name=bintray-rabbitmq-rpm
baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.7.x/el/7/
gpgcheck=0
repo_gpgcheck=0
enabled=1

yum install -y rabbitmq-server

启动

systemctl start rabbitmq-server

监听端口为4369,25672

开启web管理控制台

rabbitmq-plugins enable rabbitmq_management

此时可以通过 http://ip:15672 来访问rabbitmq的web管理控制台,用户名密码都是guest,但是有个限制,只允许127.0.0.1访问,所以还需在本机配置一个nginx代理

配置Nginx代理

yum install -y nginx #安装nginx,如果已经安装则省略该步骤
vi /etc/nginx/conf.d/rabbitmq.conf #内容如下
server {
	listen 80;
	server_name ra.aminglinux.cc; #域名自定义,如果没有dns解析,只能绑定hosts
	
        location /
        {
            proxy_pass http://127.0.0.1:15672;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
##到此结束
systemctl start nginx #启动或重启nginx服务

rabbitmq常用命令

虚拟机管理

rabbitmqctl list_vhosts  #列出所有的虚拟主机

rabbitmqctl add_vhost <虚拟主机名字> #创建虚拟主机
如:rabbitmqctl add_vhost  aming #创建aming虚拟主机

rabbitmqctl delete_vhost <虚拟主机名字> #删除虚拟主机

用户管理

rabbitmqctl add_user <username> <password> #创建用户
如:rabbitmqctl add_user user1 user1_passwd #创建user1用户,密码为user1_passwd


rabbitmqctl list_users #列出所有用户

rabbitmqctl change_password <username> <password> #更改用户密码
如:rabbitmqctl change_password user1 new_passwd #更改user1的密码为new_passwd

rabbitmqctl delete_user <username> #删除用户

rabbitmqctl clear_password <username> #清除用户密码

  • (1) 超级管理员(administrator)

    可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

  • (2) 监控者(monitoring)

    可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

  • (3) 策略制定者(policymaker)

    可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息。

  • (4) 普通管理者(management)

    仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

  • (5) 其他

    无法登陆管理控制台,通常就是普通的生产者和消费者。

rabbitmqctl set_user_tags <username> <rolename> #赋予用户某个角色
如:rabbitmqctl set_user_tags user1 managemnet  #赋予user1用户management角色
    rabbitmqctl set_user_tags user2 monitoring management #同时赋予多个角色

rabbitmqctl set_permissions -p <vhostname> <username> <conf> <write> <read> #给用户设置权限
如:rabbitmqctl set_permissions -p vhost1 user1 '.*' '.*' '.*' #针对vhost1虚拟主机给user1用户设置所有的配置、读写queue和exchange的权限。

说明:用户权限指的是用户对exchange,queue的操作权限,包括配置权限,读写权限。配置权限会影响到exchange,queue的声明和删除。读写权限影响到从queue里取消息,向exchange发送消息以及queue和exchange的绑定(bind)操作。例如: 将queue绑定到某exchange上,需要具有queue的可写权限,以及exchange的可读权限;向exchange发送消息需要具有exchange的可写权限;从queue里取数据需要具有queue的可读权限。

rabbitmqctl list_user_permissions <username> #列出某用户的权限,即该用户对哪个虚拟主机有权限

rabbitmqctl list_permissions -p <vhostname> #列出指定虚拟主机下所有用户的权限,即哪些用户对该虚拟主机有权限

rabbitmqctl clear_permissions -p <vhostname> <user> #清除某用户在指定虚拟机上的授权
如:rabbitmqctl clear_permissions -p vhost1 user1 

插件管理

rabbitmq-plugins list #获取RabbitMQ插件列表

rabbitmq-plugins enable <插件名字> #安装RabbitMQ插件

rabbitmq-plugins disable <插件名字> #卸载某个插件

限制

rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 256}' #设置虚拟主机的最大连接数

rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": 0}' #不允许客户端连接虚拟主机

rabbitmqctl set_vhost_limits -p vhost_name '{"max-connections": -1}' #不限制连接数

rabbitmqctl set_vhost_limits -p vhost_name '{"max-queues": 1024}' #限制虚拟主机里最大的队列数

rabbitmqctl set_vhost_limits -p vhost_name '{"max-queues": -1}' #不限制队列数

其他

rabbitmqctl list_exchanges #列出所有的交换器

rabbitmqctl list_bindings #列出所有的绑定,即把exchange和queue按照路由规则绑定起来

rabbitmqctl list_queues #分别查看当前系统种存在的Exchange和Exchange上绑定的Queue信息。

rabbitmqctl status  #查看运行信息

RabbitMQ集群

RabbitMQ本身是基于Erlang编写的,Erlang天生支持分布式(通过同步Erlang集群各节点的cookie来实现),因此不需要像Kafka那样通过ZooKeeper来实现分布式集群。

  • 元数据

    RabbitMQ内部有各种基础构件,包括队列、交换器、绑定、虚拟主机等,他们组成了AMQP协议消息通信的基础,而这些构件以元数据的形式存在

  • 内存节点与磁盘节点

    在集群中的每个节点,要么是内存节点,要么是磁盘节点,如果是内存节点,会将所有的元数据信息仅存储到内存中,而磁盘节点则不仅会将所有元数据存储到内存上, 还会将其持久化到磁盘。所以在搭建集群的时候,为了保证数据的安全性和性能,最好是两种节点都要有

规划

主机名 ip 节点类型
aming01 192.168.222.128 磁盘节点
aming02 192.168.222.129 内存节点
aming03 192.168.222.130 内存节点

部署集群

1. 配置hosts以及hostname

三台机器设置hostname

hostnamectl set-hostname aming01
hostnamectl set-hostname aming02
hostnamectl set-hostname aming03

三台机器上都需要编辑如下hosts

192.168.222.128 aming01
192.168.222.129 aming02
192.168.222.130 aming03

2. 关闭selinux以及firewalld

三台机器都要执行

setenforce 0
systemctl stop firewalld

3. 安装rabbitmq

三台机器都要安装,步骤参考上面

4. 启动服务

三台机器都启动起来

systemctl start rabbitmq-server

5. 安装management插件

三台机器都要开启

rabbitmq-plugins enable rabbitmq_management

6. 编辑cookie文件

vim  /var/lib/rabbitmq/.erlang.cookie  #将三台机器的该文件内容编辑为一致

7. 分配节点

aming01为磁盘节点,aming02和aming03为内存节点

aming02和aming03上都执行:

停止rabbitmq
rabbitmqctl stop_app  

将aming02作为内存节点连接到aming01
rabbitmqctl join_cluster --ram rabbit@aming01

开启rabbitmq
rabbitmqctl start_app

查看集群状态
rabbitmqctl cluster_status

后续操作

虽然已经搭建了集群,但是我们只能用两个内存节点提供服务,所以需要做一个负载均衡器。我们可以使用Nginx的tcp代理功能或者使用haproxy。

参考文档: http://objcoding.com/2018/10/19/rabbitmq-cluster/#top