软件配置流程¶
修复损坏的 GPT 表(损坏的磁盘分区)¶
如果 GPT 表损坏,运行命令时应观察到如下消息:…
$ sudo parted -l
… 命令。
... Error: The backup GPT table is corrupt, but the primary appears OK, so that will be used. OK/Cancel?
要修复此问题,首先安装
gdisk程序进行修复$ sudo aptitude install gdisk
对损坏分区的特定驱动器运行
gdisk在命令行提示符下,键入
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.
运行命令
$ sudo parted /dev/sd#
现在应该显示分区已恢复并且状态良好。
最后,从节点卸载
gdisk$ sudo aptitude remove gdisk
流程:修复损坏的 XFS 文件系统¶
如果检查其标签时观察到以下输出,则文件系统可能已损坏或损坏
$ 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
运行以下命令以删除损坏/损坏的文件系统并进行替换。(此示例使用文件系统
/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
下一步是擦除文件系统并格式化
$ 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
现在应该标记并挂载文件系统。
现在可以使用以下命令检查文件系统是否已挂载
$ 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 命令。使用指示的 curl 或 ssh 命令来检查帐户的状态和存在性。
流程:获取 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 中被标记为已删除。您可以按照此流程恢复帐户。
注意
“旧”帐户中的容器和对象不再可以列出。此外,如果帐户清理程序进程尚未完成清理“旧”帐户中的容器和对象,则这些实际上是孤立的,并且实际上不可能找到并删除它们以释放磁盘空间。
解决方案是删除帐户数据库文件并按如下方式重新创建帐户
您必须知道租户/项目 ID。帐户名称为 AUTH_<project-id>。在此示例中,租户/项目为
4ebe3039674d4864a11fe0864ae4d905,因此 Swift 帐户名称为AUTH_4ebe3039674d4864a11fe0864ae4d905。使用
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.
在继续之前,请通过使用 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 无内容响应,请不要继续。使用
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)重复此操作。
如果不存在文件,则无需采取进一步操作。
在
swift-get-nodes列出的所有节点上停止 Swift 进程(在此示例中,即 192.168.245.3、192.168.245.4 和 192.168.245.5)。我们建议您备份数据库文件。
删除数据库文件。例如
$ ssh 192.168.245.5 $ cd /srv/node/disk1/accounts/3934/052/f5ecf8b40de3e1b0adb0dbe576874052 $ sudo rm *
对另外两台服务器(192.168.245.3 和 192.168.245.4)重复此操作。
在所有三台服务器上重新启动 Swift
此时,帐户已完全删除。如果启用自动创建选项,则当用户下次尝试访问该帐户时,将创建该帐户。您也可以使用 swiftly 重新创建帐户。
流程:临时停止负载均衡器将流量导向代理服务器¶
您可以按以下方式停止负载均衡器将请求发送到代理服务器。当代理出现故障但您需要运行 Swift 以帮助诊断问题时,这可能很有用。通过从负载均衡器中移除,客户不会受到故障代理的影响。
确保在 /etc/swift/proxy-server.conf 中,
disable_path变量设置为/etc/swift/disabled-by-file。登录到代理节点。
按如下方式关闭 Swift
$ sudo swift-init proxy shutdown
注意
关闭,而不是停止。
创建
/etc/swift/disabled-by-file文件。例如$ sudo touch /etc/swift/disabled-by-file
可选,重新启动 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 本身也可能读取或写入磁盘,从而给出较低的数字。