helm安装postgres_如何在Kubernetes中部署一个高可用的PostgreSQL集群环境-程序员宅基地

技术标签: helm安装postgres  

【编者的话】本文主要介绍了如何在Kubernetes环境中用Stolon去部署高可用的PostgreSQL,本文从Stolon的结构组成开始,由浅入深介绍原理,从开始安装到最后对其进行failover测试,深入浅出,为以后部署高可用的PostgreSQL提供了一种的解决方案。

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

Crunchy

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

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

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

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

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

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

Stolon 架构图摘抄自Stolon的介绍。

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 repositoryhelm 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  --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  --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。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_31579367/article/details/111973718

智能推荐

linux系统中的定时器crontab的使用攻略、常见错误问题和运行.jar文件的具体实例。-程序员宅基地

文章浏览阅读1.5k次。linux系统中的定时器crontab的使用攻略和利用crontab运行.jar文件的具体实例以及本人遇到问题得一些解决方案和小常识。

数据通信系统组成_数据通信系统的组成部分有哪些-程序员宅基地

文章浏览阅读4.2k次。数据通信系统组成一个完整的数据通信系统应该由报文、发送方、接收方、介质和协议五个部分组成。报文(message)报文是指通讯中的数据块。文本、数字、图片、声音、视频等信息被编码后,以报文的形式被传送。发送方(sender)发送方是指发送数据报文的设备。它可以是计算机、工作站、服务器、手机等。接收方(receiver)接受方是指接收报文的设备。它可以是计算机、工作站、服务器、手机、电视等。介质(medium)传输介质:是指信号传送的载体。局域网中常见的传输介质有光纤、同轴电缆、双._数据通信系统的组成部分有哪些

【航空发动机制造装配】商发制造:商用航空发动机总装智能制造集成创新与应用-程序员宅基地

文章浏览阅读1.3k次。参考:http://www.ctoutiao.com/1037644.html工信部公布2018年智能制造试点示范项目名单,中国航发上海商用航空发动机制造有限责任公司(简称“商发制造”)的商用航空发动机智能装配试点示范位列其中,这无疑肯定了商发制造在智能制造的探索与实践。面对全球范围内新一轮的科技与产业变革,商发制造深刻认识到智能制造将是公司落实创新驱动发展、实现研制模式转型升级以尽快赶超世界...

c语言上机作业数组,2015二级c语言上机题库-程序员宅基地

文章浏览阅读93次。2015二级c语言上机题库22.A。【解析】在程序语句中,k的初始值为5,进行第l次while循环后,k自减l为4,非0,执行循环体里的printf语句,输出k,此时k的值变为l。程序执行第2次循环时,k自减l变为0,为假,退出while循环语句。所以程序的最后结果为l。23.A。【解析】通过地址来引用数组元素的方法有下列5种:(1)a[i][j];(2)*(a[i]+j);(3)*(*(a+j)..._用指针实现,将字符串a中所有下标为奇数(下标从0开始计算)的元素赋给字符串b,

PHP数据类型:一切合法操作的基础(总结)_php哪种数据类型可以不赋值就使用-程序员宅基地

文章浏览阅读147次。1、支持八种原始的数据类型:类型转换的基本方式:gettype()获取数据类型,var_dump打印类型并打印出值字符串布尔:true 和false实际工作中不应该直接将boolean值直接进行判断,而是要用布尔类型的变量。哪些值可以转化为布尔类型的值:空数据和单字符0可转为false,其他不可以。非空非零可以转为true。整型int无论什么进制的数据,最后都是以十进制显示的..._php哪种数据类型可以不赋值就使用

jq中的$("#id")与js中的document.getElementById("id")的区别_jq $('#id'))是数组还是-程序员宅基地

文章浏览阅读1.5k次。以前一直认为jq的(“#id”)与js中的document.getElementById(“id”)是等价的,然后前面刚好写了一个图片轮播的效果,里面js里 刚开始是直接用id名来表示的,但这样的缺点是,直接用id名 定义的是一个全局变量了,如果在大项目中会污染全局变量,所以我打算定义个局部变量来代替 刚开始是直接写了 var demo=(“#id”)与js中的document.getEle_jq $('#id'))是数组还是

随便推点

iOS造轮子-数字金额每隔3位用逗号隔开(Swift实现)_数字金额也么用隔点-程序员宅基地

文章浏览阅读1.5k次。概要背景概述Swift 代码实现图示代码执行原理算法复杂度分析背景概述金融类App不可避免的需要展示金额信息,如¥12345678元,但当金额数值较大时,将一整串的金额显示在用户面前显然不够友好,所以业内通用做法是每隔3位添加一逗号,即显示成¥12,45,678元,极大地提升了用户体验。Swift 代码实现/** * 将字符串每隔数位用分割符隔开 * * @param sourc..._数字金额也么用隔点

JDBC连接Oracle RAC的连接串配置_oracle rac jdbc连接串-程序员宅基地

文章浏览阅读7.9k次。jdbc连接oracle的连接串如下:String url="jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))(LOAD_BALANCE = yes)(FAILOVER = ON)(CONNECT_DATA =(SERVER = DEDICATED)(SERVIC_oracle rac jdbc连接串

asp毕业设计——基于asp+sqlserver的选题管理系统设计与实现(毕业论文+程序源码)——选题管理系统_毕业论文源码-程序员宅基地

文章浏览阅读1.2k次。本文介绍了ASP+SQL技术开发该系统的子系统的整个过程。该系统主要利用了ASP强大的网络数据库访问技术,实现了毕业设计的网上完成。系统设计并实现了学生题目查询和搜索,题目选择修改删除,老师毕设题目的申报修改,管理员队整个过程的全程监控等等功能。这些功能使得网上毕业设计选题系统简单实用。从而加强毕业设计的管理,提高教师的工作效率,降低教师的工作量。提示以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。第1章引言1.1编写目的省略图3-2业务流程示意图。..._毕业论文源码

重装操作系统的20条原则-程序员宅基地

文章浏览阅读1k次。重装操作系统的20条原则 系统是否需重装,三条法则帮你忙: 如果系统出现以下三种情况之一,应该是你考虑重装系统的时候了: 1)系统运行效率变得低下,垃圾文件充斥硬盘且散乱分布又不便于集中清理和自动清理; 2)系统频繁出错,而故障又不便于准确定位和轻易解决; 3)系统不能启动。 重新安装系统前,最好先列备份单 在因系统崩溃或出现故障而准备重装系统前,首先应该想到的是备份好自己的数据。这时,一定要静下

Android卸载程序之后跳转到指定的反馈页面-程序员宅基地

文章浏览阅读1.3k次。思路:1、注册BroadcastReceiver,监听"android.intent.action.PACKAGE_REMOVED"系统广播结果:NO。未写代码,直接分析,卸载的第一步就是退出当前应用的主进程,而此广播是在已经卸载完成后才发出的,此时主进程都没有了,去哪onReceive()呢?2、若能收到"将要卸载XX包"的系统广播,在主进程被退出之前就抢先进行反馈处理就好了,可

网络对抗技术实验二-程序员宅基地

文章浏览阅读327次。中国人民公安大学Chinese people’public security university网络对抗技术实验报告实验二网络嗅探与欺骗学生姓名李御瑾年级2015级区队..._cainzwb软件下载