私たちが話す内容:
drbd+ocfs2 ソリューションに基づいて XNUMX 台のサーバーに共有ストレージを迅速に展開する方法。
これは誰に役立ちます:
このチュートリアルは、システム管理者や、ストレージの実装方法を選択する人、またはソリューションを試してみたい人にとって役立ちます。
私たちが拒否した決定は何ですか?またその理由は何ですか?
多くの場合、小規模な Web クラスターに優れた読み取り/書き込みパフォーマンスを備えた共有ストレージを実装する必要がある状況に直面します。 私たちはプロジェクトに共有ストレージを実装するためにさまざまなオプションを試しましたが、一度に複数の指標で満足できるものはほとんどありませんでした。 その理由を説明します。
- Glusterfs は読み書きのパフォーマンスが満足できるものではなく、大量のファイルの同時読み込みに問題があり、CPU への負荷が高かった。 ファイルの読み取りに関する問題は、ブリックからファイルに直接アクセスすることで解決できますが、これは常に適用できるわけではなく、一般に誤りです。
- Ceph は過度の複雑さを好みませんでした。これは、2 ~ 4 台のサーバーを使用するプロジェクトでは、特にプロジェクトがその後保守される場合に有害になる可能性があります。 ここでも、重大なパフォーマンス制限があるため、glusterfs と同様に、個別のストレージ クラスターを構築する必要があります。
- XNUMX つの NFS サーバーを使用して共有ストレージを実装すると、フォールト トレランスの観点から疑問が生じます。
- s3 は、特定の範囲のタスクに対して優れた人気のあるソリューションですが、ファイル システムではないため、その範囲が狭くなっています。
- lsyncd。 すでに「非ファイル システム」について話し始めている場合は、この一般的なソリューションについて検討する価値があります。 双方向の交換には適していないだけでなく (ただし、本当にそうしたい場合は可能です)、多数のファイルに対して安定して動作しません。 全体への優れた追加点は、シングルスレッドであることです。 その理由はプログラムのアーキテクチャにあります。プログラムは inotify を使用して作業オブジェクトを監視し、起動時および再スキャン中に割り当てます。 rsync が転送媒体として使用されます。
チュートリアル: drbd+ocfs2 に基づいて共有ストレージを展開する方法
私たちにとって最も便利なソリューションの XNUMX つはリンクでした ocfs2+drbd。 次に、ソリューション データベースに基づいて XNUMX 台のサーバーに共有ストレージを迅速に展開する方法を説明します。 その前に、コンポーネントについて少し説明します。
DRBD - 標準 Linux ディストリビューションのストレージ システムで、サーバー間でブロック単位でデータをレプリケートできます。 主な用途は、フォールトトレラントなストレージを構築することです。
OCFS2 - 複数のシステムによる同じストレージの共有使用を提供するファイル システム。 Linux ディストリビューションに含まれており、FS を操作するためのカーネル モジュールとユーザー空間ツールが含まれています。 OCFS2 は、DRBD 経由だけでなく、複数の接続を備えた iSCSI 経由でも使用できます。 この例では DRBD を使用します。
すべてのアクションは、最小構成の ubuntu サーバー 18.04 で実行されます。
ステップ 1. DRBD を構成します。
ファイル /etc/drbd.d/drbd0.res には、仮想ブロックデバイス /dev/drbd0 を記述します。
resource drbd0 {
syncer { rate 1000M; }
net {
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
startup { become-primary-on both; }
on drbd1 {
meta-disk internal;
device /dev/drbd0;
disk /dev/vdb1;
address 10.10.10.192:7789;
}
on drbd2 {
meta-disk internal;
device /dev/drbd0;
disk /dev/vdb1;
address 10.10.10.193:7789;
}
}
内部メタディスク — 同じブロックデバイスを使用してメタデータを保存します
デバイス/dev/drbd0 — drbd ボリュームへのパスとして /dev/drbd0 を使用します。
ディスク/dev/vdb1 - /dev/vdb1 を使用します
同期器 { レート 1000M; } — ギガビットチャネル帯域幅を使用します
XNUMX つのプライマリを許可する - XNUMX つのプライマリ サーバーで変更を受け入れることができる重要なオプション
sb-0pri 後、sb-1pri 後、sb-2pri 後 — スプリットブレインが検出されたときのノードのアクションを担当するオプション。 詳細については、ドキュメントを参照してください。
両方でプライマリになる — 両方のノードをプライマリに設定します。
この例では、完全に同一の VM が 10 つあり、スループットが XNUMX ギガビットの専用仮想ネットワークを備えています。
この例では、1 つのクラスター ノードのネットワーク名は drbd2 と drbdXNUMX です。 適切に動作させるには、/etc/hosts 内のホストの名前と IP アドレスが一致する必要があります。
10.10.10.192 drbd1
10.10.10.193 drbd2
ステップ 2. ノードをセットアップします。
両方のサーバーで以下を実行します。
drbdadm create-md drbd0
modprobe drbd
drbdadm up drbd0
cat /proc/drbd
以下の結果が得られます。
同期を開始できます。 最初のノードで次を実行する必要があります。
drbdadm primary --force drbd0
ステータスを見てみましょう:
cat /proc/drbd
同期が始まりました。 最後まで待って画像を確認します。
ステップ 3. XNUMX 番目のノードで同期を開始します。
drbdadm primary --force drbd0
以下の結果が得られます。
これで、XNUMX つのサーバーから drbd に書き込むことができます。
ステップ 4. ocfs2 をインストールして構成します。
非常に単純な構成を使用します。
cluster:
node_count = 2
name = ocfs2cluster
node:
number = 1
cluster = ocfs2cluster
ip_port = 7777
ip_address = 10.10.10.192
name = drbd1
node:
number = 2
cluster = ocfs2cluster
ip_port = 7777
ip_address = 10.10.10.193
name = drbd2
に書き留める必要があります /etc/ocfs2/cluster.conf 両方のノード上で。
任意のノードの drbd0 に FS を作成します。
mkfs.ocfs2 -L "testVol" /dev/drbd0
ここでは、デフォルトのパラメータを使用して、ラベル testVol を持つファイル システムを drbd0 上に作成しました。
/etc/default/o2cb で、(設定ファイルと同様に) を設定する必要があります。
O2CB_ENABLED=true
O2CB_BOOTCLUSTER=ocfs2cluster
各ノードで実行します。
o2cb register-cluster ocfs2cluster
次に、自動実行する必要があるすべてのユニットをオンにして追加します。
systemctl enable drbd o2cb ocfs2
systemctl start drbd o2cb ocfs2
この一部はセットアップ プロセス中にすでに実行されています。
ステップ 5. 両方のノードの fstab にマウント ポイントを追加します。
/dev/drbd0 /media/shared ocfs2 defaults,noauto,heartbeat=local 0 0
ディレクトリ /メディア/共有 事前に作成しておく必要があります。
ここでは、起動時にファイルがマウントされないことを意味する noauto オプション (systemd 経由でネットワーク ファイルをマウントすることを好みます) と、heartbeat=local (各ノードでハートビート サービスを使用することを意味します) を使用します。 大規模なクラスターに適したグローバル ハートビートもあります。
次にマウントできるのは、 /メディア/共有 コンテンツの同期を確認します。
完了! その結果、スケーラビリティと適切なパフォーマンスを備えた、多かれ少なかれフォールト トレラントなストレージが得られます。
出所: habr.com