StackGres 数据库平台工程,使用 Citus + Patroni 创建生产级高可用分布式 PostgreSQL 分片集群

系列
- StackGres, 可私有部署的云原生数据库平台工程
- StackGres 数据库平台工程功能介绍与快速上手
- StackGres 1.6 数据库平台工程集群配置管理(K8S Pods/PostgreSQL/PgBouncer)
- StackGres 1.6 数据库平台工程,集群高可用(Patroni 3 管理)
什么是 Sharded Cluster(分片集群)
Sharded Cluster(分片集群)是实现数据库分片的集群。数据库分片是跨多台机器存储大型数据库的过程。这是通过在多个 Postgres 主实例之间分隔表行来实现的。这种方法提供了将数据库扩展到多个实例的能力,既有利于读取和写入吞吐量,也有利于在不同实例之间分离数据以实现安全性和/或满足法规或合规性要求。
Sharded Cluster 是如何实现的
一个分片集群是通过构造一个称为协调器的 SGCluster 和一个或多个称为 shards(分片) 的 SGCluster 来实现的。顾名思义,协调器协调实际存储数据的 shards(分片) 。StackGres 负责按照 SGShardedCluster 中设置的规范创建相关的 SGCluster。
SGShardedCluster 可以定义分片的类型(即所使用的内部分片实现)和要分片的数据库。
目前只有一个实现可用,这是通过使用 Citus 扩展提供的。
创建一个基本的 Citus Sharded Cluster
创建 SGShardedCluster 资源:
cat << EOF | kubectl apply -f -
apiVersion: stackgres.io/v1alpha1
kind: SGShardedCluster
metadata:
name: cluster
spec:
type: citus
database: mydatabase
postgres:
version: '15'
coordinator:
instances: 2
pods:
persistentVolume:
size: '10Gi'
shards:
clusters: 4
instancesPerCluster: 2
pods:
persistentVolume:
size: '10Gi'
EOF
此配置将创建一个包含 2 个 pod 的 coordinator(协调器)和4 个 shards(分片),每个分片包含 2 个 pod。
所有 Pod 就绪后,您可以通过发出以下命令来查看新创建的分片集群的拓扑:
kubectl exec -n my-cluster cluster-coord-0 -c patroni -- patronictl list
+ Citus cluster: cluster --+------------------+--------------+---------+----+-----------+
| Group | Member | Host | Role | State | TL | Lag in MB |
+-------+------------------+------------------+--------------+---------+----+-----------+
| 0 | cluster-coord-0 | 10.244.0.16:7433 | Leader | running | 1 | |
| 0 | cluster-coord-1 | 10.244.0.34:7433 | Sync Standby | running | 1 | 0 |
| 1 | cluster-shard0-0 | 10.244.0.19:7433 | Leader | running | 1 | |
| 1 | cluster-shard0-1 | 10.244.0.48:7433 | Replica | running | 1 | 0 |
| 2 | cluster-shard1-0 | 10.244.0.20:7433 | Leader | running | 1 | |
| 2 | cluster-shard1-1 | 10.244.0.42:7433 | Replica | running | 1 | 0 |
| 3 | cluster-shard2-0 | 10.244.0.22:7433 | Leader | running | 1 | |
| 3 | cluster-shard2-1 | 10.244.0.43:7433 | Replica | running | 1 | 0 |
| 4 | cluster-shard3-0 | 10.244.0.27:7433 | Leader | running | 1 | |
| 4 | cluster-shard3-1 | 10.244.0.45:7433 | Replica | running | 1 | 0 |
+-------+------------------+------------------+--------------+---------+----+-----------+
请注意,pg_dist_node 表的 groupid 列与上面的 Patroni Group 列相同。特别是,标识符为 0 的组是 coordinator(协调器) 组(coordinator 的 shouldhaveshards 列设置为 f)。
创建一个自定义的生产级 Citus Sharded Cluster
Sharded Cluster 自定义配置
有关分片集群配置的更多详细信息,请参阅自定义你的 Postgres Cluster一节。具体来说,您将在 my-cluster 命名空间中创建以下自定义资源:
SGInstanceProfile(k8s pods 自定义配置)
- 一个名为
size-small的 SGInstanceProfileapiVersion: stackgres.io/v1
kind: SGInstanceProfile
metadata:
namespace: demo
name: size-small
spec:
cpu: "4"
memory: "8Gi"
SGPostgresConfig(postgres 自定义配置)
- 一个名为
pgconfig1的 SGPostgresConfigapiVersion: stackgres.io/v1
kind: SGPostgresConfig
metadata:
name: postgresconf
spec:
postgresVersion: "11"
postgresql.conf:
password_encryption: 'scram-sha-256'
random_page_cost: '1.5'
shared_buffers: '256MB'
wal_compression: 'on'
SGPoolingConfig(pgBouncer 自定义配置)
- 一个名为
poolconfig1SGPoolingConfigapiVersion: stackgres.io/v1
kind: SGPoolingConfig
metadata:
name: pgbouncerconf
spec:
pgBouncer:
pgbouncer.ini:
pgbouncer:
max_client_conn: '2000'
default_pool_size: '50'
databases:
foodb:
max_db_connections: 1000
pool_size: 20
dbname: 'bardb'
reserve_pool: 5
users:
user1:
pool_mode: transaction
max_user_connections: 50
user2:
pool_mode: session
max_user_connections: '100'
SGObjectStorage(s3 数据备份自定义配置)
- 一个名为
backupconfig1的 SGObjectStorageapiVersion: stackgres.io/v1beta1
kind: SGObjectStorage
metadata:
name: objectstorage
spec:
type: s3Compatible
s3Compatible:
bucket: stackgres
region: k8s
enablePathStyleAddressing: true
endpoint: http://my-cluster-minio:9000
awsCredentials:
secretKeySelectors:
accessKeyId:
key: accesskey
name: my-cluster-minio
secretAccessKey:
key: secretkey
name: my-cluster-minio
SGDistributedLogs(分布式日志 server 配置)
- 一个名为
distributedlogs的 SGDistributedLogsapiVersion: stackgres.io/v1
kind: SGDistributedLogs
metadata:
name: distributedlogs
spec:
persistentVolume:
size: 10Gi
配置 SQL 启动脚本
最后但同样重要的是,StackGres 允许您包含几个 managedSql 脚本,以便在启动时执行集群操作。
在这个例子中,我们使用 Kubernetes secret 创建一个 Postgres 用户,并使用 Citus 创建一个分片表:
kubectl -n my-cluster create secret generic pgbench-user-password-secret \
--from-literal=pgbench-create-user-sql="create user pgbench password 'admin123'"
然后我们在 SGScript 中引用这个 secret:
cat << EOF | kubectl apply -f -
apiVersion: stackgres.io/v1
kind: SGScript
metadata:
namespace: my-cluster
name: cluster-scripts
spec:
scripts:
- name: create-pgbench-user
scriptFrom:
secretKeyRef:
name: pgbench-user-password-secret
key: pgbench-create-user-sql
- name: create-pgbench-tables
database: mydatabase
user: pgbench
script: |
CREATE TABLE pgbench_accounts (
aid integer NOT NULL,
bid integer,
abalance integer,
filler character(84)
);
- name: distribute-pgbench-tables
database: mydatabase
user: pgbench
script: |
SELECT create_distributed_table('pgbench_history', 'aid');
EOF
脚本由之前创建的 Secret 和内联的 SQL 指令定义。
SGScript 将在分片集群的协调器的 managedSql 定义中被引用,如下所示。
请注意,我们同样可以在配置映射中定义 SQL 脚本,但是,由于 password 表示凭据,因此我们使用的是 secret。
创建 Citus 集群
执行了所有必要的步骤来创建我们的 StackGres 集群。
创建 SGShardedCluster 资源:
cat << EOF | kubectl apply -f -
apiVersion: stackgres.io/v1alpha1
kind: SGShardedCluster
metadata:
namespace: my-cluster
name: cluster
spec:
type: citus
database: mydatabase
postgres:
version: '15.3'
coordinator:
instances: 2
sgInstanceProfile: 'size-small'
pods:
persistentVolume:
size: '10Gi'
configurations:
sgPostgresConfig: 'pgconfig1'
sgPoolingConfig: 'poolconfig1'
managedSql:
scripts:
- sgScript: cluster-scripts
shards:
clusters: 3
instancesPerCluster: 2
sgInstanceProfile: 'size-small'
pods:
persistentVolume:
size: '10Gi'
configurations:
sgPostgresConfig: 'pgconfig1'
sgPoolingConfig: 'poolconfig1'
configurations:
backups:
- sgObjectStorage: 'backupconfig1'
cronSchedule: '*/5 * * * *'
retention: 6
distributedLogs:
sgDistributedLogs: 'distributedlogs'
prometheusAutobind: true
EOF
注意,每个资源都有自己的 name,并在 StackGres 分片集群定义中被引用。
创建 CR 的顺序与成功创建分片集群相关,即在创建依赖资源之前创建所有必要的 resources、secrets 和 permissions。
另一个有用的配置是 prometheusAutobind: true 定义。
此参数自动启用对分片集群的监控。
如果我们已经在 Kubernetes 环境中安装了 Prometheus operator。
更多
StackGres 数据库平台工程,使用 Citus + Patroni 创建生产级高可用分布式 PostgreSQL 分片集群的更多相关文章
- Storm系列(三):创建Maven项目打包提交wordcount到Storm集群
在上一篇博客中,我们通过Storm.Net.Adapter创建了一个使用Csharp编写的Storm Topology - wordcount.本文将介绍如何编写Java端的程序以及如何发布到测试的S ...
- 【MongoDB】在windows平台下搭建mongodb的分片集群(二)
在上一片博客中我们讲了Mongodb数据库中分片集群的主要原理. 在本篇博客中我们主要讲描写叙述分片集群的搭建过程.配置分片集群主要有两个步骤.第一启动全部须要的mongod和mongos进程. 第二 ...
- 分布式文档存储数据库之MongoDB分片集群
前文我们聊到了mongodb的副本集以及配置副本集,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13953598.html:今天我们来聊下mongodb的分片 ...
- MongoDB在windows平台分片集群部署
本文转载自:https://www.cnblogs.com/hx764208769/p/4260177.html 前言-为什么我要使用mongodb 最近我公司要开发一个日志系统,这个日志系统包括很多 ...
- MongoDB部署实战(一)MongoDB在windows平台分片集群部署
前言-为什么我要使用mongodb 最近我公司要开发一个日志系统,这个日志系统包括很多类型,错误的,操作的,...用MongoDB存储日志,大量的日志产生,大量读写吞吐量很大的时候,单个Server很 ...
- mongo 3.4分片集群系列之六:详解配置数据库
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- 使用Patroni和HAProxy创建高可用的PostgreSQL集群
操作系统:CentOS Linux release 7.6.1810 (Core) node1:192.168.216.130 master node2:192.168.216.132 slave n ...
- 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)
申明:此文为转载(非原创),文章分析十分透彻,已添加原文链接,如有任何侵权问题,请告知,我会立即删除. 第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大 ...
- 创建简单WEB高可用集群
1. 环境介绍 我这里弄了2个虚拟机,信息如下: node1:192.168.168.201 node2:192.168.168.202 2.配置主机名 [root@node1 ~]# vim /et ...
- 整理全网最全K8S集群管理工具、平台
整理常见的整理全网最全K8S集群管理工具.平台解决方案. 1 Rancher Rancher中文官网:https://docs.rancher.cn/ 2 KubeSphere 官网:https:// ...
随机推荐
- 记通过mysql数据库成功入侵到服务器内部的渗透实战
1,在成功进入mysql到数据库之后,可以使用select user();命令,查看当前的用户,如果为root,则可以执行下一步操作.不为root,则需要通过其他方法提权. 2, 使用show var ...
- 【Unity3D】调整屏幕亮度、饱和度、对比度
1 屏幕后处理流程 调整屏幕亮度.饱和度.对比度,需要使用到屏幕后处理技术.因此,本文将先介绍屏幕后处理流程,再介绍调整屏幕亮度.饱和度.对比度的实现. 本文完整资源见→Unity3D调整屏幕 ...
- 【Windows】KMS 激活命令记录
目录 KMS 服务器激活 Office.Visio 推荐使用 office tool plus 部署并配置 KMS 激活 什么是 KMS? KMS 正版与否的区别 总结 KMS 服务器激活 利用 KM ...
- 《SQL与数据库基础》06. 函数
目录 函数 字符串函数 数值函数 日期函数 流程函数 本文以 MySQL 为例 函数 函数是指一段可以直接被另一段程序调用的程序或代码. 要查看函数操作的结果,可以使用 SELECT 函数(参数); ...
- k8s 入门到实战--部署应用到 k8s
背景 最近这这段时间更新了一些 k8s 相关的博客和视频,也收到了一些反馈:大概分为这几类: 公司已经经历过服务化改造了,但还未接触过云原生. 公司部分应用进行了云原生改造,但大部分工作是由基础架构和 ...
- Nginx map 实现时间格式转换
哈喽大家好,我是咸鱼 最近我们需要把 Nginx 的日志接入到自研的日志采集平台上,但是这个平台只支持 JSON 格式,所以需要把 Nginx 日志格式改成 JSON 格式 例如下面这样的效果 刚开始 ...
- 将python程序打包为exe可执行文件方法
将py打包为exe文件需要依赖pyinstaller第三方库 -F:打包后只生成单个exe格式文件: -D:默认选项,创建一个目录,包含exe文件以及大量依赖文件: -c:默认选项,使用控制台(就是类 ...
- rte-rtc
活动内容 个人中心 立即报名 活动详情 RTE大会(原"RTC大会")创立于2015年,是亚太首个.迄今为止规模最大的实时互联网技术盛会,覆盖200+行业场景 ...
- 高可用mongodb集群(分片+副本):用户权限配置
目录 ■ 创建副本集认证的key文件 ■ 修改配置文件指定keyfile ■ 重新启动节点 ■ 创建帐号和认证 ■ 用管理员帐号可查看整体的分片情况 ■ 用普通帐号访问数据 ■ 客户端连接多个mong ...
- Gossip in Hyperledger Fabric
1. Gossip协议基础 1.1 什么是分布式系统 分布式系统(Distributed System)是由多台计算机或计算节点组成的计算机系统,这些计算节点通过网络连接在一起,并协同工作以完成共同的 ...