软件配置流程

修复损坏的 GPT 表(损坏的磁盘分区)

  • 如果 GPT 表损坏,运行命令时应观察到如下消息:…

    $ sudo parted -l
    
  • … 命令。

    ...
    Error: The backup GPT table is corrupt, but the primary appears OK, so that will
    be used.
    OK/Cancel?
    
  1. 要修复此问题,首先安装 gdisk 程序进行修复

    $ sudo aptitude install gdisk
    
  2. 对损坏分区的特定驱动器运行 gdisk

  3. 在命令行提示符下,键入 r(恢复和转换选项),然后键入 d(使用主 GPT 头部),v(验证磁盘),最后键入 w(将表写入磁盘并退出)。还需要在提示时输入 Y 以确认操作。

    Command (? for help): r
    
    Recovery/transformation command (? for help): d
    
    Recovery/transformation command (? for help): v
    
    Caution: The CRC for the backup partition table is invalid. This table may
    be corrupt. This program will automatically create a new backup partition
    table when you save your partitions.
    
    Caution: Partition 1 doesn't begin on a 8-sector boundary. This may
    result in degraded performance on some modern (2009 and later) hard disks.
    
    Caution: Partition 2 doesn't begin on a 8-sector boundary. This may
    result in degraded performance on some modern (2009 and later) hard disks.
    
    Caution: Partition 3 doesn't begin on a 8-sector boundary. This may
    result in degraded performance on some modern (2009 and later) hard disks.
    
    Identified 1 problems!
    
    Recovery/transformation command (? for help): w
    
    Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
    PARTITIONS!!
    
    Do you want to proceed, possibly destroying your data? (Y/N): Y
    
    OK; writing new GUID partition table (GPT).
    The operation has completed successfully.
    
  4. 运行命令

    $ sudo parted /dev/sd#
    
  5. 现在应该显示分区已恢复并且状态良好。

  6. 最后,从节点卸载 gdisk

    $ sudo aptitude remove gdisk
    

流程:修复损坏的 XFS 文件系统

  1. 如果检查其标签时观察到以下输出,则文件系统可能已损坏或损坏

    $ sudo xfs_admin -l /dev/sd#
    cache_node_purge: refcount was 1, not zero (node=0x25d5ee0)
    xfs_admin: cannot read root inode (117)
    cache_node_purge: refcount was 1, not zero (node=0x25d92b0)
    xfs_admin: cannot read realtime bitmap inode (117)
    bad sb magic # 0 in AG 1
    failed to read label in AG 1
    
  2. 运行以下命令以删除损坏/损坏的文件系统并进行替换。(此示例使用文件系统 /dev/sdb2)首先需要替换分区

    $ sudo parted
    GNU Parted 2.3
    Using /dev/sda
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) select /dev/sdb
    Using /dev/sdb
    (parted) p
    Model: HP LOGICAL VOLUME (scsi)
    Disk /dev/sdb: 2000GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    
    Number  Start   End     Size    File system  Name   Flags
    1      17.4kB  1024MB  1024MB  ext3                 boot
    2      1024MB  1751GB  1750GB  xfs          sw-aw2az1-object045-disk1
    3      1751GB  2000GB  249GB                        lvm
    
    (parted) rm 2
    (parted) mkpart primary 2 -1
    Warning: You requested a partition from 2000kB to 2000GB.
    The closest location we can manage is 1024MB to 1751GB.
    Is this still acceptable to you?
    Yes/No? Yes
    Warning: The resulting partition is not properly aligned for best performance.
    Ignore/Cancel? Ignore
    (parted) p
    Model: HP LOGICAL VOLUME (scsi)
    Disk /dev/sdb: 2000GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    
    Number  Start   End     Size    File system  Name     Flags
    1      17.4kB  1024MB  1024MB  ext3                  boot
    2      1024MB  1751GB  1750GB  xfs          primary
    3      1751GB  2000GB  249GB                         lvm
    
    (parted) quit
    
  3. 下一步是擦除文件系统并格式化

    $ sudo dd if=/dev/zero of=/dev/sdb2 bs=$((1024*1024)) count=1
    1+0 records in
    1+0 records out
    1048576 bytes (1.0 MB) copied, 0.00480617 s, 218 MB/s
    $ sudo /sbin/mkfs.xfs -f -i size=1024 /dev/sdb2
    meta-data=/dev/sdb2              isize=1024   agcount=4, agsize=106811524 blks
             =                       sectsz=512   attr=2, projid32bit=0
    data     =                       bsize=4096   blocks=427246093, imaxpct=5
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0
    log      =internal log           bsize=4096   blocks=208616, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    
  4. 现在应该标记并挂载文件系统。

  5. 现在可以使用以下命令检查文件系统是否已挂载

    $ mount
    

