目录
消息队列的两种工作模式及缺点
一、CentOS7下安装RabbitMQ(单机)
1:安装erlang
2:安装RabbitMQ
3:启动RabbitMQ
4:开启web管理控制台
5:Nginx代理
二、rabbitmq常用命令
1:虚拟机管理
2:用户管理
4:插件管理
5:限制
6:其他
三、RabbitMQ集群
部署集群
(1)配置hosts以及hostname
(2)关闭selinux以及firewalld
(3)安装rabbitmq(三台机器都要安装)
(4)启动服务
(5)安装management插件,重启服务
(7)分配节点
目前主流的几大消息队列有:RabbitMQ、ActiveMQ、RocketMQ、Kafka、ZeroMQ等,也有一些小众的比如Beanstalk
角色 | 名词 |
Broker | Kafka集群包含一个或多个服务器,每个服务器被称为broker(经纪人)
|
Topic | 每条发布到Kafka集群的消息都有一个分类,这个类别被称为Topic(主题)
|
Producer | 指消息的生产者,负责发布消息到kafka broker
|
Consumer | 指消息的消费者,从kafka broker拉取数据,并消费这些已发布的消息
|
Queue |
|
Message | 消息,通信的基本单位,每个producer可以向一个topic发布一些消息
|
RabbitMQ术语 | |
生产者 | 产生消息的进程或服务 |
消费者 | 接收消息的进程或服务 |
队列 | RabbitMQ是消息队列中间件,而真正储存消息数据的就是队列,队列可以有很多 |
交换器 | 类似于网络设备交换机,它可以根据不同的关键字,将消息发送到不同的队列 |
虚拟主机 | 虚拟主机提供了资源的逻辑分组和分隔,每一个虚拟主机本质上是mini版的RabbitMQ服务器,他们有用自己的连接、队列、绑定、交换器,更重要的是有用自己的权限机制,这有点类似服务器和运行在服务器上的虚拟机一样 |
//先用阿里云的仓库 rm -rf /etc/yum.repos.d/* curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo yum clean all [root@localhost ~]# yum -y install erlang
[root@localhost ~]# yum -y install rabbitmq-server
[root@localhost ~]# systemctl start rabbitmq-server ## 监听端口为4369,25672 [root@localhost ~]# ps aux |grep rabbit ## 查看rabbit进程 [root@localhost ~]# netstat -lntp ## 查看监听端口
[root@localhost ~]# rabbitmq-plugins enable rabbitmq_management ##激活插件 [root@localhost ~]# rabbitmq-plugins list ## 查看所有插件 [root@localhost ~]# systemctl restart rabbitmq-server 此时可以通过 http://ip:15672 来访问rabbitmq的web管理控制台,用户名密码都是guest,但是有个限制,只允许127.0.0.1访问, 所以还需在本机配置一个nginx代理
[root@localhost ~]# yum install -y epel-release ##安装可扩展源 [root@localhost ~]# yum install -y nginx ##安装nginx vi /etc/nginx/conf.d/rabbitmq.conf ##内容如下 server { listen 80; server_name www.fllrabbit.com; #域名自定义,如果没有dns解析,只能绑定hosts location / { proxy_pass http://127.0.0.1:15672; proxy_set_header Host $host; ##指定主机名,$host就是server_name proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ##后两行为了在访问日志中显示真正客户端的ip,而不是代理的ip } } [root@localhost ~]# systemctl start nginx ##启动或重启nginx服务 现在可以通过宿主机绑定hosts,然后通过浏览器访问rabbit,账号密码都是:guest
[root@localhost ~]# rabbitmqctl list_vhosts ##列出所有的虚拟主机 [root@localhost ~]# rabbitmqctl add_vhost fll ##创建名字叫fll的虚拟主机 [root@localhost ~]# rabbitmqctl delete_vhost fll ##删除名字叫fll的虚拟主机 rabbitmqctl add_vhost <虚拟主机名字> #创建虚拟主机 rabbitmqctl delete_vhost <虚拟主机名字> #删除虚拟主机
[root@localhost ~]# rabbitmqctl add_user user1 user1_passwd ##创建user1用户,密码为user1_passwd [root@localhost ~]# rabbitmqctl list_users ##列出所有用户 [root@localhost ~]# rabbitmqctl change_password user1 new_passwd ##更改user1的密码为new_passwd [root@localhost ~]# rabbitmqctl delete_user user1 #删除user1用户 rabbitmqctl list_users #列出用户 rabbitmqctl add_user #创建用户 rabbitmqctl change_password ##更改用户密码 rabbitmqctl delete_user #删除用户 rabbitmqctl clear_password #清除用户密码
[root@localhost ~]# rabbitmqctl set_user_tags user1 managemnet ##赋予user1用户management角色 [root@localhost ~]# rabbitmqctl set_user_tags user2 monitoring management ##同时赋予多个角色 [root@localhost ~]# rabbitmqctl set_permissions -p fll user1 '.*' '.*' '.*' ##针对fll虚拟主机给user1用户设置所有的配置、读写queue和exchange的权限。默认是没有任何权限的 rabbitmqctl set_user_tags #赋予用户某个角色 rabbitmqctl set_permissions -p #给用户设置权限 [root@localhost ~]# rabbitmqctl list_user_permissions user1 ##列出user1的权限 [root@localhost ~]# rabbitmqctl list_permissions -p fll ##列出fll下的所有用户权限 [root@localhost ~]# rabbitmqctl clear_permissions -p fll user2 ##清除user2在fll上的权限 rabbitmqctl list_user_permissions #列出某用户的权限,即该用户对哪个虚拟主机有权限 rabbitmqctl list_permissions -p #列出指定虚拟主机下所有用户的权限,即哪些用户对该虚拟主机有权限 rabbitmqctl clear_permissions -p #清除某用户在指定虚拟机上的授权
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 #查看运行信息
主机名 | Ip | 节点类型 |
centos01 | 192.168.10.101 | 磁盘节点 |
Centos02 | 192.168.10.102 | 内存节点 |
Centos03 | 192.168.10.103 | 内存节点 |
三台机器设置hostname hostnamectl set-hostname centos01 hostnamectl set-hostname centos02 hostnamectl set-hostname centos03 三台机器上都需要编辑如下hosts 192.168.10.101 centos01 192.168.10.102 centos02 192.168.10.103 centos03
三台机器都要执行 setenforce 0 systemctl stop firewalld systemctl disable firewalld //设置永久关闭
//先用阿里云的仓库 rm -rf /etc/yum.repos.d/* curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo yum clean all [root@centos01 ~]# yum -y install erlang ... [root@centos01 ~]# yum -y install rabbitmq-server
三台机器都启动起来 systemctl start rabbitmq-server systemctl enable rabbitmq-server //可以永久开启rabbitmq服务 ps aux | grep rabbit //用ps命令查询rabbit进程
三台机器都要开启 rabbitmq-plugins enable rabbitmq_management systemctl restart rabbitmq-server
//确保集群节点能够相互认证,如果.erlang.cookie文件不一致,节点间将无法建立信任关系,从而无法正常加入集群 cat /var/lib/rabbitmq/.erlang.cookie 在centos01上操作(其实任何一个上都可以) scp /var/lib/rabbitmq/.erlang.cookie root@centos02:/var/lib/rabbitmq/ scp /var/lib/rabbitmq/.erlang.cookie root@centos03:/var/lib/rabbitmq/ [root@centos01 ~]# reboot //重启三台主机,然后检查三台主机的RabbitMQ服务,正常情况下是都在运行的 [root@centos01 ~]# ps aux | grep rabbit
centos01为磁盘节点,centos02和centos03为内存节点 centos02和centos03上都执行: 停止rabbitmq systemctl start rabbitmq-server rabbitmqctl stop_app 将centos02、03作为内存节点连接到centos01 rabbitmqctl join_cluster --ram rabbit@centos01 开启rabbitmq rabbitmqctl start_app 查看集群状态 rabbitmqctl cluster_status Cluster status of node rabbit@mq02 ... [{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]}, {running_nodes,[rabbit@mq03,rabbit@mq01,rabbit@mq02]}, {cluster_name,<<"rabbit@mq02">>}, {partitions,[]}] ...done. // disc:表示磁盘节点 // ram:表示内存节点