当前位置:首页 > 技术 > 正文内容

使用 Citus 和 ClusterManager 实现生产级高可用分布式 PostgreSQL 分片集群

访客 技术 2026年7月21日 1

image

什么是分片集群

Sharded Cluster(分片集群)是一种实现数据库分片的集群架构。通过将大型数据库的数据分布在多台机器之间,可以实现水平扩展。这种方法通过在多个 PostgreSQL 实例之间分配表行来实现,从而提升了读写吞吐量,并能够通过数据分区实现数据隔离和合规性要求。

分片集群的实现原理

分片集群由一个称为协调器的 ClusterManager 和多个称为分片的 DataNodes 组成。协调器负责管理分片实例,并通过路由请求到适当的分片来实现透明的数据分片。Citus 作为分布式数据库扩展,提供了实现分片集群的核心功能。

创建基本的分布式集群

以下是一个使用 Kubernetes 创建分布式集群的示例配置:

apiVersion: database.stack/v1alpha1
kind: DistributedCluster
metadata:
  name: my-distributed-cluster
spec:
  type: citus
  database: mydb
  coordinator:
    replicas: 2
    resources:
      requests:
        memory: "8Gi"
        cpu: "4"
    config:
      pgVersion: "15"
  shards:
    count: 4
    replicasPerShard: 2
    resources:
      requests:
        memory: "8Gi"
        cpu: "4"
    config:
      pgVersion: "15"

此配置创建了一个包含 2 个协调器实例和 4 个分片(每个分片包含 2 个副本)的分布式集群。所有 Pod 启动后,可以通过以下命令查看集群状态:

kubectl exec -n my-cluster cluster-coord-0 -c clustermanager -- cmctl list
+ Cluster: my-distributed-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 | Follower     | 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 |
+-------+------------------+------------------+--------------+---------+----+-----------+

自定义生产级集群配置

自定义配置

您可以通过以下步骤自定义分布式集群:

  1. 定义资源配额:
apiVersion: resource.stack/v1
kind: ResourceProfile
metadata:
  name: small-instance
spec:
  limits:
    cpu: 4
    memory: 8Gi
  1. 配置数据库参数:
apiVersion: database.stack/v1
kind: DBConfig
metadata:
  name: pgconfig1
spec:
  version: "11"
  settings:
    password_encryption: 'scram-sha-256'
    random_page_cost: '1.5'
    shared_buffers: '256MB'
    wal_compression: 'on'
  1. 配置连接池:
apiVersion: database.stack/v1
kind: PoolConfig
metadata:
  name: poolconfig1
spec:
  max_connections: 2000
  default_pool_size: 50
  databases:
    foodb:
      max_connections: 1000
      pool_size: 20
      dbname: 'bardb'
      reserve_pool: 5
  users:
    user1:
      pool_mode: transaction
      max_connections: 50
    user2:
      pool_mode: session
      max_connections: '100'
  1. 配置对象存储:
apiVersion: storage.stack/v1beta1
kind: ObjectStorage
metadata:
  name: backupconfig1
spec:
  type: s3Compatible
  s3:
    bucket: stackgres
    region: k8s
    endpoint: http://my-cluster-minio:9000
    credentials:
      accessKey:
        secretKeyRef:
          name: my-cluster-minio
          key: accesskey
      secretAccessKey:
        secretKeyRef:
          name: my-cluster-minio
          key: secretkey
  1. 配置分布式日志:
apiVersion: monitoring.stack/v1
kind: DistributedLog
metadata:
  name: distributedlogs
spec:
  storage:
    size: 10Gi

创建分布式集群

完整的分布式集群配置如下:

apiVersion: database.stack/v1alpha1
kind: DistributedCluster
metadata:
  namespace: my-cluster
  name: my-distributed-cluster
spec:
  type: citus
  database: mydb
  coordinator:
    replicas: 2
    profile: small-instance
    config:
      dbConfig: pgconfig1
      poolConfig: poolconfig1
    scripts:
      - name: init-database
        fromSecret: pgbench-user-password-secret
  shards:
    count: 3
    replicasPerShard: 2
    profile: small-instance
    config:
      dbConfig: pgconfig1
      poolConfig: poolconfig1
  backups:
    - storage: backupconfig1
      schedule: '*/5 * * * *'
      retention: 6
  logs:
    distributedLog: distributedlogs
  monitoring:
    prometheus: true

脚本示例:

apiVersion: database.stack/v1
kind: DatabaseScript
metadata:
  name: cluster-scripts
spec:
  scripts:
    - name: create-user
      fromSecret: pgbench-user-password-secret
      path: pgbench-create-user-sql
    - name: create-tables
      database: mydb
      user: pgbench
      script: |
        CREATE TABLE pgbench_accounts (
            id integer NOT NULL,
            bid integer,
            balance integer,
            filler character(84)
        );      
    - name: distribute-tables
      database: mydb
      user: pgbench
      script: |
            SELECT create_distributed_table('pgbench_history', 'id');
标签: PostgreSQL

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。