StackGres 1.6 資料庫平臺工程功能介紹以及快速上手

為少發表於2023-12-01

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 安裝 部分,以改變這些。

更多

相關文章