zoukankan      html  css  js  c++  java
  • RabbitMQ

    RabbitMQ集群搭建

    1. rabbitMQ简介

    1.1 RabbitMQ的特点

    MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品

    1.2 使用场景

    在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

    1.3 含义

    RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统。他遵循Mozilla Public License开源协议

    1.4 基本概念

    RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。如果不熟悉AMQP,直接看RabbitMQ的文档会比较困难

    1.5 重点概念说明

    Broker 简单来说就是消息队列服务器实体。
    Exchange 消息交换机,它指定消息按什么规则,路由到哪个队列。
    Queue 消息队列载体,每个消息都会被投入到一个或多个队列。
    Binding 绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
    Routing Key 路由关键字,exchange根据这个关键字进行消息投递。
    vhost 虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
    producer 消息生产者,就是投递消息的程序。
    consumer 消息消费者,就是接受消息的程序。
    channel 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

    1.6 RabbitMQ的结构图如下:

    image.png-485.6kB

    1.7 消息队列的使用过程大概如下:

    • 客户端连接到消息队列服务器,打开一个channel。
    • 客户端声明一个exchange,并设置相关属性。
    • 客户端声明一个queue,并设置相关属性。
    • 客户端使用routing key,在exchange和queue之间建立好绑定关系。
    • 客户端投递消息到exchange。
    • exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里

    1.8 exchange的几个类型

    • exchange是完全根据key进行投递的叫做Direct交换机,
    • 例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。
    • 对key进行模式匹配后进行投递的叫做Topic交换机,符号”#”匹配一个或多个词,符号””匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.”只匹配”abc.def”。
    • 还有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。

    1.9 RabbitMQ消息的持久化

    消息队列持久化包括3个部分:

    • exchange持久化,在声明时指定durable => 1
    • queue持久化,在声明时指定durable => 1
    • 消息持久化,在投递时指定delivery_mode => 2(1是非持久化)

    • 如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。
    • 如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定。

    1.10 消息持久

    • 将交换机置为可持久;
    • 将通道置为可持久
    • 消息发送时设置可持久。

    当我们“生产”了一条可持久化的消息,尝试中断MQ服务,启动消费者获取消息,消息依然能够恢复。相反,则抛出异常。

    2. RabbitMQ部署安装(以下操作需两个节点同步操作)

    主机名 主机IP 用途
    RabbitMQ-node01 192.168.200.23 主节点
    RabbitMQ-node02 192.168.200.24 从节点
    RabbitMQ-VIP 192.168.200.25 VIP

    2.1 Erlang在默认的YUM存储库中不可用,因此需要安装EPEL存储库

    由于RabbitMQ依赖Erlang, 所以需要先安装Erlang。

    2.1.1 安装Erlang

    #添加erlang solutions源
    [root@rabbitmq-node01 ~]# yum -y install epel-release
    [root@rabbitmq-node01 ~]# rpm -qa epel-release
    epel-release-7-11.noarch
    
    #我们要安装最新版本的Erlang到服务器中
    [root@rabbitmq-node01 ~]# yum -y update epel-release
    [root@rabbitmq-node01 ~]# rpm -qa epel-release
    epel-release-7-12.noarch
    
    #安装Erlang
    [root@rabbitmq-node01 ~]# yum -y install erlang socat
    [root@rabbitmq-node01 ~]# rpm -qa erlang socat
    socat-1.7.3.2-2.el7.x86_64
    erlang-R16B-03.18.el7.x86_64
    

    2.1.2 检查Erlang版本

    [root@rabbitmq-node01 ~]# erl -version
    Erlang (ASYNC_THREADS,HIPE) (BEAM) emulator version 5.10.4
    

    2.2 安装RabbitMQ

    RabbitMQ为预编译并可以直接安装的企业Linux系统提供RPM软件包。 唯一需要的依赖是将Erlang安装到系统中。 我们已经安装了Erlang,我们可以进一步下载RabbitMQ。

    #通过运行下载Erlang RPM软件包。
    [root@rabbitmq-node01 ~]# which wget
    /usr/bin/wget
    [root@rabbitmq-node01 ~]# wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
    
    [root@rabbitmq-node01 ~]# ll -d rabbitmq-server-3.6.10-1.el7.noarch.rpm 
    -rw-r--r-- 1 root root 4930939 5月  25 2017 rabbitmq-server-3.6.10-1.el7.noarch.rpm      #rpm包
    
    #运行RPM安装RPM包
    [root@rabbitmq-node01 ~]# rpm -Uvh rabbitmq-server-3.6.10-1.el7.noarch.rpm
    警告:rabbitmq-server-3.6.10-1.el7.noarch.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 6026dfca: NOKEY
    准备中...                          ################################# [100%]
    正在升级/安装...
       1:rabbitmq-server-3.6.10-1.el7     ################################# [100%]
    

    2.3 开始RabbitMQ

    #启动RabbitMQ服务器进程
    [root@rabbitmq-node01 ~]# systemctl start rabbitmq-server
    
    #在引导时自动启动RabbitMQ
    [root@rabbitmq-node01 ~]# systemctl enable rabbitmq-server
    Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
    
    #检查RabbitMQ服务器的状态
    [root@rabbitmq-node01 ~]# systemctl status rabbitmq-server
    

    如果启动成功,应该得到以下输出:

    image.png-178kB

    3. 访问Web控制台

    3.1 启动RabbitMQ Web管理控制台(以下操作需两个节点同步操作)

    [root@rabbitmq-node01 ~]# rabbitmq-plugins enable rabbitmq_management
    The following plugins have been enabled:
      amqp_client
      cowlib
      cowboy
      rabbitmq_web_dispatch
      rabbitmq_management_agent
      rabbitmq_management
    
    Applying plugin configuration to rabbit@rabbitmq-node01... started 6 plugins.
    

    3.2 将RabbitMQ文件的所有权提供给RabbitMQ用户

    [root@rabbitmq-node01 ~]# chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/
    

    3.3 为RabbitMQ Web管理控制台创建管理用户

    [root@rabbitmq-node01 ~]# rabbitmqctl add_user admin admin
    Creating user "admin"                          账号   密码
    
    [root@rabbitmq-node01 ~]# rabbitmqctl set_user_tags admin administrator
    Setting tags for user "admin" to [administrator]
    
    [root@rabbitmq-node01 ~]# rabbitmqctl set_permissions -p / admin “.*” “.*” “.*”
    Setting permissions for user "admin" in vhost "/"
    

    3.4 将管理员更改为管理员用户的首选用户名,然后浏览器访问

    http://192.168.200.23:15672
    image.png-97.4kB

    image.png-358.2kB
    http://192.168.200.24:15672
    image.png-353.7kB

    4. 实现主从两台RabbitMQ信息同步

    4.1 分别加入映射IP

    [root@rabbitmq-node01 ~]# vim /etc/hosts
    [root@rabbitmq-node01 ~]# tail -2 /etc/hosts
    192.168.200.23 rabbitmq-node01 
    192.168.200.24 rabbitmq-node02
    

    4.2 停掉Rabbitmq从节点

    [root@rabbitmq-node02 ~]# systemctl status rabbitmq-server
    [root@rabbitmq-node02 ~]# systemctl stop rabbitmq-server
    [root@rabbitmq-node02 ~]# systemctl status rabbitmq-server
    

    4.3 Rabbitmq主节点中的.erlang.cookie文件同步到Rabbitmq从节点

    [root@rabbitmq-node02 ~]# cd /var/lib/rabbitmq
    [root@rabbitmq-node02 rabbitmq]# scp -r root@192.168.200.23:/var/lib/rabbitmq/.erlang.cookie .
    [root@rabbitmq-node02 rabbitmq]# ll -d .erlang.cookie 
    -r-------- 1 root root 20 11月  5 07:23 .erlang.cookie
    
    #修改其属主属组与权限
    [root@rabbitmq-node02 rabbitmq]# chown rabbitmq.rabbitmq .erlang.cookie
    [root@rabbitmq-node02 rabbitmq]# chmod 600 .erlang.cookie
    [root@rabbitmq-node02 rabbitmq]# ll -d .erlang.cookie 
    -rw------- 1 rabbitmq rabbitmq 20 11月  5 07:23 .erlang.cookie
    

    4.4 启动Rabbitmq从节点

    [root@rabbitmq-node02 rabbitmq]# systemctl status rabbitmq-server
    [root@rabbitmq-node02 rabbitmq]# systemctl start rabbitmq-server
    [root@rabbitmq-node02 rabbitmq]# systemctl status rabbitmq-server
    

    4.5 将Rabbitmq从节点加到Rabbitmq主节点集群当中

    #停掉rabbitmq-node02应用
    [root@rabbitmq-node02 rabbitmq]# rabbitmqctl stop_app
    Stopping rabbit application on node 'rabbit@rabbitmq-node02'
    
    #将Rabbitmq从节点加到Rabbitmq主节点集群当中
    [root@rabbitmq-node02 rabbitmq]# rabbitmqctl join_cluster rabbit@rabbitmq-node01
    Clustering node 'rabbit@rabbitmq-node02' with 'rabbit@rabbitmq-node01'
    
    #启动rabbitmq-node01应用
    [root@rabbitmq-node02 rabbitmq]# rabbitmqctl start_app
    Starting node 'rabbit@rabbitmq-node02'
    
    #查看集群状态
    [root@rabbitmq-node01 ~]# rabbitmqctl cluster_status
    Cluster status of node 'rabbit@rabbitmq-node01'
    [{nodes,[{disc,['rabbit@rabbitmq-node01','rabbit@rabbitmq-node02']}]},
     {running_nodes,['rabbit@rabbitmq-node02','rabbit@rabbitmq-node01']},
     {cluster_name,<<"rabbit@rabbitmq-node01">>},
     {partitions,[]},
     {alarms,[{'rabbit@rabbitmq-node02',[]},{'rabbit@rabbitmq-node01',[]}]}]
    
    [root@rabbitmq-node02 rabbitmq]# rabbitmqctl cluster_status
    Cluster status of node 'rabbit@rabbitmq-node02'
    [{nodes,[{disc,['rabbit@rabbitmq-node01','rabbit@rabbitmq-node02']}]},
     {running_nodes,['rabbit@rabbitmq-node01','rabbit@rabbitmq-node02']},
     {cluster_name,<<"rabbit@rabbitmq-node01">>},
     {partitions,[]},
     {alarms,[{'rabbit@rabbitmq-node01',[]},{'rabbit@rabbitmq-node02',[]}]}]
    

    4.6 在web页面检查集群状态

    image.png-450.8kB

    image.png-451.2kB

    4.7 增加主备同步自动同步模式(主从同时进行)

    [root@rabbitmq-node01 ~]# rabbitmqctl set_policy -p / ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
    Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all","ha-sync-mode":"automatic"}" with priority "0"
    
    [root@rabbitmq-node01 ~]# rabbitmqctl list_policies
    Listing policies
    /	ha-all	all	^	{"ha-mode":"all","ha-sync-mode":"automatic"}	0
    
    [root@rabbitmq-node01 ~]# rabbitmqctl stop_app;
    Stopping rabbit application on node 'rabbit@rabbitmq-node01'
    [root@rabbitmq-node01 ~]# rabbitmqctl start_app;
    Starting node 'rabbit@rabbitmq-node01'
    

    4.8 在web页面测试信息同步状态

    4.8.1 已知目前队列信息均为空

    image.png-143.5kB

    image.png-143.1kB

    4.8.2 在Rabbitmq主节点添加一条队列信息

    image.png-250.9kB

    image.png-173.4kB

    image.png-185.7kB

    4.8.3 测试消费队列同步信息,在Rabbitmq主节点的队列中添加一条信息

    image.png-168.9kB

    image.png-293.1kB

    image.png-181.1kB

    image.png-217.5kB

    5. 部署keepalive高可用集群

    5.1 本地yum源安装keepalive软件

    [root@rabbitmq-node01 ~]# yum -y install keepalived
    [root@rabbitmq-node01 ~]# rpm -qa keepalived
    keepalived-1.3.5-16.el7.x86_64
    

    5.2 修改keealived主从优先级

    #修改keealived主配置文件
    [root@rabbitmq-node01 ~]# cd /etc/keepalived/
    [root@rabbitmq-node01 keepalived]# vim keepalived.conf
    [root@rabbitmq-node01 keepalived]# cat keepalived.conf
    ! Configuration File for keepalived
    vrrp_instance VI_1 {
        state BACKUP
        interface ens32
        garp_master_delay 10
        virtual_router_id 44
        priority 100   #主节点要高于备节点
        nopreempt      #当主节点恢复后,VIP不主动飘回
        #advert_int的作用是巡检的次数。keepalived默认是在启动完成后3秒向state:MASTER切换。若此处设置成2,则是2*3=6秒后才开启切换。                 
        advert_int 1
        authentication {
            auth_type PASS  
            auth_pass rabbitMQ   #密码唯一,主备要一致
        }
        virtual_ipaddress {
            192.168.200.25/24       #VIP
        }
    }
    
    #修改keealived从配置文件
    [root@rabbitmq-node02 rabbitmq]# cd /etc/keepalived/
    [root@rabbitmq-node02 keepalived]# vim keepalived.conf
    [root@rabbitmq-node02 keepalived]# cat keepalived.conf
    ! Configuration File for keepalived
    vrrp_instance VI_1 {
         state BACKUP
         interface ens32
         garp_master_delay 10
         virtual_router_id 44
         priority 90    #备节点要低于主节点
         nopreempt      #当主节点恢复后,VIP不主动飘回
         #advert_int的作用是巡检的次数。keepalived默认是在启动完成后3秒向state:MASTER切换。若此处设置成2,则是2*3=6秒后才开启切换。                 
         advert_int 1
         authentication {
             auth_type PASS
             auth_pass rabbitMQ    #密码唯一,主备要一致
         }
         virtual_ipaddress {
             192.168.200.25/24        #VIP
         }
    }
    

    5.3 启动keealived

    [root@rabbitmq-node01 keepalived]# systemctl status keepalived
    [root@rabbitmq-node01 keepalived]# systemctl start keepalived
    [root@rabbitmq-node01 keepalived]# systemctl status keepalived
    

    5.4 检查VIP状态

    [root@rabbitmq-node01 keepalived]# ip addr | grep -w 192.168.200.25
        inet 192.168.200.25/24 scope global secondary ens32
    
    [root@rabbitmq-node02 keepalived]# ip addr | grep -w 192.168.200.25
    

    5.5 测试VIP登录Rabbitmq的web页面http://192.168.200.25:15672

    image.png-393.5kB

    image.png-204.1kB

    5.6 测试keepalived主备切换

    5.6.1 宕掉主节点服务器

    #模拟主节点服务器意外故障
    [root@rabbitmq-node01 keepalived]# shutdown 
    
    #VIP主动飘到了从节点
    [root@rabbitmq-node02 keepalived]# ip addr | grep -w 192.168.200.25
        inet 192.168.200.25/24 scope global secondary ens32
    

    5.6.2检查VIP登录Rabbitmq的web页面有无异常http://192.168.200.25:15672

    image.png-369.9kB

    image.png-210.1kB

    5.6.3 主节点服务器已修复启动,正常运行中

    #检查rabbitmq与keepalived服务均正常运行
    [root@rabbitmq-node01 ~]# systemctl status rabbitmq-server
    [root@rabbitmq-node01 ~]# systemctl status keepalived
    
    #检查VIP所在位置
    [root@rabbitmq-node01 ~]# ip addr | grep -w 192.168.200.25
    
    [root@rabbitmq-node02 ~]# ip addr | grep -w 192.168.200.25
        inet 192.168.200.25/24 scope global secondary ens32
    
    #备注:这说明之前的配置已生效,VIP不会主动往回飘
    

    5.6.4 宕掉从节点服务器

    #模拟从节点服务器意外故障
    [root@rabbitmq-node02 keepalived]# shutdown 
    
    #VIP主动又飘回了主节点
    [root@rabbitmq-node01 ~]# ip addr | grep -w 192.168.200.25
        inet 192.168.200.25/24 scope global secondary ens32
    

    5.6.5检查VIP登录Rabbitmq的web页面有无异常http://192.168.200.25:15672

    image.png-375.4kB

    image.png-215.9kB

  • 相关阅读:
    HTML&CSS学习总结(一)
    PHP学习总结(一)
    二、python基础1 基本语法、流程控制
    MySQL练习题
    python自动化学习目录大全
    简单练习:Python三级菜单优化
    一、python语言简介
    网络编程与并发—批量主机管理开发
    windows安装nginx并存放静态资源
    集成xxl-job分布式任务调度平台
  • 原文地址:https://www.cnblogs.com/ywb123/p/11151657.html
Copyright © 2011-2022 走看看