我在Amazon RDS Aurora上运行一个包含两个实例的数据库集群。一个实例是主实例,另一个实例是只读副本。副本的目的是允许第三方应用程序访问数据库的某些表以进行报告。因此,报告工具访问只读集群终端节点,该端点工作正常。为了实现零停机维护,AWS随时将"副本"提升为"主"。这很酷,不会影响报告工具,因为它访问 cluster-ro 端点,该端点始终将流量路由到正确的(只读(副本。
但是,这意味着我必须在两个实例上启用"可公开访问:是"标志,以便报告工具(位于 VPC 外部(可以访问所有实例,因为我无法预测哪个实例成为主实例或副本实例,对吗?
我宁愿"主"实例(无论是什么实例(只能从 VPC 内部访问。我怎样才能做到这一点?
我的理解是,我在"主"实例上所做的每项更改都会在副本上自动完成,例如添加/删除安全组。因此,如果我打开防火墙以允许访问报告工具的副本,则相同的 IP 地址也可以访问正常的集群终端节点和实例(不仅是集群 ro 终端节点(。我怎样才能防止这种情况发生?
不幸的是,您将需要为此构建一些自定义内容。从设计的角度来看,需要考虑的几个选项如下:
Aurora 集群在所有实例中共享安全组设置,就像您标注的那样。如果您想使用自定义设置,那么您可以考虑的是仅创建整个集群 VPC,然后让 ALB 或 EC2 代理将请求转发到您的数据库实例。然后,您可以拥有多个这些"代理",并为每个代理关联单独的安全组。
这种体系结构的一个大要求是,您需要确保干净地处理故障转移。您的代理应始终与集群终端节点通信,而不是与实例终端节点通信,因为实例可以在后台从读取器更改为写入器。例如,ALB 不允许您创建将请求转发到 DNS 的侦听器,它们仅适用于 IP。这意味着您将需要额外的基础设施来监控读取器和写入器的 IP 并保持 ALB 更新。
EC2 代理绝对是这种设计的更好选择,但需要注意增加成本。如果您对此设置有具体问题,我可以详细介绍。这绝对是对该方法的总结,而不是准备好生产。
同样,为什么不能改用受读取受限的数据库用户并保持集群公有(当然启用 ssl(?
在这种情况下,更简单的解决方案可能是使数据在原始群集之外以某种形式可访问。您可以通过在控制台中执行"添加区域"来设置全局数据库,在不同的 AWS 区域中创建一个读取器实例,该实例也会实时镜像集群中的所有数据。该实例可小可大,无论处理报告职责所需的任何内容。
如果报告应用程序不需要 24x7 全天候访问来不断更新数据:您可以执行"创建克隆",并在几分钟内使用与原始集群相同的数据获取新集群。报表查询完成后,可以删除克隆。然后在下次需要报告时再次执行相同的操作。有些人按计划自动执行该循环。
在这两种情况下,您都可以独立于原始集群设置与其他集群的连接。
我有时使用的另一种技术是有 3 个实例。优先级层为 0 的编写者和读取器,以便他们可以来回交换编写器角色,第三个位于较低优先级层,因此不太可能提升为编写器。但是,这并不能使您免于此特定方案的网络和安全复杂性。
请记住,您为报告目的设置的额外硬件资源可以在不需要时缩小、停止或删除。