Eon 模式数据库的节点会根据需要从公共存储中提取数据以处理查询,并将该数据缓存在本地磁盘上。子群集内所有节点的缓存数据将构成该群集的存储库。Vertica 使用存储库来加快查询执行:在处理查询时,Vertica 会先检查当前存储库中是否包含所需的数据。如果数据不可用,Vertica 会从公共存储中提取数据并将副本保存在存储库中以加快将来查询的速度。此外,Vertica 还会使用存储库保存加载操作,以便在将新加载的数据上传到公共存储之前将其缓存在存储库中。
1 - 管理存储库缓存
您可以通过多种方式控制存储库缓存:
-
配置网关参数,以便存储库仅缓存已查询的数据或已加载的数据。
-
控制从公共存储中提取查询数据。
您可以使用多个 V_MONITOR
系统表或管理控制台来监控存储库活动和设置。
注意
仅在主分片订户节点上支持缓存存储库。存储库网关参数
Vertica 存储库可以缓存两种类型的数据:
-
已查询的数据:存储库可通过从公共存储中提取已查询的数据并将其缓存到存储库中来提高查询执行速度。已缓存的数据将保持可用状态,直到被逐出以便为更新的数据腾出空间,或者为更新的查询提取的数据腾出空间。
-
已加载的数据:存储库可通过临时缓存数据直到将其上传到公共存储,来加快 COPY 等加载操作。
默认情况下,将存储库配置为缓存这两种类型的数据。
以下两个配置参数确定存储库是缓存已查询的数据还是已加载的数据:
这两个参数都可以在会话级别、用户级别和数据库级别进行设置。
如果在会话或用户级别设置,则这些参数可用于隔离不同子群集存储库上的读取和写入活动。例如,可以按如下所示为用户 joe
和 rhonda
设置参数 UseDepotForReads 和 UseDepotForWrites:
=> SHOW USER joe ALL;
name | setting
-------------------------+---------
UseDepotForReads | 1
UseDepotForWrites | 0
(2 rows)
=> SHOW USER rhonda ALL;
name | setting
-------------------------+---------
UseDepotForReads | 0
UseDepotForWrites | 1
(2 rows)
鉴于这些用户设置,当 joe
连接到 Vertica 子群集时,他的会话将仅使用当前存储库来处理查询;所有加载操作都会上传到公共存储。相反,rhonda
的会话将仅使用存储库来处理加载操作;所有查询都必须从公共存储中提取数据。
存储库提取
如果已启用存储库以缓存已查询的数据 (UseDepotForReads = 1
),您可以使用配置参数 DepotOperationsForQuery 配置它从公共存储中提取数据的方式。此参数具有三个设置:
-
ALL
(默认值):从公共存储中提取文件数据,如有必要,通过将现有文件从存储库中逐出来替换它们。 -
FETCHES
:仅当空间可用时才从公共存储中提取文件数据;否则,直接从公共存储中读取查询的数据。 -
NONE
:请勿将文件数据提取到存储库,而应直接从公共存储中读取查询的数据。
您可以按优先级升序在四个级别设置提取行为:
-
按查询: DEPOT_FETCH 提示
例如,您可以在数据库级别设置 DepotOperationsForQuery,如下所示:
=> ALTER DATABASE default SET PARAMETER DepotOperationsForQuery = FETCHES;
ALTER DATABASE
此设置适用于所有数据库存储库,除非在其他级别被覆盖。例如,以下 ALTER USER 语句指定了在处理来自用户 joe
的查询时存储库的提取行为:
=> ALTER USER joe SET PARAMETER DepotOperationsForQuery = ALL;
ALTER USER
最后,joe
可以通过在各个查询中包含 DEPOT_FETCH 提示来覆盖他自己的 DepotOperationsForQuery 设置:
SELECT /*+DEPOT_FETCH(NONE)*/ count(*) FROM bar;
逐出存储库数据
通常,Vertica 会根据需要从存储库中逐出数据,以便为新数据提供空间和加快请求处理。在将新数据写入存储库之前,Vertica 会按如下方式对其进行评估:
-
从公共存储中提取的数据:Vertica 会调整下载大小并相应地从存储库中逐出数据。
-
从 DML 操作(例如 COPY)上传的数据:Vertica 无法在上传完成之前估计其总大小,因此它会根据需要调整各个缓冲区的大小并从存储库中逐出数据。
在这两种情况下,Vertica 都会评估现有的存储库数据并按优先级降序(最易受到攻击到最不易受到攻击)确定要从如下存储库中逐出的对象:
-
为任何新的固定或未固定对象逐出最近最少使用的未固定对象。
-
为新的固定对象逐出最近最少使用的固定对象。
固定存储库对象
您可以对数据库对象设置存储库固定策略,以减少它们被逐出的风险。可以在各个子群集或整个数据库上以及不同的粒度级别(表、投影和分区)设置固定策略:
默认情况下,系统会根据需要将固定对象排入从公共存储下载的队列,以执行查询或 DML 操作。SET_DEPOT_PIN_POLICY 函数可以指定覆盖此行为并立即将新固定的对象排入下载队列:将该函数的最后一个布尔值实参设置为 true
。
在以下示例中,SET_DEPOT_PIN_POLICY_TABLE 会固定表 foo
的数据,并指定立即将数据排入下载队列:
=> SELECT SET_DEPOT_PIN_POLICY_TABLE ('foo', 'default_subluster', true );
提示
Vertica 从公共存储下载固定对象的速度取决于许多因素,包括空间可用性以及排入下载队列的其他固定对象的优先级。您可以通过调用 FINISH_FETCHING_FILES 来强制立即下载已排队的对象。使用准则
将一个或多个对象固定在存储库上会影响其保留已提取(已查询)的数据已上传(新加载)的数据。如果固定对象占用的存储库空间过多,则存储库可能无法处理未固定对象上的加载操作。在这种情况下,请将配置参数 UseDepotForWrites 设置为 0,以便将加载操作直接路由到公共存储进行处理。否则,加载操作很可能会返回错误。
为了尽量减少争用存储库的现象,请考虑以下准则:
-
仅固定 DML 操作和查询中最活跃的对象。
-
通过在最小的有效级别中设置策略(例如,仅限固定表的活动分区的数据),可以最小化固定数据的大小。
存储库预热
启动时,新节点的存储库为空,而重新启动节点的存储库通常包含必须刷新的陈旧数据。启用存储库预热后,正在启动的节点会抢先加载其存储库,其中包含频繁查询和固定的数据。当节点完成启动并开始执行查询时,它的存储库已经包含了处理这些查询所需的大部分数据。这减少了从公共存储中提取数据的需要,并相应地提高了查询性能。
注意
将数据提取到预热存储库时,可能会导致节点延迟启动。默认情况下,存储库预热处于禁用状态 (EnableDepotWarmingFromPeers = 0)。节点将按如下所示执行存储库预热:
-
节点会检查配置参数 PreFetchPinnedObjectsToDepotAtStartup。如果启用(设置为 1),则节点:
-
从数据库编录中获取此节点的子群集上固定的所有对象的列表。
-
将已固定的对象排入队列以进行获取并计算它们的总大小。
-
-
节点会检查配置参数 EnableDepotWarmingFromPeers。如果启用(设置为 1),则节点:
-
标识可以复制其存储库内容的同一子群集中的对等节点。
-
在考虑所有已固定的对象后,计算预热存储库中的剩余可用空间。
-
从对等节点获取最近使用过的对象(可放入存储库)的列表。
-
将对象排入队列以进行提取。
-
-
如果 BackgroundDepotWarming 处于启用状态(默认设置为 1),则节点会在预热时将已排队的对象加载到其存储库中,并在节点变为活动状态并开始执行查询后继续在后台执行此操作。否则 BackgroundDepotWarming = 0,节点激活将被推迟,直到存储库提取并加载所有已排队的对象为止。
监控存储库
您可以使用多个 V_MONITOR 系统表来监控存储库活动和设置。
提示
您还可以使用管理控制台来监控存储库活动。有关详细信息,请参阅 在 MC 中监控存储库活动2 - 调整存储库缓存容量
Eon 数据库中的每个节点都将存储库数据缓存在预定义的存储位置。存储位置路径取决于 Vertica 安装的文件系统。默认情况下,群集中的每个节点最多可以使用存储位置文件系统上 60% 的磁盘空间来缓存存储库数据。您可以使用 ALTER_LOCATION_SIZE 通过指定固定大小或总磁盘空间的百分比来更改缓存容量。该函数可以指定单个节点、子群集或数据库群集中的所有节点。您可以将每个节点的存储库缓存容量提高多达 80%。
在以下示例中,ALTER_LOCATION_SIZE 将存储库缓存容量增加到存储位置文件系统上磁盘空间的 80%。该函数提供一个空字符串作为第二个 (node-name) 实参,因此更改应用于所有节点:
重要
默认情况下,存储库缓存容量不能超过存储位置文件系统上磁盘空间的 80%;尝试将其设置为更高的值会返回错误。Vertica 需要至少 20% 的磁盘空间用于编录、数据收集器表和临时文件。=> SELECT node_name, location_label, location_path, max_size, disk_percent FROM storage_locations WHERE location_usage = 'DEPOT' ORDER BY node_name;
node_name | location_label | location_path | max_size | disk_percent
------------------+-----------------+-------------------------+-------------+--------------
v_vmart_node0001 | auto-data-depot | /home/dbadmin/verticadb | 36060108800 | 70%
v_vmart_node0002 | auto-data-depot | /home/dbadmin/verticadb | 36059377664 | 70%
v_vmart_node0003 | auto-data-depot | /home/dbadmin/verticadb | 36060108800 | 70%
(3 rows)
=> SELECT alter_location_size('depot', '','80%');
alter_location_size
---------------------
depotSize changed.
(1 row)
=> SELECT node_name, location_label, location_path, max_size, disk_percent FROM storage_locations WHERE location_usage = 'DEPOT' ORDER BY node_name;
node_name | location_label | location_path | max_size | disk_percent
------------------+-----------------+-------------------------+-------------+--------------
v_vmart_node0001 | auto-data-depot | /home/dbadmin/verticadb | 41211552768 | 80%
v_vmart_node0002 | auto-data-depot | /home/dbadmin/verticadb | 41210717184 | 80%
v_vmart_node0003 | auto-data-depot | /home/dbadmin/verticadb | 41211552768 | 80%
(3 rows)
重新调整存储库容量
当数据库在磁盘空间大于或小于以前空间的实例上恢复时,Vertica 会评估以前有效的存储库大小设置。如果将库大小指定为可用磁盘空间的百分比,Vertica 会按比例重新调整存储库容量。例如,如果给定节点的存储库缓存容量设置为 70%,则恢复的节点会将该设置应用于新磁盘空间,并相应地调整存储库缓存容量。如果存储库容量设置为固定大小,Vertica 会应用该设置,除非这样做会消耗 80% 以上的可用磁盘空间。在这种情况下,Vertica 会根据需要自动调整存储库大小。