Kubernetes集群安装高可用postgresql

Kubernetes集群安装高可用postgresql

Bitnami 提供的 postgresql-ha 解决方案是一个预配置的、高可用的 PostgreSQL 集群配置,通常部署在 Kubernetes 环境中。它使用了一些关键技术和组件来实现数据库的高可用性。,Bitnami postgresql-ha 主要采用以下构建方式:

  1. PostgreSQL 集群:这是核心部分,通常包含一个主(Primary)数据库和一个或多个从(Standby)数据库。这种设置支持主从复制,其中从数据库实时复制主数据库的数据。

  2. 自动故障转移:在主数据库发生故障时,系统会自动将其中一个从数据库提升为新的主数据库,以确保服务的持续可用性。

  3. Pgpool-II:Bitnami 的 postgresql-ha 使用 Pgpool-II 作为数据库连接池和负载均衡器。Pgpool-II 处理客户端连接,提供负载均衡和连接池功能,同时也支持自动故障转移和读写分离。

  4. 持久化存储:为了保证数据的持久性和稳定性,Bitnami 的解决方案通常使用持久化存储,如 Kubernetes 的持久卷(Persistent Volumes,PVs)和持久卷声明(Persistent Volume Claims,PVCs)。

  5. 监控和日志记录:集成的监控和日志记录机制,以确保集群的健康状况可以被实时监控,并在出现问题时可以迅速响应。

  6. 配置和管理:Bitnami 的 Helm chart 提供了灵活的配置选项,允许用户根据具体需求调整数据库设置、资源分配、复制策略等。

  7. 安全性:通常包括网络策略、访问控制和加密选项来保护数据和通信。

  8. 备份和恢复:可能包括对数据库备份和恢复的支持,以确保数据的安全性。

使用这样的架构,Bitnami 的 postgresql-ha 解决方案能够为企业级应用提供可靠的、高可用的数据库服务,同时充分利用了 Kubernetes 平台的特性,如易于扩展、自我修复和声明式配置。

如果想进一步了解pgpool实现高可用postgresql数据库的架构原理,请参考:pgpool-II高可用配置讲解

1.通过Helm Chart安装高可用Postgresql集群

1.1 前提条件

a. Kubernetes版本>=1.23,Kubernetes的安装请参考:Kubeadm安装K8s1.26集群

b. Helm版本>=v3.8.0,其中 Helm 的安装请参考:Helm Install

c.需要有默认的StorageClass,具体准备流程参考:Kubernetes安装StorageClass

1.2 安装流程

a.创建安装目录

#切换到当前用户根目录并建立logging文件夹
cd ~ && mkdir postgresql-ha

cd postgresql-ha

b.创建logging名字空间,独立的名字空间有助于资源管理

kubectl create ns pg

c.添加elastic官方repo仓库

helm repo add bitnami https://charts.bitnami.com/bitnami

d.定制化
如果需要做某些定制化需求请参考官方 values.yaml 文件,其中每个参数都会有详细描述: 官网参考

helm pull bitnami/postgresql-ha --version 12.3.2

tar -xvf postgresql-ha-12.3.2.tgz

cd postgresql-ha

#(非必要)以下的操作主要是修改postgresql:默认的pgpool容器副本数,持久化存储卷大小,NodePort对外暴露方式。当然如果需要还可以修改数据库名,数据库密码,登录用户名等信息,也可以通过ingress实现对外7层代理,当然如果需要还可以修改镜像地址,毕竟从外网下载镜像稳定性较差。
vi values.yaml
# 1.全局搜索“pgpool.replicaCount”

## @param pgpool.replicaCount The number of replicas to deploy
##
replicaCount: 2 #修改pgpool的数量增强高可用性

# 2.全局搜索“persistence.size”

## @param persistence.size Persistent Volume Claim size
##
size: 8Gi #默认8G比较小,在真实生产环境可以根据实际需求修改。

# 3.全局搜索“service.type”,找到如下内容:
  type: NodePort #修改为NodePort方式
  ## @param service.ports.postgresql PostgreSQL port
  ##
  ports:
    postgresql: 5432
  ## @param service.portName PostgreSQL service port name
  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#multi-port-services
  ##
  portName: postgresql
  ## @param service.nodePorts.postgresql Kubernetes service nodePort
  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
  ##
  nodePorts:
    postgresql: "15432" #选择一个合适的NodePort端口

e.安装

#执行安装命令
cd ~/postgresql-ha/

helm install pg-ha ./postgresql-ha -n pg

#成功后提示
NAME: pg-ha
LAST DEPLOYED: Tue Dec  5 04:36:18 2023
NAMESPACE: pg
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: postgresql-ha
CHART VERSION: 12.3.2
APP VERSION: 16.1.0
** Please be patient while the chart is being deployed **
PostgreSQL can be accessed through Pgpool via port 5432 on the following DNS name from within your cluster:

    pg-ha-postgresql-ha-pgpool.pg.svc.cluster.local

