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 以删除仅缓存的镜像或仅排队的镜像或两者。标头可能的取值是 cachequeueboth

  • 或者,您可以使用 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_DIRimage_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>