注意

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

故障排除

网关无法启动

如果无法启动网关(即,没有现有的pid.asok用户生成的.asok用户生成的pid,请删除该.asok文件并尝试重新启动root用户身份启动进程时,启动脚本尝试以www-dataapache用户身份启动进程,而现有的.asok正在阻止脚本启动守护进程。

radosgw初始化脚本(/etc/init.d/radosgw)还具有一个详细参数,可以提供一些关于问题可能是什么的见解:

/etc/init.d/radosgw start -v

/etc/init.d radosgw start --verbose

HTTP请求错误

检查Web服务本身的访问和错误日志可能是识别问题的第一步。如果存在500错误,这通常表示与守护进程通信存在问题。确保守护进程正在运行,其套接字路径已配置,并且Web服务正在正确的位置查找它。radosgw daemon. Ensure the daemon is running, its socket path is configured, and that the web server is looking for it in the proper location.

异常崩溃radosgwprocess

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

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

阻塞radosgw请求

如果某些(或所有)radosgw请求似乎被阻塞,您可以通过其管理套接字了解守护进程的内部状态。默认情况下,将配置一个套接字驻留在radosgw daemon via its admin socket. By default, there will be a socket configured to reside in /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": []}

在此转储中,有两个请求正在进行。 4c513d: 字段是RADOS请求发送的时间。如果这是很久以前,这表明OSD没有响应。例如,对于请求1858,您可以检查OSD状态:last_sent field is the time the RADOS request was sent. If this is a while ago, it suggests that the OSD is not responding. For example, for request 1858, you could check the OSD status with:

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}},
...

The flag_point字段表示OSD当前正在等待副本响应,在这种情况下osd.0.

Java S3 API故障排除

对等方未通过身份验证

您可能会收到一个类似以下错误:

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

S3 Java SDK需要一个来自受信任的证书机构的有效证书,因为它默认使用HTTPS。如果您只是在测试Ceph对象存储服务,您可以解决此问题:

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

    conn.setEndpoint("myserver");
    

    更改为:

    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方法不允许

如果您收到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

默认.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 pool, or optionally, delete the entire pool itself.

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.