日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

StackGres 1.6,可私有部署的云原生数据库中间件平台工程

發(fā)布時(shí)間:2023/11/30 数据库 51 coder
生活随笔 收集整理的這篇文章主要介紹了 StackGres 1.6,可私有部署的云原生数据库中间件平台工程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

StackGres 數(shù)據(jù)庫平臺工程簡介

Enterprise Postgres made easy. On Kubernetes

StackGres 是 Kubernetes 的全棧 PostgreSQL 發(fā)行版,打包成一個(gè)簡單的部署單元。
使用精心選擇和調(diào)優(yōu)的 PostgreSQL 組件。

一個(gè)企業(yè)級的 PostgreSQL 棧需要幾個(gè)其他的生態(tài)系統(tǒng)組件和重要的調(diào)整。
不僅僅是 PostgreSQL。它需要連接池、自動(dòng)故障轉(zhuǎn)移和 HA、監(jiān)控、備份和 DR、集中式日志記錄……我們已經(jīng)構(gòu)建了它們:一個(gè) Postgres 堆棧。

Postgres 不僅僅是數(shù)據(jù)庫。還有圍繞它的整個(gè)生態(tài)系統(tǒng)。如果 Postgres 是 Linux 內(nèi)核,我們需要一個(gè)圍繞 PostgreSQL 的 PostgreSQL 發(fā)行版,用生產(chǎn)部署所需的組件來補(bǔ)充它。這就是我們所說的 PostgreSQL 棧。這堆東西需要整理。通常有幾個(gè)軟件實(shí)現(xiàn)相同的功能。并不是所有的都具有相同的品質(zhì)或成熟度。有許多優(yōu)點(diǎn)和缺點(diǎn),它們往往不容易評估。最好有一個(gè)自定義的組件選擇,這些組件可以打包和配置為以可預(yù)測和可信的方式一起工作。

StackGres Operator

Operator 是一種打包、部署和管理 Kubernetes 應(yīng)用程序的方法。一些應(yīng)用程序,比如數(shù)據(jù)庫,需要更多的手工操作,而云原生 Postgres 需要 operator 提供額外的知識,了解如何維護(hù)狀態(tài)和集成所有組件。StackGres operator 允許使用用戶創(chuàng)建的一些自定義資源來部署 StackGres 集群。

StackGres 堆棧

目前,StackGres 的堆棧由以下組件組成:

  • PostgreSQL: 世界上最先進(jìn)的開源關(guān)系數(shù)據(jù)庫
    • https://www.postgresql.org/
  • Patroni: 依賴 kubernetes 分布式共識存儲(chǔ)的 HA 解決方案
    • https://github.com/zalando/patroni
  • WAL-G: WAL-G 是 Postgres 的檔案恢復(fù)工具
    • https://github.com/wal-g/wal-g
  • PgBouncer: PostgreSQL 的輕量級連接池
    • http://www.pgbouncer.org/
  • PostgreSQL Server Exporter:用于 PostgreSQL 服務(wù)器指標(biāo)的 Prometheus 導(dǎo)出器。
    • https://github.com/wrouesnel/postgres_exporter
  • Envoy: 開源邊緣和服務(wù)代理,專為云原生應(yīng)用而設(shè)計(jì)
    • https://www.envoyproxy.io/

StackGres 的重要概念

StackGres 是 Kubernetes 的全棧、生產(chǎn)級 PostgreSQL 發(fā)行版。StackGres 提供了在生產(chǎn)環(huán)境中運(yùn)行 PostgreSQL 所需的所有特性和管理選項(xiàng),除此之外,它還附帶了合理的默認(rèn)選項(xiàng)。

"StackGres" 這個(gè)名字來源于運(yùn)行生產(chǎn)級 PostgreSQL 實(shí)例所需的 “組件堆棧”。

在這一頁,我們將介紹 StackGres 的重要概念。

生產(chǎn)級數(shù)據(jù)庫管理

