Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
RG
Member

Откуда:
Сообщений: 173
Здравтсвуйте,
есть очереди на разных серверах, м/д которыми передаю сообщения, в одну сторону сообщения передаются без проблем, в обратную сторону застревают в sys.transmission_queue без диагностики, не понятно в чем ошибка.
1-й сервер:Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Service Pack 2)
2-й сервер:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Microsoft Corporation Enterprise Edition on Windows NT 5.2 <X86> (Service Pack 2)

Разница в версиях серверов имеет значение? Как посмотреть в чем ошибка?
29 сен 09, 14:52    [7720569]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
mike909
Member

Откуда:
Сообщений: 662
RG
Здравтсвуйте,
есть очереди на разных серверах, м/д которыми передаю сообщения, в одну сторону сообщения передаются без проблем, в обратную сторону застревают в sys.transmission_queue без диагностики, не понятно в чем ошибка.


1) В "remote service binding" на обоих серверах корректно настроены ?
2) В "CREATE ROUTE" на обоих серверах прописаны правильные BROKER_INSTANCE и ADDRESS ? Telnet_ом порты проверены ?
3) Пользователи имеют сертификаты и права на send ?

PS. Скорее всего с маршрутом намутили ...
29 сен 09, 15:25    [7720745]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
RG
Member

Откуда:
Сообщений: 173
Cертификаты есть, routes настроены правильно, иначе бы сообщения не приходили с первого сервера, я правильно понимаю?
29 сен 09, 15:50    [7720911]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
Amorph
Member

Откуда: Киев
Сообщений: 1402
RG,

у меня такие проблемы были когда в обратную сторону роут был с неправильным ID брокера
так что внимательнее на оба роута посмотрите
29 сен 09, 16:55    [7721369]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
RG
Member

Откуда:
Сообщений: 173
Скажите, по какой причине может не работать очередь в оба направления, если не трогать сертификаты и роуты, она перестала работать в обратном направлении, изначально передавая сообщения? Как посмотреть что не так?
Почему в sys.transmission_queue пустое поле transmission_status? Где еще можно посмотреть, что происходит?
30 сен 09, 14:44    [7724970]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
Amorph
Member

Откуда: Киев
Сообщений: 1402
RG,

запускайте профалер на оба сервера - отлавливайте все ошибки\варнинги и все события сервис брокера


Outgoing Messages
Outgoing messages are added to the transmission queue in the database that sends the message. The message remains in the transmission queue until the destination has acknowledged receipt of the message.

тынц

раз вы так уверены что с роутами у вас все хорошо, то встречный вопрос - что с EndPoint-ами которые юзаются этими роутами?
30 сен 09, 16:46    [7725934]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
RG
Member

Откуда:
Сообщений: 173
При отправке в одну сторону все работает отлично, при отправке в другую - застревают в transmission_queue. Смотрю профайлером, на принимающей стороне пишется ошибка:
This message could not be delivered because the security context could not be retrieved.
Если что-то с безопасностью, то почему тогда в одну сторону проблем нет? Что посмотреть в первую очередь?
6 окт 09, 10:00    [7746133]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
mike909
Member

Откуда:
Сообщений: 662
RG
При отправке в одну сторону все работает отлично, при отправке в другую - застревают в transmission_queue. Смотрю профайлером, на принимающей стороне пишется ошибка:
This message could not be delivered because the security context could not be retrieved.
Если что-то с безопасностью, то почему тогда в одну сторону проблем нет? Что посмотреть в первую очередь?

Это значит, что скорее всего к сертификату не привязан пользователь на "принимающей стороне".
Или с правами у этого пользователя проблемы. См. BOL_овский пример - очень подробно расписано...
А "при отправке в другую" сторону используется тот-же handle диалога, по которому успешно было получено сообщение ?
Или новый диалог ?
6 окт 09, 11:41    [7746885]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
RG
Member

Откуда:
Сообщений: 173
А как проверить какой пользователь привязан к сертификату?
При отправке в другую сторону используется другой Handle диалога.
6 окт 09, 12:16    [7747190]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
mike909
Member

Откуда:
Сообщений: 662
RG
А как проверить какой пользователь привязан к сертификату?
При отправке в другую сторону используется другой Handle диалога.


