5.3. 添加新对象存储节点
要在集群中添加新的 Object Storage (swift)节点,您必须增加节点数、更新环并同步更改。以下示例流程将三个节点增加到四个节点。
流程
以
stack用户身份登录 undercloud 节点,并提供stackrc凭证文件:$ source ~/stackrc使用
ObjectStorageCount参数将 Object Storage 数增加到 1。此参数通常位于node-info.yaml文件中,这是包含节点数的环境文件:parameter_defaults: ObjectStorageCount: 4将新节点的 IP 地址添加到
node-info.yaml文件中的ObjectStorageIPs参数中:ObjectStorageIPs: <ip_address>创建一个环境文件,如
hostname-map.yaml,并将新存储节点的主机名添加,如overcloud-objectstorage-4到HostnameMap参数中:parameter_defaults: HostnameMap: overcloud-objectstorage-4: overcloud-objectstorage-4将新节点的硬件和电源管理信息添加到节点定义模板。节点定义模板是手动创建的文件,用于在初始 overcloud 配置期间注册 overcloud 节点。例如,模板可以是:
/home/stack/nodes.json。以下示例使用 JSON 格式,但如果模板是 YAML 文件,但根据 YAML 格式和属性添加信息。有关节点定义模板的更多信息,请参阅 Director 安装和使用指南中的 为 overcloud 注册节点。"ports":[ "bb:bb:bb:bb:bb:bb" ], "name":"node01", "cpu":"4", "memory":"6144", "disk":"40", "arch":"x86_64", "pm_type":"pxe_ipmitool", "pm_user":"admin", "pm_password":"p@55w0rd!", "pm_addr":"192.168.24.205"将新节点的功能信息添加到节点定义模板中:
"capabilities": "profile:swift-storage,boot_option:local,boot_mode:uefi,node:objectstorage-4",将节点导入到 overcloud,并在节点上执行内省:
$ openstack overcloud node import ~/nodes.yaml $ openstack overcloud node introspect objectstorage-4 --provide在新节点中添加根磁盘序列号:
$ openstack baremetal introspection data save objectstorage-4 | jq ".inventory.disks" $ openstack baremetal node set --property root_device='{"serial": "<disk_serial_num>"}' <node_UUID>根据您的新节点替换 <
disk_serial_num> 和 <node_UUID>。在部署命令中包括您创建的文件,其中包含与您的环境相关的任何其他环境文件:
$ openstack overcloud deploy \ --templates \ … -e <existing_overcloud_environment_files> \ -e node-info.yaml \ -e hostname-map.yaml \
5.3.1. 更新和重新平衡对象存储环 复制链接链接已复制到粘贴板!
Object Storage 服务(swift)在 undercloud 上存储环文件副本,以部署新的存储节点并替换现有的 Controller 和 Object Storage 节点。使用此副本修改 overcloud 环文件,并将它们分发到节点之间。
流程
以
stack用户身份登录 undercloud,再提供stackrc凭证文件:$ source ~/stackrc创建以下目录:
$ mkdir temp && cd temp/将 overcloud 环构建器文件下载到新目录中:
$ openstack object save overcloud-swift-rings swift-rings.tar.gz提取环:
$ tar xzvf swift-rings.tar.gz创建一个目录来备份环的原始版本:
$ mkdir backup && cp swift-rings.tar.gz backup/对象存储环文件位于
etc/swift文件夹中。根据您的设备详情收集以下变量的值:
<device_name>:$ openstack baremetal introspection data save <node_name> | jq ".inventory.disks"<node_ip>:openstack server show <node_name>-
<port> 默认端口为600x。如果更改了默认值,请使用适用的端口。 -
<builder_file> 第 3 步中的构建器文件名。 -
<weight> 和 <zone> 变量是用户定义的。
使用
swift-ring-builder将新节点添加到现有环。根据设备详情替换变量。$ swift-ring-builder etc/swift/<builder_file> add <zone>-<node_ip>:<port>/<device_name> <weight>将修改后的 ring 文件上传到 undercloud 上的对象存储服务:
$ tar cvzf swift-rings.tar.gz etc/ $ openstack object create overcloud-swift-rings swift-rings.tar.gz
5.3.2. 同步节点更改并迁移数据 复制链接链接已复制到粘贴板!
在将新 ring 文件复制到其正确的文件夹后,您必须将更改的环文件发送到 Object Storage (swift)容器。
- 重要的
- 不要同时迁移所有数据。以 10% 为单位迁移数据。例如,将源设备的 weight 配置为 90.0,目标设备配置为 equal 10.0。然后,将源设备的权重配置为 80.0 和 20.0。继续逐步迁移数据,直到您完成这个过程。在迁移过程中,如果您同时移动所有数据,旧数据位于源设备上,但环指向所有副本的新目标设备。在 replicators 已将所有数据移至目标设备之前,无法访问数据。
- 重要的
在迁移过程中,对象存储环会重新分配数据的位置,然后复制器将数据移到新位置。随着集群活动增加,因为负载增加,复制过程会减慢。集群越大,复制传递所需的时间越长。这是预期的行为,但如果客户端访问当前被重新定位的数据,则日志文件中可能会导致 404 错误。当代理尝试从新位置检索数据时,但数据还没有在新位置中检索数据时,
swift-proxy会在日志文件中报告 404 错误。当迁移逐渐时,代理会访问没有移动的副本,且不会发生错误。当代理尝试从替代副本检索数据时,日志文件中的 404 错误将解析。要确认复制过程正在进行,请参阅复制日志。对象存储服务每 5 分钟发出复制日志的问题。
流程
使用类似以下示例的脚本,将子文件从 undercloud 节点分发到指定的 Controller 节点,并在这些节点上重启对象存储服务容器:
cd etc/swift/ for j in 8 11 23; do ssh heat-admin@192.168.24."$j" "rm *.ring.gz" for i in account.ring.gz container.ring.gz object.ring.gz; do scp $i heat-admin@192.168.24."$j":~/ ssh heat-admin@192.168.24."$j" "sudo cp -f "$i" /var/lib/config-data/puppet-generated/swift/etc/swift/" ssh heat-admin@192.168.24."$j" "sudo chown root:root /var/lib/config-data/puppet-generated/swift/etc/swift/"$i"" ssh heat-admin@192.168.24."$j" "sudo restorecon /var/lib/config-data/puppet-generated/swift/etc/swift/"$i"" done ssh heat-admin@192.168.24."$j" "rm *.builder" for i in account.builder container.builder object.builder; do scp $i heat-admin@192.168.24."$j":~/ ssh heat-admin@192.168.24."$j" "cat "$i" | sudo tee /var/lib/config-data/puppet-generated/swift/etc/swift/"$i" >/dev/null" done ssh heat-admin@192.168.24."$j" 'for k in `sudo podman ps --format "{{.Names}}" | grep swift`; do sudo podman restart $k; done' done cd ../../要确认数据正在移到新磁盘中,请在新存储节点上运行以下命令:
$ sudo grep -i replication /var/log/container/swift/swift.log