阅读934 返回首页    go 阿里云 go 技术社区[云栖]


RDS-SQLSERVER不支持MSDTS的原因分析

一、Msdtc 的描述及使用方法

Msdtc 在就是windows中的一个服务,称为分布式事务处理服务。它帮助我们实现分布式数据库服务器之间集合事务处理,即远程异地事务处理功能,例如:有多个SQL SERVER 服务器,我们要让它互相执行更新操作,但又要保证事务的完整性,就要可以开启msdtc功能进行实现:

SqL server 分布式事务脚本举例:

{

Set XACT_ABORT on

Being tran

Insert into [远程机器ip].databaseName.dbo.tableName(id,name )

Select  ‘1’,’远程’

Insert into tablename(id,name)

Select ‘1’,’本地’

COMMIT

}

这个语句,启动了分布式事务, 保证远程数据库服务器和本地数据库都要插入一条数据,要么都插入,要么谁都不插入,保证数据的一致性。

二、Msdtc的配置:

网上写的很详细,我这里就不一一累述了

参考链接:

https://www.cnblogs.com/ryanding/archive/2010/07/17/1779668.html

 

三、RDS不支持的原因:

1、  msdtc 服务启动,是依赖于RPC服务的,该服务需要开启135端口,而我们现在链路层在转发vip时,没有考虑135端口包的转发。另外135端口是一个不建议开启的端口,在黑客有链接用户名、密码时可以远程直接通过该端口控制dbnode节点的,在没有用户名密码的情况也可以通过135端口,获取服务器的目录结构、用户名、共享目录等信息,这些信息如果被黑客获取,将是对RDS是致命的。这个原因跟安全专家林淼进行确认过的。

2、 msdtc 设置时需要客户端与服务器端都要配置,通过NT Authority\Network Service进行远程访问,而且不做验证。Network Service 帐户是一个内置帐户,比 Users 组的成员拥有更多的对资源和对象的访问权限。相当于服务器的操作系统级别权限,开放给了一个客户端(或者是用户)

四、     建议解决方案:

1、  暂时的处理该需求的方法,建议用户在应用端实现。

2、  后期可以考虑让用户购买两个RDS,来做分布式。这样是两个RDS主机之间相互暴露,而对用户(客户端)没有直接访问dbnode节点权限的问题。但需要现有的RDS考虑两件事情,一是考虑支持别名访问或者真实ip暴露给用户的问题 ,二是配置所有节点的msdtc服务。

最后更新:2017-04-03 08:26:18

  上一篇:go RDS最佳实践(一)–如何选择RDS
  下一篇:go 中国移动拟将部分服务价格下调至多50%