date: 2020-12-18title: Rabbitmq 3.8.6部署 #标题
tags: rabbitmq #标签
categories: MQ # 分类

最近项目上要用到Rabbitmq,特此记录下部署过程。
参考文档:

环境准备

OS IP HostName roles
CentOS 7.7 192.168.20.2 master1 master
CentOS 7.7 192.168.20.3 master2 slave

配置erlang环境

rabbitmq的运行依赖与erlang环境,故需先配置erlang环境,rabbitmq和erlang有版本要求,请参考Rabbitmq和erlang对应版本选择合适的版本。我这里选择的为 erlang版本为:23.0, rabbitmq版本为: 3.8.6。

下面的所有操作使用root用户执行,没有特别说明的均是两台节点都要执行的。

  1. # 安装依赖
  2. $ yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel ncurses-devel
  3. # 下载erlang 23.0
  4. $ wget http://erlang.org/download/otp_src_23.0.tar.gz
  5. # 官网下载较慢,可从我百度网盘中提取。
  6. # 链接:https://pan.baidu.com/s/16ayQ5g8qejt_Iq-O6XpwzQ
  7. # 提取码:bm0s
  8. $ tar zxf otp_src_23.0.tar.gz
  9. $ cd otp_src_23.0
  10. $ ./configure --prefix=/apps/usr/erlang_23.0 --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe
  11. $ make && make install
  12. # 配置环境变量(先把rabbitmq的也配置上)
  13. $ cat >> /etc/profile << EOF
  14. PATH=/apps/usr/erlang_23.0/bin:/apps/usr/rabbitmq_3.8.6/sbin:\${PATH}
  15. EOF
  16. $ source /etc/profile
  17. $ erl # 执行此指令,进入以下环境说明erlang配置完成。
  18. Erlang/OTP 23 [erts-11.0] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [hipe]
  19. Eshell V11.0 (abort with ^G)
  20. 1>

部署rabbitmq 3.8.6

rabbitmq所用端口

