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

智能推荐

acme.sh dns alias mode and acme-dns_陈振阳的博客-程序员秘密

注册curl -X POST https://auth.acme-dns.io/register设置环境变量export ACMEDNS_UPDATE_URL="https://auth.acme-dns.io/update"export ACMEDNS_USERNAME="f5568755-709e-48db-bd2d-e1057e4e9b61"export ACMEDNS_...

springboot整合oauth2_oauth2 springboot_SingleOneMan的博客-程序员秘密

springboot整合oauth2.0文章目录springboot整合oauth2.01.概念2.springboot整合oauth2.0示例2.1SecurityConfig配置2.2资源服务器配置和授权服务器配置3.测试环境springboot1.5.xdemo下载:1.概念客户应用: 通常是一个web或者手机,他需要访问用户的受保护资源资源服务器::是一个web站点或者w...

程序员面试金典 10.9_RayoNicks的博客-程序员秘密

Sorted Matrix Search:在行列都排好序的矩阵中查找根据行列排序的性质,如果target比当前元素大,那么应该向右下查找,否者应该向左上查找,所以可以从右上角和左下角的元素开始进行查找,如果从别的元素开始,则无法准确判断下一个需要比较的元素。class Solution {public: bool searchMatrix(vector<vector<in...

Ubuntu与致远ARM交叉编译Qt环境_qt配置arm交叉编译环境_Leroy_baby的博客-程序员秘密

ARM板现有环境配置(主要是对/etc/profile/编辑)较简单,参考上一篇博客,板子上已经部署了Qt5.15。本文主要介绍使用第三方ToolChain编译Qt源码并使用aarch64-linux-gnu-gcc编译器的过程。实际第三方ToolChian可能未使用。

SpringBoot中添加拦截器,在拦截器中注入其他类的时候出现空指针异常解决办法_wszhlzjl的博客-程序员秘密

首先看拦截器代码 @Component public class Intercepter extends HandlerInterceptorAdapter{ @Autowired public ActionRolesReader actionRolesReader; @Override public void post...

keras基础--5.Dropout_zeronose的博客-程序员秘密

import numpy as npfrom keras.datasets import mnistfrom keras.utils import np_utilsfrom keras.models import Sequentialfrom keras.layers import Dense,Dropoutfrom keras.optimizers import SGD# 载入数据(x_train,y_train),(x_test,y_test) = mnist.load_data()#

随便推点

怎样在局域网内远程控制自己的电脑_局域网内远程控制电脑_hsvenus的博客-程序员秘密

怎样远程控制自己的电脑我是学计算机软件专业的,经常上机房课但是机房的电脑相信用过的都懂,为了方便用自己的电脑,所以利用学校的局域网进行远程桌面控制,下面讲解一下我的小经验选中此电脑右键找到属性添加箭头所指的Administrator(它有最高权限方便以后远程操作)点击确定后找到电脑的“计算机管理”(在电脑桌面左下角输入框里可以直接搜)如果没有启动点击启动就行了在另一个计算...

上海交通大学计算机系过敏意,上海交通大学-电子信息与电气工程学院-电子信息与电气工程学院..._最爱墨色的博客-程序员秘密

2011年7月15-17日,由中国密码学会密码算法专业委员会与密码芯片专业委员会联合主办、上海交通大学计算机系承办、上海市计算机学会信息安全专业委员会协办的2011年密码算法与密码芯片学术会议在上海交通大学成功召开。上海市委办公厅副主任、上海市密码管理局郭坚局长,中国密码学会强志军秘书长,上海交通大学电子信息与电气工程学院常务副院长毛军发教授,计算机系主任过敏意教授等领导;美国 NIST的Lily...

C、C++语言的文件操作_zgmsh007的博客-程序员秘密

今天归纳总结一下文件操作函数及各个参数的含义:先介绍一下c++的文件操作,为什么说c++的文件操作呢,因为对于c语言的操作,也有它的函数之不过大同小异罢了。   在c++的文件操作中有,有一个类对文件操作进行操作,即CFile,下面就写一段代码,来简单的进行介绍。 CFile cf; char zhi[]={1,2}; char* Name = "zgm.data"; if(!cf.O

python改变numpy数据类型_numpy数据类型dtype转换_weixin_39894473的博客-程序员秘密

这篇文章我们玩玩numpy的数值数据类型转换导入numpy>>> import numpy as np一、随便玩玩生成一个浮点数组>>> a = np.random.random(4)看看信息>>>aarray([0.0945377 , 0.52199916, 0.62490646, 0.21260126])>>>a.dtypedtype('float64')>>>a.shape(4,)改变...

webapp,ios Safari打开新窗口_z-pan的博客-程序员秘密

<script type="text/javascript">//iOS Web APP中点击链接跳转到Safari 浏览器新标签页的问题 devework.com//stanislav.it/how-to-prevent-ios-standalone-mode-web-apps-from-opening-links-in-safariif(("standalone" ...

与其两败俱伤,不如握手言和------苹果三星专利战的启示_专利战两败俱伤_feitianhanxue的博客-程序员秘密

与其两败俱伤,不如握手言和------苹果三星专利战的启示    近年来,科技行业频频爆出“专利战”,众所周知,专利战是知识产权之争的最高形式,相比其他传统行业,通信、IT、互联网等对科技创新依赖更强的行业更容易爆发专利战,不过,随着专利战的泛滥,我们似乎也注意到,专利战早已突破了知识产权的范畴,演变成了激烈竞争之下的一种不理性的商业现象。    几个月前,三星与苹

推荐文章

热门文章

相关标签