The Glance Image Cache¶
Glance API 服务器可以配置为具有可选的本地镜像缓存。本地镜像缓存存储镜像文件的副本,基本上使多个 API 服务器能够提供相同的镜像文件,从而提高可扩展性,因为有更多的端点提供镜像文件。
此本地镜像缓存对最终用户是透明的——也就是说,最终用户不知道 Glance API 是从其本地缓存还是从实际的后端存储系统流式传输镜像文件。
管理 Glance 镜像缓存¶
虽然镜像文件在成功请求 GET /images/<IMAGE_ID> 时会自动放置在镜像缓存中,但镜像缓存不会自动管理。在这里,我们描述了如何在 Glance API 服务器上管理本地镜像缓存以及如何自动化此缓存管理的基本方法。
镜像缓存的配置选项¶
Glance 缓存使用两个文件:一个用于配置服务器,另一个用于实用程序。glance-api.conf 用于服务器,glance-cache.conf 用于实用程序。
以下选项同时存在于两个配置文件中。它们需要相同的值,否则缓存可能会出现问题。
image_cache_dir这是 Glance 存储缓存数据的基本目录(需要设置,因为没有默认值)。image_cache_sqlite_db用于缓存管理的 sqlite 文件数据库的路径。这是从image_cache_dir目录的相对路径(默认值:cache.db)。image_cache_driver用于缓存管理的驱动程序(默认值:sqlite)。image_cache_max_size当 glance-cache-pruner 将删除最旧的镜像时的大小,以减少字节数,直到低于此值(默认值:10 GB)。image_cache_stall_time不完整镜像在缓存中保留的时间量,在此之后将删除不完整镜像(默认值:1 day)。
以下值是特定于 glance-cache.conf 的值,并且仅需要预取器才能正确运行。
filesystem_store_datadir如果使用文件系统存储,则指向数据存储的位置。filesystem_store_datadirs用于指向多个文件系统存储。
控制镜像缓存的增长¶
镜像缓存具有可配置的最大大小(image_cache_max_size 配置文件选项)。image_cache_max_size 是一个上限,超过该上限,pruner(如果正在运行)将开始清理镜像缓存。但是,当从对 GET /images/<IMAGE_ID> 的调用成功返回镜像时,镜像缓存会自动将镜像文件写入其缓存,无论写入结果是否会导致镜像缓存的大小超过 image_cache_max_size 的值。为了使镜像缓存保持在此最大缓存大小或低于此最大缓存大小,您需要运行 glance-cache-pruner 可执行文件。
推荐的做法是使用 cron 以定期间隔触发 glance-cache-pruner。
清理镜像缓存¶
随着时间的推移,镜像缓存可能会积累处于停滞或无效状态的镜像文件。停滞的镜像文件是由于镜像缓存写入未能完成而导致的。无效的镜像文件是由于镜像文件未正确写入磁盘而导致的。
要删除这些类型的文件,您需要运行 glance-cache-cleaner 可执行文件。
推荐的做法是使用 cron 以半定期间隔触发 glance-cache-cleaner。
使用 V2 API 控制镜像缓存¶
在 Yoga 中,Glance API 添加了用于管理缓存相关操作的新 API。在 Zed 中,Glance 删除了对 cache_images 定期作业的支持,该作业用于并发预取所有排队的镜像,并记录每个镜像的获取结果。相反,镜像可以在排队进行缓存后立即缓存。您可以使用以下 API 调用来控制缓存相关操作。
要将镜像排队进行立即缓存,您可以使用以下方法之一
您可以调用
PUT /cache/<IMAGE_ID>以使用标识符<IMAGE_ID>将镜像排队进行立即缓存或者,您可以使用 glance 客户端的
cache-queue命令将镜像排队进行立即缓存。$ glance cache-queue <IMAGE_ID>
这将使用标识符
<IMAGE_ID>将镜像排队进行立即缓存。
要找出哪些镜像在镜像缓存中,您可以使用以下方法之一
您可以调用
GET /cache以查看 JSON 序列化的列表,其中显示了缓存的镜像、每个镜像的缓存命中次数、镜像的大小以及上次访问时间以及排队进行缓存的镜像。或者,您可以使用 glance 客户端的
cache-list命令。示例用法$ glance cache-list
要删除已缓存或已排队进行缓存的镜像,您可以使用以下方法之一
您可以调用
DELETE /cache/<IMAGE_ID>以从缓存或排队状态中删除具有标识符<IMAGE_ID>的镜像文件。或者,您可以使用 glance 客户端的
cache-delete命令。示例用法$ glance cache-delete <IMAGE_ID>
您还可以调用
DELETE /cache并使用标头x-image-cache-clear-target以删除仅缓存的镜像或仅排队的镜像或两者。标头可能的取值是cache、queue、both。或者,您可以使用 glance 客户端的
cache-clear命令以删除仅缓存的镜像或仅排队的镜像或两者。示例用法$ glance cache-clear (default target is ``both``) $ glance cache-clear --target cached $ glance cache-clear --target queued
在 Glance 中,镜像缓存是每个节点的本地缓存,因此必须在每个节点本地执行缓存操作。如果 OpenStack 云使用 HA(3/5/7 个控制器)部署,则在运行缓存相关操作时,必须使用 -H 选项指定 HOST 地址。示例用法
$ glance --host=<HOST> cache-list
使用 glance-cache-manage 查找镜像缓存中的哪些镜像¶
您可以使用以下方法之一来找出哪些镜像在镜像缓存中
如果应用程序管道中启用了
cachemanage中间件,您可以调用GET /cached-images以查看 JSON 序列化的列表,其中显示了缓存的镜像、每个镜像的缓存命中次数、镜像的大小以及上次访问时间。或者,您可以使用
glance-cache-manage程序。此程序可以从包含镜像缓存的主机以外的主机运行。示例用法$ glance-cache-manage --host=<HOST> list-cached
在 Glance 中,镜像缓存是每个节点的本地缓存,因此必须在每个节点本地执行镜像缓存管理。如果 OpenStack 云使用 HA(3/5/7 个控制器)部署,则在运行缓存管理时,必须使用 -H 选项指定 HOST 地址。示例用法
$ glance-cache-manage --host=<HOST> list-cached
您可以在 *nix 系统上发出以下调用(在包含镜像缓存的主机上)
$ ls -lhR $IMAGE_CACHE_DIR
其中
$IMAGE_CACHE_DIR是image_cache_dir配置变量的值。请注意,使用此方法无法显示镜像的缓存命中次数。
使用 glance-cache-manage 手动从镜像缓存中删除镜像¶
如果启用了 cachemanage 中间件,您可以调用 DELETE /cached-images/<IMAGE_ID> 以从缓存中删除具有标识符 <IMAGE_ID> 的镜像文件。
或者,您可以使用 glance-cache-manage 程序。示例用法
$ glance-cache-manage --host=<HOST> delete-cached-image <IMAGE_ID>