RabbitMQ 使用与原理


RabbitMQ 使用与原理


使用

集群搭建

node1 -> node2 -> node3

1、首先通过克隆的方式,从第一台安装好RabbitMQ的服务器环境克隆出两台机器

2、修改克隆出的2台RabbitMq服务器的lp地址,修改IP(可不修改,通过ifconfig或者ip addri查看ip地址), 只需修改/etc/sysconfig/network-scripts/ifcfg-ens33文件中的IPADDR即可。

3、修改3台RabbitMq服务器的 hostname。3台服务器的 hostname分别设置为node1、node2、node3:vi /etc/hostname。 设置后一定要对服务进行重启,重启命令:reboot

4、分别修改3台Rabbitmq服务器的节点的hosts文件:vi /etc/hosts

在hosts文件后面追加

192.168.16.137 node1
192.168.16.138 node2
192.168.16.139 node3

5、把第1个节点上的cookie文件复制到另外2台克隆的节点上,确保各节点用的同一个cookie。 在node1上执行下面2条命令,把node1节点上的cookie文件复制到node2和node3上。

scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie

6、启动RabbitMQ服务,顺带启动Erlang虚拟机和RbbitMQ应用服务,分别在3个节点上执行以下命令:rabbitmq-server -detached

7、在节点2执行

rabbitmqctl stop_app (rabbitmqctl stop 会将Erlang虚拟机关闭,rabbitmgctl stop_app只会关闭rabbitmq服务)

rabbitmqctl reset (重置)

rabbitmqctl join_cluster rabbit@node1 (节点2加入节点1)

rabbitmqctl start_app (只启动应用服务)

8、在节点3执行

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node2
rabbitmqctl start_app

9、集群状态

rabbitmqctl cluster_status

输出:

Cluster name:rabbitenodel

Disk Nodes

rabbit@nodel
rabbitanode2
rabbitanode3

Running Nodes

rabbit@nodel
rabbitanode2
rabbitenode3

Versions

rabbit@nodel:RabbitMQ 3.8.16 on Erlang 23.3.4.11
rabbitanode2:RabbitMQ 3.8.16 on Erlang 23.3.4.11
rabbitenode3:RabbitMQ 3.8.16 on Erlang 23.3.4.11

Maintenance status

Node:rabbit@nodel,status:not under maintenance
Node:rabbitenode2,status:not under maintenance
Node:rabbitanode3,status:not under maintenance

Alarms

(none)

Network Partitions

(none)

Listeners

Node:rabbitenodel,interface:[:]port:15672,protocol:http,purpose:HTTP API
Node:rabbitenodel,interface:[:]port:25672,protocol:clustering,purpose:inter-node and CLI tool communication
Node:rabbitanodel,interface:[]port:5672,protocol:amgp,purpose:AMQP 0-9-1 and AMQP 1.0
Node:rabbitenode2,interface:[:]port:15672,protocol:http,purpose:HTTP API
Node:rabbit@node2,interface:[]port:25672,protocol:clustering,purpose:inter-node and CLI tool communication
Node:rabbitenode2,interface:[:]port:5672,protocol:amqp,purpose:AMQP 0-9-1 and AMQP 1.0
Node:rabbitenode3,interface:[:]port:15672,protocol:http,purpose:HTTP API
Node:rabbitanode3,interface:[:]port:25672,protocol:clustering,purpose:inter-node and CLI tool communication
Node:rabbitanode3,interface:[]port:5672,protocol:amqp,purpose:AMQP 0-9-1 and AMQP 1.0

Feature flags

Flag:drop unroutable metric,state:enabled
Flag:empty_basic_get_metric,state:enabled
Flag:implicit_default_bindings,state:enabled
Flag:maintenance_mode_status,state:enabled
Flag:quorum_queue,state:enabled

10、需要重新设置用户(只需要在一台机器上运行)

a.创建账号 rabbitmqctl add user admin 123456

b,设置用户角色 rabbitmqctl set_user_tags admin administrator

c,设置用户权限 rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

11、解除集群节点(node2和node3机器分别执行)

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
rabbitmqctl cluster_status
rabbitmgctl forget cluster_node rabbit@node2 (node1节点上执行)

镜像队列

1、使用镜像队列的原因

  1. 虽然集群共享队列,但在默认情况下,消息只会被路由到某一个节点的符合条件的队列上,并不会同步到其他节点的相同队列上。
  2. 假设消息路由到node1的my-queue队列上,但是node1突然宕机了,那么消息就会丢失
  3. 想要解决这个问题,需要开启队列镜像,将集群中的队列彼此之间进行镜像,此时消息就会被拷贝到处于同一个镜像分组中的所有队列上。

2、管理界面配置参数

web端配置策略,Admin -> Policies

参数解释:

·Name:policy的名称,用户自定义。
·Pattern:queue的匹配模式(正则表达式)。^表示所有队列都是镜像队列。
·Definition:镜像定义,包括三个部分ha-sync-mode、ha-mode、ha-params。
    。ha-mode:指明镜像队列的模式,有效取值范围为all/exactly/nodes。
        ·all:表示在集群所有的代理上进行镜像。
        ·exactly:表示在指定个数的代理上进行镜像,代理的个数由ha-params指定。
        ·nodes:表示在指定的代理上进行镜像,代理名称通过ha-params指定。
    。ha-params:ha-mode模式需要用到的参数。
    。ha-sync-mode:表示像队列中消息的同步方式,有效取值范围为:automatic,manually。
