当前位置:   article > 正文

RabbitMQ集群搭建、镜像队列、实现高可用负载均衡、Federation Exchange、Federation Queue、Shovel_check if inter-node connections may be configured

check if inter-node connections may be configured to use tls. if so, all nod

1、环境准备

IP地址主机名
192.168.56.20conch01
192.168.56.21conch02
192.168.56.22conch03

2、安装 rabbitmq集群

1、之前我们已经在conch01上面安装了一台rabbitmq,下面我们只需要在另外两台安装即可

        conch02、conch03

        

 

 

2、配置.erlang.cookie

  RabbitMQ 的集群是依赖 erlang 集群,而 erlang 集群是通过这个 cookie 进行通信认证的,因此,三台机器的配置文件需要一致

我们将conch01的/var/lib/rabbitmq/.erlang.cookie文件拷贝到其他两台机器下

  1. scp /var/lib/rabbitmq/.erlang.cookie root@conch02:/var/lib/rabbitmq/.erlang.cookie
  2. scp /var/lib/rabbitmq/.erlang.cookie root@conch03:/var/lib/rabbitmq/.erlang.cookie

3、启动RabbitMQ服务,顺带启动Erlang虚拟机和RabbitMQ应用服务,三台节点下执行

rabbitmq-server -detached

4、在节点2执行

  1. # rabbitmqctl stop会将Erlang虚拟机关闭 rabbitmqctl stop_app 只关闭rabbitmq服务
  2. rabbitmqctl stop_app
  3. rabbitmqctl reset
  4. rabbitmqctl join_cluster rabbit@conch01
  5. # 只启动rabbitmq服务
  6. rabbitmqctl start_app

出现问题:

  1. [root@conch03 rabbitmq]# rabbitmqctl stop_app
  2. Stopping rabbit application on node rabbit@conch03 ...
  3. Error: unable to perform an operation on node 'rabbit@conch03'. Please see diagnostics information and suggestions below.
  4. Most common reasons for this are:
  5. * Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
  6. * CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
  7. * Target node is not running
  8. In addition to the diagnostics info below:
  9. * See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more
  10. * Consult server logs on node rabbit@conch03
  11. * If target node is configured to use long node names, don't forget to use --longnames with CLI tools
  12. DIAGNOSTICS
  13. ===========
  14. attempted to contact: [rabbit@conch03]
  15. rabbit@conch03:
  16. * connected to epmd (port 4369) on conch03
  17. * epmd reports node 'rabbit' uses port 25672 for inter-node and CLI tool traffic
  18. * TCP connection succeeded but Erlang distribution failed
  19. * suggestion: check if the Erlang cookie identical for all server nodes and CLI tools
  20. * suggestion: check if all server nodes and CLI tools use consistent hostnames when addressing each other
  21. * suggestion: check if inter-node connections may be configured to use TLS. If so, all nodes and CLI tools must do that
  22. * suggestion: see the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more
  23. Current node details:
  24. * node name: 'rabbitmqcli-3-rabbit@conch03'
  25. * effective user's home directory: /var/lib/rabbitmq
  26. * Erlang cookie hash: vRfqB6mBzPh2BfPPZife/A==
  27. [root@conch03 rabbitmq]#

原因:

        RabbitMQ的erlang.cookie和用户的cookie冲突了,需要用rabbitmq的cookie去覆盖用户的cookie。

解决:

        sudo cp /var/lib/rabbitmq/.erlang.cookie ~/.erlang.cookie

重启即可

5、在节点3执行

  1. rabbitmqctl stop_app
  2. rabbitmqctl reset
  3. rabbitmqctl join_cluster rabbit@conch02
  4. rabbitmqctl start_app

6、查看集群状态

rabbitmqctl cluster_status
  1. [root@conch01 ~]# rabbitmqctl cluster_status
  2. Cluster status of node rabbit@conch01 ...
  3. Basics
  4. Cluster name: rabbit@conch01
  5. Disk Nodes
  6. rabbit@conch01
  7. rabbit@conch02
  8. rabbit@conch03
  9. Running Nodes
  10. rabbit@conch01
  11. rabbit@conch02
  12. rabbit@conch03
  13. Versions
  14. rabbit@conch01: RabbitMQ 3.8.12 on Erlang 23.2.6
  15. rabbit@conch02: RabbitMQ 3.8.12 on Erlang 23.2.6
  16. rabbit@conch03: RabbitMQ 3.8.12 on Erlang 23.2.6
  17. Maintenance status
  18. Node: rabbit@conch01, status: not under maintenance
  19. Node: rabbit@conch02, status: not under maintenance
  20. Node: rabbit@conch03, status: not under maintenance
  21. Alarms
  22. (none)
  23. Network Partitions
  24. (none)
  25. Listeners
  26. Node: rabbit@conch01, interface: [::], port: 15672, protocol: http, purpose: HTTP API
  27. Node: rabbit@conch01, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
  28. Node: rabbit@conch01, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
  29. Node: rabbit@conch02, interface: [::], port: 15672, protocol: http, purpose: HTTP API
  30. Node: rabbit@conch02, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
  31. Node: rabbit@conch02, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
  32. Node: rabbit@conch03, interface: [::], port: 15672, protocol: http, purpose: HTTP API
  33. Node: rabbit@conch03, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
  34. Node: rabbit@conch03, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
  35. Feature flags
  36. Flag: drop_unroutable_metric, state: enabled
  37. Flag: empty_basic_get_metric, state: enabled
  38. Flag: implicit_default_bindings, state: enabled
  39. Flag: maintenance_mode_status, state: enabled
  40. Flag: quorum_queue, state: enabled
  41. Flag: user_limits, state: enabled
  42. Flag: virtual_host_metadata, state: enabled
  43. [root@conch01 ~]#