生產(chǎn)就緒的數(shù)據(jù)庫管理是 StackGres 的核心。StackGres 以一種簡單的聲明性方式支持所有常見的(和一些不常見的)數(shù)據(jù)庫管理操作。在這樣做的同時(shí),StackGres 堅(jiān)持生產(chǎn)級行為。這意味著不只是盲目地執(zhí)行某些操作(例如,當(dāng)用戶更新數(shù)據(jù)庫實(shí)例的目標(biāo)狀態(tài)時(shí)),而是以一種最小化應(yīng)用程序和用戶中斷的方式,就像優(yōu)秀的 DBA 所做的那樣。

因此,您可以將 StackGres 視為您友好的 DBA 的 Kubernetes 版本-只是使用 Kubernetes API,更快的響應(yīng)時(shí)間和更少的咖啡休息時(shí)間。

以 Kubernetes 為中心

StackGres 是一個(gè)基于 Kubernetes 的平臺,它以 Kubernetes operator 的形式提供生產(chǎn)級 PostgreSQL。所以 StackGres 的一切都與 Kubernetes 緊密相連。

Kubernetes operator 是一種打包、部署和管理基于 Kubernetes 的應(yīng)用程序或平臺的方法。
有些工作負(fù)載(如數(shù)據(jù)庫)需要更多的手工操作,而云原生 Postgres 部署需要了解如何維護(hù)狀態(tài)和集成所有組件。
StackGres operator 允許使用用戶創(chuàng)建的一些自定義資源來部署 StackGres 集群。

除此之外,StackGres 還遵循了工程師所熟悉和喜歡的 Kubernetes 的可用性和觀感。用戶自定義的 StackGres 資源意味著在 Kubernetes 中我們所知道的相同的方便的聲明式模型中使用。也就是說,用戶定義一個(gè)期望的目標(biāo)狀態(tài)(通常是YAML,盡管也可能有其他選項(xiàng)),StackGres operator 完成如何達(dá)到該目標(biāo)狀態(tài)的繁重工作。

單點(diǎn)接入 - 多種方式

StackGres 平臺為所有與 Postgres 相關(guān)的操作提供了一個(gè)單一的訪問點(diǎn)。
用戶有多種方式訪問和修改 Postgres 集群,即通過 Kubernetes API(例如使用 kubectl), REST API 或 web UI。
無論選擇哪種方式或哪種組合,StackGres 都確保狀態(tài)和所有操作始終一致。

這為用戶提供了最大的靈活性和簡單性。例如,如果 StackGres 設(shè)置由三個(gè)用戶操作,其中一個(gè)用戶使用 kubectl 處理所有事情,第二個(gè)用戶使用自己的 curl 腳本,第三個(gè)用戶使用 UI,那么他們都可以執(zhí)行相同的操作并訪問相同的信息。所有不同的方式都能實(shí)現(xiàn)所有的功能。

Sidecar - 提供生態(tài)堆棧功能

StackGres "stack" 的組件由部署在主 Postgres 容器旁邊的 sidecar 容器提供。

所有容器基礎(chǔ)鏡像都是由 StackGres 構(gòu)建和提供的。
輕量級和安全的容器映像基于 RedHat 的 UBI 8。

StackGres 集群

當(dāng)我們提到 "cluster" 時(shí),我們指的是由 StackGres 管理的 PostgreSQL 服務(wù)器的集合。

因此,StackGres 集群(由自定義 Kubernetes 資源類型 SGCluster 定義)是一個(gè)復(fù)制、管理、生產(chǎn)就緒和優(yōu)化的 PostgreSQL 服務(wù)器。StackGres 集群具有固定的、合理的配置默認(rèn)值,所有這些都偏向于生產(chǎn)級體驗(yàn)。因此,對于一個(gè)工作設(shè)置,定義一個(gè) StackGres 集群已經(jīng)足夠了。

