VoltDBのクラスタの台数を後から変更する方法

# はじめに

VoltDBではデータベースを初期化・起動した際に、レプリケーション数とノード数といったクラスタ構成が決定します。その構成を後で変更する場合は、一旦データベースを停止した上で、構成を変更する必要があります。
今回は、VoltDBのクラスタ構成の変更を試してみます。


# 試してみること

以下のようにクラスタ構成を変更する。（変更前はクラスタ構成ではありませんが）

- 変更前
　ノード数：1
- 変更後
　ノード数：3
　レプリケーション数：2（k-factor=1）


# クラスタ構成を変更する。

(1) データベースの処理を停止する。

以下のコマンドでデータベースの処理を停止します。これでクライアントからのリクエストを全て受け付けなくなります。

```
# voltadmin pause
INFO: The cluster is paused.
```

補足：pauseにより読み取り専用モードになりクライアントポートを使用してデータを変更できない。読み取りのトランザクションは許可される。ただし、管理ポート経由では挿入、削除、スキーマ変更などは実行できる。

(2) スナップショットをディスクに書き込む。

スナップショットを取得するコマンドを実行します。
・ファイルの接頭辞に"TestSnapshot"を指定
・スナップショットは/tmp/voltdb/backupディレクトリに保存
・「--blocking」はクライアントからのリクエストを拒否

```
# voltadmin save /tmp/voltdb/backup "TestSnapshot" --blocking

-- Snapshot Save Results --

HOST_ID HOSTNAME    SITE_ID RESULT  ERR_MSG
------- ----------- ------- ------- -------
0       voltserver1 4       SUCCESS        
0       voltserver1 7       SUCCESS        
0       voltserver1 5       SUCCESS        
0       voltserver1 0       SUCCESS        
0       voltserver1 3       SUCCESS        
0       voltserver1 2       SUCCESS        
0       voltserver1 6       SUCCESS        
0       voltserver1 1       SUCCESS   
```

(3) クラスタをシャットダウンする。

いずれか1台のサーバで以下のコマンドを実行します。

```
# voltadmin shutdown
```

(4) スキーマ(DDL)やクラスタ構成(deployment.xml)を変更する。

deployment.xmlのkfactorを"1"に変更する。

```deployment.xml
<cluster sitesperhost="8" kfactor="1" schema="ddl"/>
```

(5) 変更後の構成ファイルでデータベースを初期化する。

3台各々で以下のコマンドを実行する。

```
# voltdb init -D /opt/voltdb -C /opt/voltdb/deployment.xml -f
Ignoring voltdbroot "/opt/voltdb/voltdbroot" specified in the deployment file
When using the INIT command, some deployment file settings (hostcount and voltdbroot path) are ignored
Initialized VoltDB root directory voltdbroot

```

(6) 管理モードでクラスタを起動する。

3台各々で以下のコマンドを実行する。
「-c 3」で3台構成を指定している。

```
# voltdb start -D /opt/voltdb -H volt1 -c 3 --pause
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Initializing VoltDB...

 _    __      ____  ____  ____ 
| |  / /___  / / /_/ __ \/ __ )
| | / / __ \/ / __/ / / / __  |
| |/ / /_/ / / /_/ /_/ / /_/ / 
|___/\____/_/\__/_____/_____/

--------------------------------

Build: 8.2 voltdb-8.2-0-g6115baf-local Community Edition
Loaded node-specific settings from /opt/voltdb/voltdbroot/config/path.properties
Connecting to VoltDB cluster as the leader...
Host id of this node is: 0
```

(7) 必要に応じて、スキーマとストアドプロシージャをリロードする。

今回はなし。

(8) スナップショットを復元する。

スナップショットを作成した1台目のサーバで以下のコマンドを実行する。
ディレクトリが存在しないとエラーになるため、追加した2台のサーバにもディレクトリは作成しておく。

```
# voltadmin restore /tmp/voltdb/backup "TestSnapshot"
voltadmin: Snapshot restore has been started. Check the server logs for ongoing status of the restore operation.

-- Snapshot Restore Results --

HOST_ID HOSTNAME    SITE_ID TABLE        PARTITION_ID RESULT  ERR_MSG                                                                                                                                                                                      
------- ----------- ------- ------------ ------------ ------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0       voltserver1 0       KEISOKU_DATA 0            SUCCESS NO DATA TO DISTRIBUTE | NO DATA TO DISTRIBUTE | NO DATA TO DISTRIBUTE | NO DATA TO DISTRIBUTE | NO DATA TO DISTRIBUTE | NO DATA TO DISTRIBUTE | NO DATA TO DISTRIBUTE | NO DATA TO DISTRIBUTE
0       voltserver1 0       TEST_DATA    0            SUCCESS NO DATA TO DISTRIBUTE | NO DATA TO DISTRIBUTE | NO DATA TO DISTRIBUTE | NO DATA TO DISTRIBUTE                                                                                                
0       voltserver1 0       TEST_DATA    6            SUCCESS                                                                                                                                                                                              
0       voltserver1 0       TEST_DATA    7            SUCCESS                                                                                                                                                                                              
0       voltserver1 0       TEST_DATA    11           SUCCESS                                                                                                                                                                                              
1       voltserver3 0       TEST_DATA    1            SUCCESS                                                                                                                                                                                              
1       voltserver3 0       TEST_DATA    6            SUCCESS                                                                                                                                                                                              
1       voltserver3 0       TEST_DATA    7            SUCCESS                                                                                                                                                                                              
3       voltserver2 0       TEST_DATA    1            SUCCESS                                                                                                                                                                                              
3       voltserver2 0       TEST_DATA    11           SUCCESS                                                                                         
```

(9) データベースの処理を再開する。

スナップショットを作成した1台目のサーバで以下のコマンドを実行する。

```
# voltadmin resume
INFO: The cluster has resumed.
```

VoltDBのWebコンソールにアクセスすると、以下のように3台のサーバがActiveになっていることを確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/aab3d871-9abb-7165-bcdd-75088bb10cab.png)


# 参考

- [9.2. Updating the Cluster Configuration](https://docs.voltdb.com/UsingVoltDB/UpdateHw.php)