Pgpool acts as a load balancer for PostgreSQL and forward read/write connections to the primary node while read-only connections are forwarded to standby nodes.

To get the password for "postgres" run:

    export POSTGRES_PASSWORD=$(kubectl get secret --namespace pg pg-ha-postgresql-ha-postgresql -o jsonpath="{.data.password}" | base64 -d)

To get the password for "repmgr" run:

    export REPMGR_PASSWORD=$(kubectl get secret --namespace pg pg-ha-postgresql-ha-postgresql -o jsonpath="{.data.repmgr-password}" | base64 -d)

To connect to your database run the following command:

    kubectl run pg-ha-postgresql-ha-client --rm --tty -i --restart='Never' --namespace pg --image docker.io/bitnami/postgresql-repmgr:16.1.0-debian-11-r11 --env="PGPASSWORD=$POSTGRES_PASSWORD"  \
        --command -- psql -h pg-ha-postgresql-ha-pgpool -p 5432 -U postgres -d postgres

To connect to your database from outside the cluster execute the following commands:

    export NODE_IP=$(kubectl get nodes --namespace pg -o jsonpath="{.items[0].status.addresses[0].address}")
    export NODE_PORT=$(kubectl get --namespace pg -o jsonpath="{.spec.ports[0].nodePort}" services pg-ha-postgresql-ha-pgpool
    PGPASSWORD="$POSTGRES_PASSWORD" psql -h $NODE_IP -p $NODE_PORT -U postgres -d postgres

#查看运行状态
kubectl get po -n pg
NAME                                          READY   STATUS    RESTARTS   AGE
pg-ha-postgresql-ha-pgpool-58468c7bff-jg9kz   1/1     Running   0          3m41s
pg-ha-postgresql-ha-pgpool-58468c7bff-lhf5p   1/1     Running   0          3m41s
pg-ha-postgresql-ha-postgresql-0              1/1     Running   0          3m41s
pg-ha-postgresql-ha-postgresql-1              1/1     Running   0          3m41s
pg-ha-postgresql-ha-postgresql-2              1/1     Running   0          3m41s

f.测试连接

#获取数据库连接密码
kubectl get secret --namespace pg pg-ha-postgresql-ha-postgresql -o jsonpath="{.data.password}" | base64 -d
f6PEWNNTec  #别用我的,咱们不一样

#检查对外暴露的端口
kubectl get svc -n pg
NAME                                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
pg-ha-postgresql-ha-pgpool                NodePort    172.16.86.61    <none>        5432:15432/TCP   12m
pg-ha-postgresql-ha-postgresql            ClusterIP   172.16.19.127   <none>        5432/TCP         12m
pg-ha-postgresql-ha-postgresql-headless   ClusterIP   None            <none>        5432/TCP         12m

#使用数据库连接工具,我使用的是pgAdmin

可以看到已经能够连接成功
在这里插入图片描述
g.错误处理
我这里做过多次安装,有的机器可能遇到如下错误

password authentication failed for user “postgres”; User “postgres” has no password assigned.

这个问题是由于postgres数据库启动太慢导致的,适当增加livenessProbe,readinessProbe,startupProbe的initialDelaySeconds数值即可。

# 1.全局搜索“postgresql.livenessProbe.initialDelaySeconds”

# 2.全局搜索“postgresql.readinessProbe.initialDelaySeconds”

# 3.全局搜索“postgresql.startupProbe.initialDelaySeconds”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/230671.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM 性能调优及监控诊断工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解

目录 一. 前言 二. jps&#xff08;Java Virtual Machine Process Status Tool&#xff09; 三. jstack 四. jmap&#xff08;Memory Map&#xff09;和 jhat&#xff08;Java Heap Analysis Tool&#xff09; 五. jstat&#xff08;JVM统计监测工具&#xff09; 六. hpro…

云原生的 CI/CD 框架tekton - pipeline(一)

文章目录 1. 官方介绍2. 组件2.1 Tekton Pipelines2.2 部署pipeline2.3 部署dashborad2.3.1 task2.3.2 taskrun2.3.3 Pipeline2.3.4 PipelineRun 3. 案例案例1: 拉取代码并查看readmestep1: 创建task - 拉取代码step2: 创建task - 查看reamdestep3: 创建task的编排 - pipelines…

深入理解CyclicBarrier

文章目录 1. 概念2. CylicBarier使用简单案例3. 源码 1. 概念 CyclicBarrier 字面意思回环栅栏&#xff08;循环屏障&#xff09;&#xff0c;通过它可以实现让一组线程等待至某个状态&#xff08;屏障点&#xff09;之后再全部同时执行。叫做回环是因为当所有等待线程都被释放…

智能优化算法应用:基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于法医调查算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.参考…

Unity 状态系统

状态系统 原理食用方法Demo 原理 #mermaid-svg-lUbxJ8eMP3KqrEhY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-icon{fill:#552222;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-text{fill:#55…

使用RSA工具进行对信息加解密

我们在开发中需要对用户敏感数据进行加解密&#xff0c;比如密码 这边科普一下RSA算法 RSA是非对称加密算法&#xff0c;与对称加密算法不同;在对称加密中&#xff0c;相同的密钥用于加密和解密数据,因此密钥的安全性至关重要;而在RSA非对称加密中&#xff0c;有两个密钥&…

一文说清google最新大模型Gemini

随着AI技术的快速发展&#xff0c;谷歌和其他科技巨头在研究和部署上的竞争也越来越激烈。本月12月6号谷歌CEO哈萨比斯在谷歌官网发文&#xff0c;宣布推出万众瞩目的多模态大模型Gemini。标题明晃晃写着“最大”、“最强”&#xff0c;主打的就是一个干爆GPT-4。 一、Gemini的…

unity 2d 入门 飞翔小鸟 场景延续(八)

1、新建c#脚本如下 代码&#xff0c;在前方生成生成自身图片并3s后销毁自身&#xff0c;在碰撞物体后小鸟死亡后不删除自身 using System.Collections; using System.Collections.Generic; using UnityEngine;public class CopyScene : MonoBehaviour { //要复制的对象public…

银行卡二要素API的应用案例:从在线购物到金融投资

引言 随着互联网技术的不断发展&#xff0c;人们的金融需求也在不断增加。随之而来的是各种新型金融服务的涌现&#xff0c;让用户的金融体验更加便利快捷。其中&#xff0c;银行卡二要素API的应用&#xff0c;则为用户的金融体验和安全性提供了极大的保障。 银行卡二要素API…

计算机存储单位 + 程序编译过程

C语言的编译过程 计算机存储单位 头文件包含的两种方式 使用 C/C 程序常用的IDE 常用的C语言编译器&#xff1a; 在选择编译器时&#xff0c;需考虑平台兼容性、性能优化、调试工具和开发人员的个人偏好等因素。 详细教程可转 爱编程的大丙

Python---random库

目录 基本随机数函数(): rand.seed() random() 扩展随机数函数(): random库包含两类函数&#xff1a;基本随机数函数&#xff0c;扩展随机数函数 基本随机数函数:seed(),random() 扩展随机数函数&#xff1a;randint,getrandbits(),uniform(),randrange(),choice(),shuff…

JumpServer初探

JumpServer资产&#xff0c;用户关系如图所示。 资产管理下有资产列表和系统用户&#xff0c;系统用户分为特权用户和普通用户。资产列表下管理的是服务器&#xff0c;而特权用户就是JumpServer用来登录服务器的账号&#xff0c;因此特权用户需要拥有较高的权限&#xff0c;比…

AWS攻略——Peering连接VPC

文章目录 创建IP/CIDR不覆盖的VPC创建VPC创建子网创建密钥对创建EC2 创建Peering接受Peering邀请修改各个VPC的路由表修改美东us-east-1 pulic subnet的路由修改悉尼ap-southeast-2路由 测试知识点 我们回顾下《AWS攻略——VPC初识》中的知识&#xff1a; 一个VPC只能设置在一…

五、HotSpot细节实现

一、并发标记与三色标记 问题&#xff1a;三色标记到底发生在什么阶段&#xff0c;替代了什么。并发标记 1、并发标记( Concurrent Marking) 从 GC Root 开始对堆中对象进行可达性分析&#xff0c;递归扫描整个堆里的对象图&#xff0c;找出要回收的对象&#xff0c;这阶段耗…

Vue学习计划-Vue2--VueCLi(二)vuecli脚手架创建的项目内部主要文件分析

1. 文件分析 1. 补充&#xff1a; 什么叫单文件组件&#xff1f; 一个文件中只有一个组件 vue-cli创建的项目中&#xff0c;.vue的文件都是单文件组件&#xff0c;例如App.vue 2. 进入分析 1. package.json: 项目依赖配置文件&#xff1a; 如图&#xff0c;我们说主要的属性…

C++学习之路(十九)C++ 用Qt5实现一个工具箱(用SQLite数据库来管理粘贴板数据)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《点击按钮以新窗口打开功能面板》功能。今天我们把粘贴板功能用SQLite数据库来管理&#xff0c;用SQLite来实现增删改查。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。 老规矩&#xff…

实现:切换页面切换标题,扩展 vue-router 的类型

布局容器-页面标题 网址&#xff1a;https://router.vuejs.org/zh/guide/advanced/meta 给每一个路由添加 元信息 数据 router/index.ts const router createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{ path: /login, component: () > im…

LeetCode(52)最小栈【栈】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 最小栈 1.题目 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void…

PandoraFMS 监控软件 任意文件上传漏洞复现

0x01 产品简介 Pandora FMS 是用于监控计算机网络的软件。 Pandora FMS 允许以可视化方式监控来自不同操作系统、服务器、应用程序和硬件系统(例如防火墙、代理、数据库、Web 服务器或路由器)的多个参数的状态和性能。 0x02 漏洞概述 PandoraFMS upload_head_image.php 接…

web前端开发html/css练习

目标图&#xff1a; 素材&#xff1a; 代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"…