分布式数据库实验.docx
- 文档编号:30818272
- 上传时间:2024-01-30
- 格式:DOCX
- 页数:26
- 大小:333.33KB
分布式数据库实验.docx
《分布式数据库实验.docx》由会员分享,可在线阅读,更多相关《分布式数据库实验.docx(26页珍藏版)》请在冰豆网上搜索。
分布式数据库实验
GUrLINUNIVERSITYOFELECTRONICTECHNOLOGY
分布式数据库实验
目录
1引言2矚慫润厲钐瘗睞枥庑赖。
2课程设计分析2聞創沟燴鐺險爱氇谴净。
2.1需求分析2残骛楼諍锩瀨濟溆塹籟。
22总体设计2酽锕极額閉镇桧猪訣锥。
2.3系统ER图3彈贸摄尔霁毙攬砖卤庑。
2.4功能设计3謀荞抟箧飆鐸怼类蒋薔。
2.4.1服务端模块设计4厦礴恳蹒骈時盡继價骚。
2.4.2客户端模块设计6茕桢广鳓鯡选块网羈泪。
2.6旅行预定系统的性能需求9鹅娅尽損鹤惨歷茏鴛賴。
2.7预定系统的数据需求10籟丛妈羥为贍债蛏练淨。
3.2分布式事务管理器12買鯛鴯譖昙膚遙闫撷凄。
3.2.1实现一个工作流控制器(workflowcontroller)12綾镝鯛駕櫬鹕踪韦辚糴。
3.2.2实现一个事务管理器(TM)13驅踬髏彦浃绥譎饴憂锦。
3.2.3在多个RM上运行13猫虿驢绘燈鮒诛髅貺庑。
3.2.4实现透明性14锹籁饗迳琐筆襖鸥娅薔。
3.2.5实现集中式2PC协议14構氽頑黉碩饨荠龈话骛。
3.262PC恢复机制15輒峄陽檉簖疖網儂號泶。
3.2.7分布式事务加锁15尧侧閏繭絳闕绚勵蜆贅。
3.2.8事务失败时的情况15识饒鎂錕缢灩筧嚌俨淒。
3.3Extension(扩展设施)实现16凍鈹鋨劳臘锴痫婦胫籴。
4总结16恥諤銪灭萦欢煬鞏鹜錦。
分布式旅行预定系统说明书
1引言
旅行是人们生活中的重要部分,旅行服务行业的飞速发展,使得与旅行行业相关的各种软件及信息系统的使用也越来越频繁。
人们希望在一个服务系统上可以完成交通方式的预定,酒店预定,出租车预定等旅行必须的服务。
基于上述现实情况,设计了一个统一多个服务项目的分布式信息服务系统是一个很好的想法。
旅行者可以在同一个系统上定制如租车,订飞机票,预定酒店等多个服务,将很大程度上提高旅行服务的效率和质量。
鯊腎鑰诎褳鉀沩懼統庫。
本项目是用java组建一个分布式应用系统,它用来实施一个简单的旅行预定系统。
为了完成任务,需要有三个阶段来实施系统:
硕癘鄴颃诌攆檸攜驤蔹。
Part1:
做一个简单的资源管理器(RM)(例如:
一个简单的数据库系统包括一组固定的表和操作集合)支持具有ACID属性的并发事务。
阌擻輳嬪諫迁择楨秘騖。
Part2:
实现一个工作流管理器(WC)和一个事务管理器(TM),能在各个资源管理者
(RM)之间实现分布式事务处理。
氬嚕躑竄贸恳彈瀘颔澩。
Part3:
实现这些基础项目的外部增设功能。
2课程设计分析
2.1需求分析
机票预定系统的总目标是:
在计算机网络,利用现有的软件设计一个关于旅行订票系统实现分布式数据库的功能,配置一定的硬件,开发一个具有开放体系结构的、易扩充的、易维护的、具有良好人机交互界面的机票预定系统,实现航空公司的机票销售的自动化的计算机系统,为企业的决策层提供准确、精细、迅速的票务销售信息。
釷鹆資贏車贖孙滅獅赘。
2.2总体设计
系统采用C-S结构,主要用到了java语言中的RMI(远程方法调用)实现不同的计算机之间通信,以及采用java.util.concurrent包中的方法控制程序的并发性。
怂阐譜鯪迳導嘯畫長凉。
系统可划分为3个部分:
旅行者是主体,他们使用系统的客户端进行旅行服务的预订,查询服务信息,预订和退订各种服务;服务端提供租车,预订酒店,预订机票等旅行服务项目;服务器端充当中间代理,接受客户发起的请求,并调用和协调各个服务端提供的服务。
谚辞調担鈧谄动禪泻類。
客户
图1系统总体设计
2.3系统ER图
嘰觐詿缧铴嗫偽純铪锩。
图2ER图
2.4功能设计
系统的功能是用户通过在客户端的操作访问服务器资源,并进行资源的增加查看以及修
改(预订)。
数据库采用分布式的结构将机票信息,宾馆信息,出租车信息以及顾客信息分布在不同的服务器上,并通过一个主Server(协调者)进行总体上的控制。
熒绐譏钲鏌觶鷹緇機
库。
系统分为主服务器(Server),航班服务器(Flightserver),宾馆服务器(HotelServer),出租车服务器(CarServer),用户服务器(CustomerServer)以及预订服务器(ResverServer)。
根据cs模式,分布式旅行预定系统分为服务端和客户端两部分。
根据需要,服务端又分为插入信息、查询
与删除两个模块,客户端分为查询、预订、退订三个模块。
如图所示。
鶼渍螻偉阅劍鲰腎邏蘞。
分布式旅行预定系统
图3功能设计
针对不同的用户,提供了两类功能登录接口:
即使用者登录接口和管理人员登录接口。
通过各自的页面,从事查询,添加,修改的相关活动。
下面分别介绍各个部分的功能及设计。
纣忧蔣氳頑莶驅藥悯骛。
2.4.1服务端模块设计
服务端所要完成的工作是对所维护的数据库进行增删查改等活动。
它分为插入信息、查
询与删除两个模块,实现insert、select和delete这些SQL语句功能。
颖刍莖峽饽亿顿裊赔泷。
当有新的信息需要加入数据库时,从服务端进入插入信息这个模块,选择需要更新的信
息,包括:
飞机、酒店、汽车的信息。
填写信息的具体内容,然后选择添加,就将新的信息加入数据库。
濫驂膽閉驟羥闈詔寢賻。
当需要查询或修改数据库信息时,进入查询与删除模块。
在此模块中,可以对数据库中
的航班、酒店、租车、顾客和预订信息进行查看和删除。
当需要删除此信息时,只需选中需删除信息,点击右下角删除按钮,进行删除。
如果要删除的信息被预定了,则删除失败。
銚
銻縵哜鳗鸿锓謎諏涼。
2.4.2客户端模块设计
客户端所要完成的工作是使用者可以通过系统进行机票,酒店和汽车的预订。
它分为查
询、预订、退订三个模块,实现客户数据库select、insert和delete等SQL语句来对记事本
进行操作。
挤貼綬电麥结鈺贖哓类。
旅客在预订自己所需的服务之前,可以先进行查询。
客户可对航班,酒店,汽车,顾客
和预订情况记性查找。
可查询到自己所需乘坐的班机是否有位置,价钱如何,剩余多少座位
等信息。
也可查到所去城市的酒店是否有空的房价,价格如何。
还有租车信息,顾客信息和预订信息。
赔荊紳谘侖驟辽輩袜錈。
客户通过预订页面,填写姓名,所乘坐的航班,要到达目的地,是否预订酒店,是否租车等信息。
提交后,系统会自动为客户的请求分配班次,酒店和车辆。
如果航班,酒店和租车地点不存在,或者已经客满的话,系统会提示错误,预订失败。
塤礙籟馐决穩賽釙冊庫。
如果客户因个人原因,希望退订自己已经预订好的服务时,可进入退订页面。
通过查询
自己的名字,查询到存在的预订信息,然后进行退订。
裊樣祕廬廂颤谚鍘芈蔺。
客户端和服务端都是对记事本进行操作,根据用户的权限授予不同的级别,对不同的属
性进行操作,实现了sql语句中的对表的基本操作。
2.5数据库设计仓嫗盤紲嘱珑詁鍬齊驚。
本系统根据其设计要求,数据库共包括如下几个表,数据库中的表实现了数据的完整性。
FLIGHT(StringflightNum,intprice,intnumSeats,intnumAvail)绽萬璉轆娛閬蛏鬮绾瀧。
航班表——航班号,价格,座位总数,空闲座位数
HOTEL(Stringlocation,intprice,intnumRooms,intnumAvail)骁顾燁鶚巯瀆蕪領鲡赙。
酒店一一地点,价格,房间总数,空闲房间数
CAR(Stringlocation,intprice,intnumCars,intnumAvail)瑣钋濺暧惲锟缟馭篩凉。
汽车一一地点,价格,汽车总数,剩余汽车数
CUSTOMER(StringcustName)
顾客一一顾客姓名
RESERVATION(StringcustName,StringflightNum,Stringhotel,Stringcar)鎦诗涇艳损楼紲
鯗餳類。
预订表一一顾客姓名,航班号,酒店地点,租车地点
为了更简单,我们给出了下列假设:
1)假定这里只有一条航线,并且在给定的航班上,所有的座位都是相同的价钱:
flightnum是表FLIGHT的主键。
栉缏歐锄棗鈕种鵑瑶锬。
2)假定在同一个地方的所有的宾馆房间价格是一样的:
location是表HOTEL的主键。
3)假定在同一个地方的所有的出租车价格也是一样的:
location是表CAR的主键。
4)custName是表CUSTOMER的主键。
5)RESERVATION表包括一个对应的项目表,这张表由用户对航班,汽车,旅馆的预定信息组成,custName是这张RESERVATION表的主键。
辔烨棟剛殓攬瑤丽阄应。
6)在FLIGHT表中,numAvail是一个给定航班可以预定到的座位数。
对一个给定的航班(flightNum),数据库一致性的条件之一是:
预订表中一个航班的总的预定数加上空闲
的座位数,必须等于航班上的座位总数。
对于汽车和旅馆房间表也是一样的情况。
峴扬爛滾澗
辐滠兴渙藺。
其基本关系图如下所示:
2.6旅行预定系统的性能需求
为了保证系统能够长期、安全、稳定、可靠、高效的运行,旅行预定系统应该满足以下的性能需求:
1.系统处理的准确性和及时性
系统处理的准确性和及时性是系统的必要性能。
在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足企业对信息处理的需求。
詩叁撻訥烬忧毀厉鋨骜。
由于机票预定系统的查询功能对于整个系统的功能和性能完成举足轻重。
作为系统的很
多数据来源,而机票数量和时间又影响企业的决策活动,其准确性很大程度上决定了机票预定系统的成败。
在系统开发过程中,必须采用一定的方法保证系统的准确性。
则鯤愜韋瘓賈晖
园栋泷。
2.系统的开放性和系统的可扩充性
旅行预定系统在开发过程中,应该充分考虑以后的可扩充性。
例如订票系统的方式的改变(网上订票),用户查询的需求也会不断的更新和完善。
所有这些,都要求系统提供足够的手段进行功能的调整和扩充。
而要实现这一点,应通过系统的开放性来完成,既系统应是一个开放系统,只要符合一定的规范,可以简单的加入和减少系统的模块,配置系统的硬件。
通过软件的修补、替换完成系统的升级和更新换代。
胀鏝彈奥秘孫戶孪钇賻。
3.系统的易用性和易维护性
旅行预定系统是直接面对使用人员的,而使用人员往往对计算机并不时非常熟悉。
这就要求系统能够提供良好的用户接口,易用的人机交互界面。
要实现这一点,就要求系统应该尽量使用用户熟悉的术语和中文信息的界面;针对用户可能出现的使用问题,要提供足够的在线帮助,缩短用户对系统熟悉的过程。
鳃躋峽祷紉诵帮废掃減。
机票预定系统中涉及到的数据是航空公司的相当重要的信息,系统要提供方便的手段供系统维护人员进行数据的备份,日常的安全管理,系统意外崩溃时数据的恢复等工作。
稟虛嬪赈维哜妝扩踴粜。
4.系统的标准性
系统在设计开发使用过程中都要涉及到很多计算机硬件、软件。
所有这些都要符合主流国际、国家和行业标准。
例如在开发中使用的操作系统、网络系统、开发工具都必须符合通用标准。
如规范的数据库操纵界面、作为业界标准的TCP/IP网络协议及ISO9002标准所要求的质量规范等;同时,在自主开发本系统时,要进行良好的设计工作,制订行之有效的软件工程规范,保证代码的易读性、可操作性和可移植性。
陽簍埡鲑罷規呜旧岿錟。
5.系统的先进性
目前计算系统的技术发展相当快,做为机票预定系统工程,应该保证系统在下个世纪仍旧是先进的,在系统的生命周期尽量做到系统的先进,充分完成企业信息处理的要求而不至于落后。
这一方面通过系统的开放性和可扩充性,不断改善系统的功能完成。
另一方面,在系统设计和开发的过程中,应在考虑成本的基础上尽量采用当前主流并先进且有良好发展前途的产品。
沩氣嘮戇苌鑿鑿槠谔應。
6.系统的响应速度
预定系统系统在日常处理中的响应速度为秒级,达到实时要求,以及反馈信息。
在进行统计分析时,根据所需数据量的不同而从秒级到分钟级,原则是保证操作人员不会因为速度问题而影响工作效率。
钡嵐縣緱虜荣产涛團蔺。
2.7预定系统的数据需求
机票预定系统的数据需求包括如下几点:
1.数据录入和处理的准确性和实时性数据的输入是否准确是数据处理的前提,错误的输入会导致系统输出的不正确和不可用,从而使系统的工作失去意义。
数据的输入来源是手工输入。
手工输入要通过系统界面上的安排系统具有容错性,并且对操作人员要进行系统的培训。
懨俠劑鈍触乐鹇烬觶騮。
在系统中,数据的输入往往是大量的,因此系统要有一定的处理能力,以保证迅速的处理数据。
2.数据的一致性与完整性
由于系统的数据是共享的,在不同的旅行社中中,机票是共享数据,所以如何保证这些数据的一致性,是系统必须解决的问题。
要解决这一问题,要有一定的人员维护数据的一致性,在数据录入处控制数据的去向,并且要求对数据库的数据完整性进行严格的约束。
謾饱兗争詣繚鮐癞别瀘。
对于输入的数据,要为其定义完整性规则,如果不能符合完整性约束,系统应该拒绝该数据。
3.数据的共享与独立性
整个机票预定系统的数据是共享的。
然而,从系统开发的角度上看,共享会给设计和调试带来困难。
因此,应该提供灵活的配置,使各个分系统能够独立运行,而通过人工干预的手段进行系统数据的交换。
这样,也能提供系统的强壮性。
呙铉們欤谦鸪饺竞荡赚。
3设计具体实现步骤
3.1实现一个简单的RM
开始时忽略事物的原子性和持久性,假设这些数据都存储在存储器中。
把数据都存储在一个或多个哈希表(hashtable)中。
为每一个数据库表中建立一个哈希表,数据库表的每一
行都可作为哈希表的一个条目,由表的主键来标记。
使用一个java的类来标记每一个类型
的行。
例如:
一个与FLIGHTS数据库表相应的类,那么这个类就要含有flightNum,price,numstates,和numAvail等成员变量和一些其他数据以实验事务的ACID性质。
莹谐龌蕲賞组靄绉嚴减。
表RESERVATION中没有主键,但是可以通过custName为索引,来找到用户,所以将其和CUSTOMERS表联合起来。
这样,我们拥有了一个以custName为索引的哈希表,并且每个条目都增加了resvType和resvKey两个数据项。
麸肃鹏镟轿騍镣缚縟糶。
在这个简单的数据模型中,要保证同一个地方的价格保持一致。
3.1.1实现原子性
现在利用映像方法来实现事物的原子性。
在内存中保留两个数据库的拷贝,并且建立一
个指针指向那个活跃的拷贝。
把正在执行的事务的各个更新结果保留在一个独立的哈希表中。
当这个事务正确完成时,将事务的更新结果与那个不活跃的数据库拷贝合并,然后交换指向活跃数据库的指针。
納畴鳗吶鄖禎銣腻鰲锬。
在现有的系统中,唯一要处理的失败是事务的异常中断。
由于内存映像在进程完成时被丢弃,在这个阶段并不需要任何复原方法。
風撵鲔貓铁频钙蓟纠庙。
在本系统中实现原子性是客户端向主服务器端发出预订申请时,主服务器分别从每个服
务器取得数据并进行交互进行试预订,如果每个服务器返回成功信息,则再由Server统一
进行Commit操作,否则如果有至少一个服务器返回预订失败的信心,则由Server统一将每个服务器上试预订的信息rollback。
灭嗳骇諗鋅猎輛觏馊藹。
3.1.2实现并发性
资源管理器RM要对每个事务适当的得给定数据加锁,并且在事务提交或撤销后,释放所有的锁。
我们在这里通过对不同阶段的加锁来测试程序。
并且我们应尽可能的在一个阶段加上操作所用到的锁。
RM还要适当处理死锁,当一个事务死锁时,RM要强行撤销事务。
铹鸝饷飾镡閌赀诨癱骝。
由java的提供
java.util.concurrent.locks.Lock;java.util.concurrent.locks.ReentrantReadWriteLock;读写锁的包来进行控制,对每个操作服务器数据的线程进行并发控制,对每一个读操作进行readLock,可以与其他读线程同步进行,但是在释放读锁之前写操作无法执行。
在对数据的每一个写操作前进行writeLock,同时等待其他线程释放读锁。
其他写操作必须等到该线程释放写锁之后才能进行。
攙閿频嵘陣澇諗谴隴泸。
3.1.3实现一致性由于事物的并发、通信传输故障、站点故障会导致数据的不一致性。
针对事物并发,可以对数据资源加读写锁。
网络通信问题本系统中暂未考虑。
站点故障通过读取操作日志觉得redo或undo、commit或rollback。
趕輾雏纨颗锊讨跃满賺。
3.1.4实现持久性
给RM加上持久性和恢复方法。
所有的状态都被存储在磁盘上(Java的java.io.ObjectOutputStream类,它可以把内存中的一串数据保存到磁盘的一个文件中;相应的java.io.ObjectInputStream类作用与之相反)。
当一个事务完成时磁盘映像就要做更新。
影子方法是用来保证原子性的:
将数据库的两个拷贝保存在磁盘上,另外还有一个指向活跃的数据库的指针。
在启动时,RM必须调用恢复方法(recover())从磁盘上它的当前状态恢复到原有状态,并且能妥当地处理各个异常,比如调用未知的事务标识的操作。
经过commit或者rollback之后的数据存放在每一个Server上,可以将其入数据库或者XML文件,本系统采用txt记事本文件,把每个站点上的数据、操作日志存贮到记事本上。
以备实现故障恢复。
夹覡闾辁駁档驀迁锬減。
3.1.5检测RM的方法
用多个客户端和一个独立的资源管理器来测试RM性能。
资源管理器中的Shutdown()方法用来检测RM是否妥当的关闭。
所谓妥当的关闭,就意味着它要等待所运行的事务完成,并清理它的文件,以使RM下次启动时,不必恢复状态。
视絀镘鸸鲚鐘脑钧欖粝。
Diedown()方法使得RM能迅速调用System.exit(),来模拟一次系统故障,使数据库停留在它现行状态;当RM下次重启时,它恢复原有状态。
偽澀锟攢鴛擋緬铹鈞錠。
dieBeforePointerSwitch()和dieAfterPointerSwitch()方法设定标记,以便让RM在下一个commit操作前调用System.exit()。
緦徑铫膾龋轿级镗挢廟。
3.2分布式事务管理器
本地事物管理:
保证本地事务的特性,把用于分布式事务执行和恢复的信息记入日志,接收并听从本站点上DTM代理发来的LOG原语,记入日志并执行。
騅憑钶銘侥张礫阵轸蔼。
本地需要保存2份数据,一个是data,用于保存原始初始化和commit、rollback处理后的数据。
一个是back,用于保存正在被处理的数据。
当commit、roolback后,只需要用back来修改data疠骐錾农剎貯狱颢幗騮。
在项目的第二部分中,我们将把数据表分布在几个RM中,并在各个RM之间进行分布式事务操作。
3.2.1实现一个工作流控制器(workflowcontroller)
工作流控制器必须在前端(即:
要放在client端),这样就可使RM上的永久数据不会暴露在用户面前。
为了达到这样的效果,工作流控制器要支持和RM相同的接口以及一个
新函数:
镞锊过润启婭澗骆讕瀘。
reserveItinerary(intxid,StringcustName,ListflightNumList,Stringlocation,booleanneedCar,booleanneedRoom)榿贰轲誊壟该槛鲻垲赛。
这个reserveltinerary表是工作流控制器相关的一种高层操作。
参数有:
xid(事务id),
custName(用户名),flightNumList(—张说有航班的号码表),location(旅行房间和汽车可
能会被预订的地方),needCar/needRoom(表示用户需要一辆车/房间)。
邁茑赚陉宾呗擷鹪讼凑。
在这里将PART1中的RM程序集成到ResourceManager.java中。
在这里可以重利用
PART1中的很多程序。
工作流控制器的修改去面向一个特殊的RM的调用。
嵝硖贪塒廩袞悯倉
華糲。
3.2.2实现一个事务管理器(TM)
TM支持下列操作:
初始化(start),提交(commit),异常中断(abort)以及召入(enlist)。
该栎谖碼戆沖巋鳧薩锭。
事务管理器是在各个不同的RM之间进行分布式事务的合作。
TM的接口有如下的作用:
每当有一个RM的访问要求,就调用TM的enlist方法告诉TM,此RM要在某一个事务中涉及到。
此后,TM就会跟踪哪个RM会在哪个事务中涉及到。
这样,WC就会把客户端
提出的start/commit/abort等操作直接提交给TM来处理。
而把其他操作提交提交给适当的RM去处理。
劇妆诨貰攖苹埘呂仑庙。
因为TM和RM存在于工作流控制器的界面后,所以他们并没有用户可以直接使用的界面。
在系统启动时,RM会获得一个TM的参照(referenee)(通过RMI的名字查询实现)。
WC在启动时,会与TM和所有RM相连。
当一个RM被召入(enlist)—个TM中时,这个TM也会获得这个RM的一个参照。
臠龍讹驄桠业變墊罗蘄。
3.2.3在多个RM上运行
将flights,cars,rooms,customers,reservations数据各自存放到一个RM。
TM要为每个活动的事务保留一个表,以记录哪些RM被次事务涉及到。
WC要决定哪个数据房屋请求/事务访问哪个RM。
当一个请求提交/撤销时,TM调用适当的机制来对事务用到的所有RM进行相应操作。
鰻順褛悦漚縫輾屜鸭骞。
EzecutcirServicethresidPoci1=Executoi:
5.上色肆ecuto上();
Futurefuture-threadPool,subwiit(
needRoom))
newReserveThreadtxid,custKawe,±1ightNuiri,location^needCar,图1主server开启预定线程
Registryregistry=LocateRegistyetRegistry(,r127,□・D.I",1■。
口□£);
carStub=(CarRemoteJregistry*lookup(;
registry=LocateAegistry.上孑("127.D.□-l'J10000);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分布式 数据库 实验