StackGres 1.6 数据库平台工程集群配置管理(K8S Pods/PostgreSQL/PgBouncer)

Postgres 配置
PostgreSQL 的配置在 SGPostgresConfig CRD 中指定。如果在创建集群时没有指定自定义配置,StackGres 将创建一个默认配置,您可以在 这里 看到。
- https://stackgres.io/doc/latest/reference/crd/sgpostgresconfig/
- https://stackgres.io/doc/latest/administration/configuration/
默认情况下,StackGres 已经附带了一个经过专业调优的 Postgres 配置(即 postgresql.conf )。但是,完全可以指定您自己的配置。如果您需要有关配置的指导,请考虑使用 postgresqlCONF 服务,它为您提供多种语言的详细参数信息、建议、调优指南,甚至还提供在线存储和管理 Postgres 配置的工具。
SGPostgresConfig CRD 允许你指定和管理你的 Postgres 配置。Postgres 配置既可以在每个集群中创建(和/或修改),也可以在多个集群中重用。不需要在每个集群中重复配置。
SGPostgresConfig 从一个或多个 Postgres 集群中引用。
这是一个配置定义示例:
apiVersion: stackgres.io/v1
kind: SGPostgresConfig
metadata:
namespace: demo
name: pgconfig1
spec:
postgresVersion: "14"
postgresql.conf:
work_mem: '16MB'
shared_buffers: '2GB'
random_page_cost: '1.5'
password_encryption: 'scram-sha-256'
log_checkpoints: 'on'
jit: 'off'
这个定义是在 Kubernetes 中创建的(例如使用 kubectl apply),并且可以像检查任何其他 Kubernetes 资源一样检查(kubectl describe sgpgconfig pgconfig1)。
StackGres 集群可以通过以下方式引用该配置:
apiVersion: stackgres.io/v1
kind: SGCluster
metadata:
namespace: demo
name: cluster
spec:
# [...]
configurations:
sgPostgresConfig: 'pgconfig1'
实例配置文件
实例概要文件是对实例的资源特征的抽象(基本上,到目前为止,是 CPU "cores" 和 RAM)。StackGres 用 CRD SGInstanceProfile 表示这样一个概要文件。您可以将实例配置文件想象成 "t-shirt sizes",这是一种创建命名 t 恤大小(如 S、M、L )的方法,您将在创建集群时引用它们。这是一种通过使用标准化实例大小来实施最佳实践的方法。
SGInstanceProfile 从一个或多个 Postgres 集群中被引用。
这是一个配置定义示例:
apiVersion: stackgres.io/v1
kind: SGInstanceProfile
metadata:
namespace: demo
name: size-small
spec:
cpu: "4"
memory: "8Gi"
这个定义是在 Kubernetes 中创建的(例如使用 kubectl apply ),并且可以像其他 Kubernetes 资源一样检查(kubectl describe sginstanceprofile size-small)。
如果愿意,您可以创建其他大小的实例配置文件。
实例配置文件强制容器的资源请求和限制,其中 Patroni 和 Postgres 将使用 requests 和 limits 的 cpu 和 memory 值来设置 Pod 资源。
它还对 .spec.containers 和 .spec.initContainers 下的所有其他容器强制执行资源请求。
这些部分包含由 cpu 和 memory 指定的默认值,并且可以在以后根据您的特定用例的需求进行调整。
StackGres 集群可以通过以下方式引用该配置:
apiVersion: stackgres.io/v1
kind: SGCluster
metadata:
namespace: demo
name: cluster
spec:
# [...]
sgInstanceProfile: 'size-small'
连接池配置
默认情况下,StackGres 将 Postgres 集群部署在一个包含连接池的 sidecar 上。StackGres 目前使用 PgBouncer。连接池位于数据库前面,并控制传入的连接(fan-in)。
这使得 Postgres 能够以更少的并发连接运行,同时允许更多的外部连接(从应用程序到池处理器)。如果在创建集群时没有指定自定义池配置,StackGres将创建一个默认配置,您可以在这里 看到。
StackGres 提供了一个生产级的默认配置。您可以通过创建 SGPoolingConfig CRD 的实例来提供自己的池配置。SGPoolingConfig 从一个或多个 Postgres 集群中引用。
这是一个 PgBouncer 配置定义的例子:
apiVersion: stackgres.io/v1
kind: SGPoolingConfig
metadata:
namespace: demo
name: poolconfig1
spec:
pgBouncer:
pgbouncer.ini:
pgbouncer:
max_client_conn: '200'
default_pool_size: '200'
pool_mode: transaction
这个定义是在 Kubernetes 中创建的(例如使用 kubectl apply),并且可以像检查其他 Kubernetes 资源一样检查(kubectl describe sgpoolconfig poolconfig1)。
StackGres 集群可以通过以下方式引用该配置:
apiVersion: stackgres.io/v1
kind: SGCluster
metadata:
namespace: demo
name: cluster
spec:
# [...]
configurations:
sgPoolingConfig: 'poolconfig1'
重新加载配置
SGPoolingConfig 自定义连接池部分 一节解释了正确扩展连接的不同选项。
每个配置一旦应用,就需要 reloaded。这可以通过获取相应的主节点 pod 名称并发出与大多数环境相同的信号来完成:
PRIMARY=$(kubectl get pod -l role=master -n cluster -o name)
kubectl exec -n cluster -it ${PRIMARY} -c postgres-util -- pkill --signal HUP pgbouncer
禁用连接池
某些应用程序,特别是那些用于报告或 OLAP 的应用程序,可能不需要池中间件来发出大型查询和少量连接。可以通过在 Cluster 配置中将 disableConnectionPooling 设置为 true 来禁用池化(有关更多信息,请参阅 CRD Cluster Pods configuration)。
apiVersion: stackgres.io/v1
kind: SGCluster
metadata:
namespace: demo
name: cluster
spec:
pods:
disableConnectionPooling: false
...
不管怎样,如果您的应用程序使用了内部池,或者它已经有了池中间件,那么您可以考虑禁用内部池机制。但是,我们鼓励用户在内部启用池,因为它可以作为可能发生的意外连接峰值的争用屏障,为集群带来更多的稳定性。
池管理和内部统计
Transaction 模式
建议使用这种配置来实现最有效的池分配:
cat << EOF | kubectl apply -f -
apiVersion: stackgres.io/v1
kind: SGPoolingConfig
metadata:
namespace: my-cluster
name: poolconfig1
spec:
pgBouncer:
pgbouncer.ini:
pgbouncer:
pool_mode: transaction
max_client_conn: '1000'
default_pool_size: '80'
EOF
通过超时释放连接的 Session 模式
此配置需要从所使用的应用程序了解更多的见解和规范针对集群。这里的目的是释放连接在 idle in transaction。
您会注意到下面的代码是从影响客户端到服务器端的变量排序的,
增量。如果您的应用程序在连接空闲时设置了客户端超时,则可能不需要
要做到这一点,虽然几个生产集群可能不仅是一个,而是许多
不同连接处理中的应用程序。
cat << EOF | kubectl apply -f -
apiVersion: stackgres.io/v1
kind: SGPoolingConfig
metadata:
namespace: my-cluster
name: poolconfig-session-prod
spec:
pgBouncer:
pgbouncer.ini:
pgboucner:
pool_mode: session
max_client_conn: '1000'
default_pool_size: '80'
client_idle_timeout: '30s'
idle_transaction_timeout: '60s'
server_idle_timeout: '120s'
server_lifetime: '240s'
server_fast_close: '300s'
EOF
当 server pool 被满足时,传入的客户端连接建立请求将被排队设置
在 wait 状态由 PgBouncer。这就是为什么确保服务器连接是安全的非常重要
适当地释放,特别是如果它们被长时间保存。
访问池管理控制台
PgBouncer 包括一个管理数据库风格的连接,用于获取有关池统计的有价值的信息,如计数器、聚合、客户端和服务器连接等。对于类似生产的环境来说,理解这些值是至关重要的。
通过 container socket 和 pgbouncer(这不是数据库用户)用户访问控制台:
kubectl exec -it -c postgres-util test-0 -- psql -p 6432 -d pgbouncer pgbouncer
psql (12.4 OnGres Inc., server 1.13.0/bouncer)
Type "help" for help.
pgbouncer=# \x
Expanded display is on.
获取有价值的池信息
pgbouncer=# show stats;
-[ RECORD 1 ]-----+----------
database | pgbouncer
total_xact_count | 1
total_query_count | 1
total_received | 0
total_sent | 0
total_xact_time | 0
total_query_time | 0
total_wait_time | 0
avg_xact_count | 0
avg_query_count | 0
avg_recv | 0
avg_sent | 0
avg_xact_time | 0
avg_query_time | 0
avg_wait_time | 0
pgbouncer=# show pools;
-[ RECORD 1 ]---------
database | pgbouncer
user | pgbouncer
cl_active | 1
cl_waiting | 0
sv_active | 0
sv_idle | 0
sv_used | 0
sv_tested | 0
sv_login | 0
maxwait | 0
maxwait_us | 0
pool_mode | statement
pgbouncer=# show clients;
-[ RECORD 1 ]+------------------------
type | C
user | pgbouncer
database | pgbouncer
state | active
addr | unix
port | 6432
local_addr | unix
local_port | 6432
connect_time | 2020-10-23 13:19:54 UTC
request_time | 2020-10-23 14:18:23 UTC
wait | 3445
wait_us | 617385
close_needed | 0
ptr | 0x1a5c350
link |
remote_pid | 28349
tls |
其他有用的命令:
show serversshow fdsshow memshow stats_totalsshow stat_averages
Reference
可用命令:
SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|USERS|VERSION
SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
SHOW DNS_HOSTS|DNS_ZONES
SHOW STATS|STATS_TOTALS|STATS_AVERAGES|TOTALS
SET key = arg
RELOAD
PAUSE [<db>]
RESUME [<db>]
DISABLE <db>
ENABLE <db>
RECONNECT [<db>]
KILL <db>
SUSPEND
SHUTDOWN
更多
- StackGres 1.6,可私有部署的云原生数据库中间件平台工程
- StackGres 1.6 数据库平台工程功能介绍与快速上手
- https://hacker-linner.com
- https://stackgres.io
StackGres 1.6 数据库平台工程集群配置管理(K8S Pods/PostgreSQL/PgBouncer)的更多相关文章
- CDH构建大数据平台-配置集群的Kerberos认证安全
CDH构建大数据平台-配置集群的Kerberos认证安全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当平台用户使用量少的时候我们可能不会在一集群安全功能的缺失,因为用户少,团 ...
- Moebius数据库多活集群
背景 数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为"IT的心脏".因此,让数据库安全.稳定.高效地运行已经成为IT管理者必须要面对的问题.数据库在底层架构 ...
- 朝花夕拾之--大数据平台CDH集群离线搭建
body { border: 1px solid #ddd; outline: 1300px solid #fff; margin: 16px auto; } body .markdown-body ...
- Centos7下ELK+Redis日志分析平台的集群环境部署记录
之前的文档介绍了ELK架构的基础知识,日志集中分析系统的实施方案:- ELK+Redis- ELK+Filebeat - ELK+Filebeat+Redis- ELK+Filebeat+Kafka+ ...
- 11g RAC 集群数据库不能跟随集群启动
1.查看集群资源详细情况 [oracle@rac01-+ASM1 ~]$ crsctl stat res -p 2.修改集群资源ora.rac.db的auto_start属性改为always [ora ...
- 使用 Velero 跨云平台迁移集群资源到 TKE
概述 Velero 是一个非常强大的开源工具,可以安全地备份和还原,执行灾难恢复以及迁移Kubernetes群集资源和持久卷,可以在 TKE 平台上使用 Velero 备份.还原和迁移集群资源,关于如 ...
- k8s多集群配置管理平台
k8s多集群配置管理平台 临时集群特性 模拟生产环境 整体环境说明 内网:10.17.1.44 [root@localhost account-server]# kubectl get nodes N ...
- [k8s]zookeeper集群在k8s的搭建(statefulset模式)-pod的调度
之前一直docker-compose跑zk集群,现在把它挪到k8s集群里. docker-compose跑zk集群 zk集群in k8s部署 参考: https://github.com/kubern ...
- CentOS7环境RabbitMQ集群配置管理(转载)
CentOS7环境RabbitMQ集群配置管理(转载) CentOS7系统内核版本:3.10.0-514.26.2.el7.x86_64 一.对应主机host地址(三台主机host文件要保持一致) ...
- 阿里云-容器服务之集群服务 k8s(Jenkins+gitlab+k8s的devops)- 01
由于docker官方停止更新Swarm,另外swarm在使用期间出现了很多bug,所以阿里云也在2019年7月发布公告:于2019年12月31日起停止技术支持,请您尽快迁移至容器服务Kubernete ...
随机推荐
- linux离线安装docker与compose
前言 系统版本:centos 7.ubuntu 20.04 docker版本:v19.03.9.官方下载地址 docker-compose版本:v2.2.3.官方下载地址 官方提供免安装的二进制程序包 ...
- 【pandas小技巧】--DataFrame的显示参数
我们在jupyter notebook中使用pandas显示DataFrame的数据时,由于屏幕大小,或者数据量大小的原因,常常会觉得显示出来的表格不是特别符合预期. 这时,就需要调整pandas显示 ...
- ATtiny88初体验(四):看门狗
ATtiny88初体验(四):看门狗 ATtiny88单片机的看门狗使用内部独立的128KHz时钟源,拥有3种工作模式: Interrupt模式:超时产生中断: System Reset模式:超时产生 ...
- Leetcode刷题笔记——二分法
二分法是搜索算法中极其典型的方法,其要求输入序列有序并可随机访问.算法思想为 输入:有序数组nums,目的数值target 要求输出:如果target存在在数组中,则输出其index,否则输出-1 将 ...
- 一些H5对接微信JSSDK的问题记录
这里给大家分享我在实际生活中总结出来的一些知识,希望对大家有所帮助 一.SDK引入 这里提供两套引入流程,一套是vue2.0及其他h5项目,一套是vue3.0的引入流程 不懂的也可以看我之前的一篇详细 ...
- jmeter的全局变量(将登陆token设置全局)
1.首先调用登陆接口,用json提取器,取出响应内的token值 2.在beanshell取样器中设置全局变量 //设置全局变量方法一:用函数__setProperty设置${__setProper ...
- C#学习笔记--复杂数据类型、函数和结构体
C#基础 复杂数据类型 特点:多个数据变量地一个集合体,可以自己命名 种类:枚举.数组和结构体 枚举:整型常量的集合 数组:任意变量类型的顺序存储的数据集合 结构体:任意变量类型的数据组合成的数据块 ...
- 征集 meme
当你每次兴致勃勃地和好友分享自己喜欢的歌但 Ta 不屑一顾 / 不喜欢时:
- 再学Blazor——扩展方法
上篇提到 Blazor 组件的高级写法,是采用扩展方法对 HTML 元素和组件进行扩展,以便于书写组件结构和代码阅读.本篇主要介绍扩展方法实现的思路. 什么是扩展方法 要扩展哪个类 扩展方法的实现 1 ...
- We Need More Bosses 题解
We Need More Bosses 题目大意 给定一张图,找到两个点,使得这两个点之间的所有路径必须经过的边最多. 思路分析 我们先来思考一下如果已知两个点,怎么求两个点之间必须经过的边的数量. ...