目录
6.1连接到PostgreSQL集群---通过 pgsql client 连接
6.2 连接到PostgreSQL集群---通过pgAdmin 4连接
将 PostgreSQL 和 Kubernetes 结合使用的第一步是安装一个 Operator
1.PostgreSQL集群化部署方案
2.部署方案选择-Crunchy
功能相当完备并且集成了PostgreSQL周边生态相关的应用。该Operator实现了在Kubernetes上自动化部署PostgreSQL集群,简化了PostgreSQL服务的部署,并通过Kubernetes平台保持PostgreSQL集群的运行状态,轻松创建、扩展和删除PostgreSQL集群,同时完全自定义Pod和PostgreSQL配置。支持高可用,灾难恢复,TLS,监控,用户管理,克隆集群,可定制等。
PostgreSQL Operator在指定的namespace中以Deployment对象运行,并且最多由四个容器的Pod组成。
3.部署 Postgres Operator
3.1 启动pgo-deployer容器
下载配置文件,更新镜像地址为当前的harbor地址。
[root@k8s-dev-m1 postgreSQL]# kubectl create namespace pgo
[root@k8s-dev-m1 postgreSQL]# kubectl apply -f postgres-operator.yml
3.2 安装 PGO Client
下载PGO Client 设置脚本: https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.7.0/installers/kubectl/client-setup.sh
修改脚本内容,因为是离线下载,将配置文件的二进制包下载到本地,https://github.com/CrunchyData/postgres-operator/releases/download/v4.7.0/pgo
修改sh文件:
PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}"
PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}"
PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.7.0}"
#将二进制包放到本地路径
PGO_CLIENT_URL="~/postgreSQL"
PGO_CMD="${PGO_CMD-kubectl}"
......
echo "Operating System found is ${UNAME_RESULT}..."
echo "Downloading ${BIN_NAME} version: ${PGO_CLIENT_VERSION}..."
#将下载路径改为本地路径
#curl -Lo "${OUTPUT_DIR}/pgo" "${PGO_CLIENT_URL}/${BIN_NAME}"
mv "${PGO_CLIENT_URL}/${BIN_NAME}" "${OUTPUT_DIR}/pgo"
chmod +x "${OUTPUT_DIR}/pgo"
[root@k8s-dev-m1 postgreSQL]# chmod +x client-setup.sh
Postgres Operator 安装完成后,运行客户端安装脚本:
修改环境变量:
[root@k8s-dev-m1 postgreSQL]# cat <<EOF >> ~/.bashrc
export PGOUSER=/root/.pgo/pgo/pgouser
export PGO_CA_CERT=/root/.pgo/pgo/client.crt
export PGO_CLIENT_CERT=/root/.pgo/pgo/client.crt
export PGO_CLIENT_KEY=/root/.pgo/pgo/client.key
export PGO_APISERVER_URL='https://127.0.0.1:8082'
export PGO_NAMESPACE=pgo
EOF
[root@k8s-dev-m1 postgreSQL]# source ~/.bashrc
4.部署验证
默认情况下,PGO安装到名为PGO的namespace中。查看PGO的Kubernetes部署是否存在并且运行正常
[root@k8s-dev-m1 postgreSQL]# kubectl -n pgo get deployments
[root@k8s-dev-m1 postgreSQL]# kubectl -n pgo get pods
设置端口转发,使用kubectl端口转发方式访问集群中的应用:
[root@k8s-dev-m1 postgreSQL]# kubectl -n pgo port-forward svc/postgres-operator 8082:8443
5.创建PostgreSQL单点集群
5.1 创建PostgreSQL集群
创建一个名名为mycluster的PostgreSQL集群:
[root@k8s-dev-m1 postgreSQL]# pgo create cluster -n pgo mycluster --password=password123
5.2 查看该集群的状态
使用pgo test命令查看该集群的状态,使用pgo show cluster -n pgo mycluster
查看详细信息。
[root@k8s-dev-m1 postgreSQL]# pgo test -n pgo mycluster
5.3 创建一个带有监控的PostgreSQL集群
[root@k8s-dev-m1 postgreSQL]# pgo create cluster hippo --metrics
6.连接集群
一旦创建了PostgreSQL集群,可以使用pgo show user命令获取集群用户的凭据。
[root@k8s-dev-m1 postgreSQL]# pgo show user mycluster
获取一个系统或特定帐户信息:
[root@k8s-dev-m1 postgreSQL]# pgo show user mycluster --show-system-accounts
6.1连接到PostgreSQL集群---通过 pgsql client 连接
需要安装psql client。
[root@k8s-dev-m1 postgreSQL]# kubectl -n pgo port-forward svc/mycluster 5432:5432
[root@k8s-dev-m1 postgreSQL]# PGPASSWORD=datalake psql -h localhost -p 5432 -U testuser mycluster
6.2 连接到PostgreSQL集群---通过pgAdmin 4连接
pgAdmin 4是一个图形化工具,可以从web浏览器中管理和查询PostgreSQL数据库。PostgreSQL Operator 与pgAdmin 4提供了一个方便的集成,用于管理用户如何登录数据库。
[root@k8s-dev-m1 postgreSQL]# pgo create pgadmin -n pgo mycluster
查看svc列表:
使用以下命令连接到数据库,用datalake替换您的实际密码:
[root@k8s-dev-m1 postgreSQL]# kubectl -n pgo port-forward --adress 0.0.0.0 svc/mycluster-pgadmin 5050:5050
浏览器打开http://localhost:5050,并使用数据库用户名(testuser)和密码登录。如果登录有问题,请尝试运行命令pgo update user -n pgo mycluster——username=testuser——password=密码
。
7.搭建高可用 PostgreSQL 集群
高可用性在PostgreSQL操作符中默认是启用的,要创建一个具有3个副本的高可用性PostgreSQL集群,可以运行以下命令。也可以使用pgo scale和pgo scaledown命令放大或缩小PostgreSQL集群。
7.1 搭建 PostgreSQL 集群
[root@k8s-dev-m1 postgreSQL]# pgo create cluster mycluster --replica-count=3
查看集群实例:
[root@k8s-dev-m1 postgreSQL]# pgo scaledown mycluster --query
扩展PostgreSQL集群 :
[root@k8s-dev-m1 postgreSQL]# pgo scale mycluster
缩小PostgreSQL集群 :
[root@k8s-dev-m1 postgreSQL]# pgo scaledown hippo --target=mycluster-zwjr
7.2 故障转移策略
每个PostgreSQL集群将管理自己的可用性。如果需要手动进行故障转移,则需要使用pgo故障转移命令。
-
PostgreSQL Operator为故障转移选择最佳副本候选
[root@k8s-dev-m1 postgreSQL]# pgo failover mycluster
-
自定义副本候选进行故障转移。
[root@k8s-dev-m1 postgreSQL]# pgo failover mycluster --target==mycluster-zwjr
8.故障恢复
PostgreSQL Operator使用开源的pgBackRest备份和恢复工具来管理备份和PostgreSQL。当创建一个新的PostgreSQL集群时,会同时创建一个pgBackRest存储库。
-
Full:备份整个数据库。
-
Differential:创建自上次执行完整备份以来的所有数据的备份。
-
Incremental:备份自上次执行完整备份以来的所有数据,无论是完全备份、差异备份还是增量备份。
8.1 创建备份
#默认创建一个增量式pgBackRest备份,当集群初始配置时,PostgreSQL操作符首先创建一个pgBackRest完全备份,而pgBackRest将对后续的每个备份进行增量备份,直到指定了不同的备份类型。
[root@k8s-dev-m1 postgreSQL]# pgo backup mycluster
#创建全备份
[root@k8s-dev-m1 postgreSQL]# pgo backup mycluster --backup-opts="--type=full"
#创建差异备份
[root@k8s-dev-m1 postgreSQL]# pgo backup mycluster --backup-opts="--type=diff"
#创建增量备份
[root@k8s-dev-m1 postgreSQL]# pgo backup mycluster --backup-opts="--type=incr"
#查看PGBackRest存储库中的所有可用备份
[root@k8s-dev-m1 postgreSQL]# pgo show backup mycluster
8.2 故障恢复
PostgreSQL操作符支持在PostgreSQL集群上执行完整恢复(即克隆或复制)以及时间点恢复的能力。有两种恢复集群的方法。
-
pgo create cluster
命令中的--Restore -from
标志恢复到新集群。实际是一个克隆或复制。 -
使用pgo直接还原。
只要有一个可用的pgBackRest存储库,就可以恢复到一个新的集群技术:pgBackRest存储库不需要附加到一个活动集群。
# 删除名为 mycluster 的集群
[root@k8s-dev-m1 postgreSQL]# pgo delete cluster mycluster --keep-backupss
# 从备份中创建一个新的集群
[root@k8s-dev-m1 postgreSQL]# pgo create cluster datalake --restore-from=mycluster
现有数据目录上执行恢复。 这是使用pgo restore命令完成的。 最常见的方案是将数据库恢复到特定时间点。
#将集群恢复到2021年7月21日晚上11:59
[root@k8s-dev-m1 postgreSQL]# pgo restore hippo --pitr-target="2021-07-21 11:59:59.999999+00" --backup-opts="--type=time"
9.删除集群
删除指定集群:
[root@k8s-dev-m1 postgreSQL]# pgo delete cluster hippo
10.同步复制
进入 PostgreSQL 主实例创建一个表,并插入数据。
[root@k8s-dev-m1 postgreSQL]# kubectl get po -n pgo -lcrunchy-pgha-scope=mycluster
[root@k8s-dev-m1 postgreSQL]# kubectl -n pgo exec -it hippo-749d494c4c-52cf6 -- psql