ToB企服应用市场:ToB评测及商务社交产业平台

标题: Day 48 消息队列集群RabbitMQ [打印本页]

作者: 张裕    时间: 2024-7-27 05:46
标题: Day 48 消息队列集群RabbitMQ
消息队列集群-RabbitMQ

一、消息中间件

中间件
tomcat java web中间件 web容器 mysql
php php mysql
uwsgi python mysql
mycat 数据库中间件
rabbitMQ 消息中间件
1、简介

MQ 全称为(Message Queue消息队列)。是一种应用步伐对应用步伐的通讯方法。应用步伐通过读写出入队列的消息(针对应用步伐的数据)来通讯,而无需专用毗连来链接它们。
消息传递指的是步伐之间通过在消息中发送数据举行通讯,而不是通过直接调用相互来通讯。。队列的使用除去了接收和发送应用步伐同时执行的要求。
在项目中,通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通讯,将一些无需即时返回且耗时的操纵提取出来,举行了异步处置惩罚,而这种异步处置惩罚的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等。其能在不同平台之间举行通讯,常用来屏蔽各种平台协议之间的特性,实现应用步伐之间的协同。优点在于能够在客户端和服务器之间举行同步和异步的毗连,而且在任何时候都可以将消息举行传送和转发,是分布式系统中非常重要的组件,重要用来解决应用耦合、异步通讯、流量削峰等问题。
2、作用

1、消息中间件重要作用


2、消息中间件的两种模式

1、P2P模式

P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保存着消息,直到它们被消耗或超时。
P2P的特点:

2、Pub/Sub模式

Pub/Sub模式包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
Pub/Sub的特点:

3、常用中间件介绍与对比

1、Kafka

Kafka是LinkedIn开 源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka重要特点是基于Pull的模式来处置惩罚消息消耗,追求高吞吐量,一开始的目的就是用于日志网络和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严酷要求,得当产生大量数据的互联网服务的数据网络业务。
2、RabbitMQ

RabbitMQ是使用Erlang语言开辟的开源消息队列系统,基于AMQP协议来实现。AMQP的重要特性是面向消息、队列、路由(包罗点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据同等性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次
3、RocketMQ

RocketMQ是阿里开源的消息中间件,它是纯Java开辟,具有高吞吐量、高可用性、得当大规模分布式系统应用的特点。RocketMQ思绪劈头于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于生意业务、充值、流计算、消息推送、日志流式处置惩罚、binglog分发等场景。
RabbitMQ比Kafka可靠,Kafka更得当IO高吞吐的处置惩罚,一样寻常应用在大数据日志处置惩罚或对实时性(少量延迟)、可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志网络。
二、RabbitMQ 详解

1、RabbitMQ 介绍

对于一个大型的软件系统来说,它会有很多subsystem or Component or submodule。
那么这些模块是怎样通讯的?
这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不得当扩展(Scalability),假如使用socket那么不同的模块的确可以部署到不同的机器上,但照旧有很多问题需要解决。
比如:
1)信息的发送者和接收者怎样维持这个毗连,假如一方的毗连中断,这期间的数据怎样防止丢失?
2)怎样降低发送者和接收者的耦合度?
3)怎样让Priority高的接收者先接到数据?
4)怎样做到load balance?有用平衡接收者的负载?
5)怎样有用的将数据发送到相关的接收者?也就是说将接收者subscribe 不同的数据,怎样做有用的filter。
6)怎样做到可扩展,甚至将这个通讯模块发到cluster上?
7)怎样保证接收者接收到了完备,正确的数据?
  1. AMQP协议解决了以上的问题,而RabbitMQ实现了AMQP。
复制代码
AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件计划。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开辟语言等条件的限制。
**RabbitMQ 是一个在 AMQP(Advanced Message Queuing Protocol )基础上实现的,可复用的企业消息系统。**它可以用于大型软件系统各个模块之间的高效通讯,支持高并发,支持可扩展。它支持多种客户端如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX,长期化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
RabbitMQ是使用Erlang编写的一个开源的消息队列,自己支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更得当于企业级的开辟。它同时实现了一个Broker构架,这意味着消息在发送给客户端时先在中央队列列队,对路由(Routing)、负载平衡(Load balance)大概数据长期化都有很好的支持。
2、RabbitMQ 特点


3、RabbitMQ 概念及工作原理


RabbitMQ从团体上来看是一个典型的生产者消耗者模型,重要负责接收、存储和转发消息

