zoukankan      html  css  js  c++  java
  • RabbitMQ——安装、集群搭建、镜像队列配置

    一、环境说明

    1、Centos7.7-64位
    2、Erlang-OTP 23
    3、RabbitMQ-3.8.9

    操作系统

    ip

    主机名

    配置

    centos 7.7

    17.16.10.62

    rabbit-1

    4核8g

    centos 7.7

    17.16.10.63

    rabbit-2

    4核8g

    centos 7.7

    17.16.10.66

    rabbit-3

    4核8g

    二、下载安装文件

    1、RabbitMQ软件:

    https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.9/rabbitmq-server-3.8.9-1.el7.noarch.rpm

    2、erlang是RabbitMQ的依賴軟件,在erlang官网下载以下版本:

    https://github.com/rabbitmq/erlang-rpm/releases/download/v23.2.1/erlang-23.2.1-1.el7.x86_64.rpm

    3、把下载的文件分别上传到3台服务器的 /root/soft/rabbitmq 目录下。

    三、安装RabbitMQ依赖包

    • 安装基础依赖包

    1. 配置yum源

    touch /etc/yum.repos.d/rabbitmq_erlang.repo
    
    vim /etc/yum.repos.d/rabbitmq_erlang.repo
    [rabbitmq-erlang]
    name=rabbitmq-erlang
    baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/23/el/7
    gpgcheck=1
    gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
    repo_gpgcheck=0
    enabled=1

    2. 导入key

    rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc

    注:安装 rabbitMQ 时需要key。

    3. 安装socat

    yum -y install epel-release
    yum -y install socat

    注:安装 rabbitMQ 时需要依赖socat。

    • 安装与配置erlang

    1. erlang和rabbitmq的版本对应关系

    2. 安装erlang

    cd /root/soft/rabbitmq
    rpm -ivh erlang-23.2.1-1.el7.x86_64.rpm

    3. 使用以下指令进入erlang如出现以下讯息表示成功安装:

    shell>erl

     

    ctrl+c退出。

    四、安装RabbitMQ

    • 安装RabbitMQ
    cd /root/soft/rabbitmq
    rpm -ivh rabbitmq-server-3.8.9-1.el7.noarch.rpm

    • 在rabbit-1、rabbit-2、rabbit-3上分別配置RabbitMQ:

    rabbit-1:

    touch /etc/rabbitmq/rabbitmq-env.conf
    echo "NODENAME=rabbit@rabbit-1" > /etc/rabbitmq/rabbitmq-env.conf

    rabbit-2:

    touch /etc/rabbitmq/rabbitmq-env.conf
    echo "NODENAME=rabbit@rabbit-2" > /etc/rabbitmq/rabbitmq-env.conf

    rabbit-3:

    touch /etc/rabbitmq/rabbitmq-env.conf
    echo "NODENAME=rabbit@rabbit-3" > /etc/rabbitmq/rabbitmq-env.conf
    • 启动RabbitMQ节点
    systemctl start rabbitmq-server

    注:该命令会同时启动 Erlang 虚拟机和 RabbitMQ 应用服务。而后文用到的 rabbitmqctl start_app 只会启动 RabbitMQ 应用服务, rabbitmqctl stop_app 只会停止 RabbitMQ 服务。

    • 查看RabbitMQ节点状态
    systemctl status rabbitmq-server

    rabbitmqctl status

    • 停止RabbitMQ节点
    systemctl stop rabbitmq-server
    • 开启RabbitMQ管理控制台
    rabbitmq-plugins enable rabbitmq_management

    五、配置RabbitMQ集群

    1. 在3台机器上/etc/hosts文件中添加IP和节点名称的对应:

    vi /etc/hosts
    172.16.10.62 rabbit-1
    172.16.10.63 rabbit-2
    172.16.10.66 rabbit-3

    2. 在各个RabbitMQ服务器中停止RabbitMQ服务:

    rabbitmqctl stop rabbitmq-server

    3. 拷贝 cookie

    将一台主机上的 .erlang.cookie 文件拷贝到其他两台主机上。该 cookie 文件相当于密钥令牌,集群中的 RabbitMQ 节点需要通过交换密钥令牌以获得相互认证,
    因此处于同一集群的所有节点需要具有相同的密钥令牌,否则在搭建过程中会出现 Authentication Fail 错误。

    RabbitMQ 服务启动时,erlang VM 会自动创建该 cookie 文件,默认的存储路径为:

    /var/lib/rabbitmq/.erlang.cookie
    或 
    $HOME/.erlang.cookie

    rabbit-1:

    登陆第一台rabbit-1机器,拷贝cookie至另外2台机器rabbit-2、rabbit-3:

    scp /var/lib/rabbitmq/.erlang.cookie root@172.16.10.63:/var/lib/rabbitmq/
    scp /var/lib/rabbitmq/.erlang.cookie root@172.16.10.66:/var/lib/rabbitmq/

    rabbit-2:

    登录rabbit-2机器执行:

    chown -R rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie
    chmod 600 /var/lib/rabbitmq/.erlang.cookie

    rabbit-3:

    登录rabbit-3机器执行:

    chown -R rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie
    chmod 600 /var/lib/rabbitmq/.erlang.cookie

    4. 启动3个节点上的RabbitMQ服务:

    systemctl start rabbitmq-server

    5. 在rabbit-2及rabbit-3服务器中使用以下指令把在rabbit-2及rabbit-3服务器中的RabbitMQ服务加入到rabbit-1服务器的rabbitmq集群中:

    rabbit-2:

    # 1.停止服务
    rabbitmqctl stop_app
    # 2.重置状态
    rabbitmqctl reset
    # 3.节点加入 rabbitmqctl join_cluster rabbit@rabbit
    -1
    # 4.启动服务 rabbitmqctl start_app

    rabbit-3:

    # 1.停止服务
    rabbitmqctl stop_app
    # 2.重置状态
    rabbitmqctl reset
    # 3.节点加入 rabbitmqctl join_cluster rabbit@rabbit-1
    # 4.启动服务 rabbitmqctl start_app

    join_cluster 命令有一个可选的参数 --ram ,该参数代表新加入的节点是内存节点,默认是磁盘节点。

    如果是内存节点,则所有的队列、交换器、绑定关系、用户、访问权限和 vhost 的元数据都将存储在内存中,如果是磁盘节点,则存储在磁盘中。

    内存节点可以有更高的性能,但其重启后所有配置信息都会丢失,因此RabbitMQ 要求在集群中至少有一个磁盘节点,其他节点可以是内存节点。

    当内存节点离开集群时,它可以将变更通知到至少一个磁盘节点;然后在其重启时,再连接到磁盘节点上获取元数据信息。

    除非是将 RabbitMQ 用于 RPC 这种需要超低延迟的场景,否则在大多数情况下,RabbitMQ 的性能都是够用的,可以采用默认的磁盘节点的形式。

    另外,如果节点以磁盘节点的形式加入,则需要先使用 reset 命令进行重置,然后才能加入现有群集,重置节点会删除该节点上存在的所有的历史资源和数据。

    采用内存节点的形式加入时可以略过 reset 这一步,因为内存上的数据本身就不是持久化的。

    6. 在rabbit-1服务器上确认rabbitmq集群的信息:

    rabbitmqctl cluster_status

    六、配置RabbitMQ管理控制面板

    1. 创建用户

    rabbitmqctl add_user zat zat123

    2. 创建vhost

    rabbitmqctl add_vhost zat

    3. 分配权限

    rabbitmqctl set_permissions -p zat zat ".*" ".*" ".*"

    4. 赋予admin权限

    rabbitmqctl set_user_tags zat administrator

    5. 用户zat分配vhost zat的用户许可证

    rabbitmqctl  set_permissions -p zat  zat '.*' '.*' '.*'

    6. 登入RabbitMQ管理控制台

    http:// 172.16.10.62:15672/#/
    用户zat 密码zat123

     

    七、設置鏡像隊列策略

    • 設置

    在rabbit-1节点上执行:

    rabbitmqctl set_policy -p zat ha-allqueue "^" '{"ha-mode":"all"}'

    命令說明:针对指定vhost(zat)下的queue进行设置为镜像队列,即队列会被复制到集群各个节点,各个集群节点交换机、队列、队列内容都保持一致。

    • 複製系統
    在上面我们指定了 ha-mode 的值为 all ,代表消息会被同步到所有节点的相同队列中。这里我们之所以这样配置,因为我们本身只有三个节点,因此复制操作的性能开销比较小。
    如果你的集群有很多节点,那么此时复制的性能开销就比较大,此时需要选择合适的复制系数。通常可以遵循过半写原则,即对于一个节点数为 n 的集群,只需要同步到 n/2+1 个节点上即可。
    此时需要同时修改镜像策略为 exactly,并指定复制系数 ha-params,示例命令如下:
    rabbitmqctl set_policy ha-two "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
    • 驗證

    1、在rabbit-1節點增加一個隊列(在vhost下):mirror_queue_test

    2、查看mirror_queue_test隊列的列表信息:

    3、在列表信息點擊mirror_queue_test,查看它的詳細信息:

    注:上圖中該隊列使用了策略(ha-allqueue),有2個鏡像節點(rabbit@rabbit63、rabbit@rabbit66)

    4、驗證完成後,在詳細信息介面中,刪除mirror_queue_test隊列:

    八、集群节点下线

    以上介绍的集群搭建的过程就是服务扩容的过程,如果想要进行服务缩容,即想要把某个节点剔除集群,有两种可选方式:

    第一种:可以先使用 rabbitmqctl stop 停止该节点上的服务,然后在其他任意一个节点上执行 forget_cluster_node 命令。

    这里以剔除 rabbit-3 上的服务为例,此时可以在 rabbit-1 或 2 上执行下面的命令:

    rabbitmqctl forget_cluster_node rabbit@rabbit-3

    第二种:先使用 rabbitmqctl stop 停止该节点上的服务,然后再执行 rabbitmqctl reset 这会清空该节点上所有历史数据,并主动通知集群中其它节点它将要离开集群。

    九、集群关闭与重启

    没有一个直接的命令可以关闭整个集群,需要逐一进行关闭。但是需要保证在重启时,最后关闭的节点最先被启动。

    如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的那个节点启动,默认进行 10 次连接尝试,超时时间为 30 秒,如果依然没有等到,则该节点启动失败。

    这带来的一个问题是,假设在一个三节点的集群当中,关闭的顺序为 node1,node2,node3,如果 node1 因为故障暂时没法恢复,此时 node2 和 node3 就无法启动。

    想要解决这个问题,可以先将 node1 节点进行剔除,命令如下:

    rabbitmqctl forget_cluster_node rabbit@node1 -offline

    此时需要加上 -offline 参数,它允许节点在自身没有启动的情况下将其他节点剔除。

    十、卸載

    停止服务:

    rabbitmqctl stop_app

    停止进程:

    systemctl stop rabbitmq-server

    查看进程状态kill 掉erlang相关进程:

    ps -ef |grep rabbit

    卸载MQ:

    yum list|grep rabbitmq
    yum -y remove rabbitmq-server.noarch

    卸载erlang:

    yum list | grep erlang
    yum -y remove erlang.x86_64

    删除相关文件:

    rm -rf /usr/lib64/erlang
    rm -rf /var/lib/rabbitmq
    rm -rf /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.9/
    rm -rf /etc/rabbitmq/
    rm -rf /var/log/rabbitmq
  • 相关阅读:
    学号 2019-2020-1 《数据结构与面向对象程序设计》第四周学习总结
    20182317 2019-2020-1 《数据结构与面向对象程序设计》实验三报告
    学号 2019-2020-1 《数据结构与面向对象程序设计》第2&3周学习总结
    第二次实验报告
    20182317 《数据结构与面向对象程序设计》实验一报告
    # 学号 2019-2020-1 《数据结构与面向对象程序设计》第1周学习总结
    system_call中断处理过程
    系统调用过程
    Week4_Linux书本一二两章
    Linux系统的启动过程
  • 原文地址:https://www.cnblogs.com/caoweixiong/p/14371487.html
Copyright © 2011-2022 走看看