我想了解自动扩展我的 Web 应用程序架构的可能选项。我的架构中有 Web 应用程序 (Tomcat)、中间件 (RabbitMQ)、数据库 (MongoDB)、工作器 (独立 Java 应用程序)。现在,我正在尝试根据 CPU 利用率进行扩展。我可以按预期自动扩展我的 Web 应用程序和工作器,但我在扩展 Rabbitmq 时遇到问题,因为我不知道如何将负载传递给新实例化的 rabbtimq 服务器。
例如,我有 2 个 Tomcat 服务器正在运行。每当我的 RabbitMQ 实例的 CPU 利用率超过 80% 时,AWS 就会添加一个新的 RabbitMQ 服务器。但我的 Tomcat 服务器不知道添加了新的 RabbitMQ 实例,因此它们只引用原始 RabbitMQ 服务器,而不是新创建的服务器。
我能做什么?当 Rabbit CPU 利用率上升时,我应该自动扩展整个架构吗?还是我应该完全放弃自动扩展 RabbitMQ 的想法,并在部署的初始阶段创建所需的实例?还有其他选择吗?
答案1
问题是您的 Tomcat 服务器(很可能是您的工作人员)不知道 RabbitMQ 服务器。在这种情况下,您需要做以下两件事之一:(a) 告诉他们有关新服务器的信息,或 (b) 让他们不关心
对于上面的(a),您可以在新的 RabbitMQ 服务器启动时通知每个 Tomcat 服务器和工作程序,或者将信息放在其他组件引用的某个列表中。
但是,在这种情况下,假设您在 RabbitMQ #1 上有一个队列,如果您启动 RabbitMQ #2,该队列会发生什么情况?在这种情况下,您实际上将拥有 2 个队列,而不是跨 2 个服务器的单个队列。您的应用程序可以处理这种情况吗?
对于上面的(b),你可以看看RabbitMQ 集群我的理解是,使用 RabbitMQ 集群,您可以让节点来来去去,而客户端不必关心。
答案2
RMQ 为 AWS 提供了新的后端,可用于在自动缩放中对节点进行群集。Tyr 只需在 Rabbitmq 配置中定义后端即可使用后端,并在服务重新启动时,它将使用标签选择同一自动缩放组下的所有节点并对其进行群集。我们需要确保使用以下角色启动实例,使它们能够描述 ec2 实例和自动缩放组。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:DescribeAutoScalingInstances", "ec2:DescribeInstances" ], "Resource": [ "*" ] } ] } 现在我们将登录到一个实例并配置两个存储库,一个用于 Erlang 安装,另一个用于 Rabbitmq 安装。
cd /etc/yum.repos.d/ vi rabbit_erlang.repo [rabbitmq_erlang]
name=Repo to install erlang for centos7
baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=1
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey metadata_expire=300
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
sslverify = 1 vi rabbitmq.repo [rabbitmq_erlang]
name=Repo 用于为 centos7 安装 rabbitmq baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.8.x/el/7/ enabled=1 gpgcheck=0
现在 repo 已配置完毕,但我们通常发现软件包安装可能会与 Centos 中现有的 epel 存储库冲突。因此,最佳做法是禁用现有存储库并启用新存储库。
yum -q makecache -y --disablerepo='epel*' --enablerepo='rabbitmq*' 完成后,我们将继续使用 yum 命令安装 rabbitmq-server 、perl-JSON 和 erlang 包。确保安装了最新版本
yum install erlang perl-JSON rabbitmq-server -y rpm -qa | grep rabbitmq 现在我们在 AWS 实例上安装了最新的 rabbitmq 服务器包。我们将继续维护每个节点的 hosts 文件。为了确保现有自动缩放组中的每个新节点都能成功加入集群,我们需要找到在自动缩放组内的 AWS 节点上自动检测的方法