WinDRBD がディスクレス/スタンドアロン (両方のノード) になる理由

WinDRBD がディスクレス/スタンドアロン (両方のノード) になる理由

質問があります。

現在、この OS は Windows Server 2019 です。ボリューム構成は Raid-5 です。2 つのサーバーはハートビート ネットワークで接続されています。両方のノードは WinDRBD を使用してミラーリングされました。両方のノードは同じ構成です。G: を未フォーマットのままにして、D: をプライマリ ノードから見えるように設定しました。

私のリソースは以下の通りです

include "global_common.conf";

resource "foo" {
    protocol    A;

    net {
        use-rle no;
    }
    on node1 {
        address     XXX.XXX.XXX.XXX:7600;
        node-id 1;
        volume 1 {
            disk        "G:";
            device      minor 1;
            meta-disk   internal;
        }
    }
    on node2 {
        address     XXX.XXX.XXX.XXX:7600;
        node-id 2;
        volume 1 {
            disk            "G:";
            device      minor 1;
            meta-disk   internal;
        }
    }
}

両方のノードが正常に動作しました。役割を切り替えてテストを完了しました。(プライマリ → セカンダリ / セカンダリ → プライマリ)

しかし、起動後に問題が発生しました。

起動後、ステータスは以下のようになります。(両ノード)

foo role:Secondary
  volume:1 disk:Diskless
  node2 connection:StandAlone

いろいろ考えて調べてみましたが、答えは見つかりませんでした。

いくつか疑問に思ったことがありました。

G: 文字がドライブに割り当てられる前に試したからでしょうか。私の考えが正しければ、回避策はありますか?

今のところ私の意見ですが、上記の問題が引き続き発生する場合、原因は何でしょうか?

一度は下記の方法で解決しましたが、原因を突き止めて正確に修正したいです。

drbdadm down foo
drbdadm up foo

ご協力をよろしくお願いいたします。

答え1

WinDRBD がハートビートを失うと、問題が発生します。h/b の配線を切断すると、問題が簡単に再現します。結論は明らかです。少なくとも今のところは、WinDRBD を本番環境で使用しないでください。WinDRBD は脆弱です。

答え2

@BaronSamedi1958 の言うことは正しいです。WinDRBD はネイティブの Windows ソリューションではなく、Linux カーネル API をエミュレートするラッパーの助けを借りて Linux から Windows に露骨に移植されたものです。

https://linbit.com/windrbd-replicated-disk-drives-for-windows/

「技術的には、WinDRBD Windows ドライバは、Windows プラットフォーム用の DRBD ドライバで使用される Linux カーネル API をエミュレートする薄い Linux 互換レイヤーで構成されています。このレイヤー内では、オリジナルの DRBD エンジン (いくつかのコンパイラ固有のパッチ付き) が動作しています。」

その結果、WinDRBD は自分が何をしているのか、何が起こっているのかをほとんど把握していません。初期化時にパートナー ノードへのネットワーク接続を確立しようとしますが、Windows カーネル エコシステム内では、ネットワーク スタックが完全に起動して実行される前にストレージ スタックが起動するため失敗します。WinDRBD はパートナー ノードに ping できないため、何か問題が発生していると想定し、ストレージ プールを起動して保存し、データの破損を回避しません。

この問題を解決する方法はいくつかあります。

  1. WinDRBD によって使用される NIC を制御する NDIS ミニポートに windrbd ドライバーの開始依存関係を設定します。

https://docs.microsoft.com/en-us/windows-hardware/drivers/install/ドライバーのロード順序の指定

これは実際には不安定な方法であり、ネットワーク アダプターを変更すると構成が台無しになります。+ NDIS ミニポートの上には、NDIS フィルター (ファイアウォール?)、NDIS プロトコル ドライバー (TCP/IP?) など、よくわからないドライバーが多数あり、使い慣れていない特別なツールを使用して戻る必要があります。

https://docs.microsoft.com/en-us/windows-hardware/drivers/network/ndis-driver-stack

  1. WinDRBD の自動起動を避け、ログオンに依存するスクリプトを使用して擬似的に起動します。ログオン プロセス中はすべてのカーネル コンポーネントが準備されており、最悪の場合、失敗したドライバーの起動の問題をログ ファイルに記録し、分析してスクリプトを再試行するなどできます。

もちろん、これは実行可能ですが、PowerShell を少しいじる必要があります。以下のディスカッション スレッドから、いくつかの良い出発点を得ることができます。

https://stackoverflow.com/questions/27599287/powershell-disable-and-enable-a-driver

  1. StarWind vSAN Free や、AzS HCI に組み込まれた Microsoft 独自の SDS など、Windows 用に最初から設計されたものを使用します。

https://www.starwindsoftware.com/starwind-virtual-san-free

https://docs.microsoft.com/ja-jp/azure-stack/hci/概要

答え3

WinDRBD のバージョンをアップグレードすることをお勧めします。現在使用しているバージョンはまだリリース候補版です (投稿の日付から推測すると 1.0.0-rc14 程度)。新しい WinDRBD にアップグレードしてください。コンパイル済みのインストーラは次の場所にあります。

https://linbit.com/linbit-software-download-page-for-linstor-and-drbd-linux-driver/

この記事の執筆時点での最新バージョンは 1.1.10 です。

G: ドライブがバックアップデバイスである場合、この設定は正しいです。

問題が解決しない場合はお知らせください。

関連情報