流程:检查帐户是否正常

注意

swift-direct 仅在 HPE Helion Public Cloud 中可用。使用 swiftly 作为替代(或如本文档所述使用 swift-get-nodes)。

您必须知道租户/项目 ID。您可以按以下方式从代理检查帐户是否正常。

$ sudo -u swift  /opt/hp/swift/bin/swift-direct show AUTH_<project-id>

响应将类似于 swift 帐户容器列表,或者指示找不到资源的错误。

或者,您可以使用 swift-get-nodes 查找帐户数据库文件。在代理上运行以下命令

$ sudo swift-get-nodes /etc/swift/account.ring.gz  AUTH_<project-id>

响应将打印用于列出复制的帐户数据库的 curl/ssh 命令。使用指示的 curlssh 命令来检查帐户的状态和存在性。

流程:获取 swift 帐户统计信息

注意

swift-direct 仅适用于 HPE Helion Public Cloud。请查看 swifty 以获取替代方案,或如 流程:检查帐户是否正常 中所述使用 swift-get-nodes

此流程描述了如何确定给定 swift 帐户的 swift 使用情况,即容器数量、对象数量和使用的总字节数。为此,您需要项目 ID。

登录到其中一台 swift 代理服务器。

使用 swift-direct 显示此帐户的使用情况

$ sudo -u swift /opt/hp/swift/bin/swift-direct show AUTH_<project-id>
Status: 200
      Content-Length: 0
      Accept-Ranges: bytes
      X-Timestamp: 1379698586.88364
      X-Account-Bytes-Used: 67440225625994
      X-Account-Container-Count: 1
      Content-Type: text/plain; charset=utf-8
      X-Account-Object-Count: 8436776
      Status: 200
      name: my_container  count: 8436776  bytes: 67440225625994

此帐户有 1 个容器。该容器有 8436776 个对象。使用的总字节数为 67440225625994。

流程:恢复已删除的帐户

通常不会重新创建 Swift 帐户。如果删除了租户/项目,则可以删除帐户。如果用户希望再次使用 Swift,通常的过程是创建新的租户/项目——从而创建一个新的 Swift 帐户。

但是,如果删除了 Swift 帐户,但未从 Keystone 删除租户/项目,则用户将无法再访问该帐户。这是因为该帐户在 Swift 中被标记为已删除。您可以按照此流程恢复帐户。

注意

“旧”帐户中的容器和对象不再可以列出。此外,如果帐户清理程序进程尚未完成清理“旧”帐户中的容器和对象,则这些实际上是孤立的,并且实际上不可能找到并删除它们以释放磁盘空间。