AMQP模型中,消息在producer中产生,发送到MQ的exchange上,exchange根据设置的路由方式发到相应的Queue上,Queue又将消息发送给consumer,消息从queue到consumer有push和pull两种方式。
消息队列的使用过程大概如下:
exchange接收到消息后,就根据消息的key和已经设置的binding,举行消息路由,将消息投递到一个或多个队列里。 exchange也有几个类型,完全根据key举行投递的叫做Direct互换机,例如,绑定时设置了routing key为"abc",那么客户端提交的消息,只有设置了key为"abc"的才会投递到队列。
三、RabbitMQ 单机部署(了解)

1、安装 erlang

添加yum支持
  1. [root@qfedu.com ~]# cd /usr/local/src/
  2. [root@qfedu.com ~]# mkdir rabbitmq
  3. [root@qfedu.com ~]# cd rabbitmq
  4. [root@qfedu.com ~]# wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
  5. [root@qfedu.com ~]# rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
  6. [root@qfedu.com ~]# rpm --import http://packages.erlang-solutions.com/rpm/erlang_solutions.asc
  7. [root@qfedu.com ~]# yum install erlang -y
复制代码
2、安装RabbitMQ

用 yum 安装 RabbitMQ

注:直接使用epel源安装即可
  1. [root@qfedu.com ~]# rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
  2. # this example assumes the CentOS 7 version of the package
  3. [root@qfedu.com ~]# yum install rabbitmq-server-3.7.13-1.el7.noarch.rpm
复制代码
  1. [root@qfedu.com ~]# rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
  2. # this example assumes the CentOS 7 version of the package
  3. [root@qfedu.com ~]# yum install rabbitmq-server-3.7.13-1.el7.noarch.rpm
复制代码
2、用 rpm 手动安装

1、下载安装包

  1. [root@qfedu.com ~]# wget  https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.13/rabbitmq-server-3.7.13-1.el7.noarch.rpm
复制代码
2、安装

  1. [root@qfedu.com ~]# rpm -ivh rabbitmq-server-3.7.13-1.el7.noarch.rpm
复制代码
3、常用命令

  1. [root@qfedu.com ~]# service rabbitmq-server start
  2. [root@qfedu.com ~]# service rabbitmq-server stop
  3. [root@qfedu.com ~]# service rabbitmq-server restart
  4. [root@qfedu.com ~]# chkconfig rabbitmq-server on  //设置开机自启
复制代码
4、设置设置文件

  1. [root@qfedu.com ~]# cd /etc/rabbitmq
  2. [root@qfedu.com ~]# cp /usr/share/doc/rabbitmq-server-3.7.13/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
复制代码
5、设置用户长途访问

  1. [root@qfedu.com ~]# vim /etc/rabbitmq/rabbitmq.config
复制代码

去掉后面的逗号
6、开启web界面管理工具

  1. [root@qfedu.com ~]# rabbitmq-plugins enable rabbitmq_management
  2. [root@qfedu.com ~]# service rabbitmq-server restart
复制代码
3、客户端的简单介绍

1、界面的介绍

默认用户名和密码:guest guest

注意设置虚拟主机与添加用户这块。

关于虚拟主机,Virtual Host,实在是一个虚拟概念,雷同于权限控制组,一个Virtual Host里面可以有若干个Exchange和Queue,但是权限控制的最小粒度是Virtual Host
2、用户角色

可登陆管理控制台,可查看所有的信息,而且可以对用户,计谋(policy)举行操纵。
可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
可登陆管理控制台, 同时可以对policy举行管理。但无法查看节点的相关信息(上图红框标识的部门)。
仅可登陆管理控制台,无法看到节点信息,也无法对计谋举行管理。
无法登陆管理控制台,通常就是普通的生产者和消耗者。
3、RabbitMQ常用的命令

1、基本命令


2、用户和权限设置


3、角色说明


四、RabbitMQ 集群部署及设置

RabbitMQ一样寻常以集群方式部署,重要提供消息的担当和发送,实现各微服务之间的消息异步。以下将介绍RabbitMQ+HA方式举行部署。
1、原理介绍

RabbitMQ是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,以是rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统毗连RabbitMQ节点,在毗连过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过互换Erlang Cookie以获得认证)来实现的,以是部署Rabbitmq分布式集群时要先安装Erlang,并把此中一个服务的cookie复制到另外的节点。
RabbitMQ集群中,各个RabbitMQ为对等节点,即每个节点均提供给客户端毗连,举行消息的接收和发送。节点分为内存节点和磁盘节点,一样寻常的,均应创建为磁盘节点,为了防止机器重启后的消息消失;
RabbitMQ的Cluster集群模式一样寻常分为两种,普通模式和镜像模式。消息队列通过RabbitMQ HA镜像队枚举行消息队列实体复制。
普通模式下,以两个节点(rabbit01、rabbit02)为例来举行说明。对于Queue来说,消息实体只存在于此中一个节点rabbit01(大概rabbit02),rabbit01和rabbit02两个节点仅有雷同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消耗时,RabbitMQ会临时在rabbit01、rabbit02间举行消息传输,把A中的消息实体取出并颠末B发送给consumer。以是consumer应尽量毗连每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点创建物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
镜像模式下,将需要消耗的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实领会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消耗数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
2、部署 RabbitMQ Cluster