StackGres 架構(gòu)

Cluster

StackGres 集群基本上是一個(gè) statfulset,其中每個(gè) pod 是一個(gè)數(shù)據(jù)庫實(shí)例。
StatefulSet 保證每個(gè) pod 總是綁定到它自己的持久卷。
因此,數(shù)據(jù)庫實(shí)例數(shù)據(jù)將被映射到 kubernetes 中 Patroni 實(shí)例的狀態(tài)。

StackGres Cluster 架構(gòu)圖

StackGres Pod 架構(gòu)圖

我們使用一種稱為 sidecar 的模式,其中主應(yīng)用程序在容器中運(yùn)行,
而位于同一 pod 中的其他容器提供連接池、統(tǒng)計(jì)數(shù)據(jù)導(dǎo)出、邊緣代理、日志調(diào)度程序或數(shù)據(jù)庫實(shí)用程序等側(cè)功能。

UDS: Unix Domain Socket

StackGres 堆棧組件

在生產(chǎn)環(huán)境中成功運(yùn)行 Postgres 需要一整套與 PostgreSQL 相關(guān)的組件——一組精心設(shè)計(jì)的開源組件,它們被構(gòu)建、驗(yàn)證并打包在一起。有一個(gè)圍繞 Postgres 構(gòu)建的工具生態(tài)系統(tǒng),可以用來創(chuàng)建 Postgres 發(fā)行版。這就是我們所說的組件堆棧。

為了進(jìn)行比較,Postgres 就像 Linux 發(fā)行版的 Linux 內(nèi)核——雖然它位于核心,但它仍然需要周圍的許多組件來提供 Linux 發(fā)行版所提供的功能。

選擇該堆棧的正確組件是一項(xiàng)具有挑戰(zhàn)性的任務(wù)。
在我們做出選擇之前,有許多組件和多個(gè)軟件發(fā)行版在功能上重疊,或者有優(yōu)缺點(diǎn)需要考慮。
需要對所有組件有高度的了解,以便選擇適合的組件并提供生產(chǎn)就緒的 Postgres 發(fā)行版。

我們的 Postgres 發(fā)行版由一個(gè)核心組件 (Postgres) 和其他一些組件組成,這些組件滿足了 Postgres 生產(chǎn)發(fā)行版在不同領(lǐng)域的需求。

核心

用于 Postgres 集群節(jié)點(diǎn)的主容器使用 UBI 8 最小鏡像作為其基礎(chǔ)鏡像,其中添加了一個(gè)普通 PostgreSQL。容器使用通過 storage class 配置的持久存儲(chǔ)。始終與 sidecar util 容器一起部署,以允許系統(tǒng)/數(shù)據(jù)庫管理員訪問。

配置

在生產(chǎn)環(huán)境中使用默認(rèn)配置運(yùn)行 PostgreSQL 通常不是一個(gè)好主意。PostgreSQL 使用非常保守的默認(rèn)值,為了獲得良好的性能,必須對其進(jìn)行調(diào)優(yōu)。
這里有一些地方可以找到更多關(guān)于 Postgres 配置參數(shù)和最佳實(shí)踐的信息:

  • 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/

默認(rèn)情況下,StackGres 被調(diào)優(yōu)以獲得比使用默認(rèn)配置更好的性能。用戶仍然可以根據(jù)自己的需要更改配置。

連接池

直接連接到 PostgreSQL 不能很好地?cái)U(kuò)展。一旦達(dá)到配置的 max_connections 限制(默認(rèn)值為 100),超過這個(gè)數(shù)的連接將被拒絕,這是必須避免的。
雖然許多企業(yè)應(yīng)用程序框架提供了共享數(shù)據(jù)庫連接的功能,但多個(gè)應(yīng)用程序部署幾乎從不共享它們的連接池。

配置一個(gè)非常高的允許連接數(shù)并不能完全解決這個(gè)問題,因?yàn)槲覀儠?huì)注意到連接延遲與負(fù)載不成比例地增加,如下圖所示(綠線):

