注意

本文档适用于 Ceph 的开发版本。

故障排除

网关无法启动

如果无法启动网关(即没有现有的 pid),请检查是否存在另一个用户的 .asok 文件。如果存在另一个用户的 .asok 文件且没有正在运行的 pid,请删除 .asok 文件并尝试再次启动进程。当您以 root 用户启动进程,而启动脚本试图以 www-dataapache 用户启动进程时,可能会发生这种情况,并且现有的 .asok 文件会阻止脚本启动守护程序。

radosgw init 脚本 (/etc/init.d/radosgw) 还有一个 verbose 参数,可以提供一些关于问题所在的见解

/etc/init.d/radosgw start -v

/etc/init.d radosgw start --verbose

HTTP 请求错误

检查 Web 服务器本身的访问日志和错误日志可能是识别正在发生的事情的第一步。如果出现 500 错误,通常表示与 radosgw 守护程序通信有问题。确保守护程序正在运行,其套接字路径已配置,并且 Web 服务器正在正确的位置查找它。

radosgw 进程崩溃

如果 radosgw 进程死亡,您通常会从 Web 服务器(apache、nginx 等)看到 500 错误。在这种情况下,只需重新启动 radosgw 即可恢复服务。

要诊断崩溃原因,请检查 /var/log/ceph 中的日志和/或核心文件(如果已生成)。

radosgw 请求被阻止

如果某些(或所有)radosgw 请求似乎被阻止,您可以通过其管理套接字了解 radosgw 守护程序的内部状态。默认情况下,将配置一个位于 /var/run/ceph 的套接字,并且可以使用以下命令查询守护程序

ceph daemon /var/run/ceph/client.rgw help

help                list available commands
objecter_requests   show in-progress osd requests
perfcounters_dump   dump perfcounters value
perfcounters_schema dump perfcounters schema
version             get protocol version

特别感兴趣的是

ceph daemon /var/run/ceph/client.rgw objecter_requests
...

将转储有关当前正在进行的与 RADOS 集群的请求的信息。这允许识别是否有任何请求被无响应的 OSD 阻止。例如,您可能会看到

{ "ops": [
      { "tid": 1858,
        "pg": "2.d2041a48",
        "osd": 1,
        "last_sent": "2012-03-08 14:56:37.949872",
        "attempts": 1,
        "object_id": "fatty_25647_object1857",
        "object_locator": "@2",
        "snapid": "head",
        "snap_context": "0=[]",
        "mtime": "2012-03-08 14:56:37.949813",
        "osd_ops": [
              "write 0~4096"]},
      { "tid": 1873,
        "pg": "2.695e9f8e",
        "osd": 1,
        "last_sent": "2012-03-08 14:56:37.970615",
        "attempts": 1,
        "object_id": "fatty_25647_object1872",
        "object_locator": "@2",
        "snapid": "head",
        "snap_context": "0=[]",
        "mtime": "2012-03-08 14:56:37.970555",
        "osd_ops": [
              "write 0~4096"]}],
"linger_ops": [],
"pool_ops": [],
"pool_stat_ops": [],
"statfs_ops": []}

在此转储中,有两个请求正在进行中。last_sent 字段是发送 RADOS 请求的时间。如果这是很久以前的事,则表明 OSD 没有响应。例如,对于请求 1858,您可以使用以下命令检查 OSD 状态

ceph pg map 2.d2041a48

osdmap e9 pg 2.d2041a48 (2.0) -> up [1,0] acting [1,0]

这告诉我们查看 osd.1,这是此 PG 的主副本

ceph daemon osd.1 ops
{ "num_ops": 651,
 "ops": [
       { "description": "osd_op(client.4124.0:1858 fatty_25647_object1857 [write 0~4096] 2.d2041a48)",
         "received_at": "1331247573.344650",
         "age": "25.606449",
         "flag_point": "waiting for sub ops",
         "client_info": { "client": "client.4124",
             "tid": 1858}},
...

flag_point 字段指示 OSD 当前正在等待副本响应,在本例中为 osd.0

Java S3 API 故障排除

对等点未认证

您可能会收到如下所示的错误

[java] INFO: Unable to execute HTTP request: peer not authenticated

S3 的 Java SDK 需要来自公认证书颁发机构的有效证书,因为它默认使用 HTTPS。如果您只是测试 Ceph Object Storage 服务,可以通过几种方式解决此问题

  1. 在 IP 地址或主机名前加上 http://。例如,将此更改为

    conn.setEndpoint("myserver");
    

    To

    conn.setEndpoint("http://myserver")
    
  2. 设置凭据后,添加客户端配置并将协议设置为 Protocol.HTTP

    AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
    
    ClientConfiguration clientConfig = new ClientConfiguration();
    clientConfig.setProtocol(Protocol.HTTP);
    
    AmazonS3 conn = new AmazonS3Client(credentials, clientConfig);
    

405 MethodNotAllowed

如果您收到 405 错误,请检查是否正确设置了 S3 子域。您需要在 DNS 记录中设置通配符,子域功能才能正常工作。

另外,请确保禁用了默认站点。

[java] Exception in thread "main" Status Code: 405, AWS Service: Amazon S3, AWS Request ID: null, AWS Error Code: MethodNotAllowed, AWS Error Message: null, S3 Extended Request ID: null

default.rgw.meta 池中有大量对象

在 *jewel* 之前创建的集群默认启用了元数据存档功能,使用 default.rgw.meta 池。此存档保留了所有旧版本的用户和存储桶元数据,导致 default.rgw.meta 池中有大量对象。

禁用元数据堆

希望在将来禁用此功能的用户应将 metadata_heap 字段设置为空字符串 ""

$ radosgw-admin zone get --rgw-zone=default > zone.json
[edit zone.json, setting "metadata_heap": ""]
$ radosgw-admin zone set --rgw-zone=default --infile=zone.json
$ radosgw-admin period update --commit

这将阻止新元数据写入 default.rgw.meta 池,但不会删除任何现有对象或池。

清理元数据堆池

在 *jewel* 之前创建的集群通常仅将 default.rgw.meta 用于元数据存档功能。

然而,从 *luminous* 开始,radosgw 在 default.rgw.meta 中使用 池命名空间 用于完全不同的目的,即存储 user_keys 和其他关键元数据。

用户在执行任何清理程序之前应检查区域配置

$ radosgw-admin zone get --rgw-zone=default | grep default.rgw.meta
[should not match any strings]

确认该池未用于任何目的后,用户可以安全地删除 default.rgw.meta 池中的所有对象,或者选择删除整个池本身。

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入