StackGres 1.6 数据库平台工程功能介绍以及快速上手

发布时间 2023-12-01 13:44:42作者: 为少

image

StackGres 1.6 数据库平台工程功能

声明式 K8S CRs

StackGres operator 完全由 Kubernetes 自定义资源管理。除了 kubectl 或任何其他 Kubernetes API 访问之外,不需要安装任何客户端或其他工具来管理 StackGres。您的请求由 CRD 的 spec 部分表示,任何 result 信息都在集群中资源的 status 部分中提供。

StackGres CRDs 被设计为非常高阶的,并且抽象(隐藏)了所有 Postgres 的复杂性。对于 StackGres,如果您知道如何使用 kubectl 以及如何定义 CRDs,那么您也已经成为 Postgres 的专家用户。

在 CRDs 中定义 StackGres 的定义和操作的能力使您能够将所有 Postgres 集群定义为基础设施即代码(IaC),并在 Git 中进行版本控制。这就启用了 GitOps 的配置管理方式,当您向版本控制中的 CRDs 提交更改时,可以自动管理您的集群。通常,这种资源定义方式支持非常灵活和可扩展的方法。

请查看 CRD Reference,了解 StackGres 资源的结构。

请参阅 Getting Started,开始极简的 StackGres 安装。

Note: 如果您更喜欢可视化 UI 而不是 YAML 文件和命令行,请注意,您可以通过 CRDs 查询或执行的每一个操作也可以通过 web 控制台进行。
同样,在 web 控制台中执行的任何操作都将自动反映在 CRDs 中。
选择权在你。

默认调优

StackGres 集群将由高度专业的 OnGres Postgres DBA 团队精心调整的初始 Postgres 配置创建。

这意味着 StackGres 附带了一个开箱即用的调优配置,即使您不是 Postgres 高级用户,也可以很好地使用这个默认配置。使用 StackGres,您不需要成为 Postgres 专家就可以操作生产就绪的集群。

如果您希望进一步调优 Postgres,您可以通过 SGPostgresConfig CRD 创建自定义配置,并相应地在集群中引用它们。

OnGres, StackGres 的创造者们痴迷于充分调优 Postgres。所以他们建立了 postgresqlCO.NF,一个帮助成千上万的 Postgres 用户更好地调优他们的数据库的网站。

自定义配置

StackGres 是用普通 Postgres 构建的,并提供没有限制的 Postgres 实例。
您可以提供自定义配置,并在自己的 Postgres 安装中使用任何进一步的自定义。

完全的 postgres 用户访问权限

在 StackGres 中没有限制的伪用户。相反,您可以以最大权限访问 postgres 用户( postgres 中的 "root" 用户)。你拥有它,没有任何警告。

自定义配置

StackGres 允许高级 Postgres 用户进一步定制组件和配置。这些配置由 CRDs 支持并经过充分验证,因此如果错误地设置集群,就不会有一个简单的 ConfigMap 导致集群崩溃。

请参阅 配置指南,深入了解如何调优 Postgres 或连接池配置。至于其他 Kubernetes 资源,您可以自定义公开的服务、pod 的标签和节点容忍度等等。

总的来说,StackGres 让你完全控制。

高可用

StackGres 集成了 Postgres 中最著名的、经过生产测试的高可用性软件: Patroni

StackGres 完全集成了 Patroni,您无需再做其他任何事情。如果任何 pod、任何节点或任何东西发生故障,集群将在几秒钟内自动执行故障转移并重新修复,而无需人工干预。

StackGres 通过 Kubernetes 服务为应用程序公开了一个读写(主)和一个只读(副本)连接,在任何中断事件发生后,该连接将自动更新。

请参阅 High Availability Guide,了解更多关于将 Patroni 集成到 StackGres 中的信息,以及如何执行手动切换或如何测试故障转移。

自动备份

备份是数据库的关键部分,也是任何灾难恢复策略的关键。StackGres 包括基于连续归档的备份,它允许零数据丢失恢复和 PITR(Point-in-Time Recovery),将数据库恢复到任意过去的时间点。

