系列

什么是 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 自定义配置)

SGPostgresConfig(postgres 自定义配置)

SGPoolingConfig(pgBouncer 自定义配置)

  • 一个名为 poolconfig1 SGPoolingConfig

    apiVersion: 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 数据备份自定义配置)

  • 一个名为 backupconfig1SGObjectStorage

    apiVersion: 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 配置)

配置 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 的顺序与成功创建分片集群相关,即在创建依赖资源之前创建所有必要的 resourcessecretspermissions

另一个有用的配置是 prometheusAutobind: true 定义。

此参数自动启用对分片集群的监控。

如果我们已经在 Kubernetes 环境中安装了 Prometheus operator。

更多

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

  1. Storm系列(三):创建Maven项目打包提交wordcount到Storm集群

    在上一篇博客中,我们通过Storm.Net.Adapter创建了一个使用Csharp编写的Storm Topology - wordcount.本文将介绍如何编写Java端的程序以及如何发布到测试的S ...

  2. 【MongoDB】在windows平台下搭建mongodb的分片集群(二)

    在上一片博客中我们讲了Mongodb数据库中分片集群的主要原理. 在本篇博客中我们主要讲描写叙述分片集群的搭建过程.配置分片集群主要有两个步骤.第一启动全部须要的mongod和mongos进程. 第二 ...

  3. 分布式文档存储数据库之MongoDB分片集群

    前文我们聊到了mongodb的副本集以及配置副本集,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13953598.html:今天我们来聊下mongodb的分片 ...

  4. MongoDB在windows平台分片集群部署

    本文转载自:https://www.cnblogs.com/hx764208769/p/4260177.html 前言-为什么我要使用mongodb 最近我公司要开发一个日志系统,这个日志系统包括很多 ...

  5. MongoDB部署实战(一)MongoDB在windows平台分片集群部署

    前言-为什么我要使用mongodb 最近我公司要开发一个日志系统,这个日志系统包括很多类型,错误的,操作的,...用MongoDB存储日志,大量的日志产生,大量读写吞吐量很大的时候,单个Server很 ...

  6. mongo 3.4分片集群系列之六:详解配置数据库

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  7. 使用Patroni和HAProxy创建高可用的PostgreSQL集群

    操作系统:CentOS Linux release 7.6.1810 (Core) node1:192.168.216.130 master node2:192.168.216.132 slave n ...

  8. 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)

    申明:此文为转载(非原创),文章分析十分透彻,已添加原文链接,如有任何侵权问题,请告知,我会立即删除. 第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大 ...

  9. 创建简单WEB高可用集群

    1. 环境介绍 我这里弄了2个虚拟机,信息如下: node1:192.168.168.201 node2:192.168.168.202 2.配置主机名 [root@node1 ~]# vim /et ...

  10. 整理全网最全K8S集群管理工具、平台

    整理常见的整理全网最全K8S集群管理工具.平台解决方案. 1 Rancher Rancher中文官网:https://docs.rancher.cn/ 2 KubeSphere 官网:https:// ...

随机推荐

  1. 记通过mysql数据库成功入侵到服务器内部的渗透实战

    1,在成功进入mysql到数据库之后,可以使用select user();命令,查看当前的用户,如果为root,则可以执行下一步操作.不为root,则需要通过其他方法提权. 2, 使用show var ...

  2. 【Unity3D】调整屏幕亮度、饱和度、对比度

    1 屏幕后处理流程 ​ 调整屏幕亮度.饱和度.对比度,需要使用到屏幕后处理技术.因此,本文将先介绍屏幕后处理流程,再介绍调整屏幕亮度.饱和度.对比度的实现. ​ 本文完整资源见→Unity3D调整屏幕 ...

  3. 【Windows】KMS 激活命令记录

    目录 KMS 服务器激活 Office.Visio 推荐使用 office tool plus 部署并配置 KMS 激活 什么是 KMS? KMS 正版与否的区别 总结 KMS 服务器激活 利用 KM ...

  4. 《SQL与数据库基础》06. 函数

    目录 函数 字符串函数 数值函数 日期函数 流程函数 本文以 MySQL 为例 函数 函数是指一段可以直接被另一段程序调用的程序或代码. 要查看函数操作的结果,可以使用 SELECT 函数(参数); ...

  5. k8s 入门到实战--部署应用到 k8s

    背景 最近这这段时间更新了一些 k8s 相关的博客和视频,也收到了一些反馈:大概分为这几类: 公司已经经历过服务化改造了,但还未接触过云原生. 公司部分应用进行了云原生改造,但大部分工作是由基础架构和 ...

  6. Nginx map 实现时间格式转换

    哈喽大家好,我是咸鱼 最近我们需要把 Nginx 的日志接入到自研的日志采集平台上,但是这个平台只支持 JSON 格式,所以需要把 Nginx 日志格式改成 JSON 格式 例如下面这样的效果 刚开始 ...

  7. 将python程序打包为exe可执行文件方法

    将py打包为exe文件需要依赖pyinstaller第三方库 -F:打包后只生成单个exe格式文件: -D:默认选项,创建一个目录,包含exe文件以及大量依赖文件: -c:默认选项,使用控制台(就是类 ...

  8. rte-rtc

          活动内容 个人中心 立即报名    活动详情 RTE大会(原"RTC大会")创立于2015年,是亚太首个.迄今为止规模最大的实时互联网技术盛会,覆盖200+行业场景 ...

  9. 高可用mongodb集群(分片+副本):用户权限配置

    目录 ■ 创建副本集认证的key文件 ■ 修改配置文件指定keyfile ■ 重新启动节点 ■ 创建帐号和认证 ■ 用管理员帐号可查看整体的分片情况 ■ 用普通帐号访问数据 ■ 客户端连接多个mong ...

  10. Gossip in Hyperledger Fabric

    1. Gossip协议基础 1.1 什么是分布式系统 分布式系统(Distributed System)是由多台计算机或计算节点组成的计算机系统,这些计算节点通过网络连接在一起,并协同工作以完成共同的 ...