Создание частной очереди MSMQ в кластере Microsoft с помощью сценария - PullRequest
4 голосов
/ 10 ноября 2010

Мы осуществляем переход на Windows 2008 R2 Standard и будем использовать конфигурацию кластеризации Microsoft (активно-пассивная).Наше приложение сильно зависит от частных очередей MSMQ, и наша установка создает более 100 частных очередей, используя следующий код C #.

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

Поскольку установка не выполняется в контексте кластера, очереди создаются на локальном узле, а не в кластере.

Затем мы попытались изменить код на:

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

Однако вы не можете создать частные очереди на другом сервере (в данном случае в контексте сервера кластера), и вы получаете сообщение об ошибке "Неверноимя пути к очереди ".

У меня два вопроса: 1) Есть ли способ запустить установку в контексте кластера, чтобы при создании частной очереди она фактически создавала очередь в кластере?

2) Если нет, каков наилучший подход к созданию очередей в кластере через .NET?Я читал некоторые блоги, где люди создают службу Windows среднего уровня, которая находится внутри кластера, а затем их установка использует межпроцессное взаимодействие, чтобы сообщить службе, какие очереди создавать.Это похоже на взлом, но выполнимо, если это окажется единственным подходом.

Ответы [ 4 ]

3 голосов
/ 27 октября 2011

Вот как это сделать вручную на кластеризованном экземпляре.(Не через код)

ТОЛЬКО НА АКТИВНОМ УЗЛЕ, создайте необходимые очереди MSMQ.

a.Нажмите «Пуск», щелкните правой кнопкой мыши командную строку и выберите «Запуск от имени администратора».

b.В командной строке введите следующие команды (где {virtualname} - это имя экземпляра.)

    i.  SET _CLUSTER_NETWORK_HOSTNAME_={virtualname}

   ii.  SET _CLUSTER_NETWORK_NAME_={virtualname}

  iii.  Compmgmt.msc

c.Теперь, когда управление компьютером запущено из той же командной строки, что и переменные, будет выглядеть, как будто вы вносите изменения локально, но вы фактически изменяете их в кластерном экземпляре.Разверните Сервисы и Приложения.

e.Разверните очередь сообщений.

f.Щелкните правой кнопкой мыши на «Частные очереди» и выберите «Новая», «Частная очередь».

g.Убедитесь, что Create in: является виртуальным именем.

h.В поле Имя очереди: личное $ \ введите имя очереди и нажмите кнопку ОК.

i.Закрыть Управление компьютером.

Это работало в Windows 2008 R2

2 голосов
/ 30 июня 2012

То же решение от 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)"
0 голосов
/ 14 апреля 2016

Ради бедных душ (таких как я), которые часами изучали, как этого добиться с помощью .NET MessageQueue, можно создавать очереди в кластеризованном MSMQ без Powershell:

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.Кроме того, кажется, что необходимо устанавливать переменные среды, только если вы пытаетесь получить доступ к частной очереди в кластере с компьютера в cluster.

Если вы случайно установили переменные среды, вы можете очистить их в реестре по адресу HKCU \ Environment.Одна проблема, которая может возникнуть, если вы запускаете код в другом пользовательском контексте, в котором установлены переменные среды.В одном случае я смог войти в систему как этот пользователь, а затем удалить их из реестра, но в другом случае я отлаживал веб-сайт под IIS, и учетная запись LOCALSYSTEM установила их.Чтобы очистить их, я опубликовал веб-сайт с нулевыми значениями.Вы также хотите проверить значения переменных env для .User, .Process и .Machine.Обратите внимание, что изменения в области .Process не вступают в силу, пока машина не будет перезапущена, если рассматриваемый процесс LOCALSYSTEM.

0 голосов
/ 13 мая 2011

Чтобы решить вашу проблему, попробуйте установить две переменные среды перед запуском приложения:

SET _CLUSTER_NETWORK_HOSTNAME_=cluster_name
SET _CLUSTER_NETWORK_NAME_=cluster_name

Работает на Windows Server 2003 R2.

...