StackGres 还提供备份的自动生命周期管理。备份总是存储在当今可用的最持久的介质中: cloud object storage,如 Amazon's S3Google Cloud StorageAzure Blob。如果您在 prem 上运行,您可以使用 Minio 或其他兼容 S3 的软件来存储备份。

您需要提供 bucket 访问信息和凭据,配置保留策略,其他一切都由 StackGres 完全自动化。
您还可以随时通过简单的 YAML 文件创建手动备份。

请参阅 Backups Guide 以了解有关如何定义和管理备份的更多信息。

服务器端连接池

由于 Postgres 进程模型的原因,强烈建议在生产场景中使用连接池。

StackGres 提供了集成的服务器端连接池。PgBouncer 作为一个 sidecar 容器部署在 Postgres 容器旁边。

服务器端池可以控制连接流入,即进入 Postgres 的连接,并确保 Postgres 不会被可能导致显著性能下降的流量淹没。StackGres 还将相关的连接池指标导出到 Prometheus,并且专门的仪表板显示在集成到 web 控制台的 Grafana 中。

您可以通过 SGPoolingConfig CRD 调优低级配置,甚至完全禁用连接池。

请查看 Connection Pooling Configuration section ,了解有关如何配置连接池的更多信息。

分布式的日志

对于那些厌倦了在集群的每个 pod 中输入 kubectl exec,然后在 Postgres 日志中 grepawk 来获取你想要的信息的人来说,StackGres 是一个更好的解决方案。

StackGres 支持 Postgres 和 Patroni 的集中式分布式日志。
分布式日志集群可以通过基于 YAML 的 CRDs 或 web 控制台快速创建和配置。

Postgres 和 Patroni 容器日志都将通过 FluentBit sidecar 捕获,并将它们转发到分布式日志服务器。
它也包含一个 Fluentd 收集器,将日志转发到专用的 Postgres 数据库。为了支持高日志量摄取,这个日志专用数据库通过 TimescaleDB 扩展进行了增强,StackGres 还依赖于 TimescaleDB 扩展来执行日志保留策略。

然后可以从集中位置通过 SQL 查询聚合的日志,或者通过 web 控制台进行可视化,其中包括搜索和过滤功能。日志使用丰富的元数据进行了增强,这有助于任何 Postgres 故障排除。

有关如何配置分布式日志的更多信息,请参阅 Distributed Logs Guide

可观测

StackGres 使 Postgres 指标可用于增强可观察性,并与 Prometheus 堆栈完全集成,包括预定义的,特定于 Postgres 的 dashboards 和 alerts。

StackGres 利用 Envoy sidecar 透明地代理所有 Postgres 流量。OnGres 团队与 Envoy 社区合作开发了第一个 Postgres filter for Envoy。这个 Envoy Postgres 过滤器通过解码 Postgres wire 协议并向 Prometheus 发送指标来提供增强的可观测性。这不仅增加了在 Postgres 级别不可用的指标,而且对 Postgres 没有任何影响,因为这些指标是在代理级别收集的。这个过程对 Postgres 是完全透明的。

Envoy 将发送额外的指标,只要在 Kubernetes 中配置了 Prometheus 实例,就没有更多的事情要做。

StackGres web 控制台包括内置的 Grafana 仪表板来可视化这些指标。

请参阅 Monitoring Guide ,以了解关于如何配置监视的更多信息。

Web UI 管理控制台

StackGres 带有一个功能齐全的 web 控制台,允许您读取任何信息并执行任何操作,这些操作也可以通过 kubectl 和 StackGres CRDs 完成。

image

这个 web 控制台是针对 DBA 的内部使用的,可以通过 LoadBalancer 或其他 Kubernetes 路由机制公开。

web 控制台可以通过默认的管理凭据访问,也可以通过 Kubernetes RBAC 进行用户身份验证或 SSO 集成访问。它还附带了一个 REST API,以提供进一步的灵活性。

请查看 Admin UI Guide,了解如何访问和使用它的更多信息。

web 控制台支持光和暗模式,以优化您的用户体验。

Day-2 操作

StackGres 以生产就绪的方式全面管理您的Postgres集群。它具有 day-2 的操作功能,如 PostgreSQL 的次要和主要版本升级、容器升级、受控重启、vacuum 或 repack,可以以简单安全的方式使用。

