K8s 安装 pg集群服务器

主要的目的是做到自动灾备切换,利用kubernetes 集群做到高可用的数据库服务。
三个节点, 2节点部署 proxy,sentinel,3节点keeper (DB)

本文选着stolon,

详细解决方案,原理请看:项目地址 https://github.com/sorintlab/stolon

总体架构架构

下面是步骤

1. 创建临时目录下载项目

mkdir stolon
git clone https://github.com/sorintlab/stolon.git

或者自己手工下载zip包,解压到stolon目录

进入/examples/kubernetes

这里保存k8s的脚本

  kubernetes git:(master) ✗ ll
total 104
-rw-r--r--  1 moqiyi  staff   8.4K Apr 18 20:58 README.md
drwxr-xr-x  3 moqiyi  staff    96B Apr 18 21:41 image
-rw-r--r--  1 moqiyi  staff   3.7K Apr 18 20:58 postgresql_upgrade.md
-rw-r--r--  1 moqiyi  staff   255B Apr 18 20:58 role-binding.yaml
-rw-r--r--  1 moqiyi  staff   571B Apr 18 20:58 role.yaml
-rw-r--r--  1 moqiyi  staff   136B Apr 18 21:51 secret.yaml
-rw-r--r--  1 moqiyi  staff   3.2K Apr 18 22:05 stolon-keeper.yaml
-rw-r--r--  1 moqiyi  staff   234B Apr 18 23:34 stolon-proxy-service.yaml
-rw-r--r--  1 moqiyi  staff   1.5K Apr 18 21:56 stolon-proxy.yaml
-rw-r--r--  1 moqiyi  staff   1.3K Apr 18 20:58 stolon-sentinel.yaml

一共有7个yaml文件

2. 创建pv数据盘(nfs)

