如何在Kubernetes中部署一个高可用的PostgreSQL集群环境

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 本文讲的是如何在Kubernetes中部署一个高可用的PostgreSQL集群环境【编者的话】本文主要介绍了如何在Kubernetes环境中用Stolon去部署高可用的PostgreSQL,本文从Stolon的结构组成开始,由浅入深介绍原理,从开始安装到最后对其进行failover测试,深入浅出,为以后部署高可用的PostgreSQL提供了一种的解决方案。
本文讲的是如何在Kubernetes中部署一个高可用的PostgreSQL集群环境【编者的话】本文主要介绍了如何在Kubernetes环境中用Stolon去部署高可用的PostgreSQL,本文从Stolon的结构组成开始,由浅入深介绍原理,从开始安装到最后对其进行failover测试,深入浅出,为以后部署高可用的PostgreSQL提供了一种的解决方案。
1.png

创建一个高可用的PostgreSQL集群环境总是一件棘手的事情。在云环境里部署时更是非常困难。我至少找到了3个项目,它们可以在Kubernetes里提供高可用的PostgreSQL解决方案。

Patroni

Patroni是一个模板,它使用Python为你提供一个自己订制的,高可用的解决方案,为最大程度的可用性,它的配置信息存储在像ZooKeeper, etcd或者Consul中。如果DBAs,DevOps工程师或者SRE正在寻找一个在数据中心中快速部署高可用PostgreSQL方案,或者其他的用途,我希望Patroni能够帮到他们。

Crunchy

Crunchy容器套件提供一个了Docker容器,它能快速部署PostgreSQL,同时也提供管理和监控的工具。并且支持多种用风格的部署PostgreSQL集群。

Stolon

Stolon是一个cloud native的PostgreSQL高可用管理工具。它之所以是cloud native的是因为它可以在为容器内部的PostgreSQL提供高可用(Kubernetes 集成),而且还支持其他种类的基础设施(比如:cloud IaaS,旧风格的基础设施等)

漂亮的图表 加上一些在kubernets.io上的用户分享 1 2 说服我去试一下crunchy容器。但是过了一段时间,我改变了想法。

我不想说他设计上的某些缺点或者是其他的什么不好。但是它给我的感觉就好像是我自己在容器里手动安装PostgreSQL一样,并没有云的感觉。

所以我尝试了一下stolon。在一次又一次的安装和卸载之后,我运行了它的statefulset的 例子 并且用 helm chart 创建。

如果你想知道更多关于stolon可以参考作者 这篇介绍

下面我将展示一下安装过程并且演示一下集群环境下的failover。我们假设安装用的是helm chart。

Stolon 架构图

摘抄自 Stolon的介绍
0-tDzE_Y0wg-xPKRfk.png

Stolon 是由3个部分组成的:
  • keeper:他负责管理PostgreSQL的实例汇聚到由sentinel(s)提供的clusterview。
  • sentinel:it负责发现并且监控keeper,并且计算最理想的clusterview。
  • proxy:客户端的接入点。它强制连接到右边PostgreSQL的master并且强制关闭连接到由非选举产生的master。

Stolon 用etcd或者Consul作为主要的集群状态存储。

Installation

$ git clone https://github.com/lwolf/stolon-chart
$ cd stolon-chart
$ helm install ./stolon

You can also install directly from my repository

helm repo add lwolf-charts http://charts.lwolf.org helm install lwolf-charts/stolon
安装的过程将会做如下的动作:

首先,会用statefulset创建3个etcd节点。Stolon-proxy和stolon-sentinel也会被部署。Singe time job将集群的安装暂停直到etcd节点状态变成availabe。

chart还会创建两个服务:
  • stolon-proxy——服务来源于官方的例子。他总是指向当前的因该被写入的master。
  • stolon-keeper——Stolon自己本身不提供任何读取操作的负载均衡。但是Kubernetes的service却可以做到这点。所以对于用户来说,stolon-keeper的读操作是在pod的层面做到负载均衡的。

当所有的组件状态变为RUNNING时,我们可以试着连接它们。

我们可以用NodePort这种简单的连接方式部署service。用两个终端分别去连接master service和slave service。在post的过程中,我们假设stolon-proxy服务(RW)已经暴露了30543端口,stolon-keeper服务(RO)已经暴露了30544端口。

连接master并且建立test表
psql --host <IP> --port 30543 postgres -U stolon -W
postgres=# create table test (id int primary key not null,
value text not null);
CREATE TABLE
postgres=# insert into test values (1, 'value1');
INSERT 0 1
postgres=# select * from test;
id | value
---- --------
1 | value1
(1 row) 

连接slave并且检查数据。你可以写一些信息以便确认请求已经被slave处理了。
psql --host <IP> --port 30544 postgres -U stolon -W
postgres=# select * from test;
id | value
---- --------
1 | value1
(1 row) 