版本升级或重新启动等管理操作很容易造成压力,这就是为什么设计良好的 database operator 应该以合理的方式实现这些操作的原因。StackGres 以受控的生产级方式执行 day-2 操作。

一般来说,工程师在 StackGres CRDs 中定义所需的目标状态,通过 Kubernetes API (或者 web 控制台)应用更改,然后 StackGres operator 负责其余的工作。这种方法最大限度地减少了用户方面的粗心错误,因为不需要过程性步骤,只需要声明性定义。StackGres CRDs 提供了一种类型安全的方式来定义资源、配置和集群操作,并由 StackGres operator 理解和验证。

根据所需的更改,StackGres 以合理的方式执行更改,并考虑到生产准备情况。
这意味着,例如,所需的 Postgres 集群重启不只是立即执行(并且可能危及数据库可用性),而是以受控的方式执行。

StackGres 旨在提供 DBA 专家和 Kubernetes operator 的最佳组合。

高级复制模式

StackGres 为 Postgres 实例支持不同的高级复制模式,包括异步、同步和组复制。

还支持在单独的 Kubernetes 集群上进行级联复制和备用集群,以便进行灾难恢复。

可以在 SGCluster CRD replication section 中配置复制模式。

Sharding,高可用分布式 Postgresql

集成 Patroni + Citus + PgBouncer,高可用分布式 Postgresql 一键部署。

PostgreSQL 扩展

扩展是 Postgres 最受欢迎的功能。
通过扩展,数据库功能可以以任何可以想象的方式进行扩展。
而且,Postgres 用户受益于由数百个开源扩展组成的生态系统。

StackGres 支持 150 多个 Postgres 扩展,并且可以动态地将扩展加载到 Postgres 集群的 pod 中。
因此,StackGres 是世界上拥有最多扩展的 Postgres 平台。

请查看 扩展 的完整列表和 扩展指南,以了解如何在 StackGres 中配置和使用扩展。

生态

StackGres 用户受益于一个非常活跃、友好和支持的生态系统。

StackGres 100% 是免费开源的,有一个开源友好的许可证。
没有“具有高级功能的高级版本”,也没有任何生产使用限制。
It's just Open Source.

如果你想了解更多关于 StackGres 内部工作的信息,甚至想贡献自己的力量,你可以查看 official repositories、issue trackers 或 community Slack:

StackGres 1.6 数据库平台工程快速上手

在本篇中,您将学习如何开始使用 StackGres。
我们将在 Kubernetes 集群上安装 StackGres,并创建一个 Postgres 实例。

NOTE: 要运行此 demo,您需要一个已经在 kubectl 中配置的 K8s environment

安装 Operator

为了便于演示,我们提供了一些 Kubernetes 资源文件,以便安装 StackGres operator。
假设您已经安装了 kubectl CLI, 您可以使用以下命令安装 operator:

kubectl apply -f https://stackgres.io/downloads/stackgres-k8s/stackgres/1.6.0/stackgres-operator-demo.yml

这将安装所有必需的资源,并将 StackGres operator 添加到新的命名空间 stackgres 中。

stackgres-operator-demo.yml 将使用 LoadBalancer 暴露 UI。
请注意,使用此功能可能会给您的主机提供商带来额外的成本(例如,EKS、GKE 和 AKS 就是这种情况)。

等待 Operator 启动

一旦它准备好了,你会看到 operator pods 的状态是 Running:

kubectl get pods -n stackgres
# 正常会有如下输出
NAME                                  READY   STATUS    RESTARTS   AGE
stackgres-operator-668bf7586d-krh7f   1/1     Running   0          28h
stackgres-restapi-d7f9bd787-dh6tr     2/2     Running   0          28h

创建集群

要创建第一个 StackGres 集群,必须创建一个包含集群配置的简单自定义资源。
下面的命令,使用命令行执行此操作:

cat << 'EOF' | kubectl create -f -
apiVersion: stackgres.io/v1
kind: SGCluster
metadata:
  name: simple
spec:
  instances: 1
  postgres:
    version: 'latest'
  pods:
    persistentVolume: 
      size: '5Gi'
EOF

# 正常会有如下输出
sgcluster.stackgres.io/simple created