git上默认是利用了本地存储,这里我们使用nfs去保存数据,一面服务挂了可以恢复。更加好的是使用分布式存取服务rook ceph.(https://rook.io/, cloud native storage)

在nsf服务器上 创建pv1,pv2,pv3 目录

创建pv1, pv2,pv3 的yaml

#  pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pg-pv1
spec:capacity:storage: 2GiaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /home/nfs/pv1   <--这个一定要先在服务器上创建server: k8s-nfs       <--服务器地址
kubectl apply -f pv1.yaml

重复以上 依次创建 2,3作为冗余备份数据

原则上一个pv就对应一个pvc,有兴趣可以查询

如何创建nfs服务器,请参看本人的上一篇文章(NFS服务器部分)

https://blog.csdn.net/davidqymo/article/details/105473358

3. 修改密码文件

修改密码文件secret.yaml

---
apiVersion: v1
kind: Secret
metadata:name: stolon
type: Opaque
data:
#    echo -n 'yourpassword' |base64password: eW91cnBhc3N3b3Jk

由于secret里面只能保存Base64的字符,请自行转换,在linux/mac上用 echo -n ‘你的密码’ | base64 来转换base64的密码。 或者自己着base64转换网站自行转换。 比如

➜  stolon echo -n 'yourpassword' |base64
eW91cnBhc3N3b3Jk

4. 修改stolon-keeper deployment文件

修改stolon-keeper.yaml的pg的pg容器环境变量的初始化用户名字

...- name: STKEEPER_PG_SU_USERNAMEvalue: "postgres"...volumeClaimTemplates:- metadata:name: data
#        annotations:
#          volume.alpha.kubernetes.io/storage-class: standardspec:accessModes: ["ReadWriteMany"]resources:requests:storage: 512MistorageClassName: nfs

5. 修改stolon-proxy-service.yaml

这里开放NodePort的方式开放服务,集群众的任意节点都可以通过这个端口访问数据库

apiVersion: v1
kind: Service
metadata:name: stolon-proxy-service
spec:ports:- port: 5432targetPort: 5432nodePort: 30010type: NodePortselector:component: stolon-proxystolon-cluster: kube-stolon

其他的不需要修改

执行目录下所有的yaml文件

kubectl apply -f .

6. 初始化数据库

按照git上面的提示(个人感觉应该在做成side car方式去启动,否者pod挂了之后不能自动恢复)

kubectl run -i -t stolonctl --image=sorintlab/stolon:master-pg10 --restart=Never --rm -- /usr/local/bin/stolonctl --cluster-name=kube-stolon --store-backend=kubernetes --kube-resource-kind=configmap init

7. 测试数据库通过

工具 连接 k8s-master可以是你任意节点的ip,这里是虚拟集群用,这些节点的ip都加入了hosts文件中。如果有改动就改hosts文件即可

jdbc:postgresql://k8s-master:30010/postgres

输入用户名postgres,密码yourpassword (第三部创建,你也可以去dash board UI去secret去查看)

8. 灾备模拟

创建测试数据库

create database testDB;创建表CREATE TABLE Persons
(PersonID int,LastName varchar(255),FirstName varchar(255),Address varchar(255),City varchar(255)
)INSERT INTO "public"."persons" ("personid", "lastname", "firstname", "address", "city") VALUES (111, 'david', 'test', 'china', 'gz');

查看数据库节点

stolon kubectl get pods -o wide
NAME                               READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
stolon-keeper-0                    1/1     Running   0          69m    10.244.2.11   k8s-node1   <none>           <none>
stolon-keeper-1                    1/1     Running   0          64m    10.244.1.17   k8s-node2   <none>           <none>
stolon-proxy-5c996dbbcb-8wfhl      1/1     Running   0          3h3m   10.244.1.15   k8s-node2   <none>           <none>
stolon-proxy-5c996dbbcb-c58lg      1/1     Running   0          3h3m   10.244.3.15   k8s-node3   <none>           <none>
stolon-sentinel-8455d466f5-bzdxk   1/1     Running   0          3h2m   10.244.3.16   k8s-node3   <none>           <none>
stolon-sentinel-8455d466f5-gsbmj   1/1     Running   0          3h2m   10.244.2.10   k8s-node1   <none>           <none>

模拟删除 pods,服务,代理

kubectl delete -f stolon-keeper.yamlkubectl delete -f stolon-proxy.yaml kubectl delete -f stolon-sentinel.yamlkubectl delete -f stolon-proxy-service.yaml

查看数据库无法连接

重新建立pod,service

kubectl create -f stolon-keeper.yamlkubectl create -f stolon-proxy.yaml kubectl create -f stolon-sentinel.yamlkubectl create -f stolon-proxy-service.yaml

查看服务正常

➜  stolon kubectl get pod,svc -o wide
NAME                                   READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
pod/stolon-keeper-0                    1/1     Running   0          2m26s   10.244.2.12   k8s-node1   <none>           <none>
pod/stolon-keeper-1                    1/1     Running   0          2m25s   10.244.1.19   k8s-node2   <none>           <none>
pod/stolon-proxy-5c996dbbcb-5lhcr      1/1     Running   0          2m7s    10.244.2.13   k8s-node1   <none>           <none>
pod/stolon-proxy-5c996dbbcb-j7n2n      1/1     Running   0          2m7s    10.244.3.17   k8s-node3   <none>           <none>
pod/stolon-sentinel-8455d466f5-76tkp   1/1     Running   0          106s    10.244.3.18   k8s-node3   <none>           <none>
pod/stolon-sentinel-8455d466f5-wfsqq   1/1     Running   0          106s    10.244.1.20   k8s-node2   <none>           <none>NAME                           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE    SELECTOR
service/kubernetes             ClusterIP   10.1.0.1       <none>        443/TCP          4d9h   <none>
service/stolon-proxy-service   NodePort    10.1.214.229   <none>        5432:30010/TCP   39s    component=stolon-proxy,stolon-cluster=kube-stolon
➜  stolon

客户端连接数据库, 查看数据库表,数据,都在

模拟删除 pod/stolon-keeper-0

kubectl delete pod stolon-keeper-0pod "stolon-keeper-0" deleted

连接数据库表,还在,内容也正确。

发现单机的速度太快,删除完之后系统自动重新创建 stolon-keeper-0,系统还没来得及主备切换

调整策略

➜  stolon kubectl get pod,svc -o wide
NAME                                   READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
pod/stolon-keeper-0                    1/1     Running   0          3m19s   10.244.2.17   k8s-node1   <none>           <none>
pod/stolon-keeper-1                    1/1     Running   0          27m     10.244.1.19   k8s-node2   <none>           <none>
pod/stolon-keeper-2                    1/1     Running   0          14m     10.244.3.19   k8s-node3   <none>           <none>
pod/stolon-proxy-5c996dbbcb-5lhcr      1/1     Running   0          26m     10.244.2.13   k8s-node1   <none>           <none>
pod/stolon-proxy-5c996dbbcb-j7n2n      1/1     Running   0          26m     10.244.3.17   k8s-node3   <none>           <none>
pod/stolon-sentinel-8455d466f5-76tkp   1/1     Running   0          26m     10.244.3.18   k8s-node3   <none>           <none>
pod/stolon-sentinel-8455d466f5-wfsqq   1/1     Running   0          26m     10.244.1.20   k8s-node2   <none>           <none>NAME                           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE     SELECTOR
service/kubernetes             ClusterIP   10.1.0.1       <none>        443/TCP          4d10h   <none>
service/stolon-proxy-service   NodePort    10.1.214.229   <none>        5432:30010/TCP   25m     component=stolon-proxy,stolon-cluster=kube-stolon

可以看到 stolon-keeper-0 运行在 k8s-node1, 其他各自在node2, node3, 为了避免 stolon-keeper-0 再自动启动,现在把 k8s-node1 虚拟机关闭

查看变化 stolon-keeper-1 的log,发现他被选举成master完成主备切换

2020-04-19T01:40:42.055Z INFO    cmd/keeper.go:1526  already standby
2020-04-19T01:40:42.076Z    INFO    cmd/keeper.go:1626  postgres parameters not changed
2020-04-19T01:40:42.077Z    INFO    cmd/keeper.go:1653  postgres hba entries not changed
2020-04-19T01:40:47.125Z    INFO    cmd/keeper.go:1457  our db requested role is master
2020-04-19T01:40:47.128Z    INFO    cmd/keeper.go:1486  promoting to master
2020-04-19T01:40:47.128Z    INFO    postgresql/postgresql.go:532    promoting database
2020-04-19 01:40:47.136 UTC [4152] LOG:  received promote request
2020-04-19 01:40:47.136 UTC [4156] FATAL:  terminating walreceiver process due to administrator command
2020-04-19 01:40:47.140 UTC [4152] LOG:  invalid record length at 0/5000370: wanted 24, got 0
2020-04-19 01:40:47.140 UTC [4152] LOG:  redo done at 0/5000338
2020-04-19 01:40:47.155 UTC [4152] LOG:  selected new timeline ID: 2
2020-04-19 01:40:47.431 UTC [4152] LOG:  archive recovery complete
2020-04-19 01:40:47.469 UTC [4151] LOG:  database system is ready to accept connections
waiting for server to promote.... done
server promoted
2020-04-19T01:40:47.556Z    INFO    cmd/keeper.go:1626  postgres parameters not changed
2020-04-19T01:40:47.556Z    INFO    cmd/keeper.go:1653  postgres hba entries not changed
2020-04-19T01:40:52.613Z    INFO    cmd/keeper.go:1457  our db requested role is master
2020-04-19T01:40:52.615Z    INFO    cmd/keeper.go:1493  already master

再重启node1。 查看他的logs,发现他成为了standby

2020-04-19T01:50:33.113Z INFO    cmd/keeper.go:1526  already standby
2020-04-19T01:50:33.133Z    INFO    cmd/keeper.go:1626  postgres parameters not changed
2020-04-19T01:50:33.133Z    INFO    cmd/keeper.go:1653  postgres hba entries not changed

k8s集群下创建高可用postgresql数据库集群实践相关推荐

  1. MyCAT+MySQL 搭建高可用企业级数据库集群

    第1章 课程介绍 课程介绍 1-1 MyCAT导学 试看 1-2 课程介绍 第2章 MyCAT入门 这一章中,我们将回顾了垂直切分,水平切分,分库分表等基础概念,然后快速回如何安装和启动MyCAT的, ...

  2. oracle集群服务创建表空间,Oracle数据库集群添加表空间操作规范

    Oracle数据库集群添加表空间操作规范 Oracle数据库集群添加表空间操作规范 1.首先检查dg空间是否充足SQL> select name,total_mb,free_mb,USABLE_ ...

  3. 使用Docker搭建高可用Mysql数据库集群

    文章目录 前言 正文 选择哪一种搭建集群的方式 PXC Replication 安装docker Docker操作的基本命令 安装PXC集群 负载均衡 双机热备 具体实现细节 安装keepalived ...

  4. Mycat和Mysql搭建高可用企业数据库集群

    个人背景 如标题所示,我的个人背景非常简单,Java开发经验1年半,学历普通,2本本科毕业,毕业后出来就一直在Crud,在公司每天重复的工作对我的技术提升并没有什么帮助,但小镇出来的我也深知自我努力的 ...

  5. 看完不会的来打我!Mycat和Mysql搭建高可用企业数据库集群

    前言 本系列的目的是明明白白.彻彻底底的搞定日期/时间处理的几乎所有case.上篇文章铺设所有涉及到的概念解释,例如GMT.UTC.夏令时.时间戳等等,若你还没看过,不仅强烈建议而是强制建议你前往用花 ...

  6. RabbitMQ:使用Docker构建RabbitMQ高可用负载均衡集群

    目录 一.构建RabbitMQ集群 1. 启动多个RabbitMQ节点 2. 加入集群 3. 配置镜像队列 二.HAProxy负载均衡 1. 安装HAProxy 2. 配置HAProxy 3. 启动 ...

  7. Kubernetes学习-K8S安装篇-Kubeadm安装高可用K8S集群

    Kubernetes学习-K8S安装篇-Kubeadm高可用安装K8S集群 1. Kubernetes 高可用安装 1.1 kubeadm高可用安装k8s集群1.23.1 1.1.1 基本环境配置 1 ...

  8. k8s和harbor的集成_在Kubernetes集群上部署高可用Harbor镜像仓库

    在Kubernetes集群上部署高可用Harbor镜像仓库 一.Kubernetes上的高可用Harbor方案 首先,我可以肯定给出一个回答:Harbor支持在Kubernetes部署.只不过Harb ...

  9. Redis创建高可用集群教程【Windows环境】

    模仿的过程中,加入自己的思考和理解,也会有进步和收获. 在这个互联网时代,在高并发和高流量可能随时爆发的情况下,单机版的系统或者单机版的应用已经无法生存,越来越多的应用开始支持集群,支持分布式部署了. ...

最新文章

  1. 【某小学生作文】《我的爸爸是名驾驶员》
  2. jsp+Servlet+JavaBean+JDBC+MySQL项目增删改查
  3. .net lucene 实战搜索(二)----- 基本之索引
  4. 驱动程序实例(一):LED设备驱动程序( platform + cdev)
  5. 如何才能成为java高级程序员?
  6. 高性能服务器 - window篇
  7. 第三次学JAVA再学不好就吃翔(part104)--flush和close
  8. 关于解决jdbc版本错误问题
  9. azure模型训练_如何在Azure Machine Learning Studio上开发K-Means模型
  10. Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle
  11. Day002_LInux基础_常用命令
  12. 【面试指南】如何看待你的竞争对手30k,而你却3k?想要高薪,我们也要学会拧螺丝、造飞机的能力
  13. realtek没有禁用前面板_为什么HD声卡必须禁用前面板插孔检测前置耳机和麦克才可以有声...
  14. 创作的第一个智能婚恋系统源代码,类似于百合网。
  15. Ubuntu常用命令
  16. 精读Tree Energy Loss: Towards Sparsely Annotated Semantic Segmentation
  17. 《走近心理学》第二章之心理学的生物学理论
  18. Maven与Git速识
  19. 微信开发者工具控制台空白问题解决方案
  20. Ubuntu安装搜狗输入法后修改默认英文输入状态的方法

热门文章

  1. MySQL最全整理!java垃圾回收器的作用不包括
  2. 复现抖音动态3D恐龙算法
  3. Java基础汇总(三)——final
  4. Docker-docker安全
  5. 我正在翻译的CakePHP manual
  6. 做人,一定要说话算数!
  7. JSD-2204-面向对象-潜艇游戏--Day08
  8. CUDA程序设计(一)
  9. 【BZOJ 1455】罗马游戏
  10. 高职教育人工智能专业调研报告