Auditor Watchers

概述

审计器的职责是防止 Swift 存储介质中的数据损坏。但由于审计器会遍历所有对象,因此它们可以被用来编程 Swift 以对每个对象进行操作。这通过一个称为“watcher”(观察者)的 API 实现。

观察者没有对集群的任何私有访问权限。操作员可以编写一个独立的程序来遍历目录并执行任何所需的检查或维护。观察者提供的优势在于,它提供了一个框架,可以在审计器已经存在的资源限制下完成相同的工作。

观察者执行的操作通常是特定于站点的,否则它们将直接集成到 Swift 中。但是,树中的代码提供了一个参考实现以方便使用。它位于 swift/obj/watchers/dark_data.py 中,并实现了所谓的“Dark Data Watcher”(暗数据观察者)。

目前,只有对象审计器支持观察者。

API 类

观察者的实现是一个 Python 类,其结构可能如下所示

class MyWatcher(object):

  def __init__(self, conf, logger, **kwargs):
      pass

  def start(self, audit_type, **kwargs):
      pass

  def see_object(self, object_metadata, policy_index, partition,
                 data_file_path, **kwargs):
      pass

  def end(self, **kwargs):
      pass

观察者方法的参数作为关键字参数传递,并且方法预计能够处理新的、未知的参数。

__init__() 方法用于在插件启动时保存配置和日志记录器。

start() 方法在审计器启动一个 pass 时被调用。它通常会重置计数器。参数 auditor_type 是一个字符串,表示运行观察器的审计器的类型,为 “ALL”“ZBF”。与网络通信的观察者倾向于挂载到 ALL 类型的审计器上,而轻量级的观察者则可以使用 ZBF 类型。

end() 方法是 start() 的结束标记。它通常用于记录一些信息或转储一些统计数据。

see_object() 方法在审计器完成对一个对象的审计时被调用。大部分工作都在这里完成。

see_object() 的协议允许它引发一个特殊的异常,QuarantienRequested(隔离请求)。审计器会捕获该异常并隔离该对象。通常,观察者方法可以抛出异常,因此观察者插件的作者不必使用 try: 显式地捕获它们;它们可以自然地冒泡向上。

加载插件

Swift 审计器从 eggs 加载观察者类,因此有必要包装该类并提供一个入口点

$ cat /usr/lib/python3.8/site-p*/mywatcher*egg-info/entry_points.txt
[mywatcher.mysection]
mywatcherentry = mywatcher:MyWatcher

操作员通过将插件添加到 object-server.conf 文件中的 [object-auditor] 部分来告诉 Swift 审计器要加载哪些插件。也可以传递参数,这些参数会到达 start() 方法的参数 conf{} 中

[object-auditor]
watchers = mywatcher#mywatcherentry,swift#dark_data

[object-auditor:watcher:mywatcher#mywatcherentry]
myparam=testing2020

完成操作后,请不要忘记从审计器中删除观察者。虽然 API 本身非常轻量级,但观察者通常会产生显著的性能损失:它们可以与网络服务通信或访问其他对象。

Dark Data Watcher(暗数据观察者)

观察者 API 预计仍在开发中。需要扩展的操作员欢迎报告对 see_object() 更多参数的任何需求。

已经提供了 Dark Data 观察者作为示例。如果操作员想要创建自己的观察者,请从复制提供的示例模板 swift/obj/watchers/dark_data.py 开始,并查看它是否足够。