drbd + ocfs2ソリューションに基づいて2つのサーバーの共有ストレージを迅速に展開する方法。
誰にとって有用か:
このチュートリアルは、システム管理者や、ストレージの実装方法を選択したり、ソリューションを試したい人に役立ちます。
拒否した決定とその理由
多くの場合、読み取り/書き込みのパフォーマンスが良好な小さなWebクラスターに共通ストレージを実装する必要がある状況に直面しています。 プロジェクトに共通のリポジトリを実装するためのさまざまなオプションを試しましたが、いくつかの指標についてすぐに満足することはできませんでした。 では、その理由を説明しましょう。
- Glusterfsは読み取りと書き込みのパフォーマンスには適さず、多数のファイルの同時読み取りに問題があり、CPUに高い負荷がかかりました。 ファイルの読み取りに関する問題は、ブリックで直接適用することで解決できますが、これは常に適用できるわけではなく、通常は正しくありません。
- Cephは過度の複雑さを好まなかった。これは、2〜4台のサーバーを使用するプロジェクト、特にプロジェクトがその後サービスを受ける場合に有害になる可能性がある。 繰り返しになりますが、glusterfsと同様に、個別のストレージクラスターを構築することを余儀なくされる深刻なパフォーマンス制限があります。
- 1つのnfsサーバーを使用して共有ストレージを実装すると、フォールトトレランスの問題が発生します。
- s3は、特定の範囲のタスクに適した優れたソリューションですが、ファイルシステムではないため、範囲が狭くなります。
- lsyncd。 「非ファイルシステム」について既に話し始めている場合は、この人気のあるソリューションを検討する価値があります。 双方向の交換に不向きであるだけでなく(本当に必要な場合は可能です)、多数のファイルで安定して動作しません。 すべてに追加できるのは、シングルスレッドであるということです。 その理由は、プログラムのアーキテクチャです。inotifyを使用して、起動時および再スキャン時にハングする作業オブジェクトを監視します。 Rsyncは伝送媒体として使用されます。
チュートリアル:drbd + ocfs2に基づいて共有ストレージを展開する方法
私たちにとって最も便利なソリューションの1つは、たくさんのocfs2 + drbdでした。 次に、ソリューションデータベースに基づいて2つのサーバーの共有ストレージをすばやく展開する方法を示します。 しかし、最初に、コンポーネントについて少し:
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; } }
meta-disk internal-メタデータの保存に同じブロックデバイスを使用します
device / dev / drbd0 -drbdボリュームへのパスとして/ dev / drbd0を使用します。
ディスク/ dev / vdb1-/ dev / vdb1を使用
syncer {レート1000M; } -ギガビットチャネル帯域幅を使用する
allow-two-primaries-2つのプライマリサーバーで変更の受け入れを許可する重要なオプション
after-sb-0pri、after-sb-1pri、after-sb-2pri -splitbrainが検出されたときのノードのアクションを担当するオプション。 詳細については、ドキュメントを参照してください。
become-primary-on both-両方のノードをプライマリに設定します。
この場合、2つの完全に同一のVMがあり、専用の仮想ネットワーク帯域幅は10ギガビットです。
この例では、2つのクラスターノードのネットワーク名はdrbd1とdrbd2です。 適切に動作させるには、/ 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. 2番目のメモで同期を開始します。
drbdadm primary --force drbd0
次のものが得られます。
これで、2つのサーバーから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
ここでは、デフォルト設定を使用して、drbd0にtestVolというラベルの付いたFSを作成しました。
/ 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
/ media /共有ディレクトリは事前に作成する必要があります。
ここでは、noautoオプションを使用します。これは、起動時にFSがマウントされないことを意味します(systemdを介してネットワークFSをマウントすることを好みます)。 また、大規模なクラスターにより適したグローバルハートビートもあります。
次に、 /メディア/共有をマウントし、コンテンツの同期を確認できます。
できた! その結果、多かれ少なかれフォールトトレラントなストレージとスケーラビリティとまともなパフォーマンスが得られます。