Судя по вопросу, Вы отошли от примера из BOL_а и пользователей не создавали и сертификаты не прикручивали.
Попробуйте в точности повторить все команды из BOL_а скорректировав в нужных местах названия баз, пользователей и пути к сертификатам.
Если не ошибаться, то все заводится с пол оборота - проверенно неоднократно.
6 окт 09, 13:24    [7747711]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
RG
Member

Откуда:
Сообщений: 173
В BOL в примере нет пивязки пользователя к сертификату, может я не там смотрю, можете скинуть ссылку?
Я смотрю http://msdn.microsoft.com/ru-ru/library/ms187798.aspx
6 окт 09, 13:57    [7747987]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
RG
Member

Откуда:
Сообщений: 173
Я создаю сертификат следующим образом:
--создание мастер-сертификата
CREATE CERTIFICATE test_master_cert
ENCRYPTION BY PASSWORD = 'password'
WITH SUBJECT = 'Shipping',
START_DATE='01/01/2008',
EXPIRY_DATE = '10/31/2050';


BACKUP CERTIFICATE test_master_cert TO FILE = 'C:\test_master_cert.cer'
WITH PRIVATE KEY ( DECRYPTION BY PASSWORD = 'password' ,
FILE = 'C:\test_master_cert.pvk' ,
ENCRYPTION BY PASSWORD = 'password' );

--DROP CERTIFICATE test_master_cert
CREATE CERTIFICATE test_master_cert
FROM FILE = 'C:\test_master_cert.cer'
WITH PRIVATE KEY
(FILE= 'C:\test_master_cert.pvk',decryption by password='password')
ACTIVE FOR BEGIN_DIALOG = ON
GO


--создание сертификата в базе
CREATE CERTIFICATE test_cert
ENCRYPTION BY PASSWORD = 'password'
WITH SUBJECT = 'Dialog',
START_DATE='01/01/2008',
EXPIRY_DATE = '10/31/2050';
GO

BACKUP CERTIFICATE test_cert TO FILE = 'C:\test_cert.cer'
WITH PRIVATE KEY ( DECRYPTION BY PASSWORD = 'password',
FILE = 'C:\test_cert.pvk' ,
ENCRYPTION BY PASSWORD = 'password');
GO
--drop certificate test_cert

CREATE CERTIFICATE test_cert
FROM FILE = 'C:\test_cert.cer'
WITH PRIVATE KEY
(FILE= 'C:\test_cert.pvk', decryption by password='password')
ACTIVE FOR BEGIN_DIALOG = ON

При восстановлении сертификатов второго сервера я явно прописываю пользователя:

use [master]
CREATE CERTIFICATE srv_master_cert
AUTHORIZATION username
FROM FILE = 'C:\srv_master_cert.cer'
ACTIVE FOR BEGIN_DIALOG = ON
GO


Правильно я понимаю, нужно еще при создании сертификатов на первом сервере добавлять
AUTHORIZATION username?

Или при создании пользователя, его нужно создавать для сертификата, как в примере?

CREATE CERTIFICATE CarnationProduction50
WITH SUBJECT = 'Carnation Production Facility Supervisors',
EXPIRY_DATE = '11/11/2011';
GO
CREATE USER JinghaoLiu FOR CERTIFICATE CarnationProduction50;
GO
6 окт 09, 14:16    [7748116]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
RG
Member

Откуда:
Сообщений: 173
Скажите, я правильтно понимаю, что при создании всех сертификатов нужно явно привязать к ним пользователей посредством AUTHORIZATION username?
Или можно привязать пользователей только к восстановленным сертификатам другого сервера?
7 окт 09, 09:52    [7751498]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
mike909
Member

Откуда:
Сообщений: 662
RG
Скажите, я правильтно понимаю, что при создании всех сертификатов нужно явно привязать к ним пользователей посредством AUTHORIZATION username?
Или можно привязать пользователей только к восстановленным сертификатам другого сервера?

1_ое - НЕТ
2_е - ДА

Смысл в том, чтобы к пользователю был привязан сертификат удаленного сервера.
Например, пусть необходимо связать три сервера между собой:
Получаем фалы сетификатов тем или иным способом
Для SQL_1
C:\Temp\Cer_1.cer
C:\Temp\Cer_1.pvk
Для SQL_2
C:\Temp\Cer_2.cer
C:\Temp\Cer_2.pvk
Для SQL_3
C:\Temp\Cer_3.cer
C:\Temp\Cer_3.pvk

