架构深渊

慢慢走进程序的深渊……关注领域驱动设计、测试驱动开发、设计模式、企业应用架构模式……积累技术细节,以设计架构为宗。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

用SQL实现分布式数据复制 [转]

Posted on 2009-05-10 11:24  chen eric  阅读(290)  评论(1编辑  收藏  举报
复制的概念 

  复制作为一个重要并且强大的技术,为分布式数据的存储和处理提供了有力支持。微软公司的SQL Server可以生成数据的拷贝,并能把这些数据的拷贝分发到不同的地方,自动进行数据的同步,保持所有的数据拷贝具有相同的数据。SQL Server采用一种称为“松散一致”的复制模式在两个数据库之间进行复制。这两个数据库既可以在同一台计算机上,也可以在不同的计算机上,彼此通过局域网(LAN)、广域网(WAN)进行连接。 

  我们公司在开发“西安市国家税务局内部网络信息系统”中,正是利用了SQL Server的复制功能,实现全西安市分布的税收数据的复制同步。西安市国家税局包括市局机关和下属的18个基层征管分局,分布于西安市不同的地理位置,彼此通过DDN专线或X.25专线连接,构成了西安国税局广域网。市局信息中心用Windows NT Server4.
0 构建一个Windows NT的单主域网络环境,下属每个分局有一台运行Windows NT Server 4.0或Windows NT Server 3.51的服务器,通过广域网加入到单主域的环境中作为一台独立的服务器运行。各分局建有本分局的局域网,网络环境为Novell和Windows NT的混合网络环境。 

  全西安市所有的纳税人,均到指定的征管分局进行纳税登记、纳税申报。国税局用FoxPro开发了基于Novell网络环境的税收征管软件,在各分局征收大厅由Novell的无盘工作站负责税收数据的录入,写入到Novell服务器上的数个DBF文件中。由于税收征管数据分布在全市不同的征管分局,为全市范围纳税信息的检索和分析带来困难。 

  新系统的开发,在原有基础上,编制专门的数据转换程序,把存储于Novell服务器上的DBF文件转换到本分局Windows NT上的SQL Server数据库中。每个分局的SQL Server数据库与市局信息中心的SQL Server数据库进行复制,及时把最新的税收数据传递到市局信息中心。这样在市局信息中心,就有了全市所有税收征管数据。信息中心建立Intranet Web站点,用户的计算机只要连上各分局的局域网,或者通过Modem拨号到信息中心的RAS服务器,就可以用IE浏览器访问IIS服务器,由IIS服务器向SQL Server服务器发出数据请求并把结果按HTML格式返回给用户浏览器。 

  系统的设计采用客户浏览
/服务器的多层结构方式,客户端采用标准的浏览器访问方式。用户在自己的计算机上安装IE浏览器(WIN98、WINNT4.0中已内置IE4浏览器),输入Web 站点地址,就可以进入该系统。 

  在中间层,由Internet Information Server完成大多数的用户业务规则的实现,例如对用户权限的限制、数据请求的生成等。IIS会根据不同的用户所拥有的不同的权限,生成不同的页面。将来当业务规则发生变化时,只需要在Internet Information Server上进行相应的更改,这种更改就会在系统的每一个用户下次访问系统时得到体现。 

  在系统的最低层,由SQL Server大型关系数据库作为支撑。西安全市的税务数据是一个以GB为单位的大型数据库,纳税数据表中的数据记录超过数百万条,在如此大量的数据中进行快速的数据检索和数据分析,一般的数据库软件是难以完成的。SQL Server关系型数据库,较好地完成了用户提出的各种数据的检索要求,同时也正是利用了SQL Server的数据复制技术,把近二十个分局的数据通过广域网复制到信息中心来,使用户能快速获取全市的纳税信息。 

  该系统实现的一个重要部分就是各分局税收征管数据的复制。SQL Server的复制有以下几个特点: 

  
1.基于事务 

  有复制标志的事务从源数据库的事务日志读出,并送到目的数据库。例如执行了一条Insert语句使源数据库的数据发生变化,这条Insert语句会被写入到一个数据库中,我们称之为发布数据库(Distrbution)。在适当的时候,这条Insert语句会送到复制的目的数据库并执行该Insert语句,以此保证两端的数据保持同步。 

  
2.以三种不同的方式使用服务器 

  (
1)出版(Publication):作为源数据服务器(在本系统中是各分局的SQL Server服务器),当标志复制的表(Table)的数据发生变化时,产生该变化的事务被刻上复制标志,由日志阅读器(LogReader)把该事务送入分发数据库(Distribution Database)。这些事务寄存在分发数据库中直到被传送到目的服务器。 

  (
2)分发(Distribution):包含有分发数据库。分发服务器接受出版服务器的更改事务,并保存到分发数据库中。在适当的时候,把这些事务送入订阅服务器。缺省情况下,分发服务器与出版服务器为同一台计算机,当然也可以是不同的计算机。 

  (
3)订阅(Subscription):接受出版服务器的出版数据。 

  
3.使用专用的SQL Server数据库作为复制数据的可靠队列 

  SQL Server的复制采用“松散一致”复制模式,其特征是源数据与拷贝数据之间并不是在任何时刻都保持完全一致,它们之间有一个延时。源数据库的变化,不是立刻反应到订阅数据库中,而是把产生变化的事务写入一个专门的分发数据库中(Distribution)。当这些事务累计到设定值时,由事务分发器(Distribution task)把事务送到订阅服务器中。订阅服务器再执行这些事务来保持源数据与拷贝数据的一致。分发数据库完成了一种缓冲的作用,当因网络或其他问题使复制不能完成时,源数据的变化会一直保存在分发数据库中直到问题解决再自动把所有保存的事务送出,并且复制两端的数据仍保持一致。这种方式使SQL Server数据的复制有极大的自适应性和可靠性,最大限度减少用户的干预。 

  SQL Server的复制主要组成部分有:日志阅读(
Log Reader)、初始同步(Synchornization)、数据分发(Distribution)和分发数据库。 

  初始同步是复制真正开始执行的第一步。类似于开始传送事务前,先给源数据库照一个快照,把传送事务前的那一时刻的数据拷贝到订阅数据库。其实质就是把那时刻的数据生成BCP文件,通过网络传到订阅数据库。完成初始同步后,再开始由日志阅读初始同步以后的事务,并由数据分发过程传送分发数据库中的事务到订阅服务器中去。 

  复制的实现 

  下面我们结合在西安市国家税务局内部网络信息系统的实例,介绍SQL Server6.5的配置以及其中需要注意的事项。 

  复制前的准备 

  (
1)使用一种字符集:市局和分局的SQL Server的配置使用一种字符集。 

  (
2)允许分局服务器有足够的事务日志空间。 

  (
3)最好设置MSSQL Service 和SQLExecutive Service Auto Start at Boot time。 

  复制的安装 

  (
1)运行Microsoft SQL Enterprise Manage,在Server Manager窗口中选择源数据服务器。 

  (
2)从Server选单选择Replication Configuration, 然后从所出现的子选单选择Install Publishing。出现Install Replication Publishing 对话框。 

  (
3)选择Local-Install New Local Distribution Database选项(配置该服务器充当自身的分发服务器)。 

  在为分发数据库建立分发数据库设备时,要根据源数据的更新率估计分发数据设备的大小,尽量把分发数据库建大些。 

  设置出版和订阅服务器和数据库 

  在前面的安装分发数据库中,如果在询问是否在本次配置服务器选项对话框中,选择YES,则出现Replication-Publishing对话框。在Enable Publishin 
to These Servers(左边列表)目录中选择订阅的服务器,在本实例中为信息中心的SQL Server。在Publishing Database下(右边列表),选择被允许出版数据的数据库。 

  回到Server Manager,选择订阅服务器,从Server选单选择Replication Configuration;然后从出现的下拉选单选择Subscribing,出现Replication-Subscribing对话框。在左侧的Publishing Server框中选择源数据SQL服务器,在右侧的框内选择拷贝的数据库。 

  复制数据的设置 

  安装SQL Server复制并设置复制的服务器和数据库后,要进行出版物的设置,就是指定复制数据库中那些表要进行复制,一个出版物可以包括很多表。 

  从Server Manager窗口,选择源数据服务器。 

  从Manage选单,选择Replication,然后选择Publication对话框。 

  选择“NEW”,出现Edit Publications对话框。为该复制数据设置一个名字,选择要复制的表到右边的列表。 

  这里要注意到这样一个情况,因为我们要从多个源数据库向一个中心服务器数据库复制数据,一定要保证源数据之间不会互相影响。复制的表中要有字段定义数据的来源。 

  在Edit Publications对话框,选择右边列表中要复制的表,按“Edit”按钮,进入Manage Article对话框,在最下面的Restriction Clause中输入标识唯一源数据的条件。 

  在Manage Article对话框中,选择Scripts标签。按“Generate”按钮,出现模式源设置画面。这里需要设置初始同步的模式。在多个源数据库向一个中心数据库复制数据时,这里一定要选择“
DELETE DATA Using Restriction Clause”,即是用前面的唯一标识条件对数据操作。否则会造成不同数据源的复制数据互相影响。 

  开发体会 

  SQL Server的复制被设计成最小用户干预的实现。一旦设置完成后,基本不需要用户再去进行处理。虽然初始同步时SQL Server自动进行的,但在实际应用中,广域网的连接(DDN、X.
25)常常不能完成这种同步,所以需要我们手工完成初始同步,例如自己把源数据库BCP数据导出,再导入到订阅数据库中,选择初始同步的模式为No Data Synchronization。 

  SQL Server的复制是基于事务的。在广域网的连接速度比较慢的情况下,不要做一次更新很多记录的操作,例如一条无条件限制的UPDATE语句,在源数据库中可能影响1000条记录,但在事务传送中,会发出1000条UPDATE语句并作为一个事务传出,很容易造成复制失败。这时最好把更新的操作分解得很小,每一条更新语句都作为单独的事务传送。 

  适当增大分发数据库的大小,保证在网络不同的情况下,分发数据库有足够的空间保存更新操作的事务。 

  及时清除分发数据库。设置复制后,SQL Server会生成一个清除分发数据库的任务,负责把分发数据库中分发到订阅服务器的事务删除。但缺省情况下,清除任务是每天夜里105执行,如果你的SQL Server服务器不是24小时开机,注意把该任务调整到开机的时间范围内内执行。 

  对于大数据库的数据查询检索SQL语句的编写,特别是对带有GROUP一类合计的查询的使用以及多表连接,一定要注意。尽量避免GROUP后有多余两个字段的查询,把需要按多个字段分组GROUP的查询分成多次,利用中间表完成查询。适当增加temdb数据库的大小,使用一台单独的服务器作为SQL Server服务器,尽量为SQL Server分配更多的内存。例如在128M内存的配置下,为SQL Server分配100M的内存。 

  在微软新近推出的SQL Server 7中,数据查询的功能得到很大的加强,在多表连接、合计分组等方面都有很大的提高。SQL Server6.5中的数据复制是单向的,仅有源数据库的数据被更新到订阅数据库中。在新版本的SQL Server7中,复制已经实现了双向的复制,任何一端数据的更改,都会在另一端得到体现。SQL Server7中的复制,出版和订阅服务器可以使用不一样的代码页,这一点也较SQL Server6.5限制少了。