StackGres 1.6,可私有部署的云原生数据库中间件平台工程
StackGres 數據庫平臺工程簡介
Enterprise Postgres made easy. On Kubernetes
StackGres 是 Kubernetes 的全棧 PostgreSQL 發行版,打包成一個簡單的部署單元。
使用精心選擇和調優的 PostgreSQL 組件。
一個企業級的 PostgreSQL 棧需要幾個其他的生態系統組件和重要的調整。
不僅僅是 PostgreSQL。它需要連接池、自動故障轉移和 HA、監控、備份和 DR、集中式日志記錄……我們已經構建了它們:一個 Postgres 堆棧。
Postgres 不僅僅是數據庫。還有圍繞它的整個生態系統。如果 Postgres 是 Linux 內核,我們需要一個圍繞 PostgreSQL 的 PostgreSQL 發行版,用生產部署所需的組件來補充它。這就是我們所說的 PostgreSQL 棧。這堆東西需要整理。通常有幾個軟件實現相同的功能。并不是所有的都具有相同的品質或成熟度。有許多優點和缺點,它們往往不容易評估。最好有一個自定義的組件選擇,這些組件可以打包和配置為以可預測和可信的方式一起工作。
StackGres Operator
Operator 是一種打包、部署和管理 Kubernetes 應用程序的方法。一些應用程序,比如數據庫,需要更多的手工操作,而云原生 Postgres 需要 operator 提供額外的知識,了解如何維護狀態和集成所有組件。StackGres operator 允許使用用戶創建的一些自定義資源來部署 StackGres 集群。
StackGres 堆棧
目前,StackGres 的堆棧由以下組件組成:
-
PostgreSQL: 世界上最先進的開源關系數據庫
- https://www.postgresql.org/
-
Patroni: 依賴 kubernetes 分布式共識存儲的 HA 解決方案
- https://github.com/zalando/patroni
-
WAL-G: WAL-G 是 Postgres 的檔案恢復工具
- https://github.com/wal-g/wal-g
-
PgBouncer: PostgreSQL 的輕量級連接池
- http://www.pgbouncer.org/
-
PostgreSQL Server Exporter:用于 PostgreSQL 服務器指標的 Prometheus 導出器。
- https://github.com/wrouesnel/postgres_exporter
-
Envoy: 開源邊緣和服務代理,專為云原生應用而設計
- https://www.envoyproxy.io/
StackGres 的重要概念
StackGres 是 Kubernetes 的全棧、生產級 PostgreSQL 發行版。StackGres 提供了在生產環境中運行 PostgreSQL 所需的所有特性和管理選項,除此之外,它還附帶了合理的默認選項。
"StackGres" 這個名字來源于運行生產級 PostgreSQL 實例所需的 “組件堆棧”。
在這一頁,我們將介紹 StackGres 的重要概念。
生產級數據庫管理
生產就緒的數據庫管理是 StackGres 的核心。StackGres 以一種簡單的聲明性方式支持所有常見的(和一些不常見的)數據庫管理操作。在這樣做的同時,StackGres 堅持生產級行為。這意味著不只是盲目地執行某些操作(例如,當用戶更新數據庫實例的目標狀態時),而是以一種最小化應用程序和用戶中斷的方式,就像優秀的 DBA 所做的那樣。
因此,您可以將 StackGres 視為您友好的 DBA 的 Kubernetes 版本-只是使用 Kubernetes API,更快的響應時間和更少的咖啡休息時間。
以 Kubernetes 為中心
StackGres 是一個基于 Kubernetes 的平臺,它以 Kubernetes operator 的形式提供生產級 PostgreSQL。所以 StackGres 的一切都與 Kubernetes 緊密相連。
Kubernetes operator 是一種打包、部署和管理基于 Kubernetes 的應用程序或平臺的方法。
有些工作負載(如數據庫)需要更多的手工操作,而云原生 Postgres 部署需要了解如何維護狀態和集成所有組件。
StackGres operator 允許使用用戶創建的一些自定義資源來部署 StackGres 集群。
除此之外,StackGres 還遵循了工程師所熟悉和喜歡的 Kubernetes 的可用性和觀感。用戶自定義的 StackGres 資源意味著在 Kubernetes 中我們所知道的相同的方便的聲明式模型中使用。也就是說,用戶定義一個期望的目標狀態(通常是YAML,盡管也可能有其他選項),StackGres operator 完成如何達到該目標狀態的繁重工作。
單點接入 - 多種方式
StackGres 平臺為所有與 Postgres 相關的操作提供了一個單一的訪問點。
用戶有多種方式訪問和修改 Postgres 集群,即通過 Kubernetes API(例如使用 kubectl), REST API 或 web UI。
無論選擇哪種方式或哪種組合,StackGres 都確保狀態和所有操作始終一致。
這為用戶提供了最大的靈活性和簡單性。例如,如果 StackGres 設置由三個用戶操作,其中一個用戶使用 kubectl 處理所有事情,第二個用戶使用自己的 curl 腳本,第三個用戶使用 UI,那么他們都可以執行相同的操作并訪問相同的信息。所有不同的方式都能實現所有的功能。
Sidecar - 提供生態堆棧功能
StackGres "stack" 的組件由部署在主 Postgres 容器旁邊的 sidecar 容器提供。
所有容器基礎鏡像都是由 StackGres 構建和提供的。
輕量級和安全的容器映像基于 RedHat 的 UBI 8。
StackGres 集群
當我們提到 "cluster" 時,我們指的是由 StackGres 管理的 PostgreSQL 服務器的集合。
因此,StackGres 集群(由自定義 Kubernetes 資源類型 SGCluster 定義)是一個復制、管理、生產就緒和優化的 PostgreSQL 服務器。StackGres 集群具有固定的、合理的配置默認值,所有這些都偏向于生產級體驗。因此,對于一個工作設置,定義一個 StackGres 集群已經足夠了。
StackGres 架構
Cluster
StackGres 集群基本上是一個 statfulset,其中每個 pod 是一個數據庫實例。
StatefulSet 保證每個 pod 總是綁定到它自己的持久卷。
因此,數據庫實例數據將被映射到 kubernetes 中 Patroni 實例的狀態。
StackGres Cluster 架構圖
StackGres Pod 架構圖
我們使用一種稱為 sidecar 的模式,其中主應用程序在容器中運行,
而位于同一 pod 中的其他容器提供連接池、統計數據導出、邊緣代理、日志調度程序或數據庫實用程序等側功能。
UDS: Unix Domain Socket
StackGres 堆棧組件
在生產環境中成功運行 Postgres 需要一整套與 PostgreSQL 相關的組件——一組精心設計的開源組件,它們被構建、驗證并打包在一起。有一個圍繞 Postgres 構建的工具生態系統,可以用來創建 Postgres 發行版。這就是我們所說的組件堆棧。
為了進行比較,Postgres 就像 Linux 發行版的 Linux 內核——雖然它位于核心,但它仍然需要周圍的許多組件來提供 Linux 發行版所提供的功能。
選擇該堆棧的正確組件是一項具有挑戰性的任務。
在我們做出選擇之前,有許多組件和多個軟件發行版在功能上重疊,或者有優缺點需要考慮。
需要對所有組件有高度的了解,以便選擇適合的組件并提供生產就緒的 Postgres 發行版。
我們的 Postgres 發行版由一個核心組件 (Postgres) 和其他一些組件組成,這些組件滿足了 Postgres 生產發行版在不同領域的需求。
核心
用于 Postgres 集群節點的主容器使用 UBI 8 最小鏡像作為其基礎鏡像,其中添加了一個普通 PostgreSQL。容器使用通過 storage class 配置的持久存儲。始終與 sidecar util 容器一起部署,以允許系統/數據庫管理員訪問。
配置
在生產環境中使用默認配置運行 PostgreSQL 通常不是一個好主意。PostgreSQL 使用非常保守的默認值,為了獲得良好的性能,必須對其進行調優。
這里有一些地方可以找到更多關于 Postgres 配置參數和最佳實踐的信息:
-
Postgres Official Documentation
- https://www.postgresql.org/docs/v
-
https://postgresqlco.nf (see PostgreSQL Configuration for Humans)
- https://speakerdeck.com/ongres/postgresql-configuration-for-humans
-
The Internals of PostgreSQL
- http://www.interdb.jp/pg/
默認情況下,StackGres 被調優以獲得比使用默認配置更好的性能。用戶仍然可以根據自己的需要更改配置。
連接池
直接連接到 PostgreSQL 不能很好地擴展。一旦達到配置的 max_connections 限制(默認值為 100),超過這個數的連接將被拒絕,這是必須避免的。
雖然許多企業應用程序框架提供了共享數據庫連接的功能,但多個應用程序部署幾乎從不共享它們的連接池。
配置一個非常高的允許連接數并不能完全解決這個問題,因為我們會注意到連接延遲與負載不成比例地增加,如下圖所示(綠線):
這是由于 PostgreSQL 每個連接管理一個進程,這對于大量連接會導致 CPU 內核爭用和操作系統調度開銷。
由于這些原因,強烈建議在數據庫實例前面使用適當的連接池。
以下是三種常見的 PostgreSQL 連接池解決方案:
-
PgPool
- https://www.pgpool.net
-
PgBouncer
- https://www.pgbouncer.org/
-
Odyssey
- https://github.com/yandex/odyssey
現在,選擇哪一個呢?
StackGres 選擇的解決方案是 PgBouncer。
StackGres 選擇的解決方案是 PgBouncer。它足夠簡單和穩定,可以用于連接池。
PgBouncer 的缺點是缺乏多線程,當連接增加超過一定限制時可能導致 CPU 飽和,這取決于運行的單個 CPU 核心的性能。
當前者變得更加成熟時,Odyssey 可能是取代 PgBouncer 的一個很好的候選人。
高可用
如果一個 Postgres 實例宕機或不能正常工作,我們希望通過選擇一個工作實例轉換為新的主實例并配置所有其他實例和應用程序以指向這個新的主實例來恢復集群。我們希望這一切都能在沒有人工干預的情況下發生。
高可用性解決方案可以實現這一點。這個問題有多種解決方案,很難從中選擇一種:
-
PgPool
- https://www.pgpool.net
-
Repmgr
- https://repmgr.org/
-
Patroni
- https://github.com/zalando/patroni
-
pg_autofailover
- https://github.com/citusdata/pg_auto_failover
-
PAF
- https://dalibo.github.io/PAF/
-
Stolon
- https://github.com/sorintlab/stolon
StackGres 選擇 Patroni 作為 HA 解決方案。它是一個很好的解決方案,依靠分布式共識算法為主實例的選擇提供一致的機制。特別是,Patroni 能夠使用與 Kubernetes 相同的分布式共識算法,因此它不需要安裝其他服務。
備份和災難恢復
備份解決方案也是一個有多種選擇的生態系統:
pg_dump-
Barman
- https://www.pgbarman.org/
-
PgBackrest
- https://pgbackrest.org/
-
Wal-e / Wal-g
- https://github.com/wal-e/wal-e
- https://github.com/wal-g/wal-g
-
pg_probackup
- https://github.com/postgrespro/pg_probackup
另外,我們將備份存儲在哪里?
- Disk
- Cloud storage
最后,我們的備份是否會在需要時工作,還是會失敗?
Wal-g 是 Wal-e 的后繼版本,是提供增量(通過 archive 命令)和完全備份支持的最完整、最輕量級的解決方案。
此外,它還提供了開箱即用的特性,允許在持久卷中存儲備份
(使用支持 ReadWriteMany 訪問的存儲類)或 AWS S3、谷歌云存儲或 Azure Blob 存儲等云存儲。Wal-g 還允許配置帶寬或磁盤使用率等方面。
日志
我們希望將分布在所有容器中的日志存儲在一個中心位置,并能夠在需要時對其進行分析。沒有好的解決方案,所以必須自己創造一個。有 fluentd 和 Loki,但后者不能很好地與 Postgres 一起工作。另一種方法是使用 Timescale 將所有日志存儲在 Postgres 中。
- https://www.fluentd.org/
- https://grafana.com/oss/loki/
- https://github.com/timescale/timescaledb
代理
如何定位主實例,如果它發生了變化怎么辦?我如何獲得流量指標?是否可以管理流量:副本,A/B測試集群,或事件檢查?
- https://stackgres.io/doc/latest/administration/monitoring/
Envoy 是一個開源的邊緣和服務代理,專為云原生應用而設計。它是
可擴展,以便根據實際流量或連接特性提供高級功能。例如,可以解析 Postgres 指標以提供統計數據,或者可以配置 TLS 證書。
- https://www.envoyproxy.io/
Envoy 還能夠使用完善的 Prometheus 格式 暴露指標。
- https://stackgres.io/doc/latest/administration/monitoring/envoy/
OnGres Inc.贊助了 Envoy Proxy 項目,提供了暴露 PostgreSQL 監控指標 和實現 SSL termination support 支持等貢獻。
- https://www.envoyproxy.io/docs/envoy/latest/configuration/listeners/network_filters/postgres_proxy_filter#statistics
- https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/network/postgres_proxy/v3alpha/postgres_proxy.proto#envoy-v3-api-field-extensions-filters-network-postgres-proxy-v3alpha-postgresproxy-terminate-ssl
監控
我們可以使用哪種監控解決方案來監控 Postgres 集群?
-
Zabbix
- https://www.zabbix.com/
-
Okmeter
- https://okmeter.io/
-
Pganalyze
- https://pganalyze.com/
-
Pgwatch2
- https://github.com/cybertec-postgresql/pgwatch2
-
PoWA
- https://github.com/powa-team/powa
-
New Relic
- https://newrelic.com/
-
DataDog
- https://www.datadoghq.com/
-
Prometheus
- https://prometheus.io/
StackGres 的方法是啟用盡可能多的監控解決方案。目前,只有 Prometheus 可以使用 PostgreSQL Server Exporter 連接到 StackGres stats,并且如果使用 Prometheus Operator 安裝 Prometheus,則可以集成為提供自動綁定機制的 sidecar。
- https://github.com/wrouesnel/postgres_exporter
- https://github.com/prometheus-operator/prometheus-operator
請注意 Prometheus 是一個外部依賴,StackGres 希望你單獨安裝和配置它。
當然,StackGres 提供了一個選項,可以將 Prometheus 與 StackGres Operator 一起部署,作為 Helm chart 的一部分,您可以按照其中描述的步驟設置所需的參數,以便監視集成按預期工作。請閱讀并回顧成功安裝的步驟和注意事項。
- https://stackgres.io/doc/latest/install/helm/
另外請注意,Prometheus 將在某個時候從 Helm chart 中刪除,因此實際的說明將會改變并過時。
Grafana 集成
默認情況下,Prometheus Operator Helm chart 與 Grafana 一起提供。StackGres 提供了一個集成,允許直接從 StackGres UI 監控 StackGres 集群 pod。實現這一目標有多種選擇。
- https://github.com/coreos/prometheus-operator
StackGres包括兩種方式:
-
自動集成
- https://stackgres.io/doc/latest/install/prerequisites/#integrating-pre-existing-grafanas
-
手動集成
- https://stackgres.io/doc/latest/install/prerequisites/#manual-integration
為了實現這樣的集成,需要一些手動步驟。
用戶界面(Web UI)
有一些用戶界面可用于與 Postgres 交互,例如 DBeaver,它允許查看數據庫內容和配置。我們需要一個能夠管理整個集群的用戶界面。如何列出集群?一個集群有多少個節點?復制狀態如何?一個節點使用了多少計算資源?如何獲取特定節點的監控信息?
- https://dbeaver.io/
StackGres 通過 web 和 CLI 提供了一個用戶界面,它能夠監控和與創建的 StackGres 集群交互。它允許執行基本和高級任務,如 list/get/create/update/delete 集群或執行切換或備份恢復。
更多
- https://hacker-linner.com
- https://stackgres.io
總結
以上是生活随笔為你收集整理的StackGres 1.6,可私有部署的云原生数据库中间件平台工程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker-Compose部署Gitl
- 下一篇: 数据库系列:MySQL InnoDB锁机