RabbitMQ 学习笔记

RabbitMQ 学习笔记

环境说明

安装依赖 版本
Erlang/OTP 21.3 or 22.x
RabbitMQ 3.8.3
CentOS 7.x

单机安装

安装erlang
  • 下载地址 https://dl.bintray.com/rabbitmq-erlang
  • 下载rpm仓库
  • 安装erlang yum install -y erlang-21.3.8.16-1.el7.x86_64.rpm
安装RabbitMQ
  • 下载RabbitMQ地址 https://www.rabbitmq.com/download.html
  • 下载RabbitMQ的rpm
  • 安装RabbitMQ yum install -y rabbitmq-server-3.8.4-1.el7.noarch.rpm
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

  • 增加访问用户,默认用户guest只能本地访问。

rabbitmqctl add_user admin passwd

  • 设置角色:

rabbitmqctl set_user_tags admin administrator

  • 设置默认vhost("/")访问权限

rabbitmqctl set_permissions -p “/” admin “.” “.” “.*”

  • 浏览器访问:http://IP:15672 / 用户名admin,密码passwd进行登录

集群

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
  • 配置hosts文件
[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
  • 拷贝erlang.cookie
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.
  • 集群加入节点

    • node2节点
    # 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.
    
    • node3节点
# 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数应该是一致的

  • 镜像负载均衡-nginx

注意: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;
        }
 }

生产配置

/etc/rabbitmq
  • 内存

默认情况下,当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缓冲区大小

镜像集群测试报告

  1. The channelMax limit is reached. Try later.

每个connection最多支持2048个channel,从一个connection同时超过2048个线程并发发送,channel超过2048,会报异常 。

你可能感兴趣的:(消息中间件)