这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
基于 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.enable
Helm 图表参数配置此 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'