作者:王志斌

编辑:钟华龙

本文来自社区小伙伴 王志斌 的投稿。从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上。文章分为上下两部分,《第一部 Kubernetes 环境准备》已经发布。第二部分将带大家部署一个 RadonDB PostgreSQL Operator 和集群。

什么是 RadonDB PostgreSQL Operator?

RadonDB PostgreSQL 是一款基于 PostgreSQL 使用 Operator 实现的数据库容器化项目。

  • 被广泛应用于地理空间和移动领域
  • 具备高可用、稳定性、数据完整性等性能
  • 支持在线水平扩展
  • 支持故障自动转移 ,提供 HA 功能
  • 提供 PostgreSQL 常用参数接口,方便调整参数
  • 提供 PostGIS 插件,具备存储、查询和修改空间关系的能力
  • 提供实时监控、健康检查、日志自动清理等功能

RadonDB PostgreSQL Operator 可基于 KubeSphere、OpenShift、Rancher 等 Kubernetes 容器平台交付。可自动执行与运行 RadonDB PostgreSQL 集群有关的任务。

RadonDB PostgreSQL Operator基于 https://github.com/CrunchyData/postgres-operator 项目实现,进行了改进优化,后续会持续回馈给社区。

仓库地址:https://github.com/radondb/radondb-postgresql-operator

一、部署 RadonDB PostgreSQL 集群

安装 Helm

  1. curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

准备本地存储

本次实验 RadonDB PostgreSQL 集群数据持久化采用 Local Persistent Volumes,以下的步骤为配置集群所使用的本地持久化存储卷,配置一个一主一从的高可用集群,最低需要三个持久化存储卷:

  1. PostgreSQL Primary 数据卷
  2. PostgreSQL Replica 数据卷
  3. PostgreSQL 备份卷

实际使用可以根据具体的情况,灵活配置存储卷。

大体步骤:

  1. 虚拟机添加新硬盘(每台虚拟机分别添加一块)
  2. 重启虚拟机
  3. 查看现磁盘是否正常挂载
  1. fdisk -l

可看到新加的虚拟硬盘,一般名为: Disk /dev/sdb

给新加的硬盘分区。

  1. fdisk /dev/sdb
  2. #按照提示增加新分区
  3. /dev/sdb1 /dev/sdb2 /dev/sdb13

格式化磁盘分区。用 ext4 格式对 /dev/sdb1 进入格式化。

  1. mkfs.ext4 /dev/sdb1
  2. mkfs.ext4 /dev/sdb2
  3. mkfs.ext4 /dev/sdb3

挂载分区,创建新的挂载点。

  1. mkdir -p /data/pgdata/pv{1..3}

将新磁盘分区挂载到 /work 目录下。

  1. mount -t ext4 /dev/sdb1 /data/pgdata/pv1
  2. mount -t ext4 /dev/sdb3 /data/pgdata/pv2
  3. mount -t ext4 /dev/sdb4 /data/pgdata/pv3

查看挂载

  1. df -h

可以看到新加的硬盘: /dev/sdb1 /dev/sdb2 /dev/sdb3

实现开机自动挂载。

  1. vim /etc/fstab

在最后一行加入:

  1. /dev/sdb1 /data/pgdata/pv1 ext4 defaults 0 2
  2. /dev/sdb2 /data/pgdata/pv2 ext4 defaults 0 2
  3. /dev/sdb3 /data/pgdata/pv3 ext4 defaults 0 2

创建命名空间

  1. kubectl create namespace pgo

部署 PostgreSQL Operator

  1. kubectl apply -f https://github.com/radondb/radondb-postgresql-operator/blob/main/installers/kubectl/postgres-operator.yml -n pgo
  2. # 查看状态
  3. kubectl get all -n pgo --selector=name=postgres-operator

安装静态本地盘控制器