這是由于 PostgreSQL 每個(gè)連接管理一個(gè)進(jìn)程,這對于大量連接會(huì)導(dǎo)致 CPU 內(nèi)核爭用和操作系統(tǒng)調(diào)度開銷。

由于這些原因,強(qiáng)烈建議在數(shù)據(jù)庫實(shí)例前面使用適當(dāng)?shù)倪B接池。

以下是三種常見的 PostgreSQL 連接池解決方案:

  • PgPool
    • https://www.pgpool.net
  • PgBouncer
    • https://www.pgbouncer.org/
  • Odyssey
    • https://github.com/yandex/odyssey

現(xiàn)在,選擇哪一個(gè)呢?

StackGres 選擇的解決方案是 PgBouncer。
StackGres 選擇的解決方案是 PgBouncer。它足夠簡單和穩(wěn)定,可以用于連接池。
PgBouncer 的缺點(diǎn)是缺乏多線程,當(dāng)連接增加超過一定限制時(shí)可能導(dǎo)致 CPU 飽和,這取決于運(yùn)行的單個(gè) CPU 核心的性能。
當(dāng)前者變得更加成熟時(shí),Odyssey 可能是取代 PgBouncer 的一個(gè)很好的候選人。

高可用

如果一個(gè) Postgres 實(shí)例宕機(jī)或不能正常工作,我們希望通過選擇一個(gè)工作實(shí)例轉(zhuǎn)換為新的主實(shí)例并配置所有其他實(shí)例和應(yīng)用程序以指向這個(gè)新的主實(shí)例來恢復(fù)集群。我們希望這一切都能在沒有人工干預(yù)的情況下發(fā)生。

高可用性解決方案可以實(shí)現(xiàn)這一點(diǎn)。這個(gè)問題有多種解決方案,很難從中選擇一種:

  • 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 解決方案。它是一個(gè)很好的解決方案,依靠分布式共識算法為主實(shí)例的選擇提供一致的機(jī)制。特別是,Patroni 能夠使用與 Kubernetes 相同的分布式共識算法,因此它不需要安裝其他服務(wù)。

備份和災(zāi)難恢復(fù)

備份解決方案也是一個(gè)有多種選擇的生態(tài)系統(tǒng):

  • 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

另外,我們將備份存儲(chǔ)在哪里?

  • Disk
  • Cloud storage

最后,我們的備份是否會(huì)在需要時(shí)工作,還是會(huì)失敗?

Wal-g 是 Wal-e 的后繼版本,是提供增量(通過 archive 命令)和完全備份支持的最完整、最輕量級的解決方案。
此外,它還提供了開箱即用的特性,允許在持久卷中存儲(chǔ)備份
(使用支持 ReadWriteMany 訪問的存儲(chǔ)類)或 AWS S3、谷歌云存儲(chǔ)或 Azure Blob 存儲(chǔ)等云存儲(chǔ)。Wal-g 還允許配置帶寬或磁盤使用率等方面。

日志

我們希望將分布在所有容器中的日志存儲(chǔ)在一個(gè)中心位置,并能夠在需要時(shí)對其進(jìn)行分析。沒有好的解決方案,所以必須自己創(chuàng)造一個(gè)。有 fluentd 和 Loki,但后者不能很好地與 Postgres 一起工作。另一種方法是使用 Timescale 將所有日志存儲(chǔ)在 Postgres 中。

  • https://www.fluentd.org/
  • https://grafana.com/oss/loki/
  • https://github.com/timescale/timescaledb

代理

如何定位主實(shí)例,如果它發(fā)生了變化怎么辦?我如何獲得流量指標(biāo)?是否可以管理流量:副本,A/B測試集群,或事件檢查?

  • https://stackgres.io/doc/latest/administration/monitoring/

