通过 SQL Server Service Broker 将消息从一台机器发送到另一台机器。
发件人- Windows Server 2012 R2 和 SQL Server 2014 12.0.4213.0 Standard over NAT,具有从公共 IP:端口到本地 SQL Server IP:端口的 Service Broker 端口转发。例如,假设端口是
26223
并且它转发到 SQL Server4022
。Receiver - CentOS 7 和 SQL Server 2017 RC2 Express 作为 Web 服务器,为 Service Broker 打开了相同的特定端口。(更新到最新的 SQL Server CU - 14.0.3030.27 没有帮助)
我从 Sender 向 Receiver 发送消息,首先在错误的算法中sys.transmission_queue
出错,然后我发现我在发送者和接收者的端点上有不同的加密密钥算法,并更改了接收者端点密钥加密算法以匹配发送者的。
之后,我发送的消息出现sys.transmission_queue
了另一个错误 -Service Broker/Database Mirroring network protocol error occurred.
在 SQL Profiler 中,我找到了更多详细信息:
Broker:Corrupted Message - 收到损坏的消息。二进制消息前导码格式错误。
在 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
因此,新的错误出现了:服务 sbSenderService 的路由地址 TCP://[NAT ip address was here]:26223 与 MainServer 的任何 IP 地址都不匹配
据我了解,我的 MainServer(发件人)不知道 TCP 标头中的 NAT IP 地址并标记 TCP 包格式错误,对吗?如何解决?
UPDATE2:我们在服务器之间设置了 VPN 隧道,同样的错误仍然存在。测试 CentOS 服务器打开了所有端口,没有 Selinux。现在我假设 Service Broker 不能在 CentOS 和 Windows 之间工作。
UPDATE3:在 CentOS 上更新到最新的 SQL Server CU - 14.0.3030.27 没有帮助