Virtuozzo Hybrid Infrastructure（VHI）を本格的に理解しよう（応用編）

前回の記事では、VHIの概要について説明しました。
今回はさらに踏み込んで、VHIの仕組みを詳しく解説します。

まず、HCIと3Tier構成の違いについてですが、すでに多くの記事が公開されているため、ここでは割愛します。
興味のある方は、以下の記事をご覧ください。
https://www.cresco.co.jp/blog/entry/15996.html

## ストレージについて
VHIの説明には、まずストレージの仕組みを理解する必要があります。
以下はVirtuozzo Storageのアーキテクチャ概要図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768223/2aa594b2-44d4-f8f2-7760-ef48a9cdde1d.png)

### ストレージインターフェース

Virtuozzo Storageは、以下のストレージサービスを提供しています。
- 仮想マシンのボリューム
- iSCSIブロックストレージ
- NFSファイルストレージ
- S3オブジェクトストレージ

仮想マシンのボリューム以外は、基本的に外部向けのサービスとして利用可能です。
例えば、S3オブジェクトストレージを外販したり、社内のストレージサーバーとして活用できます。
また、iSCSIブロックストレージを別のLinuxサーバーの仮想ディスクとして使用することも可能です。

### データの冗長性

ストレージサービスはすべてボリューム単位でデータを保存します。
データの冗長性は **Erasure Coding** または **レプリカ（コピー）** によって実現され、それぞれ異なるノードに格納されます。

上記の図では、
- レプリカ = 3 のデータ
- Erasure Coding（3+2）のデータ

の2種類があります。

Erasure Codingでは、データを分割し、パリティデータを追加して複数のノードに格納します。
一方、レプリカでは、データのコピーを3つ作成し、それぞれ異なるノードに保存します。

詳しい説明は後ほど行いますが、Virtuozzo Storageには2つのデータ冗長性の仕組みがあることを理解しておいてください。

### ストレージポリシー

ストレージの管理には、**ストレージポリシー** という概念が重要です。

ストレージポリシーでは、以下の要素を決定します。
- データの保存場所（Tier）
- 保存条件（QoS）
- データの冗長性（レプリカ or Erasure Coding）
- 障害ドメイン（Failure Domain）

1つのボリュームには1つのストレージポリシーが適用され、1つのストレージポリシーを複数のボリュームに適用することも可能です。

### ストレージポリシーを理解するための3つの概念

#### 1. 障害ドメイン（Failure Domain）

障害ドメインとは、システムやインフラにおいて、単一の障害が影響を及ぼす範囲を指します。
障害が発生した際に、その影響を局所的に抑えるための概念です。

例えば、以下のような単位で障害ドメインを定義できます。

- サーバー単位： 1台の物理サーバーが障害を起こしても、他のサーバーには影響しないようにする。
- ラック単位： データセンター内の1つのラック全体が障害を受けても、別のラックは正常に動作するようにする。
- データセンター単位： 1つのデータセンターが停止しても、別のデータセンターでシステムが継続できるようにする。

障害ドメインを適切に設計することで、システム全体の耐障害性（高可用性）を向上させることができます。

#### 障害ドメインの種類
- ディスク
- ホスト
- ラック
- 行
- 部屋

ちなみに、VHIでは **ホスト単位** の障害ドメイン設定が最も一般的です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768223/ba0f2cea-a3c1-5d0e-826d-5f32aaccd6e8.png)

### ストレージのディスク要件

VHIのSDSは、HDDやSSDで構成され、Virtuozzo Storageによって制御されています。ストレージディスクにはいくつかの要件があります。

まず、ディスクロールを適切に設定しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768223/3b6c58d3-641e-e276-f1c1-fc5847bb6a43.png)

次に、ディスクロールに適したディスクの要件を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768223/8ec2792f-7f7a-303f-6758-9eae334e12c9.png)

#### キャッシュディスクについて