这将使用最新的 PostgreSQL 版本创建一个集群,一个节点,一个 5Gi 的磁盘,使用默认的存储类。
它使用 StackGres 对 PostgreSQL、连接池和资源配置文件的默认配置。

验证已创建的集群

一个名为 simple 的集群将部署在环境中配置的默认名称空间中(通常是名称空间 default)。

查看创建状态:

kubectl get pods --watch

最后,你应该看到这样的东西:

NAME       READY   STATUS    RESTARTS      AGE
simple-0   6/6     Running   1 (41s ago)   68s

通过 psql 访问 Postgres

要打开 psql 控制台并管理 PostgreSQL 集群,你可以连接到主实例(标签为 role: master 的 pod )的 postgres-util 容器。
在这个快速入门中,我们只有一个 pod,您可以简单地提供它的名称,但是无论您有多少实例,以下命令都可以工作:

kubectl exec -ti "$(kubectl get pod --selector app=StackGresCluster,stackgres.io/cluster=true,role=master -o name)" -c postgres-util -- psql

# 正常会有如下输出
psql (16.1 (OnGres 16.1-build-6.29))
Type "help" for help.

postgres=#

Note: 直接通过 postgres-util sidecar 连接将授予您使用 postgres 用户的访问权限。它类似于 sudo -i postgres -c psql

请阅读有关 postgres-util side car 以及 how to connect to the Postgres cluster 的详细信息。

通过 Kubernetes Services 访问 Postgres

虽然通过 psql 访问集群是一个很好的快速测试,但应用程序通常使用 Kubernetes 服务连接到我们的实例。
为此,需要对访问进行身份验证,这可以通过添加专用的 postgres 用户来实现,或者,对于这个快速入门,通过使用 postgres 用户( Postgres 中的超级用户)来实现。postgres 用户的密码是创建集群时随机生成的。您可以通过获取 key "superuser-password" 从一个名为 cluster 的 secret 中检索它:

kubectl get secret simple --template '{{ printf "%s" (index .data "superuser-password" | base64decode) }}'

# 正常会有如下输出
397a-7aaf-49e3-80d

现在我们可以使用用户 postgres 和刚刚返回的密码进行身份验证。为此,我们已经可以使用一个应用程序,或者,出于测试目的,再次使用 psql,但是从通过 Kubernetes 服务名称连接到 Postgres 的不同容器中:

kubectl run psql --rm -it --image ongres/postgres-util --restart=Never -- psql -h simple postgres postgres
If you don't see a command prompt, try pressing enter.


# 397a-7aaf-49e3-80d 此处输入密码即可
# 成功会有如下输出

psql (16.1 (OnGres 16.1-build-6.29))
Type "help" for help.

postgres=#

这一次,psql 命令将要求输入密码,这是超级用户的密码。

连接到 UI

现在您对 StackGres 有了更多的了解,您可以轻松地从 UI 管理所有集群了。UI 将要求输入用户名和密码。默认情况下,这些是 admin 和随机生成的密码。您可以运行以下命令获取用户和自动生成的密码:

kubectl get secret -n stackgres stackgres-restapi-admin --template '{{ printf "username = %s\npassword = %s\n" (.data.k8sUsername | base64decode) ( .data.clearPassword | base64decode) }}'

# 正常会有如下输出
username = admin
password = 1ba7-235c-4563-8fc

有了凭据,让我们连接到 operator web UI。为此,您可以转发 operator pod 的 HTTPS 端口:

POD_NAME=$(kubectl get pods --namespace stackgres -l "stackgres.io/restapi=true" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward "$POD_NAME" 8443:9443 --namespace stackgres

# 正常会有如下输出
Forwarding from 127.0.0.1:8443 -> 9443
Forwarding from [::1]:8443 -> 9443
Handling connection for 8443

然后,您可以在以下地址打开浏览器 localhost:8443/admin/

image

image

清理

要卸载这个演示生成的所有资源,你可以运行:

kubectl delete --ignore-not-found -f https://stackgres.io/downloads/stackgres-k8s/stackgres/1.6.0/stackgres-operator-demo.yml

有关更多详细信息,请查看 卸载 部分。

此外,请参阅 通过 helm 安装 部分,以改变这些。

更多