在 Kubernetes 上使用本地卷进行 PostgresXL 的实验设置

在 Kubernetes 上使用本地卷进行 PostgresXL 的实验设置

我正在做一个思想实验关于部署PostgresXL在 Kubernetes (k8s) 上,每个数据节点使用本地(直接连接)贮存。


假设我们有以下节点:

  • 2x配备速度超快的 Optane DC SSD 和 NVDIMM 的高端机器。这些节点已在 k8s 中注册并标记为type: datanode
  • 1x机器在 k8s 上注册并标记为type: GTM
  • 2x在 k8s 上注册并标记为 的机器type: coodinator

假设每个标签创建一个“节点组”(例如,type: datanode标签组成一个包含两个节点的组)。
我们还假设每个节点都有一个/data挂载点(在主机操作系统中),该挂载点映射到其底层最快的磁盘(或 LVM 逻辑卷)。

我将部署如下架构:

                        --------------
                        |   gtm_0    |
                        --------------
                       / |          | \
                     /   |          |   \
                   /     |          |     \
                 /       |          |       \
               /         |          |         \
             /           |          |           \
           /             |          |             \
         /               |          |               \
       /       ------------        ------------      \
      |        | coord_0  |        | coord_1  |       |
      |        ------------        ------------       |
      |       /             \    /             \      |
      |     /                 \/                 \    |
------------      ------------/\------------      ------------
|  data_0  |     /                          \     |  data_1  |
------------ ----                            ---- ------------

这来自于postgres-xl docker 撰写图像

我希望最终水平扩展这三个节点类别,并且我需要为每个节点起一个稳定的名称,因此我将创建三个StatefulSet(每个都由相同的无头服务支持):ss-datanodesss-gtmsss-coords在每个节点中,StatefulSetpod 模板将仅选择相关节点(例如: podtype: datanode的节点ss-datanodes)并具有适当的图像(例如:集合的 GTM ss-gtms)。

这将允许 k8s 对同一节点组内的 pod 进行“洗牌”。

但是,我不想使用任何 NAS,每个 pod 只能使用数据采集​​系统以最大限度地提高性能。
为此,我创建了一个StorageClass不带配置的,并将绑定模式设置为“WaitForFirstConsumer”的。
然后我将创建一个 PersistentVolumes,这些 PV 将属于以下类型local,指向/data挂载点,仅在 上有所不同nodeAffinity
我还会创建一个 PersistenceVolumeClaim(PVC)与伴随 PV 匹配。

最后,我会在 s 中的 pods 模板中添加 PVC StatefulSet

这应该允许 k8s:

  • 仅在其节点组中调度组件(GTM,Coordinator,DataNode)。
  • 将节点组中的 pod 进行混洗。
  • /data挂载点在每个 pod 上都可用。

我对 PostgresXL 做出以下假设:

  • 组件可以按任意顺序启动(例如 coord_0、data_1、gtm_0、data_0、coord_1)。
  • 每个组件都可以处理由同一类型的另一个组件写入的数据(例如,可以交换 data_0 和 data_1 pod,并使用另一个数据并继续工作)。这似乎并不不合理,因为 pod 保留的唯一身份是其主机名。

这个设置适用于 PostgresXL 吗?使用 k8s 我能得到什么?

K8s 的一个有用功能是 HPA,它可用于自动添加另一个数据节点并进行扩展ss-datanodes
但是,我在网上看到,K8s 中的状态管理很难。但这个设置并不难,所以我一定错过了什么。

相关内容