运行Postgres安装很简单。然而,设置生产环境是一个完全不同的问题。主要原因是Postgres本身并不是一个可用于生产的软件,它需要一组辅助工具来补充其功能,例如连接池、监控、备份工具、高可用性管理…
在这次演讲中,OnGres的创始人兼首席执行官Alvaro Hernández讨论了Kubernetes是如何成为Postgres生产就绪的最佳平台以及它提供的其他额外优势。
Bart Farrell:
我们的下一位发言人对这个社区并不陌生。去年我作为社区领导加入社区时,他是第一个真正开始与我交谈的人。他的名字是Alvaro Hernández。他是OnGres的首席执行官和创始人。如果你有任何与Postgres相关的问题,它在Kubernetes之外是否不相关,显然,在我们Kubernet内部的社区,Alvaro Hernández是一位出色的主持人。我也期待着用西班牙语和他进行一次谈话,也许几个月前阿尔瓦罗举行了我们参加人数最多的会议。无论如何,很高兴你今天能回来。
Álvaro Hernández:
非常感谢你今天邀请我来这里。让我们开始吧。我今天在这里简要介绍了为什么您应该主要在Kubernetes上部署Postgres。
因此,首先,让我们开始谈论没有Kubernetes的Postgres。基本上,你需要做什么来让Postgres在不使用Kubernetes的情况下运行起来,就像我们几年前做的那样,对吗?所以,需要做什么,正确的是要做什么,才能让这台机器运转起来。如果你使用的是Ubuntu或Debian发行版,或者类似的东西,你只需安装PostgreSQL即可。此操作将在大约40秒后运行,具体取决于您的互联网连接。您将得到一个Postgres集群并运行。所以我想这个演示差不多结束了,因为我们现在只说,不要运行Postgres和Kubernetes。基本上,您可能无法获得最新版本的Postgres,通过发出此命令,您可能希望添加一些具有更新版本的Posggres的其他存储库。而且,如果您使用的是基于环境的发行版Red Hat,并且您要运行不同的命令,那么您可能需要在此处键入更多命令。但除了这些技术性,您将无法获得完全可用于生产的Postgres。这就是这里的关键。如果您只是为了在笔记本电脑上进行测试而运行,那么您可能对此很满意。但如果要将其部署到生产环境中,可能需要做一些调整。
第一个是配置。因此,让我们来谈谈配置,我们确实需要调整数据库以在生产中运行Postgres,如果您采用默认的Postgres配置,那么它是非常保守的。在Raspberry Pi集群上运行非常棒,我听说有人在周围有集群。所以也许这对Raspberry Pi来说很好。但实际上,当您要运行集群和96个核心机器,其中有600 GB的RAM和数TB的存储SSD时,您需要选择一些基本的Postgres参数。我甚至没有说让我们深入讨论这个问题。但至少是一个基本的调整,你真的需要申请Postgres。是的,为了给您一个提示,默认情况下,Postgres附带128兆字节的共享缓冲区,它充当控制您在运行中进行的缓存的参数。因此,基本上,如果您要在默认情况下调优Postgres,您将使用128兆字节的RAM。
正如我所说,这可能对Raspberry Pi有好处,但对您的生产集群没有好处。您可能希望缓存更多RAM。我的意思是,Postgres可以很好地运行。就像你有一辆法拉利,你只在一档行驶,你会获得相当好的速度,但不是你期望的速度。这是同样的情况。即使您查看默认配置,它也不会向世界开放。您的Postgres将只监听localhost,您肯定需要调优Postgres。这不是一件容易的任务。因此,要优化Postgres,Postges包含近300个可调参数,其中一些参数需要相当多的Postgre专业知识才能进行优化。因此,即使我们只是着眼于基本的调优,只是获取一些基本参数,让Postgres进入外部世界,拥有适当大小的内存、RAM,以及影响查询性能的其他一些参数,例如您想要运行一些基本日志培训的并行进程的数量,这对于以后实际排除性能问题至关重要。你需要花费相当多的时间,比如说一名Postgres DBA,拥有一些可能需要2到8小时才能完成这项工作的经验。这是推动观点的野生估计器。如果您必须进行深度调优,那么在我们需要运行基准测试和验证您所做的性能假设之前,您确实需要更多的时间。
如果你想知道是否有一个小帮助,有一个在线工具,那就是免责声明,我帮助构建了它。Postgres字段名为https://postgresqlco.nf/就像postgresql.conf,除了你把点向右移动了两个位置。所以postgresql.conf,它允许您上传Postgres配置,与API交互,就像您的GitHub repo for postgresql。conf,它附带了一个调优指南,因此这可能在过程中对您有所帮助。
我们刚刚安装了Postgres,这很简单,然后我们需要调整Postgres,这需要更多的专业知识,我们需要一个PostgresDBA。Postgres几乎总是需要连接池。如果您只是在没有连接池的情况下将Postgres部署到外部世界,很可能会遇到麻烦。
什么样的麻烦?这里有一个我运行的小基准,在一个小实例中比较Postgres,因为它会影响早期的情况,如果你只增加连接到Postgres的并发连接的数量,比如最多500个,在这种情况下,假设你不想有500个生产并发用户,以每秒事务数计算的数据库性能,这没关系,但是当你看一下延迟,你为查询请求服务所花费的时间时,它是可怕的。它急剧飙升。
因此,为了运行Postgres并解决这些性能问题,您可能会遇到大量并发连接,您通常总是需要连接池,并且可以在客户端设置一个中间件层,可以在所有这些元素上或这些元素的组合上。而且需要时间来了解您希望连接池位于何处。
在数据库前面,它定位了体系结构如何对其进行优化,无论您是要运行会话模式还是事务模式,都有一些可调项。所以,根据我的估计,你需要一些时间来设置它。这是正常的,所以您仍然不需要很多时间,但您需要devops配置文件和Postgres DBA配置文件的帮助,因为您需要一些Postgres的专业知识,对于乐观的情况,大约需要4到16个小时,16个小时是更具潜在现实意义的情况。
好吧,我们需要进行调优,需要进行连接池。为了在生产中部署Postgres,我愿意做些什么?因为到目前为止,谁都想要高可用性。你想早上3点起床吗?我不想。因此我想让我的服务器、Postgres节点进行自动故障切换。我希望它们能够自动重新连接,如果节点无法自动重新配置,我甚至可能希望拥有它们。我甚至还没有涉足其中。因为你也可以在Kubernetes之外做这件事,尽管在Kubernet上这件事很简单,但通过一些自动缩放机制和云环境等等,在prem上很难做到。
但即使不这样做,设置高可用性Postgres也相当困难,您需要首先选择要用于此目的的软件,例如,Patroni是一款最推荐的高可用或PG自动故障切换软件之一。但是,接下来您需要解决与高可用性相关的所有痛点,您需要讨论如何分发Postgres配置,以便在舰队中的所有服务器上实现统一。你们需要解决一种入口点问题,这就是我如何定位主节点,它将成为一个DNS虚拟IP,我将做一些其他的发现机制。因此,在现实中,设置这样的内容可能会再次花费你8到24小时的时间,比如DevOps人员和你无论如何都需要的Postgres专业知识。
当然,谁不需要备份?我们需要备份,并在生产中部署集群。所以同样的故事也适用于这里。为了解决这个关键问题,我们需要了解我将使用哪种工具,我将在哪里存储您的备份,我想如何对这些备份执行生命周期管理,如何循环使用、循环使用,显然还需要了解备份的恢复和测试。在这种情况下,不需要太多Postgres专业知识;一个简单的Postgres工具,如WAL-G或pgBackRest,任何在DevOps配置文件方面没有Postgress专业知识的人,但可能能够在大约4到16小时的时间内进行设置。
当然,我们需要监控,不是吗?我们想要监控Postgres,这也很复杂,因为计算系统的Postgres Explorer公开了许多度量,您需要为这些度量编写查询。因此,一些工具当然带有预配置的查询,但您可能需要自定义它们。因此,您将再次需要DevOps和Postgres DBA的组合来解决这个问题,并能够导出您想要属性的度量。因此,假设这需要8到24小时或更长的时间。实际上,想象一下您知道的12节点Postgres服务器,将每个服务器的日志留在每个节点上?可能不会。您希望将它们发送到一个中心位置,在那里可以一起处理它们并帮助进行故障排除。因此,这需要像导出到CSV日志记录这样的东西,使用代理收集器(如FluentBit实现的收集器,如Fluent),或者只需将它们发送到SaaS服务,在那里您将为此支付费用。但在这种情况下,我会告诉你大约4小时的阅读和设置时间。否则,我们将进行FluentBit设置和CSV日志记录。这可能需要你4天的工作,这是我们做的DevOps,但仍然需要一些工作。如果您想运行一些更高级的用例,例如,现在,您可以使用Envoice代理Postgres流量折扣,这可能会带来显著的优势。一个是您可以将网络层的其他指标导出到Postgres。另一个是,您可以从gatession 1.18开始卸载SSL。这样可以减轻Postgres管理SSL轮换证书的负担,等等。这里链接了一篇有趣的博客文章,介绍如何将特使与Postgres结合使用。这是推荐的设置。因此,DevOps特使配置也需要大约8到16个小时。这并不容易,但Envoice是一个很棒的软件配置,但需要一点专业知识。
那么管理所有集群呢?有很多问题,因为基本上没有用于管理Postgres集群的软件,也没有用于管理Postgres数据库的读取,但没有集群。因此,构建或设置一个工具来帮助您管理多个集群,而不仅仅是一个集群,将需要无限长的时间。
最后但并非不重要的是,您可能希望将所有这些自动化。因此,您希望通过IAC或基础设施作为代码来运行所有这些。这将需要很多时间,请记住我们提到的所有工具和该堆栈的所有组件,您需要建立企业级Postgres堆栈。因此,在48到96小时的DevOps中,工作可能是相当保守的。总之,这些是在生产环境中运行Postgres堆栈可能需要的所有组件。
现在让我们看看我们将如何在Kubernetes部署它。好吧,这个简单的YAML将在Kubernetes上为您提供一个Postgres集群,它具有连接池,默认情况下具有优化的配置,还有其他一些功能。所以只需一个小时的Kubernetes管理员。实际上,你可能需要多一点时间。
顺便说一句,我正在使用一个名为StackGres的示例软件来说明这些原理,如果您想了解更多有关它的信息,只需转到StackGres.io即可。这是一个Postgres Kubernetes运算符,它实现了我在这里使用的所有功能。这就是我用这个作为例子的原因。因此,这个简单的演示YAML文件将创建一个集群。如果您真的想要更多像自动备份(如特使代理)和集成监控这样的功能,那么您可能还需要几行YAML。但对于Kubernetes管理员来说,不需要花费4到16个小时的时间。但请注意,并非需要所有DevOps知识,尤其是Postgres知识。它带有默认调优冲突和我刚才提到的所有组件。因此,如果需要通过负载平衡器公开web控制台或与GitOps集成,您可能需要花费额外的时间来创建入口。所以,总的来说,你可以在任何地方投资4到16个小时的Kubernetes管理员,而不是Postgres所需的专业知识,这样做会做得很好。
综上所述,我们不想比较总共需要多少时间,我们正在进行一个重要的比较,从300小时的工作时间到16小时的工作,在两种情况下最坏的情况下,比较Kubernetes目前的解决方案。
日常运营情况如何?部署集群后,我可能想运行数据库管理任务。Postgres运营商中有几个是自动化的,比如我提到的StackGress,比如Repack、Vacuum,运行小版本升级、小版本升级,控制重启,甚至基准测试,它们只通过几行YAML实现自动化。如果没有Kubernetes,所有这些努力要花多少时间?因此,这些都是为什么在Kubernetes上部署Postgres的原因,简单地说一下为什么不在Kubernet上部署Posggres。
因此,选项一,如果你只想运行一个完全管理的服务,如RDS,并真正为其付费,因为价格差异很大,那么你应该走这条路。另一种选择是,如果您看到需要特定的操作系统调优软件或某些特定的功能,如ZFS,这些功能有时会在某些特定的Kubernetes环境中发布,那么您可能想留在那里。
我真正能想到的最后一个选择是,如果你认为地球是方的,vaccines就不起作用,Kubernetes也不适合数据存储或数据平台,所以如果你不想走出舒适区,呆在那里,我们也无能为力。这就是我今天想和大家分享的。如果我们有什么问题,请告诉我!
Bart Farrell:
是的,我们有。在很短的时间内,这是一场精彩的演讲。让我们快速了解一下我们遇到的一些问题。如果我错了,请纠正我,但Postgres是一个单代码关系数据库。但要让PG与Kubernetes兼容,难道不需要一些根本性的改变吗?
Álvaro Hernández:
事实上,是的。这是我们试图在StackGres项目中利用的努力的一部分。我之前对Kubernetes会议的数据所做的演讲,我建议大家看一看,是视频记录的。它被称为“将Postgres分解为云本地平台”。“准确地说,我们的目标是尝试剥离Postgres的某些部分,这些部分可以被卸载到云原生生态系统的所有组件中,比如我提到的Envoison,比如Fluentd through,显然是用于监控的Grafna。随着时间的推移,我们在这里进行创新,我们正在从功能上剥离Postgre的某些部分并上传到这个组件中。所以感觉有点对于Kubernetes管理员来说更自然,我们正在简化Postgres核心组件本身。
Bart Farrell:
很好。我真的很喜欢提到vaccines。还有一个关于Postgres如何拥有许多高可用性选项的后续报道,你肯定会希望在Kubernetes上使用这些选项。
但你知道,当人们在考虑现有的一些替代方案时,你应该考虑哪些数据库?你之前提到过,我肯定不止几次,但我们正在研究库伯内特谱,对吗?Postgres提供了哪些我们在其他数据库中找不到的内容?
Álvaro Hernández:
嗯,确实有很多事情。Postgres是一个功能极其丰富的数据库。我首先要说的是功能集。大多数人以有限的方式使用数据库。这没关系。但是,如果您真的想深入了解Postgres可以涵盖的内容,比如SQL兼容性层,我将给您一个简单的示例。几年前,几乎没有人知道递归查询,例如,就在昨天,递归查询本身就有助于讨论通用平台切换,有些甚至是页面上的渲染,但到了一个最新版本,就CPU使用量而言,这个版本的排名要少20倍的工作量。因此,在节点上加载评论的速度提高了20倍。这是因为注释不是,它是一种层次结构,就像树结构一样。而不是抛出许多问题,数据库抛出一次递归。因此,如果你真的使用查看了自动戳记的所有功能,并且真的利用了这些功能,那么你将得到一个真正、真正强大的数据库,而且不会再老了。没有多少其他数据库具有相同级别的功能。
我想说的另一个是扩展。Postgres有一种类似插件的扩展机制,您可以通过创建或使用现有的扩展来扩展自己的意愿。这种方式改变了数据库。想想Firefox插件或Chrome插件。除了你的数据外,这是相同的想法。
Bart Farrell:
好的,我们也有一些后续问题。Citus数据库提供的切分功能如何?
Álvaro Hernández:
Postgres最初是作为单个群集数据库的站点,就像一个主数据库和多个副本,尽管您可以进行级联,也可以在复制方面创建一些复杂的拓扑。此外,支持逻辑复制。图表不是该站点内置的,这是我刚才提到的扩展之一的一个很好的例子。在其中,Postgres可以成为一个分片数据库。一旦你分享,这是一个很好的解决方案。而且您有支持良好分发的数据,您可以根据最适合分发的共享标准分发数据。而且效果很好。至于Kubernetes的销售,我相信还有路要走。购买它的微软团队,不久前收购了CitusDB。我知道他们正在开发Azure的云销售解决方案。我相信在Kubernetes上运行Citus也有更好的预览解决方案。但无论如何,这个开源是无AGPL的。因此,我们很快就能进入其他开源解决方案。
Bart Farrell:
好的,对Super Base有什么看法吗?
Álvaro Hernández:
我喜欢这个想法和项目。这是一种通过不同的API以不同的方式公开Postgres的方法,更多的应用程序或面向。我对这个项目很喜欢,我认为这是一个很酷的项目。
Bart Farrell:
好的,很好。有人说他们也在修补。它基本上是由Postgres托管的,并带有订阅功能来实现它,就像Firebase还没有尝试过自托管一样,很棒的东西。Álvaro有很多资源。他做了很多演讲,在Postgres社区非常活跃,而且他还建立了一个Posggres基金会。Álvaro,非常感谢你!
原文标题:Why You Should Be Deploying Postgres on Kubernetes
原文作者:Sylvain Kalache
原文链接:https://dzone.com/articles/why-you-should-be-deploying-postgres-on-kubernetes