Envoy 是一個(gè)開源的邊緣和服務(wù)代理,專為云原生應(yīng)用而設(shè)計(jì)。它是
可擴(kuò)展,以便根據(jù)實(shí)際流量或連接特性提供高級功能。例如,可以解析 Postgres 指標(biāo)以提供統(tǒng)計(jì)數(shù)據(jù),或者可以配置 TLS 證書。

  • https://www.envoyproxy.io/

Envoy 還能夠使用完善的 Prometheus 格式 暴露指標(biāo)。

  • https://stackgres.io/doc/latest/administration/monitoring/envoy/

OnGres Inc.贊助了 Envoy Proxy 項(xiàng)目,提供了暴露 PostgreSQL 監(jiān)控指標(biāo) 和實(shí)現(xiàn) SSL termination support 支持等貢獻(xiàn)。

  • 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

監(jiān)控

我們可以使用哪種監(jiān)控解決方案來監(jiān)控 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 的方法是啟用盡可能多的監(jiān)控解決方案。目前,只有 Prometheus 可以使用 PostgreSQL Server Exporter 連接到 StackGres stats,并且如果使用 Prometheus Operator 安裝 Prometheus,則可以集成為提供自動(dòng)綁定機(jī)制的 sidecar。

  • https://github.com/wrouesnel/postgres_exporter
  • https://github.com/prometheus-operator/prometheus-operator

請注意 Prometheus 是一個(gè)外部依賴,StackGres 希望你單獨(dú)安裝和配置它。

當(dāng)然,StackGres 提供了一個(gè)選項(xiàng),可以將 Prometheus 與 StackGres Operator 一起部署,作為 Helm chart 的一部分,您可以按照其中描述的步驟設(shè)置所需的參數(shù),以便監(jiān)視集成按預(yù)期工作。請閱讀并回顧成功安裝的步驟和注意事項(xiàng)。

  • https://stackgres.io/doc/latest/install/helm/

另外請注意,Prometheus 將在某個(gè)時(shí)候從 Helm chart 中刪除,因此實(shí)際的說明將會(huì)改變并過時(shí)。

Grafana 集成

默認(rèn)情況下,Prometheus Operator Helm chart 與 Grafana 一起提供。StackGres 提供了一個(gè)集成,允許直接從 StackGres UI 監(jiān)控 StackGres 集群 pod。實(shí)現(xiàn)這一目標(biāo)有多種選擇。

  • https://github.com/coreos/prometheus-operator

StackGres包括兩種方式:

  • 自動(dòng)集成
    • https://stackgres.io/doc/latest/install/prerequisites/#integrating-pre-existing-grafanas
  • 手動(dòng)集成
    • https://stackgres.io/doc/latest/install/prerequisites/#manual-integration

為了實(shí)現(xiàn)這樣的集成,需要一些手動(dòng)步驟。

用戶界面(Web UI)

有一些用戶界面可用于與 Postgres 交互,例如 DBeaver,它允許查看數(shù)據(jù)庫內(nèi)容和配置。我們需要一個(gè)能夠管理整個(gè)集群的用戶界面。如何列出集群?一個(gè)集群有多少個(gè)節(jié)點(diǎn)?復(fù)制狀態(tài)如何?一個(gè)節(jié)點(diǎn)使用了多少計(jì)算資源?如何獲取特定節(jié)點(diǎn)的監(jiān)控信息?

  • https://dbeaver.io/

StackGres 通過 web 和 CLI 提供了一個(gè)用戶界面,它能夠監(jiān)控和與創(chuàng)建的 StackGres 集群交互。它允許執(zhí)行基本和高級任務(wù),如 list/get/create/update/delete 集群或執(zhí)行切換或備份恢復(fù)。

更多

  • https://hacker-linner.com
  • https://stackgres.io

總結(jié)

以上是生活随笔為你收集整理的StackGres 1.6,可私有部署的云原生数据库中间件平台工程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。