使用PostgreSQL表空间和Percona Operator f雷竞技下载官网or PostgreSQL¶
表空间允许dba将数据库存储在同一服务器内的多个文件系统上,并控制数据库的特定部分存储在何处(存储在哪些文件系统上)。您可以把它想象成为磁盘挂载指定名称,然后在创建数据库对象时使用这些名称作为附加参数。
PostgreSQL支持这个特性,允许你将数据存储在主数据目录之外Percon雷竞技下载官网a Operator for PostgreSQL是一个很好的选择,可以在需要的时候把它带到Kubernetes环境中。
可能的用例¶
表空间最明显的用例是性能优化。您将数据库的适当部分放在快速但昂贵的存储上,并为较少使用的数据库对象使用较慢但便宜的存储。经典的例子是使用SSD来处理频繁使用的索引,而使用大而慢的HDD来处理归档数据。
当然是操作者已经提供了你和传统的Kubernetes方法在每荚的基础上实现这一点(公差等)。但是,如果您想更深入地在数据库对象(表和索引)级别上进行这种区分,那么表空间正是您所需要的。
表空间的另一个众所周知的用例是,当初始使用的分区空间用完且无法扩展时,快速向数据库集群添加一个新分区(对于云存储来说,这种情况可能不太典型)。最后,在将现有架构迁移到云中时可能需要表空间。
Percona Operator为PostgreSQL雷竞技下载官网创建的每个表空间都对应一个单独的持久卷,挂载在容器中/表空间目录中。
创建新的表空间¶
在Kubernetes中为数据库提供一个新的表空间包括两部分:
- 使用Operator配置新的表空间存储,
- 使用PostgreSQL在此表空间中创建数据库对象。
第一部分是通过Percona操作符的传统方式完成的,通过雷竞技下载官网部署/ cr.yaml配置文件。它有一个特别的spec.tablespaceStorages子节名称等于PostgreSQL表空间名称。
中已经给出的例子部署/ cr.yaml显示如何创建命名的表空间存储湖1Gb大小的动态配置(您可以看到Kubernetes关于持久卷的官方文档细节):
规范:…tablespaceStorages:湖:volumeSpec:大小:1克accessmode:ReadWriteOncestoragetype:动态storageclass:""matchLabels:""
应用此操作后,运行Kubectl apply -f deploy/cr.yaml命令,新的湖表空间将出现在数据库中。请注意,如果您将新的表空间添加到已经存在的PostgreSQL集群中,操作员可能需要一段时间来创建持久卷声明并实际挂载持久卷。
现在可以追加了表空间< tablespace_name >到你的创建SQL语句来隐式地在特定的表空间中创建表、索引甚至整个数据库(当然,您的用户应该有适当的创建特权使之成为可能)。
让我们在前面提到的例子中创建一个表湖表空间:
创建表格产品(product_sku字符(10),数量int,manufactured_datetimestamptz)表空间湖;
属性设置默认表空间也是可能的SET default_tablespace = <表空间名>;声明。这将进一步影响到所有人创建表和创建索引没有显式表空间说明符的命令,直到使用空字符串取消设置。
正如你所看到的,Percona 雷竞技下载官网Operator for PostgreSQL通过对持久卷和pod进行所有必要的修改简化了表空间的创建。对于已经存在的表空间的删除则不是这样,因为这不是由Operator或PostgreSQL自动执行的。
删除已有表空间¶
在Kubernetes数据库中删除一个现有的表空间也包括两部分:
- 使用PostgreSQL删除相关数据库对象和表空间,
- 删除Kubernetes表空间存储。
要使用PostgreSQL删除表空间,你应该让这个表空间为空(直到使用此表空间的所有数据库中的所有对象已被删除)。表空间列在pg_tablespace表,您可以使用它来查找哪些对象存储在特定的表空间中。命令的示例湖表空间如下所示:
选择relname从pg_class在哪里reltablespace=(选择oid从pg_tablespace在哪里spcname=“湖”);
当您的表空间为空时,可以登录PostgreSQL主实例作为一个超级用户,然后执行DROP TABLESPACE 命令。
现在,当PostgreSQL部分完成时,您可以从tablespaceStorages部分(不要忘记运行Kubectl apply -f deploy/cr.yaml命令来应用更改)。
但是,持久卷仍将被挂载到/表空间目录在PostgreSQL Pods。要删除这些挂载,您应该进行编辑所有部署对象为pgPrimary和pgReplica实例,并删除体积和VolumeMount表空间相关的表项。
您可以使用kubectl看到Deployment对象的列表得到部署命令。为一个名为cluster1输出结果如下:
NAME READY updated AVAILABLE AGE cluster1 1 1 156m cluster1-backrest-shared-repo 1/1 1 1 156m cluster1-pgbouncer 3/3 3 3 154m cluster1-repl1 1 1 154m cluster1-repl2 1 1 154m postgres-operator 1/1 1 1 157m
现在运行Kubectl编辑部署为cluster1,cluster1-repl1,cluster1-repl2因此对象。每个命令将打开一个文本编辑器,您应该在其中删除适当的行,如果湖表空间如下所示:
…规范:…容器:-名字:数据库…volumeMounts:-名字:tablespace-lakemountPath:表空间/湖卷:…——名字:tablespace-lakepersistentVolumeClaim:claimName:cluster1-tablespace-lake…
完成编辑将导致重新创建pod而不挂载表空间。