Kubernetes 当前支持静态分配的本地存储。可使用 local-static-provisioner[1] 项目中的 local-volume-provisioner 程序创建本地存储对象。

  1. git clone https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner.git
  2. cd sig-storage-local-static-provisioner
  3. # 主要修改行号
  4. vi helm/provisioner/values.yaml
  5. 66 classes:
  6. 67 - name: fast-disks
  7. 70 hostDir: /data/pgdata
  8. 76 volumeMode: Filesystem
  9. 81 fsType: ext4
  10. 116 image: quay.io/external_storage/local-volume-provisioner:v2.4.0
  11. #
  12. helm install localprovi . -n kube-system
  13. # podpv
  14. kubectl get po -n kube-system -l app.kubernetes.io/name=provisioner

部署数据库集群

启用 PGO 客户端,创建数据库集群。

  1. kubectl exec -it -n pgo  $(kubectl get po -n pgo -l name=pgo-client  -o jsonpath='{range .items[*]}{.metadata.name}{end}')  -- bash
  2. pgo create cluster radondb --storage-config=fast-disks

部分参数可参见下表,并可执行 pgo 命令行帮助 pgo --help 获取更详细的部署参数帮助。

命令行 命令说明
--pgbackrest-storage-type="s3" 备份存储的类型。支持 posix 、s3、gcs、posix,s3 和 posix,gcs五种类型。
--replica-count=3 PostgeSQL副本数量。
--ccp-image=radondb-postgres-ha 使用的镜像名称。 带 gis 插件的镜像,例如 radondb-postgres-gis-ha。 不带 gis 插件的镜像,例如 radondb-postgres-ha。
--ccp-image-prefix=docker.io/radondb 镜像仓库。
--ccp-image-tag=debian-14.2-2.1.1 dockerhub 上镜像的标签。
--pgbackrest-s3-endpoint=s3.pek3b.qingstor.com \ --pgbackrest-s3-key=xxxxx \ --pgbackrest-s3-key-secret=xxxx \ --pgbackrest-s3-bucket=xxxx \ --pgbackrest-s3-region=xxx \ --pgbackrest-s3-verify-tls=false 支持 s3 协议的对象存储设置,主要用于备份。若备份存储选择了 s3 则需要设置这部分参数。
--metrics 启用适用于 Prometheus 的指标收集器。
--pgbadger 启用 pgbadger。
--debug 调试模式。

执行以下命令观察集群创建过程。待所有 Pod 状态切换为 Running,则集群创建完成。

  1. kubectl get po -n pgo --watch

检查 local pv 是否正常绑定

  1. kubectl get pv -n pgo |grep ^local

二、连接 RadonDB PostgreSQL 集群

通过执行 pgo 命令连接,获取集群中用户账号信息。

  1. pgo show user -n pgo radondb

