Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GKE上的多区域高可用性-如何处理PostgreSQL数据库?_Postgresql_Kubernetes_Google Kubernetes Engine - Fatal编程技术网

GKE上的多区域高可用性-如何处理PostgreSQL数据库?

GKE上的多区域高可用性-如何处理PostgreSQL数据库?,postgresql,kubernetes,google-kubernetes-engine,Postgresql,Kubernetes,Google Kubernetes Engine,Google有]这个很酷的工具kubemci-命令行工具,可以使用多个kubernetes集群来配置L7负载平衡器,基本上可以使用HA多区域kubernetes设置。这有点酷 但假设我们有这样一个基本架构: 前端实现为SPA,并使用json API与后端通信 后端是一组使用PostgreSQL作为数据库存储引擎的微服务 所以我可以在GKE上创建两个Kubernetes集群,将后端和前端都放在它们上面(比如说在伦敦和比利时),所有这些看起来都很好 直到我们想到数据库。PostgreSQL仅为单

Google有]这个很酷的工具
kubemci
-
命令行工具,可以使用多个kubernetes集群来配置L7负载平衡器
,基本上可以使用HA多区域kubernetes设置。这有点酷

但假设我们有这样一个基本架构:

  • 前端实现为SPA,并使用json API与后端通信
  • 后端是一组使用PostgreSQL作为数据库存储引擎的微服务
所以我可以在GKE上创建两个Kubernetes集群,将后端和前端都放在它们上面(比如说在伦敦和比利时),所有这些看起来都很好

直到我们想到数据库。PostgreSQL仅为单主机,因此它必须仅放置在其中一个区域中。如果来自伦敦地区的后端开始与比利时地区的PostgreSQL对话,考虑到这些地区之间的6毫秒以上延迟,性能将非常差

所以整个HA设置都没有任何意义?还是我遗漏了什么?稍微缓解该问题的一个选项是在“从属”区域中有一个只读副本,并在那里直接进行只读查询(PostgreSQL也可以吗?

如果您在不同区域的两个集群上进行了设置,那么多集群入口将只向用户发送最近区域的流量

如果最近的区域关闭,则此时流量将路由到另一个区域中的群集

因此,使用您提供的示例,如果有流量发送到后端,并且该用户距离伦敦较近,则只要该地区已启动并运行,该用户发送的流量将始终发送到伦敦

关于处理延迟,在这种情况下,您必须处理延迟,因为您无法在另一个区域内创建读取副本


此功能(多群集进入)的好处是,如果一个区域出现故障,则您可以将流量路由到另一个区域。

这是一个经典的体系结构场景,没有简单的解决方案。在多个地区提供数据是一个具有挑战性的问题,大公司需要花费大量的时间和金钱来解决

  • PostgreSQL本机不支持多主机写入。你认为复制副本位于另一个区域,并在你的应用程序中具有读取和写入正确数据库的逻辑,这种想法是可行的。这将为您提供快速的本地读取,但在一个区域中的写入速度较慢。应用程序中的代码也更复杂,处理主机故障切换的工作也更多。带宽和成本也可能是大量更新的问题

  • 使用多主博士后(如)的第三方解决方案将工作转移到数据库层。这可能会很昂贵,而且您的应用程序仍然必须管理来自两个区域的数据冲突,同时覆盖相同的数据

  • 选择另一个支持多主机写入的多区域复制的数据库。(或)是一个不错的选择,或托管选项,如、、和其他。一个有趣的选项是,它支持PostgreSQL协议,但它是一个可扩展的关系数据库,并且支持多个区域

  • 如果这些选项都不起作用,则必须创建自己的复制系统。一些公司使用事件源/CQRS体系结构实现这一点,其中每次写入都是发送到中心日志的消息,然后应用于每个位置。这是一项更复杂的工作,但提供了最大的灵活性。此时,您基本上也在构建自己的数据库复制系统


对于读取副本概念,我可以共享。在那里,它说,
读取副本必须与主实例位于同一区域。
,因此它至少可能不是一个选项。顺便说一句,您的案例是否必须使用Postgres?是的,目前使用的是DB引擎。