• RabbitMQ 消息中间件 消息队列


    RabbitMQ

    1、RabbitMQ简介

    RabbiMQ是⽤Erang开发的,集群⾮常⽅便,因为Erlang天⽣就是⼀⻔分布式语⾔,但其本身并不⽀持负载均衡。支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    2、RabbitMQ 特点

    • 可靠性

    • 扩展性

    • 高可用性

    • 多种协议

    • 多语言客户端

    • 管理界面

    • 插件机制

    3、什么是消息队列

    ​ MQ 全称为Message Queue, 。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。

    消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信。

    4、RabbiMQ模式

    注意:RabbitMQ模式⼤概分为以下三种:

    (1)单⼀模式。

    (2)普通模式(默认的集群模式)。

    (3) 镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA⽅案,在对业务可靠性要求较⾼的场合中⽐较适⽤)。要实现镜像模式,需要先搭建⼀个普通集群模式,在这个模式的基础上再配置镜像模式以实现⾼可⽤。

    5、集群中的基本概念

    RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。

    一个rabbitmq集 群中可以共享 user,vhost,queue,exchange等,所有的数据和状态都是必须在所有节点上复制的。

    ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;
    Channel(信道):消息推送使用的通道;
    Exchange(交换器):用于接受、分配消息;
    Queue(队列):用于存储生产者的消息;
    RoutingKey(路由键):用于把生成者的数据分配到交换器上;
    BindingKey(绑定键):用于把交换器的消息绑定到队列上;
    Broker:简单来说就是消息队列服务器实体
    vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离.
    producer:消息生产者,就是投递消息的程序。
    consumer:消息消费者,就是接受消息的程序。
    user:用户

    单实例安装RabbitMQ

    安装依赖

    [root@localhost ~]# yum -y install vim lrasz
    [root@localhost ~]# yum install -y epel-release gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
    
    • 1
    • 2

    安装erlang

    方法一:
    [root@localhost ~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
    方法二:
    [root@localhost ~]# rz   #上传安装包
    
    安装erlang
    [root@localhost ~]# yum -y install erlang-21.3.8.21-1.el7.x86_64.rpm
    
    测试:
    [root@localhost ~]# erl
    Erlang/OTP 21 [erts-10.3.5.16] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]
    
    Eshell V10.3.5.16  (abort with ^G)
    1> 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    安装rabbitmq

    [root@localhost ~]# yum -y install rabbitmq-server-3.7.10-1.el7.noarch.rpm 
    [root@localhost ~]# systemctl daemon-reload
    [root@localhost ~]# systemctl start rabbitmq-server
    [root@localhost ~]# systemctl enable rabbitmq-server
    
    • 1
    • 2
    • 3
    • 4

    开启rabbitmq的web访问界面

    [root@localhost ~]# rabbitmq-plugins enable rabbitmq_management
    
    • 1

    添加用户

    [root@localhost ~]# rabbitmqctl add_user zx 123456
    Adding user "zx" ...
    [root@localhost ~]# rabbitmqctl set_user_tags zx administrator
    Setting tags for user "zx" to [administrator] ...
    [root@localhost ~]# rabbitmqctl list_users
    Listing users ...
    user    tags
    zx      [administrator]
    guest   [administrator]
    [root@localhost ~]# rabbitmqctl set_permissions -p "/" zx ".*" ".*" ".*"
    Setting permissions for user "zx" in vhost "/" ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    修改配置文件

    [root@localhost rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.10/rabbitmq.config.example /etc/rabbitmq/
    [root@localhost rabbitmq]# cp rabbitmq.config.example rabbitmq.config
    [root@localhost rabbitmq]# vim rabbitmq.config
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    重启服务

    [root@localhost rabbitmq]# systemctl restart rabbitmq-server
    
    • 1

    浏览器访问

    在这里插入图片描述
    在这里插入图片描述

    Rabbit-test

    [root@localhost ~]# yun -y install unzip
    [root@localhost ~]# lrzsz
    [root@localhost ~]# ls
    anaconda-ks.cfg                    
    rabbitmq-test-main.zip
    
    • 1
    • 2
    • 3
    • 4
    • 5
    cd rabbitmq-test && yum install -y python3 python3-devel && \
    pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple && \
    export FLASK_ENV=development ; flask run --reload -p 80 -h 0.0.0.0
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    在这里插入图片描述

    rabbitMQ集群

    准备三台rabbitMQ服务器

    hostnameip
    rabbitmq-1192.168.20.141
    rabbitmq-2192.168.20.142
    rabbitmq-3192.168.20.143

    准备工作(三台)

    [root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/data
    [root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/logs
    [root@rabbitmq-1 ~]# chmod 777 -R /data/rabbitmq
    [root@rabbitmq-1 ~]# chown rabbitmq.rabbitmq /data/ -R
    [root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf
    RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
    RABBITMQ_LOG_BASE=/data/rabbitmq/logs
    # 重启服务
    [root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    rabbitmq-1服务器

    [root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
    HOUCUGJDZYTFZDSWXTHJ
    #⽤scp的⽅式将rabbitmq-1节点的.erlang.cookie的值复制到其他两个节点中。
    [root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.20.142:/var/lib/rabbitmq/
    [root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.20.143:/var/lib/rabbitmq/
    
    • 1
    • 2
    • 3
    • 4
    • 5

    rabbitmq-2服务器

    [root@rabbitmq-2 ~]# systemctl restart rabbitmq-server
    #停止节点
    [root@rabbitmq-2 ~]# rabbitmqctl stop_app 
    #如果有数据需要重置,没有则不用
    [root@rabbitmq-2 ~]# rabbitmqctl reset  
     #添加到磁盘节点,--ram内存节点
    [root@rabbitmq-2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1  
    Clustering node 'rabbit@rabbitmq-2' with 'rabbit@rabbitmq-1' ...
     #启动节点
    [root@rabbitmq-2 ~]# rabbitmqctl start_app 
    Starting node 'rabbit@rabbitmq-2' ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    rabbitmq-3服务器

    [root@rabbitmq-3 ~]# systemctl restart rabbitmq-server
    [root@rabbitmq-3 ~]# rabbitmqctl stop_app
    Stopping node 'rabbit@rabbitmq-3' ...
    [root@rabbitmq-3 ~]# rabbitmqctl reset
    Resetting node 'rabbit@rabbitmq-3' ...
    [root@rabbitmq-3 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
    Clustering node 'rabbit@rabbitmq-3' with 'rabbit@rabbitmq-1' ...
    [root@rabbitmq-3 ~]# rabbitmqctl start_app
    Starting node 'rabbit@rabbitmq-3' ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,mq-1是磁盘节点。
    (2)如果要使mq-2、mq-3都是磁盘节点,去掉–ram参数即可。
    (3)如果想要更改节点类型,可以使⽤命令rabbitmqctl change_cluster_node_typedisc(ram),前提是必须停掉rabbit应⽤

    查看集群状态

    [root@rabbitmq-1 ~]# rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbitmq-1 ...
    [{nodes,[{disc,['rabbit@rabbitmq-1','rabbit@rabbitmq-3']},
             {ram,['rabbit@rabbitmq-2']}]},
     {running_nodes,['rabbit@rabbitmq-2','rabbit@rabbitmq-3','rabbit@rabbitmq-1']},
     {cluster_name,<<"rabbit@rabbitmq-1">>},
     {partitions,[]},
     {alarms,[{'rabbit@rabbitmq-2',[]},
              {'rabbit@rabbitmq-3',[]},
              {'rabbit@rabbitmq-1',[]}]}]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    浏览器访问

    在这里插入图片描述

    安装配置负载均衡器

    1.安装负载均衡器haproxy

    yum -y install haproxy
    
    • 1

    2、修改 /etc/haproxy/haproxy.cfg

    global
        log         127.0.0.1 local2
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        nbproc      4
        daemon
        # turn on stats unix socket
        stats socket /var/lib/haproxy/stats
    #---------------------------------------------------------------------
    defaults
        mode                    http
        log                     global
        retries                 3
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout check           10s
        maxconn                 2048
    #---------------------------------------------------------------------
    ##监控查看本地状态#####
    listen admin_stats
            bind *:89    #80端口冲突
        mode http
        option httplog
        option httpclose
        log 127.0.0.1 local0 err
        stats uri  /haproxy
        stats auth newrain:123456  #登录用户
        stats refresh 30s
    ####################################
    ###反代监控
    frontend server
        bind *:5670
        log global
        mode tcp
        #option forwardfor
        default_backend rabbitmq
        maxconn 3
    backend rabbitmq
        mode        tcp
        log         global
        balance     roundrobin
        server      rabbitmq1 192.168.20.141:5672 check inter 2000s rise 2 fall 3
        server      rabbitmq2 192.168.20.142:5672 check inter 2000s rise 2 fall 3
        server      rabbitmq3 192.168.20.143:5672 check inter 2000s rise 2 fall 3
        [root@rabbitmq-1 ~]# systemctl start haproxy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    浏览器访问

    在这里插入图片描述

  • 相关阅读:
    C语言学习笔记day2
    OR青年学员访谈特辑 | 在做学术的道路上不断认识自己
    C语言变量
    深刻理解JAVA并发中的有序性问题和解决之道
    uniapp分包 解决分多个包的问题
    .net core中你的MD5用对了吗?
    SVN创建分支与合并分支
    【数据结构】顺序表的实现
    Java学习-详述main方法、可变参数、数组的工具类、二维数组
    四旋翼飞行器建模(二)
  • 原文地址:https://blog.csdn.net/2301_78315274/article/details/134271154