k8s集群下创建高可用postgresql数据库集群实践
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数据库集群实践相关推荐
- MyCAT+MySQL 搭建高可用企业级数据库集群
第1章 课程介绍 课程介绍 1-1 MyCAT导学 试看 1-2 课程介绍 第2章 MyCAT入门 这一章中,我们将回顾了垂直切分,水平切分,分库分表等基础概念,然后快速回如何安装和启动MyCAT的, ...
- oracle集群服务创建表空间,Oracle数据库集群添加表空间操作规范
Oracle数据库集群添加表空间操作规范 Oracle数据库集群添加表空间操作规范 1.首先检查dg空间是否充足SQL> select name,total_mb,free_mb,USABLE_ ...
- 使用Docker搭建高可用Mysql数据库集群
文章目录 前言 正文 选择哪一种搭建集群的方式 PXC Replication 安装docker Docker操作的基本命令 安装PXC集群 负载均衡 双机热备 具体实现细节 安装keepalived ...
- Mycat和Mysql搭建高可用企业数据库集群
个人背景 如标题所示,我的个人背景非常简单,Java开发经验1年半,学历普通,2本本科毕业,毕业后出来就一直在Crud,在公司每天重复的工作对我的技术提升并没有什么帮助,但小镇出来的我也深知自我努力的 ...
- 看完不会的来打我!Mycat和Mysql搭建高可用企业数据库集群
前言 本系列的目的是明明白白.彻彻底底的搞定日期/时间处理的几乎所有case.上篇文章铺设所有涉及到的概念解释,例如GMT.UTC.夏令时.时间戳等等,若你还没看过,不仅强烈建议而是强制建议你前往用花 ...
- RabbitMQ:使用Docker构建RabbitMQ高可用负载均衡集群
目录 一.构建RabbitMQ集群 1. 启动多个RabbitMQ节点 2. 加入集群 3. 配置镜像队列 二.HAProxy负载均衡 1. 安装HAProxy 2. 配置HAProxy 3. 启动 ...
- Kubernetes学习-K8S安装篇-Kubeadm安装高可用K8S集群
Kubernetes学习-K8S安装篇-Kubeadm高可用安装K8S集群 1. Kubernetes 高可用安装 1.1 kubeadm高可用安装k8s集群1.23.1 1.1.1 基本环境配置 1 ...
- k8s和harbor的集成_在Kubernetes集群上部署高可用Harbor镜像仓库
在Kubernetes集群上部署高可用Harbor镜像仓库 一.Kubernetes上的高可用Harbor方案 首先,我可以肯定给出一个回答:Harbor支持在Kubernetes部署.只不过Harb ...
- Redis创建高可用集群教程【Windows环境】
模仿的过程中,加入自己的思考和理解,也会有进步和收获. 在这个互联网时代,在高并发和高流量可能随时爆发的情况下,单机版的系统或者单机版的应用已经无法生存,越来越多的应用开始支持集群,支持分布式部署了. ...
最新文章
- 【某小学生作文】《我的爸爸是名驾驶员》
- jsp+Servlet+JavaBean+JDBC+MySQL项目增删改查
- .net lucene 实战搜索(二)----- 基本之索引
- 驱动程序实例(一):LED设备驱动程序( platform + cdev)
- 如何才能成为java高级程序员?
- 高性能服务器 - window篇
- 第三次学JAVA再学不好就吃翔(part104)--flush和close
- 关于解决jdbc版本错误问题
- azure模型训练_如何在Azure Machine Learning Studio上开发K-Means模型
- Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle
- Day002_LInux基础_常用命令
- 【面试指南】如何看待你的竞争对手30k,而你却3k?想要高薪,我们也要学会拧螺丝、造飞机的能力
- realtek没有禁用前面板_为什么HD声卡必须禁用前面板插孔检测前置耳机和麦克才可以有声...
- 创作的第一个智能婚恋系统源代码,类似于百合网。
- Ubuntu常用命令
- 精读Tree Energy Loss: Towards Sparsely Annotated Semantic Segmentation
- 《走近心理学》第二章之心理学的生物学理论
- Maven与Git速识
- 微信开发者工具控制台空白问题解决方案
- Ubuntu安装搜狗输入法后修改默认英文输入状态的方法