1、Rabbitmq 有 3 种模式,但集群模式是 2 种
具体如下:

2、环境准备及软件安装
  1. 3台centos7操作系统,ip分别为
  2. 192.168.120.138
  3. 192.168.120.139
  4. 192.168.120.140
复制代码
修改 hosts 文件 (3 台)
  1. [root@rabbitmq1 ~]# vim /etc/hosts
  2. 192.168.120.138 rabbitmq1
  3. 192.168.120.139 rabbitmq2
  4. 192.168.120.140 rabbitmq3
复制代码
安装 erlang 环境和rabbitmq-server (3 台)–centos7
  1. [root@rabbitmq1 ~]# yum install -y epel-release && yum -y install erlang socat 
  2. [root@rabbitmq1 ~]# yum -y install rabbitmq-server
  3. 编程:ruby erlang perl python shell c c++ php c# .net  js
  4. 标记语言: yaml xml html   
复制代码
安装 erlang 环境和rabbitmq-server (3 台)–centos-stream 8/9同配
设置官方yum源,本源设置来源于官方网站(Installing on RPM-based Linux (RedHat Enterprise Linux, CentOS, Fedora, openSUSE) — RabbitMQ)

从上面的网页入口找到如下内容

  1. [root@rabbitmq1 ~]# cat /etc/yum.repos.d/rebbitmq.repo
  2. # In /etc/yum.repos.d/rabbitmq.repo
  3. ##
  4. ## Zero dependency Erlang
  5. ##
  6. [rabbitmq_erlang]
  7. name=rabbitmq_erlang
  8. baseurl=https://packagecloud.io/rabbitmq/erlang/el/8/$basearch
  9. repo_gpgcheck=1
  10. gpgcheck=0
  11. enabled=1
  12. # PackageCloud's repository key and RabbitMQ package signing key
  13. gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
  14.        https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
  15. sslverify=1
  16. sslcacert=/etc/pki/tls/certs/ca-bundle.crt
  17. metadata_expire=300
  18. [rabbitmq_erlang-source]
  19. name=rabbitmq_erlang-source
  20. baseurl=https://packagecloud.io/rabbitmq/erlang/el/8/SRPMS
  21. repo_gpgcheck=1
  22. gpgcheck=0
  23. enabled=1
  24. # PackageCloud's repository key and RabbitMQ package signing key
  25. gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
  26.        https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
  27. sslverify=1
  28. sslcacert=/etc/pki/tls/certs/ca-bundle.crt
  29. metadata_expire=300
  30. ##
  31. ## RabbitMQ server
  32. ##
  33. [rabbitmq_server]
  34. name=rabbitmq_server
  35. baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/8/$basearch
  36. repo_gpgcheck=1
  37. gpgcheck=0
  38. enabled=1
  39. # PackageCloud's repository key and RabbitMQ package signing key
  40. gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
  41.        https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
  42. sslverify=1
  43. sslcacert=/etc/pki/tls/certs/ca-bundle.crt
  44. metadata_expire=300
  45. [rabbitmq_server-source]
  46. name=rabbitmq_server-source
  47. baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/8/SRPMS
  48. repo_gpgcheck=1
  49. gpgcheck=0
  50. enabled=1
  51. gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
  52. sslverify=1
  53. sslcacert=/etc/pki/tls/certs/ca-bundle.crt
  54. metadata_expire=300
复制代码
  1. [root@rabbitmq1 ~]# yum install rabbitmq-server -y
复制代码
启动服务 (3 台)
  1. [root@rabbitmq1 ~]# systemctl start rabbitmq-server.service
  2. [root@rabbitmq1 ~]# systemctl stop rabbitmq-server.service
  3. [root@rabbitmq1 ~]# systemctl enable rabbitmq-server.service
  4. [root@rabbitmq1 ~]# systemctl restart rabbitmq-server.service
复制代码
3、账号设置
安装启动后实在还不能在其它机器访问,rabbitmq 默认的 guest 账号只能在本地机器访问, 假如想在其它机器访问必须设置其它账号
设置管理员账号:
  1. # 可以创建管理员用户,负责整个 MQ 的运维
  2. [root@rabbitmq1 ~]# rabbitmqctl add_user admin admin
  3. # 赋予其 administrator 角色
  4. [root@rabbitmq1 ~]# rabbitmqctl set_user_tags admin administrator
  5. # 创建 RabbitMQ 监控用户,负责整个 MQ 的监控
  6. [root@rabbitmq1 ~]# rabbitmqctl add_user  user_monitoring  passwd_monitor  
  7. [root@rabbitmq1 ~]# rabbitmqctl set_user_tags user_monitoring monitoring
  8. # 创建某个项目的专用用户,只能访问项目自己的 virtual hosts
  9. [root@rabbitmq1 ~]# rabbitmqctl set_user_tags user_monitoring management
  10. # 创建和赋角色完成后查看并确认
  11. [root@rabbitmq1 ~]# rabbitmqctl list_users  