Далее
---SQL_1---
use master
GO

--Create a master key in the master database.
create master key encryption by password = 'password'
--select * from sys.symmetric_keys
GO

--Create a certificate for transport security.
CREATE CERTIFICATE ctfCHCer_1
FROM FILE = 'C:\Temp\Cer_1.cer'
WITH PRIVATE KEY ( FILE = 'C:\Temp\Cer_1.pvk' , DECRYPTION BY PASSWORD = 'password' )
ACTIVE FOR BEGIN_DIALOG = ON

--select * from sys.certificates 
GO
create login SQL_2 with password = 'password'
create login SQL_3 with password = 'password'

create user SQL_2 for login SQL_2
create user SQL_3 for login SQL_3

create certificate ctfCer_2
AUTHORIZATION SQL_2
FROM FILE = 'C:\Temp\Cer_2.cer'
active for begin_dialog = ON

create certificate ctfCer_3
AUTHORIZATION SQL_3
FROM FILE = 'C:\Temp\Cer_3.cer'
active for begin_dialog = ON

GO

CREATE ENDPOINT SB_EndPoint
  state = started
as TCP (
  Listener_Port = 1001
)
for service_broker ( 
  AUTHENTICATION = CERTIFICATE ctfCHCer_1
)

GO
grant connect to SQL_2
grant connect to SQL_3
grant connect on endpoint::SB_EndPoint to SQL_2
grant connect on endpoint::SB_EndPoint to SQL_3
GO
--------------------------------------------------------------------------------
USE [MyDB_On_SQL_1]

create master key encryption by password = 'password'

GO

--Create a certificate for the SourceDB database.
CREATE CERTIFICATE ctfDlgCer_1
FROM FILE = 'C:\Temp\Cer_1.cer'
WITH PRIVATE KEY 
(FILE='C:\Temp\Cer_1.pvk', decryption by password='password')
ACTIVE FOR BEGIN_DIALOG = ON

GO

create user SQL_2 for login SQL_2
create user SQL_3 for login SQL_3

create certificate ctfDlgCer_2
AUTHORIZATION SQL_2
FROM FILE = 'C:\Temp\Cer_2.cer'
active for begin_dialog = ON

create certificate ctfDlgCer_3
AUTHORIZATION SQL_3
FROM FILE = 'C:\Temp\Cer_3.cer'
active for begin_dialog = ON

GO
--Grant the send permission to the user.
grant send on service::[SQL_1/SomeService]    to SQL_2
grant send on service::[SQL_1/SomeService]    to SQL_3

GO
create remote service binding [RSB_SomeService_SQL_2]
  to service 'SQL_2/SomeService'
  with user = SQL_2, anonymous = OFF;

create remote service binding [RSB_SomeService_SQL_3]
  to service 'SQL_3/SomeService'
  with user = SQL_3, anonymous = OFF;

GO

CREATE ROUTE [RouteTo_SomeService_SQL_2]
WITH  
  SERVICE_NAME     = N'SQL_2/SomeService' ,  
  BROKER_INSTANCE  = N'37411451-5DEA-4828-AA3B-D7BC1E063EAD',
  ADDRESS          = N'TCP://Comp_SQL_2.domain:1002';

CREATE ROUTE [RouteTo_SomeService_SQL_3]
WITH  
  SERVICE_NAME     = N'SQL_3/SomeService' ,  
  BROKER_INSTANCE  = N'DC93D851-B705-4500-82F2-8D1FD9DD99D0',
  ADDRESS          = N'TCP://Comp_SQL_3.domain:1003';

А теперь для SQL_2
---SQL_2---
use master
GO

--Create a master key in the master database.
create master key encryption by password = 'password'
--select * from sys.symmetric_keys
GO

--Create a certificate for transport security.
CREATE CERTIFICATE ctfCHCer_2
FROM FILE = 'C:\Temp\Cer_2.cer'
WITH PRIVATE KEY ( FILE = 'C:\Temp\Cer_2.pvk' , DECRYPTION BY PASSWORD = 'password' )
ACTIVE FOR BEGIN_DIALOG = ON

