Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule wdrożysz bazę danych PostgreSQL o wysokiej dostępności na platformie AKS.
- Jeśli nadal musisz utworzyć wymaganą infrastrukturę dla tego wdrożenia, wykonaj kroki opisane w temacie Tworzenie infrastruktury wdrażania bazy danych PostgreSQL o wysokiej dostępności w usłudze AKS , aby się skonfigurować, a następnie wróć do tego artykułu.
Important
Oprogramowanie typu open source jest wymienione w dokumentacji i przykładach usługi AKS. Wdrażane oprogramowanie jest wykluczone z umów dotyczących poziomu usług AKS, ograniczonej gwarancji i wsparcia Azure. W miarę korzystania z technologii open source wraz z usługą AKS zapoznaj się z opcjami pomocy technicznej dostępnymi w odpowiednich społecznościach i opiekunami projektów, aby opracować plan.
Firma Microsoft ponosi odpowiedzialność za tworzenie pakietów typu open source wdrażanych w usłudze AKS. Ta odpowiedzialność obejmuje posiadanie pełnej kontroli nad procesem kompilacji, skanowania, podpisywania, weryfikacji i szybkich poprawek, a także nad plikami binarnymi w obrazach kontenerów. Aby uzyskać więcej informacji, zapoznaj się z Zarządzanie lukami w zabezpieczeniach dla usług AKS i zakres pomocy technicznej usługi AKS.
Utwórz sekret dla użytkownika aplikacji bootstrap
- Wygeneruj sekret do zweryfikowania wdrożenia PostgreSQL przez interakcyjne logowanie dla użytkownika aplikacji bootstrap przy użyciu polecenia
kubectl create secret.
Important
Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Przepływ uwierzytelniania opisany w tej procedurze wymaga wysokiego stopnia zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach. Tego przepływu należy używać tylko wtedy, gdy inne bezpieczniejsze przepływy, takie jak tożsamości zarządzane, nie są opłacalne.
PG_DATABASE_APPUSER_SECRET=$(echo -n | openssl rand -base64 16)
kubectl create secret generic db-user-pass \
--from-literal=username=app \
--from-literal=password="${PG_DATABASE_APPUSER_SECRET}" \
--namespace $PG_NAMESPACE \
--context $AKS_PRIMARY_CLUSTER_NAME
Sprawdź, czy tajny klucz został pomyślnie utworzony przy użyciu polecenia
kubectl get.kubectl get secret db-user-pass --namespace $PG_NAMESPACE --context $AKS_PRIMARY_CLUSTER_NAME
Ustawianie zmiennych środowiskowych dla klastra PostgreSQL
Wdróż narzędzie ConfigMap, aby skonfigurować operator CNPG przy użyciu następującego
kubectl applypolecenia. Te wartości zastępują starszyENABLE_AZURE_PVC_UPDATESprzełącznik, który nie jest już wymagany, i pomagają w stopniowych aktualizacjach oraz przyspieszeniu ponownego nawiązywania połączeń replik. Przed przejściem tej konfiguracji do środowiska produkcyjnego sprawdź, czy wszystkie istniejąceDRAIN_TAINTSustawienia, na których polegasz, pozostają zgodne ze środowiskiem platformy Azure.cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME -n $PG_NAMESPACE -f - apiVersion: v1 kind: ConfigMap metadata: name: cnpg-controller-manager-config data: CLUSTERS_ROLLOUT_DELAY: '120' STANDBY_TCP_USER_TIMEOUT: '10' EOF
Zainstaluj Prometheus PodMonitors
Prometheus scrapuje CNPG przy użyciu reguł zapisywania przechowywanych w przykładowym repozytorium CNPG na GitHubie. Ponieważ zarządzany przez operatora zasób PodMonitor jest wycofywany z użycia, utwórz i zarządzaj zasobem PodMonitor samodzielnie, aby dostosować go do swojego stosu monitorowania.
Dodaj repozytorium Helm społeczności Prometheus przy użyciu polecenia
helm repo add.helm repo add prometheus-community \ https://prometheus-community.github.io/helm-chartsUaktualnij repozytorium Helm społeczności Prometheus i zainstaluj je w głównym klastrze za pomocą polecenia
helm upgradeoraz flagi--install.helm upgrade --install \ --namespace $PG_NAMESPACE \ -f https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/docs/src/samples/monitoring/kube-stack-config.yaml \ prometheus-community \ prometheus-community/kube-prometheus-stack \ --kube-context=$AKS_PRIMARY_CLUSTER_NAMEUtwórz podMonitor dla klastra. Zespół CNPG przestarza PodMonitor zarządzany przez operatora, więc teraz Ty nim zarządzasz bezpośrednio.
cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -f - apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: $PG_PRIMARY_CLUSTER_NAME namespace: ${PG_NAMESPACE} labels: cnpg.io/cluster: ${PG_PRIMARY_CLUSTER_NAME} spec: selector: matchLabels: cnpg.io/cluster: ${PG_PRIMARY_CLUSTER_NAME} podMetricsEndpoints: - port: metrics EOF
Utwórz poświadczenie federacyjne
W tej sekcji utworzysz poświadczenie tożsamości federacyjnej dla kopii zapasowej PostgreSQL, aby umożliwić CNPG używanie tożsamości obciążenia AKS do uwierzytelniania w docelowym koncie magazynu na potrzeby kopii zapasowych. Operator CNPG tworzy konto usługi Kubernetes o takiej samej nazwie jak klaster o nazwie używanej w manifeście wdrożenia klastra CNPG.
Uzyskaj adres URL wystawcy OIDC klastra, używając polecenia
az aks show.export AKS_PRIMARY_CLUSTER_OIDC_ISSUER="$(az aks show \ --name $AKS_PRIMARY_CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --query "oidcIssuerProfile.issuerUrl" \ --output tsv)"Utwórz poświadczenia tożsamości federacyjnej przy użyciu polecenia
az identity federated-credential create.az identity federated-credential create \ --name $AKS_PRIMARY_CLUSTER_FED_CREDENTIAL_NAME \ --identity-name $AKS_UAMI_CLUSTER_IDENTITY_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --issuer "${AKS_PRIMARY_CLUSTER_OIDC_ISSUER}" \ --subject system:serviceaccount:"${PG_NAMESPACE}":"${PG_PRIMARY_CLUSTER_NAME}" \ --audience api://AzureADTokenExchange
Wdrażanie klastra PostgreSQL o wysokiej dostępności
W tej sekcji wdrożysz klaster PostgreSQL o wysokiej dostępności przy użyciu niestandardowej definicji zasobów klastra CPG (CRD).
Parametry CRD klastra
W poniższej tabeli przedstawiono właściwości klucza ustawione w manifeście wdrożenia YAML dla klastra CRD:
| Property | Definition |
|---|---|
imageName |
Wskazuje obraz kontenera CloudNativePG operand. Użyj ghcr.io/cloudnative-pg/postgresql:18-system-trixie zgodnie z integracją kopii zapasowej pokazaną w tym przewodniku lub przełącz się na 18-standard-trixie przy korzystaniu z wtyczki Barman Cloud. |
inheritedMetadata |
Specyficzny dla operatora CNPG. Operator CNPG stosuje metadane do każdego obiektu powiązanego z klastrem. |
annotations |
Zawiera etykietę DNS wymaganą podczas uwidaczniania punktów końcowych klastra i włącza alpha.cnpg.io/failoverQuorum tryb failover oparty na kworum. |
labels: azure.workload.identity/use: "true" |
Wskazuje, że usługa AKS powinna wprowadzać zależności tożsamości obciążenia do zasobników hostujących wystąpienia klastra PostgreSQL. |
topologySpreadConstraints |
Wymagaj różnych stref i różnych węzłów z etykietą "workload=postgres". |
resources |
Konfiguruje klasę Jakości usług (QoS) gwarantowanej. W środowisku produkcyjnym te wartości są kluczem do maksymalizacji użycia podstawowej maszyny wirtualnej węzła i różnią się w zależności od używanej jednostki SKU maszyny wirtualnej platformy Azure. |
probes |
Zastępuje starszą startDelay konfigurację. Sondy początkowe i gotowości technologicznej pomagają zapewnić, że repliki są w dobrej kondycji, zanim zaczną obsługiwać ruch. |
smartShutdownTimeout |
Umożliwia długotrwałym transakcjom na bezproblemowe zakończenie podczas aktualizacji zamiast używania agresywnych opóźnień zatrzymania. |
bootstrap |
Specyficzny dla operatora CNPG. Inicjuje pustą bazę danych aplikacji. |
storage |
Definiuje ustawienia PersistentVolume dla bazy danych. Dzięki dyskom zarządzanym platformy Azure uproszczona składnia przechowuje dane i WAL na tym samym woluminie 64 GiB, co umożliwia lepsze poziomy przepustowości na dyskach zarządzanych. Dostosuj, jeśli potrzebujesz oddzielnych woluminów WAL. |
postgresql.synchronous |
minSyncReplicas
/
maxSyncReplicas Zamienia i umożliwia określenie synchronicznego zachowania replikacji przy użyciu nowszego schematu. |
postgresql.parameters |
Specyficzny dla operatora CNPG. Ustawienia map dla postgresql.conf, pg_hba.confi pg_ident.conf. W przykładzie kładzie się nacisk na obserwowalność i domyślne wartości retencji WAL, które odpowiadają scenariuszowi tożsamości obciążenia usługi AKS, ale powinny być dostosowane do obciążenia. |
serviceAccountTemplate |
Zawiera szablon wymagany do wygenerowania kont usług i mapowania poświadczeń tożsamości federacyjnej usługi AKS do interfejsu użytkownika w celu włączenia uwierzytelniania tożsamości obciążenia usługi AKS z zasobników hostających wystąpienia bazy danych PostgreSQL do zewnętrznych zasobów platformy Azure. |
barmanObjectStore |
Specyficzny dla operatora CNPG. Konfiguruje pakiet narzędzi barman-cloud z wykorzystaniem tożsamości aplikacji AKS do uwierzytelniania w sklepie obiektów Azure Blob Storage. |
Aby dodatkowo odizolować obciążenia PostgreSQL, możesz dodać znacznik (na przykład node-role.kubernetes.io/postgres=:NoSchedule) w węzłach płaszczyzny danych i zastąpić przykładowe wartości nodeSelector/tolerations wartościami zalecanymi przez CloudNativePG. Jeśli wybierzesz to podejście, oznacz węzły odpowiednio i potwierdź, że zasady autoskalowania AKS są zgodne z twoją topologią.
Parametry wydajności bazy danych PostgreSQL
Wydajność bazy danych PostgreSQL w dużym stopniu zależy od bazowych zasobów i obciążenia klastra. Poniższa tabela zawiera podstawowe wskazówki dla klastra z trzema węzłami działającego na węzłach Standard D4s v3 (16 GiB pamięci). Traktuj te wartości jako punkt początkowy i dostosuj je po zapoznaniu się z profilem obciążenia:
| Property | Zalecana wartość | Definition |
|---|---|---|
wal_compression |
lz4 | Kompresuje pełnostronicowe zapisy w pliku WAL za pomocą określonej metody |
max_wal_size |
6 GB | Ustawia rozmiar WAL, który wyzwala punkt kontrolny |
checkpoint_timeout |
15 minut | Ustawia maksymalny czas między automatycznymi punktami kontrolnymi WAL |
checkpoint_completion_target |
0,9 | Równoważy pracę punktu kontrolnego w ramach okna punktu kontrolnego |
checkpoint_flush_after |
2 MB | Liczba stron, po których wcześniej wykonane operacje zapisu są opróżniane na dysk |
wal_writer_flush_after |
2 MB | Ilość danych WAL zapisanych przez moduł zapisujący WAL, który wyzwala spłukanie |
min_wal_size |
2 GB | Ustawia minimalny rozmiar, aby zmniejszyć "WAL". |
max_slot_wal_keep_size |
10 GB | Górna granica dla WAL pozostało do obsługi slotów replikacji |
shared_buffers |
4 GB | Ustawia liczbę pamięci udostępnionej używanych przez serwer (25% pamięci węzła w tym przykładzie) |
effective_cache_size |
12 GB | Określa założenie planisty dotyczące całkowitego rozmiaru pamięci podręcznych danych |
work_mem |
1/256-owa część pamięci węzła | Ustawia maksymalną ilość pamięci do użycia w obszarach roboczych zapytań |
maintenance_work_mem |
6.25% pamięci węzła | Ustawia maksymalną ilość pamięci do użycia na potrzeby operacji konserwacji |
autovacuum_vacuum_cost_limit |
2400 | Ilość kosztów próżni dostępna przed drzemką w przypadku autowakuum |
random_page_cost |
1.1 | Ustawia szacowanie kosztu przez planistę dla niesekwencyjnie pobranej strony dysku |
effective_io_concurrency |
64 | Określa liczbę równoczesnych żądań, które podsystem dysków może obsłużyć wydajnie |
maintenance_io_concurrency |
64 | Wariant "effective_io_concurrency", który jest używany do prac konserwacyjnych |
Wdrażanie bazy danych PostgreSQL
- Dysk platformy Azure (SSD w warstwie Premium/SSD w warstwie Premium w wersji 2)
- Azure Container Storage (lokalny NVMe)
Wdróż klaster PostgreSQL przy użyciu klastra CRD przy użyciu
kubectl applypolecenia .cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME -n $PG_NAMESPACE -v 9 -f - apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: $PG_PRIMARY_CLUSTER_NAME annotations: alpha.cnpg.io/failoverQuorum: "true" spec: imageName: ghcr.io/cloudnative-pg/postgresql:18-system-trixie inheritedMetadata: annotations: service.beta.kubernetes.io/azure-dns-label-name: $AKS_PRIMARY_CLUSTER_PG_DNSPREFIX labels: azure.workload.identity/use: "true" instances: 3 smartShutdownTimeout: 30 probes: startup: type: streaming maximumLag: 32Mi periodSeconds: 5 timeoutSeconds: 3 failureThreshold: 120 readiness: type: streaming maximumLag: 0 periodSeconds: 10 failureThreshold: 6 topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: cnpg.io/cluster: $PG_PRIMARY_CLUSTER_NAME affinity: nodeSelector: workload: postgres resources: requests: memory: '8Gi' cpu: 2 limits: memory: '8Gi' cpu: 2 bootstrap: initdb: database: appdb owner: app secret: name: db-user-pass dataChecksums: true storage: storageClass: $POSTGRES_STORAGE_CLASS size: 64Gi postgresql: synchronous: method: any number: 1 parameters: wal_compression: lz4 max_wal_size: 6GB max_slot_wal_keep_size: 10GB checkpoint_timeout: 15min checkpoint_completion_target: '0.9' checkpoint_flush_after: 2MB wal_writer_flush_after: 2MB min_wal_size: 2GB shared_buffers: 4GB effective_cache_size: 12GB work_mem: 62MB maintenance_work_mem: 1GB autovacuum_vacuum_cost_limit: "2400" random_page_cost: "1.1" effective_io_concurrency: "64" maintenance_io_concurrency: "64" log_checkpoints: 'on' log_lock_waits: 'on' log_min_duration_statement: '1000' log_statement: 'ddl' log_temp_files: '1024' log_autovacuum_min_duration: '1s' pg_stat_statements.max: '10000' pg_stat_statements.track: 'all' hot_standby_feedback: 'on' pg_hba: - host all all all scram-sha-256 serviceAccountTemplate: metadata: annotations: azure.workload.identity/client-id: "$AKS_UAMI_WORKLOAD_CLIENTID" labels: azure.workload.identity/use: "true" backup: barmanObjectStore: destinationPath: "https://${PG_PRIMARY_STORAGE_ACCOUNT_NAME}.blob.core.windows.net/backups" azureCredentials: inheritFromAzureAD: true retentionPolicy: '7d' EOF
Uwaga / Notatka
Przykładowy manifest używa ghcr.io/cloudnative-pg/postgresql:18-system-trixie obrazu, ponieważ współdziała z podstawową integracją platformy Barman Cloud pokazaną później. Gdy będziesz gotowy do przełączenia się na wtyczkę Barman Cloud, zaktualizuj spec.imageName do ghcr.io/cloudnative-pg/postgresql:18-standard-trixie i postępuj zgodnie z wskazówkami dotyczącymi konfiguracji wtyczki zanim ponownie wdrożysz klaster.
Important
Przykładowy pg_hba wpis zezwala na dostęp bez protokołu TLS. Jeśli zachowasz tę konfigurację, udomentuj implikacje dotyczące zabezpieczeń twojego zespołu i preferuj szyfrowane połączenia wszędzie tam, gdzie to możliwe.
Sprawdź, czy podstawowy klaster PostgreSQL został pomyślnie utworzony przy użyciu
kubectl getpolecenia . Klaster CNPG CRD określił trzy instancje, które można zweryfikować, wyświetlając uruchomione zasobniki, gdy każda instancja jest włączona i dołączona do replikacji. Bądź cierpliwy, ponieważ może upłynąć trochę czasu, aż wszystkie trzy wystąpienia zostaną dołączone do klastra w trybie online.kubectl get pods --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -l cnpg.io/cluster=$PG_PRIMARY_CLUSTER_NAMEPrzykładowe dane wyjściowe
NAME READY STATUS RESTARTS AGE pg-primary-cnpg-r8c7unrw-1 1/1 Running 0 4m25s pg-primary-cnpg-r8c7unrw-2 1/1 Running 0 3m33s pg-primary-cnpg-r8c7unrw-3 1/1 Running 0 2m49s
Important
Jeśli używasz lokalnego urządzenia NVMe z usługą Azure Container Storage, a zasobnik pozostanie w stanie inicjowania z błędem wielokrotnego dołączania, zasobnik nadal wyszukuje wolumin w utraconym węźle. Po uruchomieniu zasobnika, przechodzi do stanu CrashLoopBackOff, ponieważ CNPG tworzy nową replikę na nowym węźle bez danych i nie może znaleźć katalogu pgdata. Aby rozwiązać ten problem, należy zniszczyć wystąpienie, którego dotyczy problem, i utworzyć nowe. Uruchom następujące polecenie:
kubectl cnpg destroy [cnpg-cluster-name] [instance-number]
Sprawdź, czy uruchomiono narzędzie Prometheus PodMonitor
Ręcznie utworzony PodMonitor łączy konfigurację pobierania kube-prometheus-stack z wcześniej wdrożonymi zasobnikami CNPG.
Zweryfikuj, czy PodMonitor działa, przy użyciu polecenia kubectl get.
kubectl --namespace $PG_NAMESPACE \
--context $AKS_PRIMARY_CLUSTER_NAME \
get podmonitors.monitoring.coreos.com \
$PG_PRIMARY_CLUSTER_NAME \
--output yaml
Przykładowe dane wyjściowe
kind: PodMonitor
metadata:
labels:
cnpg.io/cluster: pg-primary-cnpg-r8c7unrw
name: pg-primary-cnpg-r8c7unrw
namespace: cnpg-database
spec:
podMetricsEndpoints:
- port: metrics
selector:
matchLabels:
cnpg.io/cluster: pg-primary-cnpg-r8c7unrw
Jeśli używasz Azure Monitor dla zarządzanego Prometheus, musisz dodać kolejny monitor pod przy użyciu niestandardowej nazwy grupy. Zarządzany Prometheus nie przejmuje niestandardowych definicji zasobów (CRD) ze społeczności Prometheus. Oprócz nazwy grupy identyfikatory CRD są takie same. Ten projekt umożliwia monitorowanie zasobników dla Managed Prometheus równocześnie z monitorami zasobników korzystającymi ze społecznościowego CRD. Jeśli nie używasz zarządzanego rozwiązania Prometheus, możesz pominąć tę sekcję. Utwórz nowy monitor zasobnika:
cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -f -
apiVersion: azmonitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: cnpg-cluster-metrics-managed-prometheus
namespace: ${PG_NAMESPACE}
labels:
azure.workload.identity/use: "true"
cnpg.io/cluster: ${PG_PRIMARY_CLUSTER_NAME}
spec:
selector:
matchLabels:
azure.workload.identity/use: "true"
cnpg.io/cluster: ${PG_PRIMARY_CLUSTER_NAME}
podMetricsEndpoints:
- port: metrics
EOF
Zweryfikuj, czy monitor podu został utworzony (zwróć uwagę na różnicę w nazwie grupy).
kubectl --namespace $PG_NAMESPACE \
--context $AKS_PRIMARY_CLUSTER_NAME \
get podmonitors.azmonitoring.coreos.com \
-l cnpg.io/cluster=$PG_PRIMARY_CLUSTER_NAME \
-o yaml
Opcja A — obszar roboczy usługi Azure Monitor
Po wdrożeniu klastra Postgres i monitora kontenera można wyświetlić metryki przy użyciu portalu Azure w obszarze roboczym usługi Azure Monitor.
Opcja B — zarządzana Grafana
Alternatywnie po wdrożeniu monitorów klastra Postgres i zasobnika można utworzyć pulpit nawigacyjny metryk w wystąpieniu Zarządzany Grafana utworzonym przez skrypt wdrożenia, aby zwizualizować metryki wyeksportowane do obszaru roboczego usługi Azure Monitor. Dostęp do aplikacji Managed Grafana można uzyskać za pośrednictwem witryny Azure Portal. Przejdź do zarządzanej instancji Grafana utworzonej przez skrypt wdrożenia i wybierz link Endpoint, jak pokazano poniżej.
Wybranie linku Punkt końcowy powoduje otwarcie nowego okna przeglądarki, w którym można tworzyć pulpity nawigacyjne w zarządzanej instancji Grafana. Postępując zgodnie z instrukcjami konfigurowania źródła danych usługi Azure Monitor, możesz dodać wizualizacje, aby utworzyć pulpit nawigacyjny metryk z klastra Postgres. Po skonfigurowaniu połączenia ze źródłem danych w menu głównym wybierz opcję Źródła danych. Powinien zostać wyświetlony zestaw opcji źródła danych dla połączenia ze źródłem danych, jak pokazano poniżej:
Na opcji Zarządzany Prometheus wybierz opcję utworzenia pulpitu nawigacyjnego, aby otworzyć edytor. Po otwarciu okna edytora wybierz opcję Dodaj wizualizację, a następnie wybierz opcję Zarządzany Prometheus, aby przeglądać metryki z klastra Postgres. Po wybraniu metryki, którą chcesz wizualizować, wybierz przycisk Uruchom zapytania, aby pobrać dane wizualizacji, jak pokazano poniżej:
Wybierz ikonę Zapisz, aby dodać panel do pulpitu nawigacyjnego. Możesz dodać inne panele, wybierając przycisk Dodaj w edytorze pulpitu nawigacyjnego i powtarzając ten proces, aby zwizualizować inne metryki. Dodając wizualizacje metryk, powinieneś mieć coś, co wygląda tak:
Wybierz ikonę Zapisz, aby zapisać pulpit nawigacyjny.
Dalsze kroki
Contributors
Firma Microsoft utrzymuje ten artykuł. Następujący współautorzy pierwotnie to napisali:
- Ken Kilty | Główny TPM
- Russell de Pina | Główny Menedżer TPM
- Adrian Joian | Starszy inżynier klienta
- Jenny Hayes | Starszy deweloper zawartości
- Carol Smith | Starszy deweloper zawartości
- Erin Schaffer | Content Developer 2
- Adam Sharif | Inżynier klienta 2
Potwierdzenie
Ta dokumentacja została opracowana wspólnie z bazą danych EnterpriseDB, opiekunami operatora CloudNativePG. Dziękujemy Gabriele Bartolini za przejrzenie wcześniejszych wersji tego dokumentu i oferowanie ulepszeń technicznych.