复制代码

4、启动 rabbitmq 内置 web 插件, 管理 rabbitmq 账号等信息 (3 台)
  1. [root@rabbitmq1 ~]# rabbitmq-plugins enable rabbitmq_management
  2. [root@rabbitmq1 ~]# systemctl restart rabbitmq-server
复制代码
访问 http:// 你的地址:15672
centos7使用用户guest、密码guest登录,这个账户拥有所有的权限
centos8使用用户admin、密码admin登录
页面如下:

5、rabbitmq 用户权限 VirtualHost(部署集群过程中不是必须的)
像 mysql 有数据库的概念而且可以指定用户对库和表等操纵的权限。那 RabbitMQ 呢?RabbitMQ 也有雷同的权限管理。在 RabbitMQ 中可以虚拟消息服务器 VirtualHost,每个 VirtualHost 相当于一个相对独立的 RabbitMQ 服务器,每个 VirtualHost 之间是相互隔离的。exchange、queue、message 不能互通。 在 RabbitMQ 中无法通过 AMQP 创建 VirtualHost,可以通过以下命令来创建
  1. [root@rabbitmq1 ~]# rabbitmqctl add_vhost [vhostname]
复制代码
通常在权限管理中重要包含三步:
1、新建用户
  1. [root@rabbitmq1 ~]# rabbitmqctl add_user superrd superrd
复制代码
2、设置权限
  1. set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
  2. [root@rabbitmq1 ~]# rabbitmqctl  set_permissions -p /  admin '.*' '.*' '.*'  
复制代码
此中,.* 的位置分别用正则表达式来匹配特定的资源,如:
  1. '^(amq.gen.*|amq.default)$'
复制代码
可以匹配 server 天生的和默认的 exchange,’^$’不匹配任何资源

示例:我们赋予 superrd 在“/”下面的全部资源的设置和读写权限。
  1. [root@rabbitmq1 ~]# rabbitmqctl set_permissions -p / superrd ".*" ".*" ".*"
复制代码
注意”/”代表 virtual host 为“/”这个“/”和 linux 里的根目录是有区别的并不是 virtual host 为“/”可以访问以是的 virtual host,把这个“/”明确成字符串就行。
需要注意的是 RabbitMQ 会缓存每个 connection 或 channel 的权限验证效果、因此权限发生变化后需要重连才华见效。
3、查看权限
  1. [root@rabbitmq1 ~]# rabbitmqctl list_user_permissions admin
  2. [root@rabbitmq1 ~]# rabbitmqctl list_permissions -p /
复制代码
4、设置角色
  1. [root@rabbitmq1 ~]# rabbitmqctl set_user_tags [user] [role]
复制代码
RabbitMQ 中的角色分为如下五类:none、management、policymaker、monitoring、administrator
官方解释如下:
  1. management
  2. User can access the management plugin
  3. policymaker
  4. User can access the management plugin and manage policies and parameters for the vhosts they have access to.
  5. monitoring
  6. User can access the management plugin and see all connections and channels as well as node-related information.
  7. administrator
  8. 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 角色。
  1. [root@rabbitmq1 ~]# rabbitmqctl set_user_tags superrd administrator
复制代码
3、搭建 rabbitmq 的一样寻常模式集群

在上述的 3 台机器上安装 rabbitmq 完成之后,你可以看到你的机器中有如下 1 个文件。路径在 $HOME 中大概在 /var/lib/rabbitmq 中,文件名称为.erlang.cookie, 他是一个潜伏文件。那么这文件存储的内容是什么,是做什么用的呢?
RabbitMQ 的集群是依靠 erlang 集群,而 erlang 集群是通过这个 cookie 举行通讯认证的,因此我们做集群的第一步就是干 cookie。
1、统一 erlang.cookie 文件中 cookie 值

必须使集群中也就是rabbitmq2,rabbitmq3这两台机器的.erlang.cookie 文件中 cookie 值同等,且权限为 owner 只读。
  1. # 复制 rabbitmq1 中 /var/lib/rabbitmq/.erlang.cookie 的内容到 rabbitmq2 rabbitmq3 相同的内容
  2. [root@rabbitmq2 ~]# chmod 600 /var/lib/rabbitmq/.erlang.cookie
复制代码
2、查看集群状态

