给小白的 PG 容器化部署教程(下)
作者:王志斌
编辑:钟华龙
本文来自社区小伙伴 王志斌 的投稿。从小白的角度,带你一步步实现将 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
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
准备本地存储
本次实验 RadonDB PostgreSQL 集群数据持久化采用 Local Persistent Volumes
,以下的步骤为配置集群所使用的本地持久化存储卷,配置一个一主一从的高可用集群,最低需要三个持久化存储卷:
- PostgreSQL Primary 数据卷
- PostgreSQL Replica 数据卷
- PostgreSQL 备份卷
实际使用可以根据具体的情况,灵活配置存储卷。
大体步骤:
- 虚拟机添加新硬盘(每台虚拟机分别添加一块)
- 重启虚拟机
- 查看现磁盘是否正常挂载
fdisk -l
可看到新加的虚拟硬盘,一般名为: Disk /dev/sdb
给新加的硬盘分区。
fdisk /dev/sdb
#按照提示增加新分区
/dev/sdb1 /dev/sdb2 /dev/sdb13
格式化磁盘分区。用 ext4 格式对 /dev/sdb1
进入格式化。
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
mkfs.ext4 /dev/sdb3
挂载分区,创建新的挂载点。
mkdir -p /data/pgdata/pv{1..3}
将新磁盘分区挂载到 /work
目录下。
mount -t ext4 /dev/sdb1 /data/pgdata/pv1
mount -t ext4 /dev/sdb3 /data/pgdata/pv2
mount -t ext4 /dev/sdb4 /data/pgdata/pv3
查看挂载
df -h
可以看到新加的硬盘: /dev/sdb1 /dev/sdb2 /dev/sdb3
实现开机自动挂载。
vim /etc/fstab
在最后一行加入:
/dev/sdb1 /data/pgdata/pv1 ext4 defaults 0 2
/dev/sdb2 /data/pgdata/pv2 ext4 defaults 0 2
/dev/sdb3 /data/pgdata/pv3 ext4 defaults 0 2
创建命名空间
kubectl create namespace pgo
部署 PostgreSQL Operator
kubectl apply -f https://github.com/radondb/radondb-postgresql-operator/blob/main/installers/kubectl/postgres-operator.yml -n pgo
# 查看状态
kubectl get all -n pgo --selector=name=postgres-operator
安装静态本地盘控制器
Kubernetes 当前支持静态分配的本地存储。可使用 local-static-provisioner[1] 项目中的 local-volume-provisioner
程序创建本地存储对象。
git clone https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner.git
cd sig-storage-local-static-provisioner
# 主要修改行号
vi helm/provisioner/values.yaml
66 classes:
67 - name: fast-disks
70 hostDir: /data/pgdata
76 volumeMode: Filesystem
81 fsType: ext4
116 image: quay.io/external_storage/local-volume-provisioner:v2.4.0
#
helm install localprovi . -n kube-system
# podpv
kubectl get po -n kube-system -l app.kubernetes.io/name=provisioner
部署数据库集群
启用 PGO 客户端,创建数据库集群。
kubectl exec -it -n pgo $(kubectl get po -n pgo -l name=pgo-client -o jsonpath='{range .items[*]}{.metadata.name}{end}') -- bash
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,则集群创建完成。
kubectl get po -n pgo --watch
检查 local pv 是否正常绑定
kubectl get pv -n pgo |grep ^local
二、连接 RadonDB PostgreSQL 集群
通过执行 pgo 命令连接,获取集群中用户账号信息。
pgo show user -n pgo radondb
以下以 RadonDB PostgreSQL 集群为示例,获取数据库账号并连接数据库。
pgo show user -n pgo radondb --show-system-accounts
CLUSTER USERNAME PASSWORD EXPIRES STATUS ERROR
--------- -------------- ------------------------ ------- ------ -----
radondb ccp_monitoring Dwpa|MCg,b4M+rY.>ZC0ONz4 never ok
radondb postgres 1a4R-d7Po=,PS@R:-=?[gP(9 never ok
radondb primaryuser =B8x*Haf*dCq+V4hkGSfh/.} never ok
radondb testuser yTFeeH1|^DX<Bx4[?:B_/Q;M never ok
此外,还可以通过 psql 工具连接。
查看服务:
kubectl -n pgo get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
postgres-operator ClusterIP 10.96.64.37 <none> 8443/TCP,4171/TCP,4150/TCP 58m
radondb ClusterIP 10.96.171.227 <none> 10000/TCP,9187/TCP,2022/TCP,5432/TCP 5m42s
radondb-backrest-shared-repo ClusterIP 10.96.235.247 <none> 2022/TCP 5m42s
radondb-pgbouncer ClusterIP 10.96.234.49 <none> 5432/TCP 4m16s
radondb-replica ClusterIP 10.96.67.45 <none> 10000/TCP,9187/TCP,2022/TCP,5432/TCP 3m50s
以 testuser 账号为示例,连接到数据库。
kubectl -n pgo port-forward svc/radondb 5432:5432
PGPASSWORD='xxxxxxxxxxxxxxxxxxxxxxxx' psql -h localhost -p 5432 -U testuser radondb
查看集群
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 容器化部署教程(下)的更多相关文章
- 给小白的 PostgreSQL 容器化部署教程(上)
作者:王志斌 编辑:钟华龙 本文来自社区小伙伴 王志斌 的投稿.从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上.文章分为上下两部分,第一部分 ...
- .NET Core+MySql+Nginx 容器化部署
.NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...
- Gogs的Docker容器化部署流程遇到的问题
Gogs的Docker容器化部署流程遇到的问题 最近在学习CI/CD的一些方案,个人比较青睐容器化轻量级.CI方面一开始是想使用gitlab的,但是发现我自己买的服务器配置太低,内存根本不够(大写 ...
- 浅谈surging服务引擎中的rabbitmq组件和容器化部署
1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...
- 谈谈surging引擎的tcp、http、ws协议和如何容器化部署
1.前言 分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿.从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果.esb,网关, ...
- 1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))
容器化部署一套云服务系列 1. 容器化部署一套云服务之Jenkins 一.购买服务器 服务器
- angular应用容器化部署
angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...
- Flask容器化部署原理与实现
本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Fla ...
- Ubuntu系统下容器化部署gitlab
容器化部署gitlab 获取镜像文件 1. 下载镜像文件 docker pull beginor/gitlab-ce:-ce. 2. 创建GitLab 的配置 (etc) . 日志 (log) .数据 ...
随机推荐
- 将word文件转为excel文件
有些word文件里的数据是有顺序或者规律,想转成表格的形式,下面就以我要转的word为例. 我的word文件是这样的 1.word转txt(文本文件) 文件--->另存为--->路径--- ...
- CTFHUB之gopher协议实现SSRF
介绍 解题思路: 利用302协议(重定向)的跳转ssrf.可以访问与服务器相连的内网 ①什么是gopher协议 Gopher是Internet上一个信息查找系统,它将Internet上的文件组织成某种 ...
- VUE3 之 全局 Mixin 与 自定义属性合并策略 - 这个系列的教程通俗易懂,适合新手
1. 概述 老话说的好:心态决定命运,好心态才能有好的命运. 言归正传,今天我们来聊聊 VUE 中的全局 Mixin 与 自定义属性合并策略. 2. Mixin 的使用 2.1 全局 Mixin 之前 ...
- Java设计模式——抽象工厂模式
抽象工厂模式也是创建模式,可以把它理解成创建工厂的工厂,这种模式也是我们经常使用的.在抽象工厂中的接口是用来创建工厂的,每个生成的工厂又都可以按照工厂模式创建其他对象. 举例说明: 创建Shape接口 ...
- TCP/IP 协议标准简单描述
TCP/IP 协议标准简单描述 说明 分为三部分:中文名称.缩写.说明. 应用层 DNS 域名服务 (DNS) 功能: 将域名转化为IP地址 BOOTP 引导程序协议 (BOOTP) 功能: 允许无盘 ...
- Solon 1.6.36 发布,更现代感的应用开发框架
相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...
- python中一些元组知识
元组 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号 ( ),列表使用方括号 [ ]. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 实例(Pytho ...
- mmdetection训练出现nan
训练出现nan 在使用MMDetection训练模型时,发现打印信息中出现了很多nan.现象是,loss在正常训练下降的过程中,突然变为nan. 梯度裁减 在模型配置中加上grad_clip: opt ...
- Go语言实践模式 - 函数选项模式(Functional Options Pattern)
什么是函数选项模式 大家好,我是小白,有点黑的那个白. 最近遇到一个问题,因为业务需求,需要对接三方平台. 而三方平台提供的一些HTTP(S)接口都有统一的密钥生成规则要求. 为此我们封装了一个独立的 ...
- 『现学现忘』Git基础 — 18、Git对象的总结
目录 1.Git操作最基本的流程 2.工作目录中文件的状态 3.Git效率说明 提示:前面三篇文章已经分别的对blob对象.tree对象.commit对象进行了详细的说明,这篇文章我们总结一下,Git ...