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用户执行,没有特别说明的均是两台节点都要执行的。
# 安装依赖
$ yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel ncurses-devel
# 下载erlang 23.0
$ wget http://erlang.org/download/otp_src_23.0.tar.gz
# 官网下载较慢,可从我百度网盘中提取。
# 链接:https://pan.baidu.com/s/16ayQ5g8qejt_Iq-O6XpwzQ
# 提取码:bm0s
$ tar zxf otp_src_23.0.tar.gz
$ cd otp_src_23.0
$ ./configure --prefix=/apps/usr/erlang_23.0 --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe
$ make && make install
# 配置环境变量(先把rabbitmq的也配置上)
$ cat >> /etc/profile << EOF
PATH=/apps/usr/erlang_23.0/bin:/apps/usr/rabbitmq_3.8.6/sbin:\${PATH}
EOF
$ source /etc/profile
$ erl # 执行此指令,进入以下环境说明erlang配置完成。
Erlang/OTP 23 [erts-11.0] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [hipe]
Eshell V11.0 (abort with ^G)
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插件的情况下)
# 调整防火墙策略(已关闭的可忽略)
$ firewall-cmd --permanent --add-port={5672,4369,25672,15672,35672}/tcp
$ firewall-cmd --reload
# 配置hosts文件(rabbitmq使用主机名来通信的,所以必须可以互相解析)
cat >> /etc/hosts << EOF
192.168.20.2 master1
192.168.20.3 master2
EOF
# 修改系统最大可使用文件数及进程数(需重新登录终端生效)
cat >> /etc/security/limits.conf << EOF
* - nofile 655360
* - memlock unlimited
* - stack 655360
* - nproc unlimited
EOF
# 创建普通用户,用于管理rabbitmq,已有或允许直接使用root则不用创建
$ useradd sysadmin
$ echo 123.com | passwd --stdin sysadmin
# 创建rabbitmq家目录
$ mkdir -p /apps/usr/rabbitmq_3.8.6
$ chown sysadmin /apps/usr/rabbitmq_3.8.6/
# 切换至普通用户进行接下来的操作
$ su - sysadmin
# 下载并解压
$ wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.6/rabbitmq-server-generic-unix-3.8.6.tar.xz
# 同样,下载较慢,下面是我网盘连接,可以从我网盘下载
链接:https://pan.baidu.com/s/1DDLAdTr4S1adoch_YtQ0fQ
提取码:plv8
$ tar xf rabbitmq-server-generic-unix-3.8.6.tar.xz -C /apps/usr/rabbitmq_3.8.6/ --strip-components=1
$ cd /apps/usr/rabbitmq_3.8.6/
# 修改配置文件
$ cat >> etc/rabbitmq/rabbitmq.conf << EOF
listeners.tcp.default = 5672
num_acceptors.tcp = 10
handshake_timeout = 10000
vm_memory_high_watermark.relative = 0.4
vm_memory_high_watermark_paging_ratio = 0.75
#management.path_prefix = /rabbitmq
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.relative
和vm_memory_high_watermark_paging_ratio
这两个参数最好配置下,也可以了解下rabbitmq的部分工作原理。这两个参数的详细解释,可以参考官方文档。
启动master1主机节点
以下操作在master1主机操作即可
# 开启rabbitmq的web管理页面
$ rabbitmq-plugins enable rabbitmq_management
$ rabbitmq-server -detached # 启动
$ ss -lnput | grep 5672 # 确定端口在监听
tcp LISTEN 0 128 *:25672 *:* users:(("beam.smp",pid=73758,fd=83))
tcp LISTEN 0 128 *:15672 *:* users:(("beam.smp",pid=73758,fd=96))
tcp LISTEN 0 128 [::]:5672 [::]:* users:(("beam.smp",pid=73758,fd=97))
# 创建web管理界面登录用户
$ rabbitmqctl delete_user guest # 删除默认guest用户
$ rabbitmqctl add_user lvjianzhao 123.com # 添加新用户
$ rabbitmqctl set_user_tags lvjianzhao administrator # 将用户添加至administrator组
$ rabbitmqctl set_permissions -p / lvjianzhao '.*' '.*' '.*' # 赋予所有权限( ^$ 表示没有任何权限)
$ rabbitmqctl list_permissions # 查看用户及权限
Listing permissions for vhost "/" ...
user configure write read
lvjianzhao .* .* .*
# 将.erlang.cookie文件发送至slave节点
cd ~
rsync -az .erlang.cookie 192.168.20.3:/home/sysadmin/
关于用户权限可以参考以下几个链接:
使用新创建的用户登录web管理控制台
登录后,可以看到以下界面即可:
启动master 2节点
$ rabbitmq-plugins enable rabbitmq_management # 开启管理页面
$ rabbitmq-server -detached # 启动rabbitmq
$ rabbitmqctl stop_app # 停止broker
# 在master1主机上执行以下命令,获取节点名字
$ rabbitmqctl status | grep 'Status of node'
Status of node rabbit@master1 ...
# 在master2主机上执行下面的命令,加入集群
# 默认以磁盘节点加入集群,若要更改为内存模式,增加 “--ram” 选项即可
# 但如果你搞不懂磁盘模式和内存模式,建议保持默认,磁盘模式加入集群即可
$ rabbitmqctl join_cluster rabbit@master1
$ rabbitmqctl start_app # 启动broker
节点加入集群后,会有一个隐式初始化的过程,你可以尝试访问master2的web管理界面,同样可以使用master1创建的用户进行登录。
配置镜像队列
rabbitmq队列有三种模式,分别式普通队列、镜像队列、仲裁队列(较低版本的可能没有仲裁队列)。
一般配置集群后,不进行任何配置,就是普通队列模式,一般数据重要的话,会在普通队列模式上配置为镜像队列,命令如下:
# 任意一台服务器上执行即可
$ rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
也可以在web管理页面进行配置,自行研究吧。
集群重启顺序
集群重启的顺序是固定的,并且是相反的。 如下所述:
- 启动顺序:磁盘节点 => 内存节点
- 关闭顺序:内存节点 => 磁盘节点
- 最后关闭必须是磁盘节点,不然可能回造成集群启动失败、数据丢失等异常情况。
一个集群中至少要有一个磁盘节点,为了安全起见,一般建议使用两个磁盘节点,否则磁盘节点宕机后,集群仍然可以保持运行,但是无法进行其他操作(包括创建队列、交换器、绑定,添加用户、更改权限、添加和删除集群结点),直到节点恢复。
rabbitmq常用维护指令
单节点管理指令
$ rabbitmqctl version # 查看rabbitmq版本
3.8.6
$ rabbitmqctl reset # 重置节点
# 从该节点所属的任何集群中删除该节点,从管理数据库中删除所有数据,例如已配置的用户和虚拟主机,并删除所有持久性消息。
# 为了reset成功,在这之前必须先停止broker,如执行命令 rabbitmqctl stop_app
$ rabbitmqctl force_reset # 强制重置节点,和reset的区别在于,此指令仅当数据库或群集配置已损坏时,才应将其用作最后的手段。
$ rabbitmqctl rotate_logs # 日志切割
Rotating logs for node rabbit@master2 ...
$ rabbitmqctl shudown # 停止rabbitmq
$ rabbitmqctl stop_app # 停止rabbitmq的broker程序,通常用于在节点reset前执行
$ rabbitmqctl start_app # 启动rabbitmq的broker程序,通常用于在节点reset后执行
集群管理指令
# 以下三条指令式修改节点类型
# 节点类型可以为: disc(磁盘节点) 及 ram(内存节点)。
$ rabbitmqctl stop_app # 先停止broker
Stopping rabbit application on node rabbit@master2 ...
$ rabbitmqctl change_cluster_node_type ram # 修改节点类型为ram
Turning rabbit@master2 into a ram node
$ rabbitmqctl start_app # 修改后再启动broker
Starting node rabbit@master2 ...
$ rabbitmqctl cluster_status # 查看集群状态
$ rabbitmqctl join_cluster rabbit@master1 # 以磁盘节点类型加入master1集群,若要以内存节点加入,增加 --ram 选项
用户管理指令
$ rabbitmqctl add_user sysadmin PasW! # 新增用户 sysadmin ,密码为: PasW!
$ rabbitmqctl change_password sysadmin 123.com # 修改用户密码为123.com
$ rabbitmqctl clear_password sysadmin # 清除用户的密码
$ rabbitmqctl delete_user sysadmin # 删除此用户
$ rabbitmqctl list_users # 列出所有用户
$ rabbitmqctl set_user_tags sysadmin administrator # 给sysadmin用户添加administrator标签,不支持追加,但可以一条命令写多个标签
访问控制指令
$ rabbitmqctl clear_permissions -p / sysadmin # 禁止sysadmin用户访问虚拟主机 “/”