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
SwiftRingBuild
和 RingBuild
参数分别定义了 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 中的其它节点来使删除生效。