DAOS 分布式异步对象存储|代理
DAOS 代理是一个后台进程,它充当客户端应用程序和 DAOS 系统之间的可信中介。必须在每个计算节点上运行 DAOS 代理进程,以便这些节点上的客户端操作能够成功执行。
证书
如果系统设置为正常模式(而不是不安全模式),则已为代理配置了一个 CommonName 为“agent”的证书,用以标识自身并证明用户凭据的有效性。
有关如何在 DAOS 中使用证书的更多详细信息,请参阅 Security documentation。
客户端通信
客户端进程使用在计算节点上设置的 UNIX 域套接字与 DAOS 代理通信。
UNIX 域套接字
UNIX 域套接字使用的默认目录是 /var/run/daos_agent
,也可以在代理配置文件中指定目录。目录必须存在,并且启动代理进程的用户必须具有对该目录的写访问权限,才能成功启动代理。代理打开套接字并监听来自本地客户端的通信。
DAOS 客户端库不读入配置文件。如果要为套接字使用非默认目录,则必须在环境变量 DAOS_AGENT_DRPC_DIR
中指定此目录,以便客户端库与代理通信。
dRPC
dRPC 协议用于在客户端和代理之间进行通信。所需的 dRPC 通信已被嵌入到客户端库中,客户端 API 的调用者对其不可见。
当客户端 API 作为 dRPC 客户端时,代理则作为 dRPC 服务器。代理不查询客户端库,代理的 dRPC 处理程序的实现位于 *_rpc.go
文件。
服务器通信
代理和 DAOS 控制平面服务器之间的通信是利用 gRPC 协议通过管理网络进行的。
访问点服务器在代理的配置文件中定义。
有关 gRPC 通信如何进行验证并保证安全性的详细信息,请参阅 Security documentation。
功能
代理提供的功能包括:
- 获取 DAOS service ranks 的附加信息。
- 生成服务器用于访问控制的已签名的客户端凭据。
客户端可以通过 dRPC 协议使用这些功能。
获取附加信息
客户端通信通过高速结构发送到数据平面引擎。
最初,客户端不知道这些 service ranks 的 URI。Primary Service Ranks (PSRs) 是客户端查询以获取集群中特定 service rank 的 URI 的引擎。一旦客户端库知道 PSR 并且选择了适当的网络设备,CaRT 上的客户端通信将被初始化,并将自动查询 PSR 以将 RPC 定向到正确的 service rank。
要获取 PSRs 和网络配置,客户端进程必须向代理发送 Get Attach Info 请求。
- 代理进程第一次收到请求时,会初始化 Get Attach Info 响应的缓存。
- 为了填充缓存,代理通过管理网络将此请求转发到访问点的控制平面服务器。
- 控制平面服务器再次将请求转发给本地数据平面实例,该实例查找 PSR 并将信息返回给代理。
- 代理扫描本地结构,以确定哪些网络设备可用于支持控制平面服务器使用的结构提供程序。它将确定找到的每个匹配网络设备的 NUMA 相关性。
- 代理将完全编码的响应存储到缓存中,该缓存封装每个 NUMA 节点的 PSR 和网络配置。每个 NUMA 节点支持多个网络设备。每个设备和 NUMA 节点的组合在缓存中都有自己的条目。
- 此时,Get Attach Info 缓存被初始化。对于此请求和后续所有请求,代理将检查与请求关联的客户端 PID,以确定其 NUMA 绑定(如果可用)。
- 然后,代理在缓存中进行索引,找到与客户端的 NUMA 关联相匹配的网络设备检索缓存响应,并将该响应返回给客户端,而无需在堆栈上进一步通信。
- 如果无法确定客户端的 NUMA 关联,或者没有可用的网络设备共享相同的关联,则从已知的网络设备中选择默认响应。如果没有网络设备,则选择使用环回设备编码的响应。
- 如果有多个网络设备共享同一 NUMA 关联,则缓存将包含每个设备的条目。代理使用循环选择 (round-robin selection) 算法来选择同一 NUMA 节点内的响应。
Get Attach Info 的负载包含网络配置参数,这些参数包括:
- OFI_INTERFACE
- OFI_DOMAIN
- CRT_TIMEOUT
- provider
- CRT_CTX_SHARE_ADDR
在启动之前,可以通过在客户端环境中设置 OFI_INTERFACE
、OFI_DOMAIN
和 CRT_TIMEOUT
这些环境变量中的任何一个来覆盖它们。DAOS 客户端库将使用 Get Attach Info 请求提供的值初始化 CaRT,除非被重写。
客户端需要此信息才能发送 RPC。
请求客户端凭据
某些客户端操作(如连接到 Pool)由访问控制进行控制。
由于客户端库可能被篡改或替换,因此无法信任它执行的访问检查或生成的凭据。相反,客户端必须查询代理以验证用户的身份,服务器使用此身份信息进行访问控制检查。
要为用户身份请求凭据,客户端需要向代理发送 Request Credentials 请求。代理检查用于发送请求以获取有效用户的 UID 的 UNIX 域套接字。由此,它生成一个 Auth Token。Auth Token 是有效负载的凭证和用于确认凭证完整性的校验值。Auth Token 返回到客户端库,客户端库将其打包为二进制 blob。这可以作为 RPC 负载的一部分发送到数据平面服务器。
在安全模式下,校验值是打包凭证上的签名,该签名使用代理证书的私钥。当数据平面服务器收到这个凭证时,它可以使用每个服务器拥有的一组已知代理证书来验证签名。这保证了凭证是由代理生成的,不会被篡改。
在非安全模式下,校验值只是凭证数据的散列。这只能验证凭证在传输过程中没有损坏,但不能防止篡改。
相关信息
Emai: debugzhang@163.com
DAOS: https://github.com/daos-stack/daos
本文翻译自 https://github.com/daos-stack/daos/blob/master/src/control/cmd/daos_agent/README.md
- 点赞
- 收藏
- 关注作者
评论(0)