aws 可用区
在使用AWS时,为了具有高度可用的设置,一次必须在多个可用区域(AZ≈数据中心)中拥有实例。 如果一个可用区死亡(可能会发生),则您的应用程序应继续处理请求。
在多个可用区中设置应用程序节点很简单(如果将它们正确地编写为无状态的话),但是对于数据库,消息队列和所有有状态的对象来说,这比较麻烦。 因此,让我们看看如何配置RabbitMQ。 第一步不仅与RabbitMQ有关,而且与任何持久数据解决方案都无关。
首先(无论使用CloudFormation还是手动设置),您必须:
- 有一个VPC。 没有VPC可能有可能,但是我无法保证,尤其是如下所述的DNS主机名
- 声明专用子网(对于每个可用区)
- 使用以下方法声明RabbitMQ自动缩放组(建议有一个)来跨越多个可用区:
"AvailabilityZones" : { "Fn::GetAZs" : { "Ref": "AWS::Region" } }
- 使用
VPCZoneIdentifier
属性声明RabbitMQ自动缩放组以跨越多个子网 - 在RabbitMQ节点之前声明LoadBalancer(这是确保将负载平均分配到Rabbit集群的最简单方法),以覆盖所有子网
- 将LoadBalancer声明为
"CrossZone": true
然后是特定的RabbitMQ配置。 通常,您有两种选择:
在WAN的情况下,不建议使用群集,但是可用区域之间的连接可以被视为LAN(可能有些乐观)( 本详细文章假定是其他情况,但是该线程暗示在多个可用区上使用群集是可以的)。
使用联合身份验证,您可以声明交换将它们收到的所有消息发送到另一个节点的交换。 这在广域网中很有用,在广域网中,网络断开很常见,而速度并不是那么重要。 但是它可能仍然适用于多可用区场景,因此值得研究。 这是一个示例 ,其中包含要执行的确切命令,以及如何使用federation plugin实现该命令的示例 。 联合身份验证的棘手部分是自动缩放-每当需要添加新节点时,都应修改(某些)现有节点配置,以便将新节点设置为上游节点。 您可能还需要允许其他计算机以访客身份连接到Rabbitmq(rabbitmq conf文件中的[{rabbit, [{loopback_users, []}]}]
),或找到一种方法来配置用于联盟的自定义用户名/密码对上班。
使用群集时,它有所不同,并且实际上更易于设置。 您要做的就是编写一个脚本,在启动时自动加入集群。 这可能是使用AWS开发工具包的Shell脚本或python脚本。 这样的脚本的主要步骤(坦白地说,不是那么简单):
- 在RabbitMQ自动扩展组中查找所有正在运行的实例(使用AWS API过滤选项)
- 如果这是第一个节点(顺序是随机的,没关系),请假定它是集群的“种子”节点,所有其他节点都将连接到该节点
- 如果这不是第一个节点,请连接到第一个节点(使用
rabbitmqctl join_cluster rabbit@{node}
),其中{node}是实例私有DNS名称(可通过SDK获得) - 完成所有配置时,请停止RabbitMQ,完成后再启动它
在所有情况下(集群或联合),RabbitMQ都依赖域名。 使它工作最简单的方法是在VPC中启用DNS主机名: "EnableDnsHostnames": true
。 这里有一个小技巧,当它表示要加入集群时– AWS API可能会返回完全限定的域名,除了ip-xxx-xxx之外,还包括“ .eu-west-1.compute.internal”之类的内容。 -xxx-xxx部分。 因此,在加入RabbitMQ集群时,应删除该后缀,否则它将不起作用。
最终结果应该允许一个群集,如果一个节点死亡而又产生了一个节点(通过自动缩放组),则该群集应该能够正常运行。
将这两种方法与PerfTest进行比较,可以为集群选项提供更好的吞吐量-联合处理的消息大约减少了1/3,并且延迟也有所增加。 测试应从应用程序节点向RabbitMQ ELB执行(否则,您仅测试一个节点)。 您可以获取PerfTest并执行类似的操作(其中amqp地址是RabbitMQ负载均衡器的DNS名称):
wget http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.3.4/rabbitmq-java-client-bin-3.3.4.tar.gz
tar -xvf rabbitmq-java-client-bin-3.3.4.tar.gz
cd rabbitmq-java-client-bin-3.3.4
sudo sh runjava.sh com.rabbitmq.examples.PerfTest -x 10 -y 10 -z 10 -h amqp://internal-foo-RabbitMQEl-1GM6IW33O-1097824.eu-west-1.elb.amazonaws.com:5672
您将采用两种方法中的哪一种取决于您的特定情况,但是我通常会建议使用群集选项。 性能更高,在云环境中的设置和支持也更容易,节点经常产生和死亡。
翻译自: https://www.javacodegeeks.com/2014/07/rabbitmq-in-multiple-aws-availability-zones.html
aws 可用区