这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
基于 Kubernetes 的子群集
Eon 模式使用子群集进行工作负载隔离和扩展。Vertica 操作器提供了工具以将外部客户端通信定向到特定子群集,以及在不停止数据库的情况下自动扩展。
自定义资源定义 (CRD) 提供参数,允许您针对特定工作负载微调每个子群集。例如,您可以增加子群集 size 设置以增加吞吐量,或调整资源请求和限制以管理计算能力。当您创建自定义资源实例时,操作器将每个子群集部署为 StatefulSet。每个 StatefulSet 都有一个服务对象,它允许外部客户端连接到特定子群集。
Kubernetes 使用子群集名称来派生子群集 StatefulSet、服务对象和 pod 的名称。这种命名约定将子群集对象紧密耦合在一起,以帮助 Kubernetes 有效地管理群集。如果要重命名子群集,则必须将其从 CRD 中删除并重新定义,以便操作器可以使用派生名称创建新对象。
重要
资源类型名称不能包含下划线字符。资源类型名称用于完全限定域名 (FQDN),并且 FQDN 不允许使用下划线字符。您必须提供一个符合 Kubernetes 准则 的有效名称。
例如,Vertica 服务器生成的默认子群集名称为 default_subcluster。此名称对 Kubernetes 资源类型无效。
外部客户端连接
外部客户端可以将特定的子群集作为目标,这些子群集在经过微调之后可以处理外部客户端的工作负载。每个子群集都有一个用来处理外部连接的服务对象。要将多个子群集作为单个服务对象的目标,请在自定义资源 (CR) 中为每个子群集分配相同的 spec.subclusters.serviceName 值。有关实施的详细信息,请参阅创建自定义资源。
操作器执行运行状况监控,检查 Vertica 守护程序是否在每个 pod 上运行。如果是,则操作器允许服务对象将流量路由到 pod。
默认情况下,服务对象从自定义资源名称和关联的子群集派生其名称,并使用 customResourceName-subclusterName 格式。使用 subclusters[i].serviceName CR 参数 覆盖默认命名格式并使用 metadata.name-serviceName 格式。
Vertica 支持以下服务对象类型:
-
ClusterIP:默认服务类型。此服务提供内部负载均衡,并设置仅可从子群集内部访问的稳定 IP 和端口。
-
NodePort:提供外部客户端访问。您可以为子群集中的每个主机节点指定一个端口号,以便为客户端连接打开。
-
LoadBalancer:使用云提供商负载均衡器根据需要创建 NodePort 和 ClusterIP 服务。有关实施的详细信息,请参阅 Kubernetes 文档 和云提供商文档。
有关配置的详细信息,请参阅创建自定义资源。
管理内部和外部工作负载
Vertica StatefulSet 与外部服务对象相关联。所有外部客户端请求都通过此服务对象发送,并在群集中的 pod 之间进行负载均衡。
导入和导出
在 Kubernetes 之外的群集之间导入和导出数据要求您公开具有 NodePort 或 LoadBalancer 服务类型的服务并正确配置网络。
重要
导入或导出数据时,每个节点都必须有一个静态 IP 地址。重新调度的 pod 可能位于其他主机节点上,因此您必须监控和更新静态 IP 地址以反映新节点。
有关详细信息,请参阅配置网络以导入和导出数据。
1 - 扩展子群集
操作器使您能够自动扩展子群集的数量以及每个子群集的 pod 数量。这使您可以根据工作负载的即时需求来利用或节省资源。
以下部分说明如何为新工作负载扩展资源。有关为现有工作负载扩展资源的详细信息,请参阅 VerticaAutoscaler 自定义资源。
先决条件
扩展子群集的数量
调整自定义资源中的子群集数量,以针对短期运行的仪表板查询微调资源。例如,增加子群集的数量以提高吞吐量。有关详细信息,请参阅使用子群集提高查询吞吐量。
-
使用 kubectl edit 打开默认文本编辑器并更新指定的自定义资源的 YAML 文件。以下命令打开名为 vdb 的自定义资源进行编辑:
$ kubectl edit vdb
-
在自定义资源的 spec 部分中,找到 subclusters 子部分。从 isPrimary 字段开始定义新的子群集。
isPrimary 字段接受一个布尔值,以指定子群集是主群集还是辅助群集。用于自定义资源中已经有一个主子群集,因此输入 false:
spec:
...
subclusters:
...
- isPrimary: false
-
按照创建自定义资源中的步骤完成子群集定义。以下已完成的示例为仪表板查询添加了一个辅助子群集:
spec:
...
subclusters:
- isPrimary: true
name: primary-subcluster
...
- isPrimary: false
name: dashboard
nodePort: 32001
resources:
limits:
cpu: 32
memory: 96Gi
requests:
cpu: 32
memory: 96Gi
serviceType: NodePort
size: 3
-
保存并关闭自定义资源文件。成功更新文件后,您会收到类似如下的消息:
verticadb.vertica.com/vertica-db 已编辑 (verticadb.vertica.com/vertica-db edited)
-
使用 kubectl wait 命令监控新 pod 何时准备就绪:
$ kubectl wait --for=condition=Ready pod --selector app.kubernetes.io/name=vertica-db --timeout 180s
pod/vdb-dashboard-0 condition met
pod/vdb-dashboard-1 condition met
pod/vdb-dashboard-2 condition met
扩展子群集中的 pod
对于长时间运行的分析查询,增加子群集的 pod 计数。请参阅使用 Elastic Crunch Scaling 提高查询性能。
-
使用 kubectl edit 打开默认文本编辑器并更新指定的自定义资源的 YAML 文件。以下命令打开名为 vdb 的自定义资源进行编辑:
$ kubectl edit vertica-db
-
将 subclusters.size 值更新为 6:
spec:
...
subclusters:
...
- isPrimary: false
...
size: 6
分片会自动重新平衡。
-
保存并关闭自定义资源文件。成功更新文件后,您会收到类似如下的消息:
verticadb.vertica.com/vertica-db 已编辑 (verticadb.vertica.com/vertica-db edited)
-
使用 kubectl wait 命令监控新 pod 何时准备就绪:
$ kubectl wait --for=condition=Ready pod --selector app.kubernetes.io/name=vertica-db --timeout 180s
pod/vdb-subcluster1-3 condition met
pod/vdb-subcluster1-4 condition met
pod/vdb-subcluster1-5 condition met
移除子群集
当不再需要子群集或为了保留资源时,移除子群集。
重要
由于每个自定义资源实例都需要一个主子群集,因此您无法移除所有子群集。
-
使用 kubectl edit 打开默认文本编辑器并更新指定的自定义资源的 YAML 文件。以下命令打开名为 vdb 的自定义资源进行编辑:
$ kubectl edit vertica-db
-
在 spec 下嵌套的 subclusters 子部分中,找到要删除的子群集。删除子群集数组中代表要删除的子群集的元素。每个元素由连字符 (-) 标识。
-
删除子群集并保存后,您会收到类似如下的消息:
verticadb.vertica.com/vertica-db 已编辑 (verticadb.vertica.com/vertica-db edited)
2 - VerticaAutoscaler 自定义资源
VerticaAutoscaler 自定义资源 (CR) 是一个 HorizontalPodAutoscaler,它使用以下策略之一自动扩展现有子群集的资源:
-
运行时间较短的仪表板查询的子群集扩展。
-
用于运行时间较长的分析查询的 Pod 扩展。
VerticaAutoscaler CR 使用资源或自定义指标进行扩展。Vertica 按工作负载管理子群集,这有助于您确定最佳指标以触发扩展事件。为了保持数据完整性,除非与 pod 的所有连接都已耗尽且会话已关闭,否则运算符不会缩减规模。
有关确定 VerticaAutoscaler 何时扩展的算法的详细信息,请参阅 Kubernetes 文档。
此外,VerticaAutoscaler 提供了一个 webhook 来验证状态更改。默认情况下,此 webhook 已启用。您可以使用 webhook.enableHelm 图表参数配置此 webhook。
参数
示例
此部分中的示例使用以下 VerticaDB 自定义资源。每个示例都使用 CPU 来触发扩展:
apiVersion: vertica.com/v1beta1
kind: VerticaDB
metadata:
name: dbname
spec:
communal:
path: "path/to/communal-storage"
endpoint: "path/to/communal-endpoint"
credentialSecret: credentials-secret
subclusters:
- name: primary1
size: 3
isPrimary: true
serviceName: primary1
resources:
limits:
cpu: "8"
requests:
cpu: "4"
先决条件
- 为触发扩展的指标设置一个值。例如,如果要按 CPU 利用率进行扩展,则必须设置 CPU 限制和请求。
子群集扩展
自动调整自定义资源中的子群集数量,以针对运行时间较短的仪表板查询优化资源。例如,增加子群集的数量以提高吞吐量。有关详细信息,请参阅使用子群集提高查询吞吐量。
所有子群集共享相同的服务对象,因此无需更改外部服务对象。新子群集中的 Pod 由现有服务对象进行负载均衡。
以下示例创建了一个 VerticaAutoscaler 自定义资源,当 VerticaDB 使用 50% 的节点可用 CPU 时,该资源将按子群集进行扩展:
-
在 YAML 格式的清单中定义 VerticaAutoscaler 自定义资源:
apiVersion: vertica.com/v1beta1
kind: VerticaAutoscaler
metadata:
name: autoscaler-name
spec:
verticaDBName: dbname
scalingGranularity: Subcluster
serviceName: primary1
-
使用 kubectl autoscale 命令创建 VerticaAutoscaler:
$ kubectl autoscale verticaautoscaler autoscaler-name --cpu-percent=50 --min=3 --max=12
上一命令创建了一个 HorizontalPodAutoscaler 对象:
Pod 扩展
对于长时间运行的分析查询,增加子群集的 pod 计数。有关 Vertica 和分析查询的其他信息,请参阅使用 Elastic Crunch Scaling 提高查询性能。
在 Eon 模式数据库中扩展 pod 时,必须考虑对数据库分片的影响。有关详细信息,请参阅分片和订阅。
以下示例创建了一个 VerticaAutoscaler 自定义资源,当 VerticaDB 占用 50% 的节点可用 CPU 时,该资源将按 pod 进行扩展:
-
在 YAML 格式的清单中定义 VerticaAutoScaler 自定义资源:
apiVersion: vertica.com/v1beta1
kind: VerticaAutoscaler
metadata:
name: autoscaler-name
spec:
verticaDBName: dbname
scalingGranularity: Pod
serviceName: primary1
-
使用 kubectl autoscale 命令创建 autoscaler 实例:
$ kubectl autoscale verticaautoscaler autoscaler-name --cpu-percent=50 --min=3 --max=12
上一命令创建了一个 HorizontalPodAutoscaler 对象:
事件监控
要查看 VerticaAutoscaler 对象,请使用 kubectl describe hpa 命令:
$ kubectl describe hpa autoscaler-name
Name: as
Namespace: vertica
Labels: <none>
Annotations: <none>
CreationTimestamp: Tue, 12 Apr 2022 15:11:28 -0300
Reference: VerticaAutoscaler/as
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 0% (9m) / 50%
Min replicas: 3
Max replicas: 12
VerticaAutoscaler pods: 3 current / 3 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
当发生扩展事件时,您可以查看 admintools 命令来扩展群集。使用 kubectl 查看 StatefulSets:
$ kubectl get statefulsets
NAME READY AGE
db-name-as-instance-name-0 0/3 71s
db-name-primary1 3/3 39m
使用 kubectl describe 查看正在执行的命令:
$ kubectl describe vdb dbname | tail
Upgrade Status:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ReviveDBStart 41m verticadb-operator Calling 'admintools -t revive_db'
Normal ReviveDBSucceeded 40m verticadb-operator Successfully revived database. It took 25.255683916s
Normal ClusterRestartStarted 40m verticadb-operator Calling 'admintools -t start_db' to restart the cluster
Normal ClusterRestartSucceeded 39m verticadb-operator Successfully called 'admintools -t start_db' and it took 44.713787718s
Normal SubclusterAdded 10s verticadb-operator Added new subcluster 'as-0'
Normal AddNodeStart 9s verticadb-operator Calling 'admintools -t db_add_node' for pod(s) 'db-name-as-instance-name-0-0, db-name-as-instance-name-0-1, db-name-as-instance-name-0-2'