--select * from sys.certificates 
GO
create login SQL_1 with password = 'password'
create login SQL_3 with password = 'password'

create user SQL_1 for login SQL_1
create user SQL_3 for login SQL_3

create certificate ctfCer_1
AUTHORIZATION SQL_1
FROM FILE = 'C:\Temp\Cer_1.cer'
active for begin_dialog = ON

create certificate ctfCer_3
AUTHORIZATION SQL_3
FROM FILE = 'C:\Temp\Cer_3.cer'
active for begin_dialog = ON

GO

CREATE ENDPOINT SB_EndPoint
  state = started
as TCP (
  Listener_Port = 1002
)
for service_broker ( 
  AUTHENTICATION = CERTIFICATE ctfCHCer_2
)

GO
grant connect to SQL_1
grant connect to SQL_3
grant connect on endpoint::SB_EndPoint to SQL_1
grant connect on endpoint::SB_EndPoint to SQL_3
GO
--------------------------------------------------------------------------------
USE [MyDB_On_SQL_2]

create master key encryption by password = 'password'

GO

--Create a certificate for the SourceDB database.
CREATE CERTIFICATE ctfDlgCer_2
FROM FILE = 'C:\Temp\Cer_2.cer'
WITH PRIVATE KEY 
(FILE='C:\Temp\Cer_2.pvk',decryption by password='password')
ACTIVE FOR BEGIN_DIALOG = ON

GO

create user SQL_1 for login SQL_1
create user SQL_3 for login SQL_3

create certificate ctfDlgCer_1
AUTHORIZATION SQL_1
FROM FILE = 'C:\Temp\Cer_1.cer'
active for begin_dialog = ON

create certificate ctfDlgCer_3
AUTHORIZATION SQL_3
FROM FILE = 'C:\Temp\Cer_3.cer'
active for begin_dialog = ON

GO

--Grant the send permission to the user.
grant send on service::[SQL_2/SomeService]    to SQL_1
grant send on service::[SQL_2/SomeService]    to SQL_3

GO

create remote service binding [RSB_SomeService_SQL_1]
  to service 'SQL_1/SomeService'
  with user = SQL_1, anonymous = OFF;

create remote service binding [RSB_SomeService_SQL_3]
  to service 'SQL_3/SomeService'
  with user = SQL_3, anonymous = OFF;

GO

CREATE ROUTE [RouteTo_SomeService_SQL_1]
WITH  
  SERVICE_NAME     = N'SQL_1/SomeService' ,  
  BROKER_INSTANCE  = N'B8F44A1D-397F-4911-BB77-4D636384F178',
  ADDRESS          = N'TCP://Comp_SQL_1.domain:1001';


CREATE ROUTE [RouteTo_SomeService_SQL_3]
WITH  
  SERVICE_NAME     = N'SQL_3/SomeService' ,  
  BROKER_INSTANCE  = N'DC93D851-B705-4500-82F2-8D1FD9DD99D0',
  ADDRESS          = N'TCP://Comp_SQL_3.domain:1003';

А для SQL_3 - нарисуйте сами ...

P.S. GUID_ы service broker_ов в примере получены через select newid(). Реальные смотри в sys.databases.
Порты, имена серверов, сервис SB и домен взяты с потолка - подставте свои...
7 окт 09, 14:10    [7753559]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
RG
Member

Откуда:
Сообщений: 173
mike909, скажи: логин SQL_2 сервера, созданный на первом SQL_1 сервере, должен быть создан с тем же паролем, что и на SQL_2, или главное, чтоб названия совпадали?
7 окт 09, 16:14    [7754398]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
mike909
Member

Откуда:
Сообщений: 662
RG,

Во первых: на SQL_2 пользователь SQL_2 не создается
Во вторых: Имена пользователей и пароли взяты с потолка и, как следствие, могут быть любыми...
8 окт 09, 10:05    [7756940]     Ответить | Цитировать Сообщить модератору
 Re: Service Broker: Проблема при передаче сообщений в обратную сторону  [new]
RG
Member

Откуда:
Сообщений: 173
Спасибо большое, mike909!
Проблема была в том, что я восстанавливала сертификаты разных серверов под одним пользователем, не создавая для каждого сервера своего пользователя.
Ваш пример помог мне разобраться, еще раз спасибо:)
8 окт 09, 11:49    [7757674]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить