2010-11-10 1 views
4

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

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

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

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

MessageQueue.Create ("MYCLUSTERNAME \ частный $ \ myqueue", ложь);

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

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

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

+0

Пожалуйста, отметьте более тщательно. Удаление неправильного тега [tag: cluster-analysis] (aka: «кластеризация», в отличие от кластерных вычислений) –

ответ

0

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

SET _CLUSTER_NETWORK_HOSTNAME_=cluster_name 
SET _CLUSTER_NETWORK_NAME_=cluster_name 

Он работал на Windows Server 2003 R2.

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. В поле «Queue name: private $ \ field» введите имя очереди и нажмите кнопку «ОК».

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

Это работает на Windows 2008 R2

2

То же решение от 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" 
[email protected]{` 
    "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

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

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

Смежные вопросы