我的是已经做好的
  1. [root@rabbitmq1 rabbitmq]#  rabbitmqctl status
  2. Status of node rabbit@rabbitmq1
  3. [{pid,17572},
  4. {running_applications,
  5.      [{rabbitmq_management,"RabbitMQ Management Console","3.6.15"},
  6.       {rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.6.15"},
  7.       {rabbitmq_management_agent,"RabbitMQ Management Agent","3.6.15"},
  8.       {rabbit,"RabbitMQ","3.6.15"},
  9.       {amqp_client,"RabbitMQ AMQP Client","3.6.15"},
  10.       {rabbit_common,
  11.           "Modules shared by rabbitmq-server and rabbitmq-erlang-client",
  12.           "3.6.15"},
  13.       {recon,"Diagnostic tools for production use","2.3.2"},
  14.       {os_mon,"CPO  CXC 138 46","2.2.14"},
  15.       {cowboy,"Small, fast, modular HTTP server.","1.0.4"},
  16.       {ranch,"Socket acceptor pool for TCP protocols.","1.3.2"},
  17.       {ssl,"Erlang/OTP SSL application","5.3.3"},
  18.       {public_key,"Public key infrastructure","0.21"},
  19.       {cowlib,"Support library for manipulating Web protocols.","1.0.2"},
  20.       {crypto,"CRYPTO version 2","3.2"},
  21.       {inets,"INETS  CXC 138 49","5.9.8"},
  22.       {mnesia,"MNESIA  CXC 138 12","4.11"},
  23.       {compiler,"ERTS  CXC 138 10","4.9.4"},
  24.       {xmerl,"XML parser","1.3.6"},
  25.       {syntax_tools,"Syntax tools","1.6.13"},
  26.       {asn1,"The Erlang ASN1 compiler version 2.0.4","2.0.4"},
  27.       {sasl,"SASL  CXC 138 11","2.3.4"},
  28.       {stdlib,"ERTS  CXC 138 10","1.19.4"},
  29.       {kernel,"ERTS  CXC 138 10","2.16.4"}]},
  30. {os,{unix,linux}},
  31. {erlang_version,
  32.      "Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:2:2] [async-threads:64] [hipe] [kernel-poll:true]\n"},
  33. {memory,
  34.      [{connection_readers,0},
  35.       {connection_writers,0},
  36.       {connection_channels,0},
  37.       {connection_other,2800},
  38.       {queue_procs,2800},
  39.       {queue_slave_procs,0},
  40.       {plugins,1471200},
  41.       {other_proc,23282232},
  42.       {metrics,142320},
  43.       {mgmt_db,526352},
  44.       {mnesia,84160},
  45.       {other_ets,2372704},
  46.       {binary,890656},
  47.       {msg_index,40536},
  48.       {code,27114499},
  49.       {atom,992409},
  50.       {other_system,22458876},
  51.       {allocated_unused,9790936},
  52.       {reserved_unallocated,2389504},
  53.       {total,91561984}]},
  54. {alarms,[]},
  55. {listeners,[{clustering,25672,"::"},{amqp,5672,"::"},{http,15672,"::"}]},
  56. {vm_memory_calculation_strategy,rss},
  57. {vm_memory_high_watermark,0.4},
  58. {vm_memory_limit,1589890252},
  59. {disk_free_limit,50000000},
  60. {disk_free,33908043776},
  61. {file_descriptors,
  62.      [{total_limit,204700},
  63.       {total_used,2},
  64.       {sockets_limit,184228},
  65.       {sockets_used,0}]},
  66. {processes,[{limit,1048576},{used,330}]},
  67. {run_queue,0},
  68. {uptime,2934},
  69. {kernel,{net_ticktime,60}}]
  70. [root@rabbitmq1 rabbitmq]# rabbitmqctl cluster_status
  71. Cluster status of node rabbit@rabbitmq1
  72. [{nodes,[{disc,[rabbit@rabbitmq1]},{ram,[rabbit@rabbitmq3,rabbit@rabbitmq2]}]},
  73. {running_nodes,[rabbit@rabbitmq3,rabbit@rabbitmq2,rabbit@rabbitmq1]},
  74. {cluster_name,<<"rabbit_cluster">>},
  75. {partitions,[]},
  76. {alarms,[{rabbit@rabbitmq3,[]},{rabbit@rabbitmq2,[]},{rabbit@rabbitmq1,[]}]}]
  77. [root@rabbitmq1 rabbitmq]#
复制代码
3、Rabbitmq 集群添加节点

重启 rabbitmq1机器中 rabbitmq 的服务
在 rabbitmq2,rabbitmq3 分别执行
  1. [root@rabbitmq2 ~]# systemctl restart rabbitmq-server.service
  2. [root@rabbitmq2 ~]# rabbitmqctl stop_app
  3. [root@rabbitmq2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq1
  4. [root@rabbitmq2 ~]# rabbitmqctl start_app
  5. [root@rabbitmq2 ~]# rabbitmq-plugins enable rabbitmq_management
复制代码
4、打开网页管理页面查看 nodes


如此便可以啦,你可以做下测试,验证下我们序言中说的普通模式的说明,那必须是杠杠对的。
4、搭建 rabbitmq 的镜像高可用模式集群

这一节要参考的文档是:http://www.rabbitmq.com/ha.html
首先镜像模式要依靠policy模块,这个模块是做什么用的呢?
policy中文来说是政策,计谋的意思,那么他就是要设置,那些Exchanges大概queue的数据需要复制,同步,怎样复制同步?对就是做这些的。
  1. [root@rabbitmq1 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
复制代码
参数意思为:
ha-all:为计谋名称。
:为匹配符,只有一个代表匹配所有,^zlh为匹配名称为zlh的exchanges大概queue。
ha-mode:为匹配类型,他分为3种模式:

参考示例如下

当然在web管理界面也能设置:

设置完看队列如下,此中表示ha-haall的说明用我的ha-haall计谋啦,属于镜像模式,没有表示的就是普通模式:

五、Rabbitmq 附录

RabbitMQ 常用的三种自定义服务器的通用方法:

rabbitmq.conf和rabbitmq-env.conf的位置

假如rabbitmq.conf和rabbitmq-env.conf 的两个文件不存在,那么我们可以创建该文件,然后我们可以通过环境变量
指定该文件的位置。
补充 :

1、 rabbitmq.conf

在rabbitmq 3.7.0 之前,rabbitmq.conf 使用了Erlang语法设置格式,新的版本使用了sysctl 格式.
sysctl 语法:

设置示例文件:rabbitmq.conf.example
设置属性和形貌(官网链接)
属性形貌默认值listeners要监听 AMQP 0-9-1 and AMQP 1.0 的端口listeners.tcp.default = 5672num_acceptors.tcp担当tcp毗连的erlang 进程数num_acceptors.tcp = 10handshake_timeoutAMQP 0-9-1 超时时间,也就是最大的毗连时间,单位毫秒handshake_timeout = 10000listeners.ssl启用TLS的协议默认值为nonenum_acceptors.ssl担当基于TLS协议的毗连的erlang 进程数num_acceptors.ssl = 10ssl_optionsTLS 设置ssl_options =nonessl_handshake_timeoutTLS 毗连超时时间 单位为毫秒ssl_handshake_timeout = 5000vm_memory_high_watermark触发流量控制的内存阈值,可以为相对值(0.5),大概绝对值 vm_memory_high_watermark.relative = 0.6 ,vm_memory_high_watermark.absolute = 2GB默认vm_memory_high_watermark.relative = 0.4vm_memory_calculation_strategy内存使用报告计谋,assigned:使用Erlang内存分配器统计信息 rss:使用操纵系统RSS内存报告。这使用特定于操纵系统的方法,并可能启动短期子进程。legacy:使用遗留内存报告(运行时认为将使用多少内存)。这种计谋相当不正确。erlang 与legacy一样 是为了向后兼容vm_memory_calculation_strategy = allocatedvm_memory_high_watermark_paging_ratio当内存的使用达到了50%后,队列开始将消息分页到磁盘vm_memory_high_watermark_paging_ratio = 0.5total_memory_available_override_value该参数用于指定系统的可用内存总量,一样寻常不使用,适用于在容器等一些获取内存现实值不精确的环境默认未设置disk_free_limitRabbitmq存储数据的可用空间限制,当低于该值的时候,将触发流量限制,设置可参考vm_memory_high_watermark参数disk_free_limit.absolute = 50MBlog.file.level控制记载日志的等级,有info,error,warning,debuglog.file.level = infochannel_max最大通道数,但不包含协议中使用的特殊通道号0,设置为0表示无穷制,不建议使用该值,容易出现channel泄漏channel_max = 2047channel_operation_timeout通道操纵超时,单位为毫秒channel_operation_timeout = 15000heartbeat表示毗连参数协商期间服务器建议的心跳超时的值。假如两端都设置为0,则禁用心跳,不建议禁用heartbeat = 60default_vhostrabbitmq安装后启动创建的虚拟主机default_vhost = /default_user默认创建的用户名default_user = guestdefault_pass默认用户的密码default_pass = guestdefault_user_tags默认用户的标签default_user_tags.administrator = truedefault_permissions在创建默认用户是分配给默认用户的权限default_permissions.configure = .* default_permissions.read = .* default_permissions.write = .*loopback_users允许通过回环地址毗连到rabbitmq的用户列表,假如要允许guest用户长途毗连(不安全)请将该值设置为none,假如要将一个用户设置为仅localhost毗连的话,设置loopback_users.username =true(username要更换成用户名)loopback_users.guest = true(默认为只能本地毗连)cluster_formation.classic_config.nodes设置集群节点cluster_formation.classic_config.nodes.1 = rabbit@hostname1cluster_formation.classic_config.nodes.2 = rabbit@hostname2默认为空,未设置collect_statistics统计网络模式,none 不发出统计信息事件,coarse每个队列毗连都发送统计一次,fine每发一条消息的统计数据collect_statistics = nonecollect_statistics_interval统计信息网络隔断,以毫秒为单位collect_statistics_interval = 5000delegate_count用于集群内通讯的委托进程数。在多核的服务器上我们可以增长此值delegate_count = 16tcp_listen_options默认的套接字选项tcp_listen_options.backlog = 128 …hipe_compile设置为true以使用HiPE预编译RabbitMQ的部门,HiPE是Erlang的即时编译器,启用HiPE可以提高吞吐量两位数,但启动时会延迟几分钟。Erlang运行时必须包含HiPE支持。假如不是,启用此选项将不起作用。HiPE在某些平台上根本不可用,尤其是Windows。hipe_compile = falsecluster_keepalive_interval节点应该多长时间向其他节点发送keepalive消息(以毫秒为单位),keepalive的消息丢失不会被视为关闭cluster_keepalive_interval = 10000queue_index_embed_msgs_below消息的字节大小,低于该大小,消息将直接嵌入队列索引中 bytesqueue_index_embed_msgs_below = 4096mnesia_table_loading_retry_timeout期待集群中Mnesia表可用的超时时间,单位毫秒mnesia_table_loading_retry_timeout = 30000mnesia_table_loading_retry_limit集群启动时期待Mnesia表的重试次数,不适用于Mnesia升级或节点删除。mnesia_table_loading_retry_limit = 10mirroring_sync_batch_size要在队列镜像之间同步的消息的批处置惩罚大小mirroring_sync_batch_size = 4096queue_master_locator队列主节点的计谋,有三大计谋 min-masters,client-local,randomqueue_master_locator = client-localproxy_protocol假如设置为true ,则毗连需要通过反向署理毗连,不能直毗连proxy_protocol = falsemanagement.listener.portrabbitmq web管理界面使用的端口management.listener.port = 15672 查看rabbitmq的有用设置
  1. [root@rabbitmq1 ~]# rabbitmqctl environment
复制代码
2、advanced.config

示例文件
某些设置设置不可用或难以使用sysctl格式举行设置。因此,可以使用Erlang术语格式的其他设置文件advanced.config
它将与rabbitmq.conf 文件中提供的设置归并。
设置属性和形貌(官网链接)
属性形貌默认值msg_store_index_module设置队列索引使用的模块{rabbit,[ {msg_store_index_module,rabbit_msg_store_ets_index} ]}backing_queue_module队列内容的实现模块。{rabbit,[ {backing_queue_module,rabbit_variable_queue} ]}msg_store_file_size_limit消息储存的文件大小,现有的节点更改是危险的,可能导致数据丢失默认值16777216trace_vhosts内部的tracer使用,不建议更改{rabbit,[ {trace_vhosts,[]} ]}msg_store_credit_disc_bound设置消息储存库给队列进程的积分,默认一个队列进程被赋予4000个消息积分{rabbit, [{msg_store_credit_disc_bound, {4000, 800}}]}queue_index_max_journal_entries队列的索引日志超过该阈值将刷新到磁盘{rabbit, [{queue_index_max_journal_entries, 32768}]}lazy_queue_explicit_gc_run_operation_threshold在内存压力下为延迟队列设置的值,该值可以触发垃圾回收和减少内存使用,降低该值,会降低性能,提高该值,会导致更高的内存消耗{rabbit,[{lazy_queue_explicit_gc_run_operation_threshold, 1000}]}queue_explicit_gc_run_operation_threshold在内存压力下,正常队列设置的值,该值可以触发垃圾回收和减少内存使用,降低该值,会降低性能,提高该值,会导致更高的内存消耗{rabbit, [{queue_explicit_gc_run_operation_threshold, 1000}]} 3、rabbitmq-env.conf

官网链接
通过rabbitmq-env.conf 来定义环境变量
RABBITMQ_NODENAME 指定节点名称
属性形貌默认值RABBITMQ_NODE_IP_ADDRESS绑定的网络接口默认为空字符串表示绑定本机所有的网络接口RABBITMQ_NODE_PORT端口默认为5672RABBITMQ_DISTRIBUTION_BUFFER_SIZE节点之间通讯毗连的数据缓冲区大小默认为128000,该值建议不要使用低于64MBRABBITMQ_IO_THREAD_POOL_SIZE运行时用于io的线程数建议不要低于32,linux默认为128 ,windows默认为64RABBITMQ_NODENAMErabbitmq节点名称,集群中要注意节点名称唯一linux 默认节点名为 rabbit@$hostnameRABBITMQ_CONFIG_FILErabbitmq 的设置文件路径,注意不要加文件的后缀(.conf)默认 $RABBITMQ_HOME/etc/rabbitmq/rabbitmq(二进制安装) /etc/rabbitmq/rabbitmq(rpm 安装)RABBITMQ_ADVANCED_CONFIG_FILEadvanced.config文件路径默认 $RABBITMQ_HOME/etc/rabbitmq/advanced(二进制安装) /etc/rabbitmq/advanced(rpm 安装)RABBITMQ_CONF_ENV_FILE环境变量设置文件路径默认 $RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf(二进制安装) /etc/rabbitmq/rabbitmq-env.conf(rpm 安装)RABBITMQ_SERVER_CODE_PATH在使用HiPE 模块时需要使用默认为空RABBITMQ_LOGS指定日志文件位置默认为 $RABBITMQ_HOME/etc/var/log/rabbitmq/ 网络设置 http://www.rabbitmq.com/networking.html
RABBITMQ_DISTRIBUTION_BUFFER_SIZE 节点间通讯缓冲区大小,默认值 128Mb,节点流量比较多的集群中,可以提升该值,建议该值不要低于64MB。
tcp 缓存区大小
下示例将AMQP 0-9-1毗连的TCP缓冲区设置为192 KiB:
  1. tcp_listen_options.backlog = 128
  2. tcp_listen_options.nodelay = true
  3. tcp_listen_options.linger.on = true
  4. tcp_listen_options.linger.timeout = 0
  5. tcp_listen_options.sndbuf = 196608
  6. tcp_listen_options.recbuf = 196608
复制代码
4、在生产环境中不适用的计谋

官网链接
1、 vhost

在生产中,假如rabbitmq只为单个系统提供服务的时候,我们使用默认的(/)是可以的。在为多个系统提供的服务时,我们建议使用单独的vhost.
2、 user

对于生产环境,请删除默认用户(guest),默认用户只能从localhost 毗连。
我们可以创建指定权限的单独用户为每个应用提供服务。对于开启权限用户来说,我们可以使用证书,和源ip地址过滤,和身份验证。来加强安全性。
3、最大打开文件限制

在生产环境我们可能需要调整一些系统的默认限制,以便处置惩罚大量的并发毗连和队列。
需要调整的值有打开的最大文件数。在生产环境为rabbitmq 运行的用户设定为65536,但是对于大多数开辟环境来说,4096就已经足够了。
查看默认的打开文件的最大数目。
  1. [root@rabbitmq1 ~]# ulimit -n
复制代码
1、临时修改

  1. [root@rabbitmq1 ~]# ulimit -n
  2. 65536
复制代码
2、永久修改


  1. [service]
  2. LimitNOFILE=300000
复制代码

3、内存

当rabbitmq 检测到它使用的内存超过系统的40%,它将不会担当任何新的消息,这个值是由参数 vm_memory_high_watermark来控制的,默认值是一个安全的值,修改该值需要注意。 rabbitmq 的至少需要128MB,建议vm_memory_high_watermark 值为 0.4~0…66 ,不要使用大于0.7的值。
4、磁盘

磁盘默认的储存数据阈值是50MB,当低于该值的时候,将触发流量限制。50MB 只适用于开辟环境,生产环境需要调高该值,否则容易由磁盘空间不足导致节点故障,也可能导致数据丢失。
在生产环境中我们设置的值

它是基于mem_relative的值,例如在具有4GB内存的rabbitmq主机上,那么该磁盘的阈值就是4G,假如磁盘可用空间低于4G,所有生产者和消息都将拒绝。在允许规复发布之前,通常需要消耗者将队列消息消耗完。

在具有4GB内存的RabbitMQ节点上,假如可用磁盘空间低于6GB,则所有新消息都将被阻止,但是假如我们在停止的时候rabbitmq需要储存4GB的数据到磁盘,再下一次启动的时候,就只有2G空间了。

5、毗连

少使用短毗连,使用毗连池大概长毗连。
6、TLS

建议尽可能使用TLS毗连,使用TLS会对传输的数据加密,但是对系统的吞吐量产生很大的影响
7、更改默认端口

我们常用的web界面的端口 15672 和AMQP 0-9-1 协议端口 5672 ,建议更改,web界面更改,设置参数 management.listener.port ,AMQP 0-9-1 协议端口设置参数 listeners.tcp.default。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4