跳转到内容

数据库集群

有些数据库最好以集群方式运行:多个节点复制数据并在节点故障时存活。Pier 可以在 WireGuard 网格上跨多台服务器部署这些集群,因此节点位于不同主机上,但仍能通过私有覆盖网络相互访问。

集群是按引擎选择性启用的,在目录模板中声明。有七种引擎支持它:

引擎拓扑最小节点数最大节点数
PostgreSQL流式复制(1 个主节点 + 只读副本)25
MySQL流式复制(1 个主节点 + 只读副本)25
MariaDB流式复制(1 个主节点 + 只读副本)25
MongoDB带自动主节点选举的副本集35
RedisSentinel 高可用(1 个主节点 + 副本 + sentinel)35
Cassandra基于种子发现的 Gossip 环25
ScyllaDBGossip 环(兼容 Cassandra)25

每个集群化引擎的默认节点数为 3。MongoDB 和 Redis 至少需要三个节点,它们基于法定人数的选举才能工作。没有集群部分的引擎——例如 PostGIS、TimescaleDB、Valkey 和 ClickHouse——以单个独立实例的方式部署。

你在创建资源时通过选择集群模式并将每个节点分配到一台服务器来选择集群:

  • 如果每个节点都落在同一台服务器上,Pier 为该集群构建一个单主机 Compose 堆栈。
  • 如果节点分布在多台服务器上,Pier 部署一个分布式集群。每台目标服务器都必须处于活动的 WireGuard 网格上,否则请求会被拒绝——节点通过网格 IP 和发布的主机端口相互访问。

Cassandra 和 ScyllaDB 在分布式时有一个额外约束:每台服务器一个节点,因为它们的 gossip 端口是固定的,同一主机上的两个节点会冲突。

POST /api/v1/resources/{id}/scale 更改总节点数,传入新的 node_count。Pier 会对照引擎的最小和最大边界进行验证,重新生成集群,并保留现有节点的放置位置。移除节点会使用引擎自身的下线路径(如果存在)——Cassandra 和 ScyllaDB 用 nodetool decommission,MongoDB 在主节点上用 rs.remove()

负载均衡(/load-balance)针对的是无状态服务副本,而非数据库集群。集群化的数据库通过 /scale 进行伸缩;load-balance 端点会拒绝集群模式的服务。

GET /api/v1/resources/{id}/nodes 查看集群的节点和连接详情。对于分布式集群,Pier 会自动为引擎组装正确的连接形式:

  • MongoDB —— 一个副本集 URI,列出每个节点的网格地址,以 ?replicaSet=rs0 结尾。
  • Redis —— 一个 Sentinel 配置:sentinel 地址列表加上你的客户端通过其连接的主节点集名称。

其他引擎返回它们的节点列表而不带合成的 URI;你需根据该引擎的具体情况将应用指向主节点(或联系点)。