rabbitmq可能会用到以下端口(参考:官方文档):

  • 4369:epmd,RabbitMQ节点和CLI工具使用的对等发现服务
  • 5672、5671:由不带TLS和带TLS的AMQP 0-9-1和1.0客户端使用
  • 25672:用于节点间和CLI工具通信(Erlang分发服务器端口),并从动态范围分配(默认情况下限制为单个端口,计算为AMQP端口+ 20000)。除非确实需要这些端口上的外部连接(例如,群集使用联合身份验证或在子网外部的计算机上使用CLI工具),否则这些端口不应公开。有关详细信息,请参见网络指南。
  • 35672-35682:由CLI工具(Erlang分发客户端端口)用于与节点进行通信,并从动态范围(通过服务器分发端口+ 10010计算为服务器分发端口+ 10000)分配。
  • 15672:HTTP API客户端,管理UI和Rabbitmqadmin (仅在启用管理插件的情况下)
  • 61613、61614:不带TLS和带TLS的STOMP客户端(仅在启用STOMP插件的情况下)
  • 1883、8883 :(如果启用了MQTT插件,则不带有TLS和带有TLS的MQTT客户端
  • 15674:STOMP-over-WebSockets客户端(仅在启用了Web STOMP插件的情况下)
  • 15675:MQTT-over-WebSockets客户端(仅在启用Web MQTT插件的情况下)
  • 15692:Prometheus指标(仅在启用Prometheus插件的情况下)
  1. # 调整防火墙策略(已关闭的可忽略)
  2. $ firewall-cmd --permanent --add-port={5672,4369,25672,15672,35672}/tcp
  3. $ firewall-cmd --reload
  4. # 配置hosts文件(rabbitmq使用主机名来通信的,所以必须可以互相解析)
  5. cat >> /etc/hosts << EOF
  6. 192.168.20.2 master1
  7. 192.168.20.3 master2
  8. EOF
  9. # 修改系统最大可使用文件数及进程数(需重新登录终端生效)
  10. cat >> /etc/security/limits.conf << EOF
  11. * - nofile 655360
  12. * - memlock unlimited
  13. * - stack 655360
  14. * - nproc unlimited
  15. EOF
  16. # 创建普通用户,用于管理rabbitmq,已有或允许直接使用root则不用创建
  17. $ useradd sysadmin
  18. $ echo 123.com | passwd --stdin sysadmin
  19. # 创建rabbitmq家目录
  20. $ mkdir -p /apps/usr/rabbitmq_3.8.6
  21. $ chown sysadmin /apps/usr/rabbitmq_3.8.6/
  22. # 切换至普通用户进行接下来的操作
  23. $ su - sysadmin
  24. # 下载并解压
  25. $ wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.6/rabbitmq-server-generic-unix-3.8.6.tar.xz
  26. # 同样,下载较慢,下面是我网盘连接,可以从我网盘下载
  27. 链接:https://pan.baidu.com/s/1DDLAdTr4S1adoch_YtQ0fQ
  28. 提取码:plv8
  29. $ tar xf rabbitmq-server-generic-unix-3.8.6.tar.xz -C /apps/usr/rabbitmq_3.8.6/ --strip-components=1
  30. $ cd /apps/usr/rabbitmq_3.8.6/
  31. # 修改配置文件
  32. $ cat >> etc/rabbitmq/rabbitmq.conf << EOF
  33. listeners.tcp.default = 5672
  34. num_acceptors.tcp = 10
  35. handshake_timeout = 10000
  36. vm_memory_high_watermark.relative = 0.4
  37. vm_memory_high_watermark_paging_ratio = 0.75
  38. #management.path_prefix = /rabbitmq
  39. EOF

部分配置文件解释如下:

  • listeners.tcp.default: broker 监听端口;
  • vm_memory_high_watermark.relative = 0.4: 内存超过系统总内存的百分之40后,将阻止producer写入消息,直至积压数据被消费,内存释放后恢复正常。
  • vm_memory_high_watermark_paging_ratio = 0.75: 假设系统总内存为16G,上面定义了0.4,则表示rabbitmq在使用6.4G内存(16 X 0.4)的四分之三时,也就是4.8G内存时,开始将数据写入磁盘,并释放内存中的数据。
  • management.path_prefix = /rabbitmq:如果你需要使用nginx来代理rabbitmq,并且nginx需要配置路径匹配,则需要增加此配置,此配置是指定匹配的路径,比如这里的配置,也就必须在nginx的localtion规则上匹配 /rabbitmq。

其实个人感觉,rabbitmq大多数参数都无需配置,使用其默认值即可,但vm_memory_high_watermark.relativevm_memory_high_watermark_paging_ratio这两个参数最好配置下,也可以了解下rabbitmq的部分工作原理。这两个参数的详细解释,可以参考官方文档

启动master1主机节点

以下操作在master1主机操作即可

  1. # 开启rabbitmq的web管理页面
  2. $ rabbitmq-plugins enable rabbitmq_management
  3. $ rabbitmq-server -detached # 启动
  4. $ ss -lnput | grep 5672 # 确定端口在监听
  5. tcp LISTEN 0 128 *:25672 *:* users:(("beam.smp",pid=73758,fd=83))
  6. tcp LISTEN 0 128 *:15672 *:* users:(("beam.smp",pid=73758,fd=96))
  7. tcp LISTEN 0 128 [::]:5672 [::]:* users:(("beam.smp",pid=73758,fd=97))
  8. # 创建web管理界面登录用户
  9. $ rabbitmqctl delete_user guest # 删除默认guest用户
  10. $ rabbitmqctl add_user lvjianzhao 123.com # 添加新用户
  11. $ rabbitmqctl set_user_tags lvjianzhao administrator # 将用户添加至administrator组
  12. $ rabbitmqctl set_permissions -p / lvjianzhao '.*' '.*' '.*' # 赋予所有权限( ^$ 表示没有任何权限)
  13. $ rabbitmqctl list_permissions # 查看用户及权限
  14. Listing permissions for vhost "/" ...
  15. user configure write read
  16. lvjianzhao .* .* .*
  17. # 将.erlang.cookie文件发送至slave节点
  18. cd ~
  19. rsync -az .erlang.cookie 192.168.20.3:/home/sysadmin/

关于用户权限可以参考以下几个链接:

使用新创建的用户登录web管理控制台

Rabbitmq部署 - 图1

登录后,可以看到以下界面即可:

Rabbitmq部署 - 图2

启动master 2节点

  1. $ rabbitmq-plugins enable rabbitmq_management # 开启管理页面
  2. $ rabbitmq-server -detached # 启动rabbitmq
  3. $ rabbitmqctl stop_app # 停止broker
  4. # 在master1主机上执行以下命令,获取节点名字
  5. $ rabbitmqctl status | grep 'Status of node'
  6. Status of node rabbit@master1 ...
  7. # 在master2主机上执行下面的命令,加入集群
  8. # 默认以磁盘节点加入集群,若要更改为内存模式,增加 “--ram” 选项即可
  9. # 但如果你搞不懂磁盘模式和内存模式,建议保持默认,磁盘模式加入集群即可
  10. $ rabbitmqctl join_cluster rabbit@master1
  11. $ rabbitmqctl start_app # 启动broker

节点加入集群后,会有一个隐式初始化的过程,你可以尝试访问master2的web管理界面,同样可以使用master1创建的用户进行登录。

配置镜像队列

rabbitmq队列有三种模式,分别式普通队列、镜像队列、仲裁队列(较低版本的可能没有仲裁队列)。

一般配置集群后,不进行任何配置,就是普通队列模式,一般数据重要的话,会在普通队列模式上配置为镜像队列,命令如下:

  1. # 任意一台服务器上执行即可
  2. $ rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

也可以在web管理页面进行配置,自行研究吧。

集群重启顺序

集群重启的顺序是固定的,并且是相反的。 如下所述:

  • 启动顺序:磁盘节点 => 内存节点
  • 关闭顺序:内存节点 => 磁盘节点
  • 最后关闭必须是磁盘节点,不然可能回造成集群启动失败、数据丢失等异常情况。

一个集群中至少要有一个磁盘节点,为了安全起见,一般建议使用两个磁盘节点,否则磁盘节点宕机后,集群仍然可以保持运行,但是无法进行其他操作(包括创建队列、交换器、绑定,添加用户、更改权限、添加和删除集群结点),直到节点恢复。

rabbitmq常用维护指令

单节点管理指令

  1. $ rabbitmqctl version # 查看rabbitmq版本
  2. 3.8.6
  3. $ rabbitmqctl reset # 重置节点
  4. # 从该节点所属的任何集群中删除该节点,从管理数据库中删除所有数据,例如已配置的用户和虚拟主机,并删除所有持久性消息。
  5. # 为了reset成功,在这之前必须先停止broker,如执行命令 rabbitmqctl stop_app
  6. $ rabbitmqctl force_reset # 强制重置节点,和reset的区别在于,此指令仅当数据库或群集配置已损坏时,才应将其用作最后的手段。
  7. $ rabbitmqctl rotate_logs # 日志切割
  8. Rotating logs for node rabbit@master2 ...
  9. $ rabbitmqctl shudown # 停止rabbitmq
  10. $ rabbitmqctl stop_app # 停止rabbitmq的broker程序,通常用于在节点reset前执行
  11. $ rabbitmqctl start_app # 启动rabbitmq的broker程序,通常用于在节点reset后执行

集群管理指令

  1. # 以下三条指令式修改节点类型
  2. # 节点类型可以为: disc(磁盘节点) 及 ram(内存节点)。
  3. $ rabbitmqctl stop_app # 先停止broker
  4. Stopping rabbit application on node rabbit@master2 ...
  5. $ rabbitmqctl change_cluster_node_type ram # 修改节点类型为ram
  6. Turning rabbit@master2 into a ram node
  7. $ rabbitmqctl start_app # 修改后再启动broker
  8. Starting node rabbit@master2 ...
  9. $ rabbitmqctl cluster_status # 查看集群状态
  10. $ rabbitmqctl join_cluster rabbit@master1 # 以磁盘节点类型加入master1集群,若要以内存节点加入,增加 --ram 选项

用户管理指令

  1. $ rabbitmqctl add_user sysadmin PasW! # 新增用户 sysadmin ,密码为: PasW!
  2. $ rabbitmqctl change_password sysadmin 123.com # 修改用户密码为123.com
  3. $ rabbitmqctl clear_password sysadmin # 清除用户的密码
  4. $ rabbitmqctl delete_user sysadmin # 删除此用户
  5. $ rabbitmqctl list_users # 列出所有用户
  6. $ rabbitmqctl set_user_tags sysadmin administrator # 给sysadmin用户添加administrator标签,不支持追加,但可以一条命令写多个标签

访问控制指令

  1. $ rabbitmqctl clear_permissions -p / sysadmin # 禁止sysadmin用户访问虚拟主机 “/”