VoltDBの開発者向けドキュメントのまとめ（3章：データベースの起動）

# はじめに

VoltDBの開発者向けの公式ドキュメント[Using VoltDB](https://docs.voltdb.com/UsingVoltDB/index.php)のまとめです。対象のバージョンはv8.3です。

今回は3章です。

現時点でまとめたのは以下の章です。
・[3. データベースの起動](https://qiita.com/mkyz08/items/647459cfe67641e4b888)
・[7. アプリケーション開発の簡略化](https://qiita.com/mkyz08/items/ff9d15cf050af6508964)
・[9. クラスタでVoltDBを使用する](https://qiita.com/mkyz08/items/80f29883a006d1f393e2)
・[13. VoltDBデータベースの保存と復元](https://qiita.com/mkyz08/items/552e83b231e02d47314c)

# 3. データベースの起動

本章では、VoltDBデータベースの起動と停止の手順と、データベースの設定の詳細について説明する。

## 3.1. VoltDBデータベースの初期化と起動

・VoltDBデータベースを起動する前にルートディレクトリを初期化。ルートディレクトリは、VoltDBが設定、ログ、およびその他の情報を格納する。
・voltdb init、およびvoltdb startコマンドのデフォルト値を用いて実行することで、新しいシングルノードのデータベースを初期化・起動することができる。
・デフォルトではカレントディレクトリにVoltDBのルートディレクトリが作成される。

```
 $ voltdb init
 $ voltdb start 
```

必要に応じて、以下のコマンドでデータベースを起動したり停止できる。

```
 $ voltadmin shutdown
 $ voltdb start 
```

・コマンドロギングが有効の場合、VoltDBは停止と再起動の間にデータベースを自動的に保存し復元する。VoltDB Enterprise Editionではデフォルトで有効になっている。
・コマンドロギングが無効の場合、シャットダウンする前にスナップショットを保存する(--save)ことが推奨される。
・スナップショットは、データベースの起動時に自動で復元される。

```
 $ voltadmin shutdown --save
 $ voltdb start 
```

・データベースを再度初期化する場合は、--forceフラグを使用して強制的に初期化する。

```
 $ voltdb init --force
 $ voltdb start 
```

・ルートディレクトリの別の場所を指定する場合は、--dirまたは-Dフラグを使用する。起動時も同じルートディレクトリを指定する。

```
 $ voltdb init --dir=~/mydb
 $ voltdb start --dir=~/mydb 
```

・VoltDB Enterprise Editionを使用する場合は、データベースを起動するときにライセンスファイルを指定する。 VoltDBはライセンスファイル（license.xml）を次の3箇所で順番に検索する。

1) 現在のディレクトリ
2) VoltDBイメージファイルがインストールされているディレクトリ（通常はインストールディレクトリの/voltdbサブフォルダにあります）
3) 現在のユーザーのホームディレクトリ 

・ライセンスファイルは、--licenseまたは-lフラグを使用してvoltdb startコマンドを実行するときに指定することもできる。

```
  $ voltdb start -l /usr/share/voltdb-license.xml 
```

## 3.2. クラスタでのVoltDBデータベースの初期化と起動

・単一のノードとクラスタを起動する場合の違いは、クラスタを起動するときはクラスタノードの数と、起動時のリーダーホストとして使用するホストノードを指定する必要があること。
・初期化するときに、構成ファイルを--configまたは-Cフラグで指定する。クラスタを構成する全てのノードで同じ構成ファイルを使用する。

```
  $ voltdb init -D ~/mydb --config=myconfig.xml 
```

・ノードの初期化後、次の引数を指定して全てのノードでvoltdb startコマンドを実行するとクラスタが起動する。

--count引数：クラスタ内のノード数
--hostまたは-Hフラグ：ホストのリスト。クラスタを構成する1台以上のノードを指定する。 

・次の例では、ホストノードとしてvoltsvr1を指定して、5ノードのクラスタを起動している。

```
  $ voltdb start --count=5 --host=voltsvr1
または
  $ voltdb start -c 5 -H voltsvr1 
```

・ホストは1つだけでも起動するが複数のホストを指定することを推奨。（クラスタ再参入時にvoltsvr1がクラスタ内に存在するとは限らない）
・全てのサーバーを--host引数で指定すると--count引数を省略できる。

```
  $ voltdb start --host = svrA、svrB、svrC 
```

・クラスタ上でVoltDBデータベースを起動すると、VoltDBサーバプロセスは次の処理を実行する。

- ホストノードは起動すると他のノードからの初期化メッセージを待機する。 
- ホストノードはコマンドで指定されたホストのリストから選択され、起動時にクラスタの開始を管理する特別な役割を果たす。
- ホストノードに全てのノードが接続されるまで、データベースは動作しない。
- 全てのノードが初期化メッセージをホストノードに送信すると、ホストノードは他のノードにメッセージを送信し、ホストノードの役割は完了する。以降、ホストノードは特別な役割を果たさず、他のノードと同一の存在となる。 


## 3.3. VoltDBデータベースの停止

・1つのコマンドでクラスタを停止することができる。
・クラスタを停止するにはvoltadmin shutdownコマンドを使用する。停止前にトランザクション等の全ての処理が完了される。

```
  $ voltadmin shutdown 
```

・コマンドロギングを使用していない場合は、シャットダウンする前に最後のスナップショットを保存するため、--save引数を指定する。

```
  $ voltadmin shutdown --save 
```

・別のサーバで実行中のデータベースを停止するには、--host引数を使用する。

```
  $ voltadmin shutdown --host=zeus 
```

・voltadmin pauseコマンドを使用すると管理モードになる。管理モードではクライアントからのアクセスを制限できる。
・管理モードから再開する場合、voltadmin resumeコマンドを使用する。


## 3.4. データの保存

・VoltDBはインメモリデータベースなので、データベースが停止すると、スキーマおよびデータ自体がメモリーから削除される。
・コマンドログとスナップショットを使用してこれらの情報をディスクに保存できる（推奨）。

-コマンドロギングは、完全なデータ耐久性を提供し、VoltDB Enterprise Editionではデフォルトで有効になっている。 コマンドロギングは、自動的に全てトランザクションのレコードを保存する。データベースが停止した場合、これらのログから復元できる。
-スナップショットは 、データベース中のデータのポイントインタイムのコピーを提供する。voltadmin saveコマンドを使用して手動でスナップショットを作成したり、自動で定期的にスナップショットを作成したり、voltadmin shutdown --saveコマンドを使用してシャットダウン時にスナップショットを保存することができる。スナップショットはデータベースの起動時に自動でリストアされる。ただし、スナップショット作成以降のトランザクションは復元されない。

## 3.5. VoltDBデータベースを再起動する

・データベースを停止後、再度起動する場合は最初に起動したときと同じvoltdb startコマンドを使用する。
・データベースが起動すると、（存在すれば）コマンドログまたはスナップショットが復元される。

```
1ノードの場合
  $ voltdb start 
クラスタの場合
  $ voltdb start --count=5 --host=voltsvr1 
```

## 3.6. クラスタ上のノードの更新

・データベースの障害からの復旧、メモリ容量の拡張や処理能力の向上のため、オンザフライでクラスタにノードを追加できる。
・voltdb startコマンドは次の追加機能を提供する。

-10.3節「システム障害からのリカバリ」 - 同じvoltdb startコマンドを使用して、クラスタを起動するか、 障害の発生したノードに再結合します。
-9.2.1節「エラスティック・スケーリングを使用したノードの追加」 - 実行中のデータベース・クラスタに新しいノードを追加するには、 voltdb startに--addフラグを指定します。 

## 3.7. クラスタ構成の定義

・VoltDBデータベースのクラスタの物理レイアウトと選択したデータベース機能の2つが重要。
・物理クラスタのレイアウトは、 voltc startコマンドで--countおよび--host引数を使用して定義する。
・データベース機能の有効化・無効化は、voltdb initコマンドで初期化するときの構成ファイルで指定できる。
・構成ファイルはXMLファイルで、ルートディレクトリを初期化するときに指定する。
・構成ファイルの基本的な構文は次のとおり。

```xml
<?xml version="1.0"?>
<deployment>
   <cluster kfactor="n" />

   <feature option... >
   </feature>

   ...

</deployment>
```

・データベース・パーティションのレイアウトは、以下の\<cluster>タグの属性で定義する。
- siteperhost：クラスタ内の各サーバで作成されるパーティションの数を指定する。sitesperhost値とサーバーの数を掛けるとクラスタ内のパーティションの合計数が得られる。パーティション数の詳細は、3.7.1節「ホストごとのサイト数の決定」を参照してください。
- kfactor：可用性に影響するK-safetyを指定する。K-safetyは、データベース・パーティションのレプリケーション数を制御する。K-safetyの詳細については10章を参照してください。 

・初期化時に構成ファイルを指定しない場合、デフォルトはsiteperhostが8、K-safetyは0になる。
・構成ファイルは、データベースに関連する他の多くの実行時オプションを有効にして設定するためにも使用される。
・構成ファイルの構文の詳細については、 付録E「 構成ファイル（deployment.xml）」を参照。


### 3.7.1. ホストごとのサイト数の決定

・データベースが使用するパーティションに必要以上に多くのサイトを割り当てることにはほとんどペナルティがない。（必要に応じて増分メモリを使用する場合を除く）
・VoltDBは、ほとんどの最新のシステム構成で妥当なパフォーマンスを提供するために、ノードあたり8つのサイトをデフォルトにしている。このデフォルトは通常変更する必要はない。
・ただし、使用可能なコアが16以上か、またはコアが8未満でメモリーが限られている古いマシンではsitesperhost属性を調整することを推奨する。

・ノードごとに必要なサイト数は、各システムに搭載されているプロセッサコアの数に関係している。
・最適な数はCPU数の約3/4。例えば、8コアの場合の最適なパーティション数はノードあたり6または7。

```xml
<?xml version="1.0"?>
<deployment>
   <cluster . . .
            sitesperhost="6"
   />
</deployment>
```

・ハイパースレッディングが利用できる場合、OSは物理コアの数を2倍に認識する。非ハイパースレッディングシステムほど効率的ではない。そのため、ハイパースレッディングが有効な場合の16コアの最適なサイト数はノードあたり10〜12になる可能性が高い。
・ノードあたりの最適なサイト数は、アプリケーションを実際にベンチマークして確認する。
・クラスタ内の全てのノードが同じ数のサイトを使用することが重要。
・そのため、クラスタを構成するサーバは、同じコア数を持つと、最高のパフォーマンスが得られる。


### 3.7.2. 実行時機能のパスの設定

・設定ファイル内に各機能の個別のパスを指定できる。指定していない場合、VoltDBは必要に応じてデータベースルートディレクトリに各機能のサブフォルダを作成する。
・本番環境ではデータベースのパフォーマンスを考慮し、コマンドロギングなどの高I/Oが発生する機能のパスのストレージを分ける。

\<paths>要素内の次の機能のパスを指定できる。

```xml
    <commandlog>
    <commandlogsnapshot>
    <exportoverflow>
    <snapshots>
```

・特定の機能のパスを指定して、そのパスが存在しない場合、パスは自動で作成される。
・例えば、以下の例では/opt/overflowが自動で作成される。

```xml
<paths>
   <exportoverflow path="/opt/overflow" />
</paths>
```

### 3.7.3. ハードウェア構成の確認

・VoltDBは異種ハード上のクラスタで実行できる。ただし、各ノードが同じプロセッサ、プロセッサ数、メモリー量を持つ同様のハードウェアでクラスターを実行すると、最高のパフォーマンスが得られる。
・全てのノードは、クラスタ内の他のノードのIPアドレスとホスト名を解決できる必要がある。
・全てのクラスタノードでNTPで時刻同期する必要がある。同じローカルタイムサーバーと同期することが好ましい。クラスタ内のノード間の時刻差異が200ミリ秒より大きい場合、VoltDBはデータベースを起動できない。
・-x引数を指定してNTPを実行することを強く推奨する。