解决方案是删除帐户数据库文件并按如下方式重新创建帐户

  1. 您必须知道租户/项目 ID。帐户名称为 AUTH_<project-id>。在此示例中,租户/项目为 4ebe3039674d4864a11fe0864ae4d905,因此 Swift 帐户名称为 AUTH_4ebe3039674d4864a11fe0864ae4d905

  2. 使用 swift-get-nodes 找到帐户的数据库文件(在三台服务器上)。输出已被截断,以便我们专注于重要数据

    $ sudo swift-get-nodes /etc/swift/account.ring.gz AUTH_4ebe3039674d4864a11fe0864ae4d905
    ...
    curl -I -XHEAD "http://192.168.245.5:6202/disk1/3934/AUTH_4ebe3039674d4864a11fe0864ae4d905"
    curl -I -XHEAD "http://192.168.245.3:6202/disk0/3934/AUTH_4ebe3039674d4864a11fe0864ae4d905"
    curl -I -XHEAD "http://192.168.245.4:6202/disk1/3934/AUTH_4ebe3039674d4864a11fe0864ae4d905"
    ...
    Use your own device location of servers:
    such as "export DEVICE=/srv/node"
    ssh 192.168.245.5 "ls -lah ${DEVICE:-/srv/node*}/disk1/accounts/3934/052/f5ecf8b40de3e1b0adb0dbe576874052"
    ssh 192.168.245.3 "ls -lah ${DEVICE:-/srv/node*}/disk0/accounts/3934/052/f5ecf8b40de3e1b0adb0dbe576874052"
    ssh 192.168.245.4 "ls -lah ${DEVICE:-/srv/node*}/disk1/accounts/3934/052/f5ecf8b40de3e1b0adb0dbe576874052"
    ...
    note: `/srv/node*` is used as default value of `devices`, the real value is set in the config file on each storage node.
    
  3. 在继续之前,请通过使用 curl 检查帐户是否确实已删除。执行 swift-get-nodes 打印的命令。例如

    $ curl -I -XHEAD "http://192.168.245.5:6202/disk1/3934/AUTH_4ebe3039674d4864a11fe0864ae4d905"
    HTTP/1.1 404 Not Found
    Content-Length: 0
    Content-Type: text/html; charset=utf-8
    

    对另外两台服务器(192.168.245.3 和 192.168.245.4)重复此操作。404 未找到 表示帐户已删除(或从未存在)。

    如果收到 204 无内容 响应,请不要继续。

  4. 使用 swift-get-nodes 打印的 ssh 命令检查数据库文件是否存在。例如

    $  ssh 192.168.245.5 "ls -lah ${DEVICE:-/srv/node*}/disk1/accounts/3934/052/f5ecf8b40de3e1b0adb0dbe576874052"
    total 20K
    drwxr-xr-x 2 swift swift 110 Mar  9 10:22 .
    drwxr-xr-x 3 swift swift  45 Mar  9 10:18 ..
    -rw------- 1 swift swift 17K Mar  9 10:22 f5ecf8b40de3e1b0adb0dbe576874052.db
    -rw-r--r-- 1 swift swift   0 Mar  9 10:22 f5ecf8b40de3e1b0adb0dbe576874052.db.pending
    -rwxr-xr-x 1 swift swift   0 Mar  9 10:18 .lock
    

    对另外两台服务器(192.168.245.3 和 192.168.245.4)重复此操作。

    如果不存在文件,则无需采取进一步操作。

  5. swift-get-nodes 列出的所有节点上停止 Swift 进程(在此示例中,即 192.168.245.3、192.168.245.4 和 192.168.245.5)。

  6. 我们建议您备份数据库文件。

  7. 删除数据库文件。例如

    $ ssh 192.168.245.5
    $ cd /srv/node/disk1/accounts/3934/052/f5ecf8b40de3e1b0adb0dbe576874052
    $ sudo rm *
    

    对另外两台服务器(192.168.245.3 和 192.168.245.4)重复此操作。

  8. 在所有三台服务器上重新启动 Swift

此时,帐户已完全删除。如果启用自动创建选项,则当用户下次尝试访问该帐户时,将创建该帐户。您也可以使用 swiftly 重新创建帐户。

流程:临时停止负载均衡器将流量导向代理服务器

您可以按以下方式停止负载均衡器将请求发送到代理服务器。当代理出现故障但您需要运行 Swift 以帮助诊断问题时,这可能很有用。通过从负载均衡器中移除,客户不会受到故障代理的影响。

  1. 确保在 /etc/swift/proxy-server.conf 中,disable_path 变量设置为 /etc/swift/disabled-by-file

  2. 登录到代理节点。

  3. 按如下方式关闭 Swift

    $ sudo swift-init proxy shutdown
    

    注意

    关闭,而不是停止。

  4. 创建 /etc/swift/disabled-by-file 文件。例如

    $ sudo touch /etc/swift/disabled-by-file
    
  5. 可选,重新启动 Swift

    $ sudo swift-init proxy start
    

它的工作原理是 healthcheck 中间件查找 /etc/swift/disabled-by-file。如果存在,则中间件将返回 503/error 而不是 200/OK。这意味着负载均衡器应停止将流量发送到代理。

流程:临时磁盘性能测试

您可以按如下方式了解磁盘驱动器是否正常运行

$ sudo dd bs=1M count=256 if=/dev/zero conv=fdatasync of=/srv/node/disk11/remember-to-delete-this-later

您可以预期 ~600MB/秒。如果获得较低的数字,请多次重复,因为 Swift 本身也可能读取或写入磁盘,从而给出较低的数字。