通过SQL Server Service Broker从一台计算机向另一台计算机发送消息。
发件人 - 带有SQL Server 2014的Windows Server 2012 R2 12.0.4213.0基于NAT的标准,它将Service Broker的端口转发从公共IP:端口转移到本地SQL Server IP:端口。例如,假设端口为26223
,并且它转发到SQL Server 4022
。
Receiver - 带有SQL Server 2017 RC2 Express的CentOS 7作为Web服务器,为Service Broker打开了相同的特定端口。 (更新到最新的SQL Server CU - 14.0.3030.27没有帮助)
我从Sender发送消息给接收者,并且首先在sys.transmission_queue
中收到有关错误的alghoritm的错误,然后我发现我在发送者和接收者的端点上有加密密钥alghoritms不同并且已更改接收方端点密钥加密算法以匹配发送方
之后,我发送的邮件显示在sys.transmission_queue
中,并显示另一个错误 - Service Broker/Database Mirroring network protocol error occurred.
在SQL Profiler中我发现了更多详细信息:
代理:已损坏的消息 - 已收到已损坏的消息。二进制消息前导码格式不正确。
在Receiver端,SQL Profiler显示:
审计经纪人登录:4 - 协商失败 - 接收数据时发生错误:' 996(重叠的I / O事件未处于信号状态。)'。
审计经纪人登录:5 - 身份验证失败
除了之前的话,有时我在接收方也遇到了这个错误:
审计经纪人登录:4 - 协商失败 - 接收数据时发生错误:' 24(程序发出命令但命令长度不正确。)'。
我只有一条消息让该实例在发件人方sys.transmission_queue
等待。
更新 我使用了 ssbdiagnose 实用程序,这就是它所说的:
D 29835 MainServer MainDatabase Messages on conversation handle 13c07ab1-6b8d-e711-80c5-002590cb2a25 (conversation id 3a7d0dd0-c957-4fe8-a98e-1cb56713023c) from service sbSenderService to service sbReceiverService cannot be transmitted dues to the following problem: Service Broker/Database Mirroring network protocol error occurred.
An internal exception occurred: No such host is known
D 29933 WebServer WebDatabase The routing address TCP://[NAT ip address was here]:26223 for service sbSenderService does not match any of the IP addresses for MainServer
An internal exception occurred: Value cannot be null.
Parameter name: value
An internal exception occurred: No such host is known
P 29945 Cannot parse the routing address: unknown
因此,新错误发挥作用:路由地址TCP:// [NAT IP地址在这里]:26223服务sbSenderService与MainServer的任何IP地址都不匹配
据我了解,我的MainServer(发件人)不知道TCP头中的NAT IP地址,并标记TCP包格式错误,对吧?如何解决?
UPDATE2:我们在服务器之间设置VPN隧道,但仍然存在相同的错误。测试CentOS服务器已打开所有端口,没有Selinux。现在我假设Service Broker在CentOS和Windows之间不起作用。
UPDATE3:在CentOS上更新到最新的SQL Server CU - 14.0.3030.27没有帮助