代码改变世界

浅谈SQL Server 2005联合数据库服务器(一)

2011-10-23 00:18  Echo.  阅读(367)  评论(0)    收藏  举报

 

一般网站是由应用程序跟数据库应用程序组成的。稍微大点的网站都会有多台服务器搭建起来的,比如web应用程序服务器,图片服务器,文件服务器,样式服务器,数据库服务器。今天就来讨论下SQL SERVER 2005的联合数据库服务器。 某些公司随着不断发展,业务范围不断扩大,复杂,导致需要处理的数据越来多,越来越频繁,这个时候一台数据库服务器明显不能够支持现有业务,建立联合数据库服务器可以对SQL SERVER数据库的数据进行水平分区在一组服务器间散布处理负荷。假如现在有下面2台SQL Server 2005服务器分别为XIAOYAN-BE50AF5,XIAOYAN-BA6058F.

 

在开始建立测试环境之前,我们来比较下单个服务器,与联合服务器的差异:

单个服务器层 联合服务器层

生产服务器上有一个 SQL Server 实例。

每个成员服务器上有一个 SQL Server 实例。

生产数据存储在一个数据库中。

每个成员服务器都有一个成员数据库。数据分布在成员数据库之间。

一般每个表都是一个实体。

原始数据库中的表被水平分区到成员表。每个成员数据库有一个成员表,而且使用分布式分区视图使每个成员服务器上看起来似乎都有原始表的完整副本。

所有连接都连接到单个服务器,而所有 SQL 语句都由 SQL Server 的同一实例进行处理。

应用程序层必须能够将 SQL 语句配置到包含语句所引用的大部分数据的成员服务器上

OK,建立测试环境。

 

View Code
 1 --服务器[XIAOYAN-BE50AF5],创建测试库,表
 2 use master;
 3 go
 4 sp_addlinkedserver 'XIAOYAN-BA6058F','','SQLNCLI','XIAOYAN-BA6058F','','','';
 5 go
 6 sp_addlinkedsrvlogin 'XIAOYAN-BA6058F','false',NULL,'sa','sa';
 7 go
 8 sp_serveroption 'XIAOYAN-BA6058F''lazy schema validation''true';
 9 go
10 --检测是否定义成功
11 select * from sys.servers;
12 go
13 
14 
15 if exists (select * from sys.databases where [name] = N'Sales')
16     drop database Sales;
17 
18 create database Sales;
19 go
20 use Sales;
21 go
22 SET ANSI_PADDING ON;
23 
24 create table dbo.customers
25 (
26     customerid int primary key check (customerid > 0 and customerid < 30001)not null,
27     firstname nvarchar(50not null,
28     lastname nvarchar(50not null,
29     birthday datetime null
30 ) on [PRIMARY];
31 go
32 
33 --创建分布式分区视图
34 create view dbo.v_customer
35 as
36     select customerid,firstname,lastname,birthday from Sales.dbo.customers
37     union all
38     select customerid,firstname,lastname,birthday from [XIAOYAN-BA6058F].Sales.dbo.customers
39     with check option;
40 go
41 
42 
43 --服务器[XIAOYAN-BA6058F],创建测试数据库,表
44 use master;
45 go
46 --设置另外2台服务器为链接服务器
47 sp_addlinkedserver 'XIAOYAN-BE50AF5','','SQLNCLI','XIAOYAN-BE50AF5','','','';
48 go
49 sp_addlinkedsrvlogin 'XIAOYAN-BE50AF5','false',NULL,'sa','sa';
50 go
51 sp_serveroption 'XIAOYAN-BE50AF5''lazy schema validation''true';
52 go
53 
54 --检测是否定义成功
55 select * from sys.servers;
56 go
57 
58 if exists (select * from sys.databases where [name] = N'Sales')
59     drop database Sales;
60 
61 create database Sales;
62 go
63 use Sales;
64 go
65 SET ANSI_PADDING ON;
66 
67 create table dbo.customers
68 (
69     customerid int primary key check (customerid >= 30001not null,
70     firstname nvarchar(50not null,
71     lastname nvarchar(50not null,
72     birthday datetime null
73 ) on [PRIMARY];
74 go
75 create view dbo.v_customer
76 as
77     select customerid,firstname,lastname,birthday from Sales.dbo.customers
78     union all
79     select customerid,firstname,lastname,birthday from [XIAOYAN-BE50AF5].Sales.dbo.customers
80     with check option;
81 go

 

为了demo容易读懂,我首先在每台服务器上添加彼此为链接服务器,并创建了登陆映射,另外还在2台服务器上建立了2个一样的Sales数据库,里面分别有一张表customers,除里分区列customerid外,我还象征性的添加了firstname ,lastname,birthday 几个列,这样更稍微像一张表,虽然库名,表名不是强制性要求一致,但是希望尽量一致,因为这有利于后期对联合数据库日后的频繁操作。每个服务器上都建立了一个简单的分布式分区视图,

 

熟悉SQL SERVER 2005的朋友都看出来了, 这断代码其实就是分别对2台服务器建立彼此的链接,即使10台服务的话,就得每台服务器添加对另外9台的映射,麻烦。

SERVER1添加 SERVER 2,SERVER3.....SERVER10

SERVER2添加 SERVAER 1,SERVER3....SERVER10

SERVER3添加 SERVER1,SERVER2,SERVER4....SERVER10

注意:这些链接服务器之间没有主次之分,但是有先后之分。因为在SERVER 1创建分布式分区视图,引用的SERVER2,SERVER3必须要用sp_addlinkedserver添加,并且建立登陆映射。

添加测试数据前准备工作.首先查看每台服务器Distributed Transaction Coordinator 服务是否已经启动,否则开始-运行-cmd-net start msdtc.如果msdtc没有正常启动则可能是因为丢失了msdtc日志文件,在cmd里给创建个,输入msdtc -resetlog 然后Enter, 输入net start msdtc 再次Enter.确保三台服务器dtc启动后随便再其中某台服务器执行t-sql:

添加测试数据:

 

1 set xact_abort on;
2 begin distributed tran;  
3 insert into Sales.dbo.v_customer
4 select 1,N'Mr',N'Z','2011-01-01'
5 union all
6 select 30001,N'Mr',N'Y','2012-01-01';
7 commit tran;
8 go

执行查询视图:

select * from Sales.dbo.v_customer;

 

会返回2条记录。分别再2台服务器上单独执行

select * from Sales.dbo.customers;

 每台服务器会单独返回一条记录, 可以看到对分布式分区视图的insert操作,是根据分区依据列的值(该例子为customerid)以确定对哪台服务器的表插入数据.

 

从上面来看, 本地分区表,分区视图的原则与联合数据库的差异不大。

不同点:

对本地表进行分区:1创建分区函数2创建分区方案3新建表的时候指定分区方案(由SQL SERVER事务处理)

联合数据库服务器:1,添加彼此为链接服务器,映射关系,2,再每台服务器创建成员表 3,在每台服务器创建分布式分区视图 (由MSDTC事务处理)

相同点:都是根据分区依据列的范围对数据进行分区。