書き込み速度を向上させるため、キャッシュディスクを利用します。ストレージが大容量HDDの場合、SSDのキャッシュディスクを追加することでパフォーマンスを向上させたい時に利用されます

**代表的な組み合わせ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768223/5fc9273a-56ec-e133-62cf-326690d63880.png)

**ガイドライン**
キャッシュデバイスを選定する際には、速度と耐久性を考慮する必要があります。耐久性はDWPD（1日あたりの書き込み回数）とTBW（総書き込み容量）で評価され、10DWPD以上の値が推奨されます。

- **キャッシュディスクの最小構成**：1ノードにつき1つのキャッシュデバイスでも運用可能ですが、パフォーマンスと可用性の向上のため、最低3つのキャッシュディスクを実装することを推奨します。
- **キャッシュディスクの数の決定方法**：4～12個のストレージデバイスに対して1つのキャッシュデバイスを割り当てるのが一般的です。
  
  計算式: `N = 0.8 * (cache_speed / capacity_speed)`
  
  Nは各キャッシュデバイスが対応できる最大の大容量デバイス数、cache_speedはキャッシュデバイスの持続的書き込み速度、capacity_speedは大容量デバイスの持続的書き込み速度です。

- **キャッシュディスクのサイズの決定方法**：
  `(ワークロードのピーク時のデータ量 + 0.1 * すべてのストレージディスクの総容量) × 110％`

キャッシュディスクの設置はすこし複雑で、さほど繊細な設計で運用しない場合、考慮しなくても全く問題ありません。実際もサービスプロバイダー以外はほとんど利用されていない状況です。なぜかいうと、SDDを利用すればキャッシュディスクをそもそも利用する必要がないです。また、キャッシュディスクはDWPD要件があるため、コストの上昇にもつながります

## ネットワークについて

最低限、以下の2つのネットワークが必要です。VLANを利用するのも問題ないです。

- **Privateネットワーク**：内部クラスターの通信用
- **Publicネットワーク**：外部トラフィック用

**注意**：「Public」ネットワークも、外部から直接アクセスできないプライベートネットワークを利用することを推奨します。外部アクセスが必要な場合は、NATの利用を推奨します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768223/9f018021-5f33-cea4-2467-54af7c4297b0.png)

検証環境や冗長化を考慮しない本番環境では、まず2つのネットワークから構成するのが無難です。ネットワークトラフィックの割り当ては、以下の例が参考になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768223/40757c6b-0743-dd15-2ef6-b1dcc6843c88.png)

### 推奨ネットワーク設定

推奨されるネットワーク構成として、**4つのネットワークインターフェース（25G×2、10G×2）** をボンディングして使用する方法があります。

- **25G×2** をボンディングしてPrivateネットワークとして利用
- **10G×2** をボンディングしてPublicネットワークとして利用
- VLANを利用してネットワークを細分化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768223/a600f810-c74d-a064-f2f7-7baadeba61e8.png)

詳しくは以下の表をご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768223/df964c5a-0396-50c0-e3eb-0b7f3ba58795.png)

また、ネットワークの冗長化を考慮する際には、ネットワークデバイス自体の冗長化も検討する必要があります。これを考慮しないと、単一障害点（Single Point of Failure）が発生するリスクがあります。

### ネットワークの仕組み
VHIは、分散スイッチと分散ルーターの構成を採用しており、各ネットワークサービスは各ノードに分散されています。これにより、単一障害点を防ぐことが可能になります。

通常、仮想ネットワーク内のトラフィックは仮想スイッチとルーターで処理されます。
外部ネットワークへ接続する場合や異なるサブネット間で通信する場合は、物理ネットワークが介在し、仮想ルーターを経由して通信を行います。

---

以上、ストレージとネットワークについての説明でした。

実際にVHIをインストールして試してみることで、より理解が深まると思います。

次回の記事では、VHIのインストール手順について解説します。