4

Windows 2008 R2 Standard に移行しており、Microsoft Clustering (アクティブ-パッシブ) 構成を使用します。私たちのアプリケーションは MSMQ プライベート キューに大きく依存しており、インストールでは次の C# コードを使用して 100 をはるかに超えるプライベート キューが作成されます。

MessageQueue.Create(".\private$\myqueue", false);

インストールはクラスターのコンテキスト内で実行されていないため、キューはクラスターではなくローカル ノードに作成されます。

次に、コードを次のように変更してみました。

MessageQueue.Create("MYCLUSTERNAME\private$\myqueue", false);

ただし、別のサーバー (この場合はクラスター サーバー コンテキスト) にプライベート キューを作成することはできず、"無効なキュー パス名" というエラーが表示されます。

私の 2 つの質問は次のとおりです。1) クラスターのコンテキストでインストールを実行して、プライベート キューを作成するときに実際にクラスター内にキューを作成する方法はありますか?

2) そうでない場合、.NET を介してクラスター内にキューを作成する最善の方法は何ですか? クラスター内に常駐する仲介者の Windows サービスを作成し、インストール時にプロセス間通信を使用して作成するキューをサービスに伝えるブログをいくつか読んだことがあります。これはハックのように思えますが、それが唯一のアプローチであることが判明した場合は実行可能です。

4

4 に答える 4

3

クラスタ化されたインスタンスで手動で行う方法は次のとおりです。(コード経由ではありません)

アクティブノードでのみ、必要なMSMQキューを作成します。

a。[スタート]をクリックし、コマンドプロンプトを右クリックして、[管理者として実行]をクリックします。

b。コマンドプロンプトで、次のコマンドを入力します({virtualname}はインスタンスの名前です)。

    i.  SET _CLUSTER_NETWORK_HOSTNAME_={virtualname}

   ii.  SET _CLUSTER_NETWORK_NAME_={virtualname}

  iii.  Compmgmt.msc

c。変数と同じコマンドプロンプトからコンピューターの管理が開始されたので、ローカルで変更を加えているように見えますが、実際にはクラスター化されたインスタンスで変更しています。

d。サービスとアプリケーションを展開します。

e。メッセージキューを展開します。

f。プライベートキューを右クリックし、[新規、プライベートキュー]をクリックします。

g。Create in:が仮想名であることを確認します。

h。[キュー名:private $ \]フィールドにキュー名を入力し、[OK]ボタンをクリックします。

私。コンピュータの管理を閉じます。

これはWindows2008R2で機能しました

于 2011-10-27T15:13:19.420 に答える
3

Powershell からの同じ解決策 (まだ使用していないもの???) 私はしばらくこの問題に取り組んでいましたが、最近このスレッドを見つけました。

http://winterdom.com/2011/10/using-powershell-with-clustered-msmq

以下は、私が最近使用している、プライベート キューを作成してアクセス許可を設定するサンプル スクリプトです。リモート マシンで作成します。私は Win2k3 サーバーを使用しています。

Invoke-Command -ScriptBlock {
$env:_CLUSTER_NETWORK_NAME_ = 'myclusterMSMQ'

Write-Host "... load the .NET Messaging assembly"
[Reflection.Assembly]::LoadWithPartialName("System.Messaging")
$environment="perf2"
$groups=@{`
    "MessageRouters"="DomainName\Group";`
    "CalcDaemons"="DomainName\GroupB";`
    "MessageSenders"="DomainName\GroupC";`
}


function new-queue ([string] $queuepath,[bool] $transactional)
{
    if (([System.Messaging.MessageQueue]::Exists($queuepath))){throw "$queuepath already exists"}
    Write-Host "creating $queuepath"
    [System.Messaging.MessageQueue]::Create($queuepath,$transactional)
}

function set-msmqpermission ([string] $queuepath,[string] $account, [string] $accessright)
{
    if (!([System.Messaging.MessageQueue]::Exists($queuepath))){
        throw "$queuepath could not be found."
    }
    $q=New-Object System.Messaging.MessageQueue($queuepath)
    $q.SetPermissions($account,[System.Messaging.MessageQueueAccessRights]::$accessright,            
      [System.Messaging.AccessControlEntryType]::Set)
}

#example usage
new-queue ".\private$\$($environment)ack" $false
set-msmqpermission ".\private$\$($environment)ack" $groups.messagerouters "FullControl"

} -ComputerName "servername (or array)"
于 2012-06-29T20:48:27.213 に答える
0

問題を解決するには、アプリケーションを実行する前に 2 つの環境変数を設定してみてください。

SET _CLUSTER_NETWORK_HOSTNAME_=cluster_name
SET _CLUSTER_NETWORK_NAME_=cluster_name

Windows Server 2003 R2 で動作しました。

于 2011-05-13T07:46:30.027 に答える
0

.NET MessageQueue を使用してこれを実現する方法を何時間もかけて探し求めてきた貧しい魂 (私のような) のために、Powershell を使用せずにクラスター化された MSMQ でキューを作成することできます。

Environment.SetEnvironmentVariable("_CLUSTER_NETWORK_HOSTNAME_", "yourclustername", EnvironmentVariableTarget.User);
Environment.SetEnvironmentVariable("_CLUSTER_NETWORK_NAME_", "yourclustername", EnvironmentVariableTarget.User);

var path = @"yourclustername\Private$\yourprivatequeuepath";
MessageQueue.Create(path, false);

サーバー2012でテスト済み。

警告: 環境変数は、EnvironmentVariableTarget.User を使用して設定した場合でも後でクリアするのが難しいため、設定には注意してください。また、クラスター内のマシンからクラスター内のプライベートキューにアクセスしようとしている場合にのみ、環境変数を設定する必要があるようです。

誤って環境変数を設定してしまった場合は、HKCU\Environment のレジストリでそれらをクリアできます。発生する可能性のある問題の 1 つは、環境変数が設定されている別のユーザー コンテキストでコードを実行した場合です。あるケースでは、そのユーザーとしてログインしてレジストリから削除できましたが、別のケースでは、IIS で Web サイトをデバッグしていて、LOCALSYSTEM アカウントにそれらが設定されていました。それらをクリアするために、値を null に設定する Web サイトを公開しました。また、.User、.Process、.Machine の環境変数の値を確認する必要があります。問題のプロセスが LO​​CALSYSTEM の場合、.Process スコープの変更はマシンが再起動されるまで有効にならないことに注意してください。

于 2016-04-14T08:39:30.450 に答える