以下以 RadonDB PostgreSQL 集群为示例,获取数据库账号并连接数据库。

  1. pgo show user -n pgo radondb --show-system-accounts
  2. CLUSTER USERNAME PASSWORD EXPIRES STATUS ERROR
  3. --------- -------------- ------------------------ ------- ------ -----
  4. radondb ccp_monitoring Dwpa|MCg,b4M+rY.>ZC0ONz4 never ok
  5. radondb postgres 1a4R-d7Po=,PS@R:-=?[gP(9 never ok
  6. radondb primaryuser =B8x*Haf*dCq+V4hkGSfh/.} never ok
  7. radondb testuser yTFeeH1|^DX<Bx4[?:B_/Q;M never ok

此外,还可以通过 psql 工具连接。

查看服务:

  1. kubectl -n pgo get svc
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. postgres-operator ClusterIP 10.96.64.37 <none> 8443/TCP,4171/TCP,4150/TCP 58m
  4. radondb ClusterIP 10.96.171.227 <none> 10000/TCP,9187/TCP,2022/TCP,5432/TCP 5m42s
  5. radondb-backrest-shared-repo ClusterIP 10.96.235.247 <none> 2022/TCP 5m42s
  6. radondb-pgbouncer ClusterIP 10.96.234.49 <none> 5432/TCP 4m16s
  7. radondb-replica ClusterIP 10.96.67.45 <none> 10000/TCP,9187/TCP,2022/TCP,5432/TCP 3m50s

以 testuser 账号为示例,连接到数据库。

  1. kubectl -n pgo port-forward svc/radondb 5432:5432
  2. PGPASSWORD='xxxxxxxxxxxxxxxxxxxxxxxx' psql -h localhost -p 5432 -U testuser radondb

查看集群

  1. kubectl exec -it rp1-65798ccf5c-ftbp9 -n pgo -c database bash

可以看到图中为 3 节点集群。至此,RadonDB PostgreSQL 容器化数据库搭建完成。

引用链接

1.local-static-provisioner:https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner

致谢

RadonDB 开源社区向本文的投稿作者表示感谢!也期待更多的社区小伙伴的投稿~

给小白的 PG 容器化部署教程(下)的更多相关文章

  1. 给小白的 PostgreSQL 容器化部署教程(上)

    作者:王志斌 编辑:钟华龙 本文来自社区小伙伴 王志斌 的投稿.从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上.文章分为上下两部分,第一部分 ...

  2. .NET Core+MySql+Nginx 容器化部署

    .NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...

  3. Gogs的Docker容器化部署流程遇到的问题

    Gogs的Docker容器化部署流程遇到的问题   最近在学习CI/CD的一些方案,个人比较青睐容器化轻量级.CI方面一开始是想使用gitlab的,但是发现我自己买的服务器配置太低,内存根本不够(大写 ...

  4. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  5. 谈谈surging引擎的tcp、http、ws协议和如何容器化部署

    1.前言 分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿.从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果.esb,网关, ...

  6. 1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))

    容器化部署一套云服务系列 1. 容器化部署一套云服务之Jenkins 一.购买服务器 服务器

  7. angular应用容器化部署

    angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...

  8. Flask容器化部署原理与实现

    本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Fla ...

  9. Ubuntu系统下容器化部署gitlab

    容器化部署gitlab 获取镜像文件 1. 下载镜像文件 docker pull beginor/gitlab-ce:-ce. 2. 创建GitLab 的配置 (etc) . 日志 (log) .数据 ...

随机推荐

  1. uniapp中websokcet封装和使用

    1.  websocket.js   封装代码 //是否已经连接上ws let isOpenSocket = false //心跳间隔,单位毫秒 let heartBeatDelay = 3000 l ...

  2. java读取xml文件并转换成对象,并进行修改

    1.首先要写工具类,处理读取和写入xml文件使用的工具.XMLUtil.javaimport java.io.FileInputStream; import java.io.FileWriter; i ...

  3. Oracle安装 - shmmax和shmall设置

    一.概述 在Linux上安装oracle,需要对内核参数进行调整,其中有shmmax和shmall这两个参数,那这两个参数是什么意思,又该如何设置呢? 二.官方文档 在oracle的官方文档( htt ...

  4. Spring-Mybatis使用到的依赖及配置

    日志(log4j) log4j.rootLogger=DEBUG,console,file log4j.appender.console = org.apache.log4j.ConsoleAppen ...

  5. Java学习day37

    动态语言:是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化. 主要动态语言:Objective-C.C#.JavaScript.PH ...

  6. MySQL启动过程详解二:核心模块启动 init_server_components()

    mysqld_main() 函数中,init_server_components() 函数负责MySQL核心模块的启动,包括mdl系统,Innodb存储引擎的启动等等: 1. mdl子系统初始化. 2 ...

  7. flex布局 (转)

    网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...

  8. .NET 7 预览版2 中的 ASP.NET Core 更新

    .NET 7 预览版2 现已推出,其中包括对ASP.NET Core 的许多重大改进. 以下是此预览版中新增内容的摘要: 推断来自服务的API 控制器操作参数 SignalR 集线器方法的依赖注入 为 ...

  9. [DEBUG] QAT Nginx for docker 部署时"--with-ld-opt"出错

    layout: post title: [DEBUG] QAT Nginx for docker 部署时"--with-ld-opt"出错 subtitle: 记一次debug经历 ...

  10. 为什么Redis要比Memcached更火?

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 前言 我们都知道,Redis和Memcached都是内存数据库,它们的访问速度非常之快.但我们 ...