9.6. Object Storage ノードの置き換え
Object Storage クラスターのノードを置き換えるには、以下を行う必要があります。
- 新規 Object Storage ノードでオーバークラウドを更新して、director によりリングファイルが作成されないようにします。
swift-ring-builder
を使用して手動でクラスターにノードを追加するか、クラスターからノードを削除します。
以下の手順では、クラスターの整合性を保ちながらノードを置き換える方法を説明します。この例では、ノードが 2 つある Object Storage クラスターを使用します。目的は、別のノードを追加して、問題のあるノードを置き換えることです。
まず、以下の内容が含まれる
~/templates/swift-ring-prevent.yaml
という名前の環境ファイルを作成します。
parameter_defaults: SwiftRingBuild: false RingBuild: false ObjectStorageCount: 3
SwiftRingBuild
および RingBuild
パラメーターにより、オーバークラウドが自動的に Object Storage とコントローラーノードそれぞれのリングファイルを構築するかどうかが定義されます。ObjectStorageCount
は、環境内で Object Storage ノードをいくつ指定するかを定義します。今回の例では、ノードを 2 つから 3 つにスケーリングします。
openstack overcloud deploy
の一部として、オーバークラウドの残りの環境ファイルと合わせて、swift-ring-prevent.yaml
ファイルも追加します。
$ openstack overcloud deploy --templates [ENVIRONMENT_FILES] -e swift-ring-prevent.yaml
注記
このファイルのパラメーターが以前の環境ファイルのパラメーターよりも優先されるように、このファイルを環境ファイルの一覧の最後に追加します。
再デプロイメントが完了したら、オーバークラウドには追加の Object Storage が含まれるようになりますが、ノードのストレージディレクトリーは作成されておらず、ノードのオブジェクトストアのリングファイルもまだ構築されていません。そのため、手動でストレージのディレクトリーを作成して、リングファイルを構築する必要があります。
注記
以下の手順を使用して、コントローラーノードでのリングファイル構築も行なってください。
新規ノードにログインしてストレージのディレクトリーを作成します。
$ sudo mkdir -p /srv/node/d1 $ sudo chown -R swift:swift /srv/node/d1
注記
このディレクトリーで、外部のストレージデバイスをマウントすることもできます。
ノードに既存のリングファイルをコピーします。
heat-admin
ユーザーとして、コントローラーノードにログインしてから、スーパーユーザーに切り替えます。たとえば、IP アドレスが 192.168.201.24 のコントローラーノードの場合は以下のようになります。
$ ssh heat-admin@192.168.201.24 $ sudo -i
コントローラーノードからの
/etc/swift/*.builder
ファイルを新しい Object Storage ノードの /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:~/.
新しい Object Storage ノードに
heat-admin
ユーザーとしてログインして、スーパーユーザーに切り替えます。たとえば、IP アドレスが 192.168.201.29 の Object Storage ノードの場合は以下のようになります。
$ ssh heat-admin@192.168.201.29 $ sudo -i
これらのファイルを
/etc/swift
ディレクトリーにコピーします。
# cp /home/heat-admin/*.builder /etc/swift/.
新規の Object Storage ノードをアカウント、コンテナー、オブジェクトリングに追加します。新規ノードに以下のコマンドを実行します。
# 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 は、指定のゾーンに適した整数に置き換えます (例: ゾーン 1 には z1)。
- IP
- アカウント、コンテナー、オブジェクトサービスがリッスンするのに使用する IP。これは、特に、
/etc/swift/object-server.conf
と/etc/swift/account-server.conf
、/etc/swift/container-server.conf
のDEFAULT
セクションのbind_ip
など、各ストレージノードの IP アドレスと同じでなければなりません。 - 重み
- 他のデバイスと比較したデバイスの相対的な重み付けを入力します。通常、これは 100 となっています。
注記
リングファイル上で
swift-ring-builder
を使用して、リングファイルにある現在のノードの既存値を確認します。
# swift-ring-builder /etc/swift/account.builder
アカウント、コンテナー、オブジェクトリングから置き換えるノードを削除します。各ノードに対して、以下のコマンドを実行します。
# 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.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
これらのファイルは、コントローラーノードと既存の Object Storage ノード上の
/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
新規ノードが追加され、リングファイルの一部になります。リングから以前のノードを削除する前に、他のノードから新規ノードの初期のデータを複製する必要があります。
リングから以前のノードを削除するには、
ObjectStorageCount
の数を減らして以前のリングを省略します。今回は 3 から 2 に減らします。
parameter_defaults: SwiftRingBuild: false RingBuild: false ObjectStorageCount: 2
新規環境ファイル (
remove-object-node.yaml
) を作成して、以前の Object Storage ノードを特定し、削除します。今回の場合は overcloud-objectstorage-1
を削除します。
parameter_defaults: ObjectStorageRemovalPolicies: [{'resource_list': ['1']}]
デプロイメントのコマンドで両環境ファイルを指定します。
$ openstack overcloud deploy --templates -e swift-ring-prevent.yaml -e remove-object-node.yaml ...
director は、オーバークラウドから Object Storage ノードを削除して、オーバークラウド上の残りのノードを更新し、ノードの削除に対応します。