安装依赖 | 版本 |
---|---|
Erlang/OTP | 21.3 or 22.x |
RabbitMQ | 3.8.3 |
CentOS | 7.x |
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
# This example assumes the CentOS 8 version of the package.
# For CentOS 7, replace "el8" with "el7".
yum install rabbitmq-server-3.8.4-1.el8.noarch.rpm
#chkconfig rabbitmq-server on
#启动RabbitMQ服务
systemctl start rabbitmq-server
#集群模式启动RabbitMQ服务
rabbitmq-server -detached
#停止RabbitMQ服务
systemctl stop rabbitmq-server
#查看RabbitMQ运行状态
systemctl status rabbitmq-server
#重启RabbitMQ服务
systemctl restart rabbitmq-server
参考地址 https://www.rabbitmq.com/rabbitmqctl.8.html
添加用户 rabbitmqctl add_user username password
删除用户 rabbitmqctl delete_user username
修改密码 rabbitmqctl change_password username newpassword
列出所有用户 rabbitmqctl list_users
设置用户权限 rabbitmqctl set_permissions [-p vhostpath] username regexp regexp regexp
清除用户权限 rabbitmqctl clear_permissions [-p vhostpath] username
列出用户权限 rabbitmqctl list_user_permissions username
设置用户角色 rabbitmqctl set_user_tags username tagsname
返回queue的信息 rabbitmqctl list_queues [-p ] [ …]
返回exchange的信息 rabbitmqctl list_exchanges [-p ] [ …]
返回绑定信息 rabbitmqctl list_bindings [-p ] [ …]
返回链接信息 rabbitmqctl list_connections [ …]
返回目前所有的 rabbitmqctl channels list_channels [ …]
返回consumers rabbitmqctl list_consumers [-p ]
显示broker的状态 rabbitmqctl status
清除队列 rabbitmqctl reset
创建虚拟主机 rabbitmqctl add_vhost vhostpath
删除虚拟主机 rabbitmqctl delete_vhost vhostpath
列出所有虚拟主机 rabbitmqctl list_vhosts
列出虚拟主机上的所有权限 rabbitmqctl list_permissions [-p vhostpath]
停止RabbitMQ应用,关闭节点 rabbitmqctl stop
停止RabbitMQ应用 rabbitmqctl stop_app
启动RabbitMQ应用 rabbitmqctl start_app
显示RabbitMQ中间件各种信息 rabbitmqctl status
重置RabbitMQ节点 rabbitmqctl reset
强制节点重启 rabbitmqctl force_boot
强制重置RabbitMQ节点 rabbitmqctl force_reset
修改集群节点的存储形式 rabbitmqctl change_cluster_node_type disc ram (选择disc或ram)
忘记节点(摘除节点) rabbitmqctl forget_cluster_node [–offline]
修改节点名称 rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2 …]
查看节点名称 rabbitmqctl cluster_status
4369 -- erlang发现口
5672 --client端通信口
15672 -- 管理界面ui端口
25672 -- server间内部通信口
操作系统默认文件最大数 1024 ;
ulimit -n
/etc/systemd/system/rabbitmq-server.service.d/limits.conf
[Service]
LimitNOFILE=64000
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins list
rabbitmqctl add_user admin passwd
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p “/” admin “.” “.” “.*”
1.普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
2.镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
参考文档 https://www.rabbitmq.com/clustering.html
IP地址 | 主机名 | 操作系统 | 防火墙和SELinux | 用途 |
---|---|---|---|---|
192.168.6.22 | node1 | centos7.x | 关闭 | 磁盘节点 |
192.168.6.23 | node2 | centos7.x | 关闭 | 内存节点 |
192.168.6.24 | node3 | centos7.x | 关闭 | 内存节点 |
注意:每个节点都执行
[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node2 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node3 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.6.22 node1
192.168.6.23 node2
192.168.6.24 node3
chmod 600 /var/lib/rabbitmq/.erlang.cookie
scp -r /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/
scp -r /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/
# on node1
rabbitmq-server -detached
# on node2
rabbitmq-server -detached
# on node3
rabbitmq-server -detached
# on rabbit1
rabbitmqctl cluster_status
# => Cluster status of node rabbit@node1 ...
# => [{nodes,[{disc,[rabbit@rabbit1]}]},{running_nodes,[rabbit@node1]}]
# => ...done.
# on rabbit2
rabbitmqctl cluster_status
# => Cluster status of node rabbit@node2 ...
# => [{nodes,[{disc,[rabbit@rabbit2]}]},{running_nodes,[rabbit@node2]}]
# => ...done.
# on rabbit3
rabbitmqctl cluster_status
# => Cluster status of node rabbit@node3 ...
# => [{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@node3]}]
# => ...done.
集群加入节点
# on node2
rabbitmqctl stop_app
# => Stopping node rabbit@node2 ...done.
rabbitmqctl reset
# => Resetting node rabbit@node2 ...
rabbitmqctl join_cluster rabbit@node1 --ram #参数设置为内存节点
# rabbitmqctl join_cluster rabbit@node1
# => Clustering node rabbit@node2 with [rabbit@node1] ...done.
rabbitmqctl start_app
# => Starting node rabbit@node2 ...done.
# on node3
rabbitmqctl stop_app
# => Stopping node rabbit@node3 ...done.
rabbitmqctl reset
# => Resetting node rabbit@node3 ...
rabbitmqctl join_cluster rabbit@node1 --ram
# => Clustering node rabbit@node3 with [rabbit@node1] ...done.
rabbitmqctl start_app
# => Starting node rabbit@node3 ...done.
移除的节点停机
root@rabbitmq-03:~# rabbitmqctl stop_app
root@rabbitmq-03:~# rabbitmqctl reset
root@rabbitmq-03:~# rabbitmqctl stop
在主节点进行节点的移除 /node1上移除node3
rabbitmqctl -n rabbit@node1 forget_cluster_node rabbit@node3
# on rabbit1
rabbitmqctl cluster_status
# => Cluster status of node rabbit@node1 ...
# => [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
# => {running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]}]
# => ...done.
# on rabbit2
rabbitmqctl cluster_status
# => Cluster status of node rabbit@node1 ...
# => [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
# => {running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]}]
# => ...done.
# on rabbit3
rabbitmqctl cluster_status
# => Cluster status of node rabbit@node1 ...
# => [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
# => {running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]}]
# => ...done.
节点重启
# on node1
[root@node1 ~]# rabbitmqctl stop
# => Stopping and halting node rabbit@rabbit1 ...done.
[root@node1 ~]# rabbitmq-server -detached
[root@node1 ~]# rabbitmqctl cluster_status
集群重启顺序
集群重启的顺序是固定的,并且是相反的。如下所述:
启动顺序:磁盘节点 => 内存节点
关闭顺序:内存节点 => 磁盘节点
最后关闭必须是磁盘节点,不然可能回造成集群启动失败、数据丢失等异常情况。
更换节点类型
rabbitmqctl stop_app
#rabbitmqctl change_cluster_node_type dist
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
效果图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t8LcuMG1-1596263798609)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/1591167777438.png)]
镜像集群模式是在RabbitMQ Cluster默认集群基础上添加镜像集群策略.
镜像策略设置
新增策略
master节点上执行:
“ha-mode”:“all” 表示所有队列都镜像 ;
“ha-sync-mode”:“automatic” 表示节点之间队列镜像手动同步;
#rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
rabbitmqctl set_policy ha-all "." '{"ha-mode":"all", "ha-sync-mode":"automatic"}' --apply-to all --priority 0
查看策略
rabbitmqctl list_policies
删除策略
rabbitmqctl clear_policy ha-all
验证效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bq8osM8x-1596263798614)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/1591327730673.png)]
任意节点的 total数应该是一致的
注意:Nginx1.9.0版本后 新增了stream 模块用于一般的 TCP 代理和负载均衡,之前版本不支持
yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
./configure --with-stream
make && make install
vi /usr/local/nginx/conf/nginx.conf
events {
worker_connections 1024;
}
stream{
log_format basic '$proxy_protocol_addr - $remote_user [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time';
upstream rabbitmqserver{
server 192.168.6.22:5672 max_fails=2 fail_timeout=3s weight=2;
server 192.168.6.23:5672 max_fails=2 fail_timeout=3s weight=2;
server 192.168.6.24:5672 max_fails=2 fail_timeout=3s weight=2;
}
server{
listen 5678;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass rabbitmqserver;
}
}
默认情况下,当RabbitMQ检测到使用的内存超过40%(由操作系统报告)时,将不会接收任何消息:{vm_memory_high_watermark,0.4},这是一个安全的默认值 ;
推荐的vm_memory_high_watermark范围是 0.40到0.6;
操作系统和文件系统必须至少保留30%的内存,否则性能可能因寻呼而严重降级 ;
生产配置调整为0.6,编辑rabbitmq.conf
vm_memory_high_watermark.relative = 0.6
disk_free_limit默认值是50MB ;
{disk_free_limit,{mem_relative,1.0}}是最小推荐值,和内存的容量一样大 ;
例如,在专用于具有4GB系统内存的RabbitMQ的主机上,如果可用磁盘空间低于4GB,所有发布者将被阻止,并且不会接收新消息。队列将需要被排空,通常由消费者,在发布之前将被允许恢复
{disk_free_limit,{mem_relative,1.5}}是一个更安全的产品价值
在具有4GB内存的RabbitMQ节点上,如果可用磁盘空间低于6GB,则所有新消息都将被阻止,直到磁盘警报清除
{disk_free_limit,{mem_relative,2.0}}是最保守的产品价值,我们想不出任何理由使用更高的产品。
生产配置调整为5.0,编辑rabbitmq.conf
disk_free_limit.relative = 5.0
保证您的环境至少允许有效的RabbitMQ用户使用至少50K的开放文件描述符,包括在开发环境中
修改文件:/etc/security/limits.conf,在文件中添加:(立即生效-当前session中运行ulimit -a命令无法显示)
* soft nofile 32768 #限制单个进程最大文件句柄数(到达此限制时系统报警)
* hard nofile 65536 #限制单个进程最大文件句柄数(到达此限制时系统报错)
内存报警阀值50%;
磁盘报警阀值70% ;
日志收集
/var/log/rabbitmq
节点时间同步
节点时间同步
网络配置
TCP缓冲区大小
每个connection最多支持2048个channel,从一个connection同时超过2048个线程并发发送,channel超过2048,会报异常 。