·automatic:表示自动向master同步数据。
·manually:表示手动向masterl同步数据。
·Priority:可选参数,policy的优先级。

负载均衡-HAProxy

1、HAProxy概述

  • 一种高效、可靠、免费的高可用及负载均衡软件,非常适合于高负载站点的七层数据请求。 客户端通过 Haproxy代理服务器 获得站点页面,而代理服务器收到客户请求后根据负载均衡的规则将请求数据转发给后端真实服务器
  • 实现了一种事件驱动、单一进程模型,能支持非常大的并发连接数

生产者发送到HAProxy,HAProxy转发给 node (node1 -> node2 -> node3),其中一个节点宕机后,其他节点还可以正常服务, 消费者从HAProxy读取数据。

2、安装HAProxy

1.下载依赖包

yum install gcc vim wget

2.下载haproxyi源码包

wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-2.7.3.tar.gz/sha512/f9eeee2d232fd2f4da1959e9265dd6abe6c6182109a0455d4f868a516e78cc6ea67e8456d5bc26e439385d17f52e4b179d7c615bacf15aeae901ab8e172dc758/haproxy-2.7.3.tar.gz

(源码包下载地址:https:/src.fedoraproject.org/repo/pkgs/haproxy/)

3.解压

tar -zxvf haproxy-2.7.3.tar.gz -C /usr/local

4.进入目录,进行编辑、安装

cd /usr/local/haproxy-2.7.3

make TARGET=linux30 PREFIX=/usr/local/haproxy

make install PREFIX=/usr/local/haproxy

创建文件夹:

mkdir /etc/haproxy

5.赋权

-创建组 groupadd -r -g 149 haproxy

-创建用户 useradd -g haproxy -r -s /sbin/nologin -u 149 haproxy

6.创建配置文件

vim /etc/haproxy/haproxy.cfg

写入:

#全局配置
global
    #设置日志
    log 127.0.0.1 local0 info
    #当前工作日录
    chroot /usr/local/haproxy
    #用户与用户细
    user haproxy
    group haproxy
    #运行进程ID
    uid 99
    gid 99
    #守护进程启动
    daemon
    #最人连接数
    maxconn 4096
    
# 默认配置
defaults
    #应用全局的日志配置
    log global
    #默认的模式mode{tcp http|health}
    #TCP是4层,HTTP是7层,health只返回oK
    mode tcp
    #日志类别tcp1og
    option tcplog
    #不记录健康检查日志信息
    option dontlognull
    #3次失败则认为服务不可用
    retries 3
    #每个进程可用的最大连接数
    maxconn 2000
    #连接超时
    timeout connect 5s
    #客户端超时
    timeout client 120s
    #服务端超时
    timeout server 120s
    
#绑定配置
listen rabbitmq_cluster
    # 5672 已被占用
    bind 192.168.16.138:5671
    #配置TCP模式
    mode tcp
    #简单的轮询
    balance roundrobin
    #RabbitMo集群节点配置
    server node1 192.168.16.137:5672 check inter 5000 rise 2 fall 2
    server node2 192.168.16.138:5672 check inter 5000 rise 2 fall 2
    server node3 192.168.16.139:5672 check inter 5000 rise 2 fall 2

#haproxy监控页面地址
listen monitor
    bind 192.168.16.138:8100
    mode http
    option httplog
    stats enable
    #项日名为rabbitmq_stats,ip+端口+项目名即可访问
    stats uri /rabbitmq_stats
    #自动刷新时间
    stats refresh 5s

7.配置启动文件复制haproxy文件到/usr/sbin下,复制haproxy脚本,到/etc/init.d下

cp /usr/local/haproxy/sbin/haproxy /usr/sbin/

cp /usr/local/haproxy-2.7.3/examples/haproxy.init /etc/init.d/haproxy

chmod 755 /etc/init.d/haproxy

8.启动

> service haproxy start|stop|restartreload|condrestart|statuscheck

启动后,在浏览器中访问:http://192.168.16.138:8100/rabbitmq ,查看状态 stats

视频

快速掌握RabbitMQ的使用与原理实战 https://www.bilibili.com/video/BV1Am4y1z7Tu/?p=15&spm_id_from=pageDriver&vd_source=14e623b3280938e774caf714015caa22






参考资料

1小时学会RabbitMQ!快速掌握RabbitMQ的使用与原理实战 https://www.bilibili.com/video/BV1Am4y1z7Tu

Linux 下安装RabbitMQ https://ibaiyang.github.io/blog/linux/2020/03/30/Linux-下安装RabbitMQ.html

PHP RabbitMQ相关 https://ibaiyang.github.io/blog/php/2019/04/18/PHP-RabbitMQ相关.html

PHP RabbitMQ延迟队列实现 https://ibaiyang.github.io/blog/php/2019/04/19/PHP-RabbitMQ延迟队列实现.html


返回