使用AWS时,为了获得高可用性设置,once必须在多个可用性区域(AZ ≈数据中心)中拥有实例。如果一个AZ死亡(这是可能发生的),您的应用程序应该继续服务请求。
在多个AZ中设置应用程序节点很简单(如果它们被恰当地编写成无状态的),但是对于数据库、消息队列和所有有状态的东西来说就比较复杂了。所以我们来看看如何配置RabbitMQ。第一步不仅与RabbitMQ相关,还与任何持久数据解决方案相关。
首先(无论是使用CloudFormation还是手动设置),您必须:
- 喝一杯VPC。没有VPC也许是可能的,但是我不能保证,特别是下面讨论的DNS主机名
- 声明私有子网(针对每个AZ)
- 使用以下命令声明RabbitMQ自动缩放组(建议有一个)以跨越多个az:
1
2
3
4
5
"AvailabilityZones"
: {
"Fn::GetAZs"
: {
"Ref"
:
"AWS::Region"
}
}
- 使用声明RabbitMQ自动缩放组以跨越多个子网
VPCZoneIdentifier
财产 - 在RabbitMQ节点前面声明负载平衡器(这是确保负载均匀分布到Rabbit集群的最简单的方法),以跨越所有子网
- 将负载平衡器声明为
"CrossZone": true
然后是建议使用集群,但是可用性区域之间的连接可以被视为(可能有点乐观)LA多个AZ上使用集群是可以的)
https://bbs.hupu.com/52239786.html
通过联合,您可以声明您的交换将它们收到的所有消息发送到另一个节点的交换。这在广域网中非常有用,在广域网中,网络断开是常见的,速度不是那么重要。但是它可能仍然适用于多AZ场景,因此值得及要执行的确切命令,如何实现这一点,使用处在于自动伸缩——每当您需要添加新节点时,您都应该修改(某些)现有节点配置,以便将新节点设置为它们的上游节点。您可能还需要允许其他机器作为来宾连接到rabbitmq([{rabbit, [{loopback_users, []}]}]
或者想办法配置一个定制的用户名/密码对,以便联邦能够工作。
https://www.douban.com/note/826697058/
有了集群,就有点不同了,事实上设置起来更简单。您所要做的就是编写一个脚本,在启动时自动加入集群。这可能是使用AWS SDK的shell脚本或python脚本。这样一个脚本的主要步骤(坦白地说,并不那么简单)是:
- 查找全部运转RabbitMQ自动缩放组中的实例(使用AWS API过滤选项)
- 如果这是第一个节点(顺序是随机的,没有关系),假设它是集群的“种子”节点,所有其他节点都将连接到它
- 如果这不是第一个节点,请连接到第一个节点(使用
rabbitmqctl join_cluster rabbit@{node}
),其中{node}是实例专用DNS名称(可通过SDK获得) - 完成所有配置时停止RabbitMQ,完成后启动它
在所有情况下(集群或联盟),RabbitMQ都依赖域名。最简单的方法是在您的VPC中启用DNS主机名:"EnableDnsHostnames": true
。这里有一个小技巧,当它涉及到加入集群时,AWS API可能会返回完全限定的域名,其中包括类似于“.eu-west-1.compute.internal”除了ip-xxx-xxx-xxx-xxx部分。所以在加入RabbitMQ集群的时候,要把这个后缀去掉,否则不行。
最终结果应该考虑到集群,如果一个节点死亡,另一个节点产生(通过自动扩展组),集群应该正常工作。
将这两种方法与选项产生了更好的吞吐量——联合处理的消息减少了约1/3,延迟也有所增加。测试应该从一个应用程序节点执行,朝向RabbitMQ ELB(否则您只测试一个节点)。您可以获取PerfTest并执行它(其中amqp地址是RabbitMQ负载平衡器的DNS名称):
1 2 3 4 |
|
这两种方法中您将选择哪一种取决于您的具体情况,但是我通常会推荐集群选项。在云环境中,性能更高,设置和支持也更容易,因为节点会频繁产生和死亡。