在测试通过后,我们去试试failover功能。

测试failover

这个案例是官方代码库中statefullset的一个 例子 。简单的说,就是为模拟了master挂掉,我们先删除了master的statefulset又删除了master的pod。
kubectl delete statefulset stolon-keeper --cascade=false
kubectl delete pod stolon-keeper-0

然后,在sentinel的log中我们可以看到新的master被选举出来了。
no keeper info available db=cb96f42d keeper=keeper0
no keeper info available db=cb96f42d keeper=keeper0
master db is failed db=cb96f42d keeper=keeper0
trying to find a standby to replace failed master
electing db as the new master db=087ce88a keeper=keeper1 

现在,在刚才的那两个终端中如果我们重复上一个命令,我们可以看到如下输出。
postgres=# select * from test;
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset:
Succeeded.
postgres=# select * from test;
id | value
---- --------
1 | value1
(1 row)

Kubernetes的service把不可用的pod去掉,把请求转到可用的pod上。所以新的读取连接被路由到了健康的pod上。

最后,我们需要重新创建statefulset。最简单的方法就是更新部署了的helm chart。
helm ls
NAME               REVISION   UPDATED                    STATUS     CHART              NAMESPACE
factual-crocodile  1          Sat Feb 18 15:42:50 2017   DEPLOYED   stolon-0.1.0       default
helm upgrade factual-crocodile .

2.用chaoskube模拟随机的pod挂掉

另一个测试集群弹性(resilience)的好方法是用 chaoskube 。Chaoskube是一个小的服务程序,它可以周期性的在集群里随机的kill掉一些的pod。它也可以用helm charts部署。
helm install --set labels="release=factualcrocodile,
component!=factual-crocodine-etcd" --set
interval=5m stable/chaoskube

这条命令会运行chaoskube,它会每5分钟删除一个pod。它会选择label中 release=factual-crocodile 的pod,但是会忽略etcd的pod。

在做了几个小时的测试之后,我的集群环境仍然是一致并且工作的很稳定。

结论

我仍然在我的开发服务器上运行stolon。到目前为止我还是满意的。他真的很想一个本地的运环境。有很好的弹性和自动化的failover能力。

如果你对它感兴趣-可以查看我的 官方repository 或者和我的 chart

原文链接:How to deploy HA PostgreSQL cluster on Kubernetes(翻译:王晓轩)

原文发布时间为:2017-03-09

本文作者:王晓轩

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:如何在Kubernetes中部署一个高可用的PostgreSQL集群环境

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
27天前
|
JSON Kubernetes Linux
Linux环境签发CA证书和K8s需要的证书
Linux环境签发CA证书和K8s需要的证书
29 0
|
27天前
|
Kubernetes 网络协议 应用服务中间件
K8S二进制部署实践-1.15.5
K8S二进制部署实践-1.15.5
34 0
|
16天前
|
Docker 容器 关系型数据库
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
本期课程将于4月11日19:00开始直播,内容包括源码编译基础知识和实践操作,课程目标是使学员掌握源码编译部署技能,为未来发展奠定基础,期待大家在课程中取得丰富的学习成果!
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
|
29天前
|
Kubernetes 流计算 Perl
在Rancher K8s上部署Flink时,TaskManager连接不上并不断重启可能是由多种原因导致的
在Rancher K8s上部署Flink时,TaskManager连接不上并不断重启可能是由多种原因导致的
34 7
|
11天前
|
Kubernetes 搜索推荐 Docker
使用 kubeadm 部署 Kubernetes 集群(二)k8s环境安装
使用 kubeadm 部署 Kubernetes 集群(二)k8s环境安装
53 17
|
24天前
|
Kubernetes Ubuntu 应用服务中间件
Ubuntu 22.04 利用kubeadm方式部署Kubernetes(v1.28.2版本)
Ubuntu 22.04 利用kubeadm方式部署Kubernetes(v1.28.2版本)
98 0
|
27天前
|
人工智能 监控 Serverless
如何基于ACK Serverless快速部署AI推理服务
通过上述步骤,可以在ACK Serverless上快速部署AI推理服务,实现高可用、弹性扩展的服务架构。
20 1
|
1月前
|
Kubernetes Java Nacos
nacos常见问题之k8s上部署需要自动扩缩容如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
33 0
|
1月前
|
SQL 关系型数据库 分布式数据库
PolarDB常见问题之PolarDB-X部署三台失败如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
1月前
|
存储 Kubernetes 分布式数据库
利用Helm在K8S上部署 PolarDB-X 集群(详细步骤--亲测!!!)
利用Helm在K8S上部署 PolarDB-X 集群(详细步骤--亲测!!!)
89 0