Red Hat Training

A Red Hat training course is available for Red Hat OpenStack Platform

9.5. 替换 Object 存储节点

要在 Object 存储集群中替换节点,您需要:
  • 更新带有新 Object 存储节点的 Overcloud,防止 Director 创建 ring 文件。
  • 使用 swift-ring-builder 对节点手工添加或删除节点。
以下介绍了在保证集群正常的情况下,如何替换节点的方法。在这个示例中,有一个带有 2 个节点 的 Object 存储集群。我们需要添加一个额外的节点,然后替换有问题的节点。
首先,创建一个包括以下内容的环境文件(名为 ~/templates/swift-ring-prevent.yaml):
parameter_defaults:
SwiftRingBuild: false
RingBuild: false
ObjectStorageCount: 3
SwiftRingBuildRingBuild 参数分别定义了 Overcloud 是否自动为 Object 存储和 Controller 节点自动构建 ring 文件。ObjectStorageCount 定义了在环境中有多少个 Object 存储节点。在这里,我们把节点数从 2 个扩展为 3 个。
openstack overcloud deploy 命令中包括 swift-ring-prevent.yaml 文件,以及 Overcloud 中的其它环境文件:
$ openstack overcloud deploy --templates [ENVIRONMENT_FILES] -e swift-ring-prevent.yaml

注意

把这个文件添加到环境文件的最后,从而使它的参数可以覆盖前面的环境文件参数。
在部署完成后,Overcloud 就包括了一个额外的 Object 存储节点。但是,这个节点的存储目录还没有创建,用于节点对象存储的 ring 文件也没有构建。这意味着,您需要手工创建存储目录,并手工构建 ring 文件。
登录到新节点并创建存储目录:
$ sudo mkdir -p /srv/node/d1
$ sudo chown -R swift:swift /srv/node/d1

注意

您还可以在这个目录中挂载一个外部存储设备。
把存在的 ring 文件复制到节点。以 heat-admin 用户身份登录到一个 Controller 节点,然后切换到超级用户(superuser)。例如,对于一个 IP 地址为 192.168.201.24 的 Controller 节点:
$ ssh heat-admin@192.168.201.24
$ sudo -i
/etc/swift/*.builder 文件从 Controller 节点复制到新的 Object 存储节点的 /etc/swift/ 目录中。如果需要,把文件放到 director 主机上:
[root@overcloud-controller-0 ~]# scp /etc/swift/*.builder stack@192.1.2.1:~/.
然后,把文件放到新节点上:
[stack@director ~]$ scp ~/*.builder heat-admin@192.1.2.24:~/.
heat-admin 用户的身份登录到新的 Object 存储节点上,然后切换到超级用户。例如,对于 IP 地址为 192.168.201.29 的 Object 存储节点:
$ ssh heat-admin@192.168.201.29
$ sudo -i
把文件复制到 /etc/swift 目录:
# cp /home/heat-admin/*.builder /etc/swift/.
把新的 Object 存储节点添加到帐号、容器和对象 ring 中。为新节点运行以下命令:
# swift-ring-builder /etc/swift/account.builder add zX-IP:6002/d1 weight
# swift-ring-builder /etc/swift/container.builder add zX-IP:6001/d1 weight
# swift-ring-builder /etc/swift/object.builder add zX-IP:6000/d1 weight
在这些命令中替换以下值:
zX
使用代表特定区的一个整数替换 X(例如,Zone 1 的值为 1)。
IP
帐号、容器和对象服务要监听的 IP 地址。这应该和每个存储节点的 IP 地址相匹配,特别是和 /etc/swift/object-server.conf/etc/swift/account-server.conf/etc/swift/container-server.conf 中的 DEFAULT 部分中的 bind_ip 的值相匹配。
weight
表示一个设备和其它设备相比较的相对权重。它的值通常是 100

注意

针对 rings 文件运行 swift-ring-builder 命令来检查当前节点存在的值:
# swift-ring-builder /etc/swift/account.builder
删除您需要从账户、容器和对象 ring 中替换的节点。为每个节点运行以下命令:
# swift-ring-builder /etc/swift/account.builder remove IP
# swift-ring-builder /etc/swift/container.builder remove IP
# swift-ring-builder /etc/swift/object.builder remove IP
使用节点的 IP 地址替换 IP。
在所以节点间重新分布分区:
# swift-ring-builder /etc/swift/account.builder rebalance
# swift-ring-builder /etc/swift/container.builder rebalance
# swift-ring-builder /etc/swift/object.builder rebalance
把所有 /etc/swift/ 内容的所有者设置改为 root 用户和 swift 组:
      # chown -R root:swift /etc/swift
重启 openstack-swift-proxy 服务:
# systemctl restart openstack-swift-proxy.service
到此为止,ring 文件(*.ring.gz 和 *.builder)应该已在新节点上被更新:
/etc/swift/account.builder
/etc/swift/account.ring.gz
/etc/swift/container.builder
/etc/swift/container.ring.gz
/etc/swift/object.builder
/etc/swift/object.ring.gz
把这些文件从复制到 Controller 节点和存在的 Object 存储节点(除去要删除的节点)的 /etc/swift/ 目录中。如果需要,把文件放置到 director 主机:
[root@overcloud-objectstorage-2 swift]# scp *.builder stack@192.1.2.1:~/
[root@overcloud-objectstorage-2 swift]# scp *.ring.gz stack@192.1.2.1:~/
把这个文件复制到每个节点的 /etc/swift/ 中。
在每个节点中,把所有 /etc/swift/ 内容的所有者设置改为 root 用户和 swift 组:
# chown -R root:swift /etc/swift
新节点被添加并作为 ring 的一部分。在把旧节点从 ring 中删除前,请确认新节点已完成了一个完整的数据复制过程。
为了从 ring 中删除旧节点,减少 ObjectStorageCount 的值。在这个示例中,我们把它从 3 减为 2:
parameter_defaults:
SwiftRingBuild: false
RingBuild: false
ObjectStorageCount: 2
创建一个环境文件(remove-object-node.yaml)来指定并删除旧的 Object 存储节点。在这个示例中,我们删除 overcloud-objectstorage-1
parameter_defaults:
ObjectStorageRemovalPolicies:
  [{'resource_list': ['1']}]
在部署命令中包括这两个环境文件:
$ openstack overcloud deploy --templates -e swift-ring-prevent.yaml -e remove-object-node.yaml ...
director 从 Overcloud 中删除 Object 存储节点,并更新 Overcloud 中的其它节点来使删除生效。