7、需要重新设置用户(随便一台机器执行即可)

  1. # 创建账号
  2. rabbitmqctl add_user admin 123456
  3. # 设置用户角色
  4. rabbitmqctl set_user_tags admin administrator
  5. # 设置用户权限
  6. rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

之后在三个集群节点的任意一个可视化界面登录均可

8、解除集群节点,node2和node3分别执行 

  1. rabbitmqctl stop_app
  2. rabbitmqctl reset
  3. rabbitmqctl start_app
  4. rabbitmqctl cluster_status
  5. # 此项命令均在node1上执行
  6. rabbitmqctl forget_cluster_node rabbit@对应节点的hostname
  7. 例如:rabbitmqctl forget_cluster_node rabbit@conch02

3、镜像队列

1、使用镜像的原因

        如果RabbitMQ集群中只有一个Broker节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,但是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一个短暂却会产生问题的时间窗。通过publisherconfirm机制能够确保客户端知道哪些消息己经存入磁盘,尽管如此,一般不希望遇到因单点故障导致的服务不可用。
        引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他Broker节点之上,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性

2、搭建步骤

  1. 启动三台集群节点
  2. 随便找一个节点添加policy,例如我们在conch01节点

     

  3. 在conch01上创建一个队列试试

    可以发现出现了一个加1,表示有一个备份
     那么一旦conch01出现宕机,那么备份节点conch02就可以用了,
    我们将conch01节点停掉再看一下:

    发现重新在节点3上再次备份一下,保证数据不丢失。 

4、实现高可用负载均衡

        HAProxy.提供高可用性、负载均衡及基于TCPHTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub.在内的多家知名互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的井发连接数。

 5、Federation Exchange

1、使用原因

        (broker北京),(broker深圳)彼此之间相距甚远,网络延迟是一个不得不面对的问题。有一个在北京的业务(Client北京)需要连接(broker北京),向其中的交换器exchangeA.发送消息,此时的网络延迟很小,(Client北京)可以迅速将消息发送至exchangeA.中,就算在开启了publisherconfirm.机制或者事务机制的情况下,也可以迅速收到确认信息。此时又有个在深圳的业务(Client深圳)需要向exchangeA发送消息,那么(Client深圳)(broker北京)之间有很大的网络延迟,(Client深圳)将发送消息至exchangeA会经历一定的延迟,尤其是在开启了publisherconfirm.机制或者事务机制的情况下,(Client深圳)会等待很长的延迟时间来接收(broker北京)的确认信息,进而必然造成这条发送线程的性能降低,甚至造成一定程度上的阻塞。

        将业务(Client深圳)部署到北京的机房可以解决这个问题,但是如果(Client深圳)调用的另些服务都部署在深圳,那么又会引发新的时延问题,总不见得将所有业务全部部署在一个机房,那么容灾又何以实现?这里使用Federation插件就可以很好地解决这个问题.

2、搭建步骤 

  1. 需要保证每台节点单独运行

  2. 在每台机器上开启federation相关插件
     

    1. # 每台节点均需执行以下命令
    2. rabbitmq-plugins enable rabbitmq_federation
    3. rabbitmq-plugins enable rabbitmq_federation_management
  3. 原理图

     

  4. 在下游节点(node2)配置上游节点(node1)

     

  5. 添加policy

     

  6. 成功
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vUDIj4bm-1630999921199)(D:\学习资料\图片\image-20210907143703833.png)] 

6、Federation Queue

1、使用原因

        联邦队列可以在多个Broker节点(或者集群)之间为单个队列提供均衡负载的功能。一个联邦队列可以连接一个或者多个上游队列(upstream queue),并从这些上游队列中获取消息以满足本地消费者消费消息的需求。 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GrEsaxGN-1630999921199)(D:\学习资料\图片\image-20210907143939763.png)]

  1. 添加上下游配置(同10.4)

  2. 添加policy

     

 

7、Shovel

1、简介

        Federation具备的数据转发功能类似,Shovel够可靠、持续地从一个Broker中的队列(作为源端,即source)拉取数据并转发至另一个Broker中的交换器(作为目的端,即destination)。作为源端的队列和作为目的端的交换器可以同时位于同一个Broker,也可以位于不同的Broker上。Shovel可以翻译为"铲子",是一种比较形象的比喻,这个"铲子"可以将消息从一方"铲子"另一方。Shovel行为就像优秀的客户端应用程序能够负责连接源和目的地、负责消息的读写及负责连接失败问题的处理。

2、开启插件(需要的机器都开启) 

  1. rabbitmq-plugins enable rabbitmq_shovel
  2. rabbitmq-plugins enable rabbitmq_shovel_management

3、添加shevel源和目的地

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/416603
推荐阅读
相关标签
  

闽ICP备14008679号