Informix动态可伸缩体系结构.docx
- 文档编号:26404766
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:24
- 大小:28.34KB
Informix动态可伸缩体系结构.docx
《Informix动态可伸缩体系结构.docx》由会员分享,可在线阅读,更多相关《Informix动态可伸缩体系结构.docx(24页珍藏版)》请在冰豆网上搜索。
Informix动态可伸缩体系结构
第一章Informix动态可伸缩体系结构
DSA(DynamicScalabilityArchitecture)
一、关系型数据库(RelationalDatabase)系统体系结构
目前比较流行的商用关系型数据库多采用一下三种体系结构:
1、一请求一服务体系结构
采用对于每一数据库服务请求,数据库系统将为之分配一个数据库服务进程服务的方式。
优点:
可以充分隔离不同用户的数据库服务,并且可以比较容易发挥采用SMP体系结构的机器的资源。
缺点:
系统内存资源、CPU资源消耗大;由于使用操作系统的进程调度,系统运行效率不高。
2、多线索体系结构
优点:
不需要频繁的操作系统的进程切换,节约内存、CPU资源;系统并行运行程度高,运行效率高。
缺点:
系统比较脆弱,一个线索的误操作,可能导致系统瘫痪;数据库自己的线索切换较操作系统的切换简单;大数据量的操作可能引起系统资源的不均衡分布。
3、混合体系结构
该系统由
(1)多线索的网络监听器
(2)任务分发器,包括请求/响应队列
(3)可重用数据库服务器组成。
优点:
任务处理采用并行和排队的方式,系统运行效率高。
缺点:
负载均衡较简单。
二、IDS系统组成
IDS(InformixDynamicServer)数据库系统由一下部分组成:
1、共享内存部分
共享内存部分包括:
长驻内存部分、虚拟内存部分、消息区。
(1)长驻内存部分主要是用于磁盘数据在内存的缓冲、系统数据等等
(bufffers,physical/logicalbuffers,LRUs,chunks,dbsapces,users,locks…)。
(2)虚拟内存部分主要用于VP的管理信息和缓冲区。
(globalpool,dictionarypools,procedurepools,sortpools,sessionpools,bigbufferpools,MTpools)。
虚拟内存部分在使用过程中可以动态增长,增长大小在配置文件中定义。
(3)消息区主要用于应用(client)和数据库引擎(server)之间的信息交换。
2、磁盘数据空间部分
3、数据库引擎-虚拟处理器VP(VirtualProcessors)
三、IDS多线索体系结构
Online7.0改变了Online5.0中一对一的客户/服务器模式:
由原来的一个数据库请求启动一sqplexec数据库引擎服务的Client/Server方式转变为对于所有数据库请求由多个数量固定(除非动态调整)的数据库引擎(即VP虚拟处理器)服务的方式。
OnLine7.0把数据库引擎按功能划分为多个VP,这些VP是长驻内存的oninit进程。
对于每一个数据库服务请求都将被分割成多个可并行的线索,由不同VP并行服务。
线索(thread)可以定义为一段顺序执行的程序。
虚拟处理器VP可以定义为完成一定义数据库服务功能的数据库进程。
VP包括一下类型:
CPU,PIO(负责写物理日志),LIO(负责写逻辑日志),AIO(负责磁盘I/O)等等。
线索运行在VP上,线索的调度由CPUVP完成。
从这一点来看,VP类似于硬件上的CPU,线索类似与运行其上的进程。
多线索体系结构的优点:
(1)fan-in:
对于多个应用请求,数据库只用一定数量的VP服务,并可以根据需要动态调整;
(2)fan-out:
多个数据库VP服务一个应用请求;
(3)数据库内部的线索切换比操作系统的进程切换速度快、效率高;
(4)多线索体系结构更适合于多CPU的体系结构,如:
affinity特性。
四、IDS客户/服务器连接方式
1、IDS的客户/服务器连接方式可采用一下方式:
(1)共享内存连接方式(onipcshm)
(2)管道连接方式(onipcstr)
(3)网络连接方式(基于TCP/IP协议,包括ontlitcp,onsoctcp或者IPX/SPX协议,ontlispx)
基于TCP/IP网络协议的应用接口可以使用SOC(Socket)或者TLI(TransportLayerInterface)。
采用网络连接方式的客户端与服务器端必须使用相同的网络通讯协议(TCP/IP协议或者IPX/SPX协议),但是客户端使用socker接口,而服务器端使用tli接口。
2、基于共享内存方式的客户服务器连接
3、基于TCP/IP协议的客户服务器连接
(1)在客户端和服务器端的/etc/hosts文件中指定连接方式。
(2)在客户端和服务器端的/etc/services文件中指定通讯端口和网络协议。
(3)在客户端和服务器端的$INFORMIXSQLHOSTS文件中指定如何访问服务器,包括服务器名称、服务器网络地址、服务器网络访问方式(协议和端口号)。
(4)检查网络系统安全文件,包括/etc/hosts.equive、$HOME/.rhosts文件。
(5)在客户端和服务器端设置环境变量,包括INFORMIXSERVER,INFORMIXSQLHOSTS。
五、IDS磁盘数据结构
1、数据存储概念
(1)page
page是OnLine的最基本数据存储单位。
OnLine的数据页面包含一下内容:
(a)24个字节的页头(包含4个字节的时间戳(timestamp))。
(b)数据区
(c)槽表(slottable)
每4个字节。
前2个字节存放记录在页面的偏移量,后2个字节存放该记录的大小。
一个页面中的槽表个数最多不超过255,所以一个数据页面最多存放255个记录。
(d)时间戳。
(2)extent
extent是多个物理连续page(最多4个)的组合。
数据库表的存储空间分配是以extent为单位的。
(3)tbspace
tbspace是extent的逻辑组合。
Tbspace由分配给一个表的所有extent组成。
一个tbspace只可能在一个dbspace中,但可能跨越多个chunk。
(4)chunk
chunk是分配给OnLine的一块物理存储空间,可以是unix文件,也可以是原始设备。
(5)dbspace、blobspace
dbspace是chunk的逻辑组合。
数据库管理员可以为dbspace创建、增加chunk、从而增加数据库的存储空间。
创建dbspace时必须首选指定它的primarychunk。
2、日志(log)
数据库日志是用于维护数据库数据一致性的手段。
IDS的日志分为物理日志(physicallog)和逻辑日志(logicallog)。
物理日志用于维护数据库的物理一致性,在每次修改数据之前,该数据所在的数据页面都将存储在物理日志中,所以物理日志也称为“前镜像”(beforeimages)。
逻辑日志用于维护数据库的逻辑一致性,在每次变动数据库时,所有变动情况都将记录在逻辑日志中。
物理日志在每次checkpoint之后将被自动清空;
逻辑日志必需是已经备份,而且日志中包含的事务都已提交,并且不是最后一个日志文件才能被释放。
长事务是指那些尚未结束,但数据库逻辑日志文件已经被事务日志记录充满的事务。
这样一来逻辑日志文件既不能被释放重用,
同时事务日志记录也写不进逻辑日志文件。
这种情况下,IDS会阻塞数据库请求,同时“回滚”长事务。
六、IDS的容错处理
1、checkpoint
checkpoint是IDS的一个重要系统功能。
IDS利用checkpoint来保证共享内存数据缓冲区中的数据与物理磁盘上的数据保持一致。
它包括以下步骤:
(1)挂起临界区;
(2)刷新共享内存中的物理日志缓冲到物理磁盘上的物理日志文件;
(3)刷新共享内存缓冲区中发生修改的页面到物理磁盘页面上;
(4)写checkpoint记录到逻辑日志文件和系统保留页中;
(5)逻辑清空物理日志文件;
(6)刷新逻辑日志缓冲区到物理磁盘的逻辑日志文件中。
注意:
IDS在刷新内存中的页面到物理磁盘之前,必须先将物理日志缓冲区的数据刷新到硬盘上的物理日志文件中。
2、fastrecovery
IDS利用fastrecovery功能来保证数据库每次重起时快速恢复到数据库shutdown时的一致性状态。
它包含以下步骤:
(1)恢复物理日志文件中的数据到共享内存的缓冲区和磁盘的物理页面上;
(2)在逻辑日志文件中定位系统最后一个一致点-checkpoint点;
(3)根据系统最后的一致点以后的逻辑日志记录“回滚”(rollback)尚未提交的事务和“取消”(undo)已经提交的事务。
3、IDS数据缓冲技术
IDS对数据库中的操作都是通过对共享内存数据缓冲区中数据的操作来完成的。
例如一个修改数据库记录的操作
…
Beginwork;
Updatetab1setfld1=””wherefld2=?
;
Commitwork;
…
IDS处理如下:
(1)客户端连接到IDS后(connect…,database…),IDS为这个请求启动一个sqlexec任务进行服务。
(2)sqlexec在对SQL语句进行语法分析后,产生执行计划。
(3)sqlexec在logicallogbuffer中写入事务开始记录。
(4)sqlexec将请求读取某个chunk中的某个数据页面,并申请相应锁资源。
(5)IDS首选在内存缓冲区的LRU队列中查找该数据页面是否在缓冲区中。
(6)如果不在缓冲区中,IDS将在FLRU队列中查找空闲页面,如果没有,IDS将启动一个ForgroundWrite来申请一个空闲缓冲区页面。
IDS申请将该数据页面从磁盘上读入到缓冲区中。
在修改数据前,IDS将该页面写入物理日志缓冲区中。
然后,进行数据修改。
接下来执行步骤(8)。
(7)如果在缓冲区中,并且在FLRU队列中,IDS将该页面写入物理日志缓冲区中,并进行数据修改。
如果在MLRU队列中,IDS将直接进行数据修改。
(8)IDS向逻辑日志缓冲区中写入修改操作的逻辑日志记录。
(9)IDS释放该事务申请的所有锁资源,并向逻辑日志缓冲区中写入日志结束记录。
七、IDS监控
1、IDS状态
(1)off-line状态
(2)quiescent状态
(3)online状态
(4)shutdown状态
(5)recovery状态
2、系统阻塞原因
CKPTCheckpoint
LONGTXLongTransaction
ARCHIVEOngoingarchive
MEDIA_FAILUREMediafailure
HANG_SYSTEMDatabaseserverfailure
DBS_DROPDroppingadbspace
DDRDiscretehighavailabilitydatareplication
LBULogsfullhigh-watermark
3、监控工具。
用户可以使用SMI(SystemMonitoringInterface)、onstat工具、oncheck工具完成对IDS的监控。
1)使用系统监控界面SMI
系统监控界面采用只读方式直接访问DSA的管理信息。
2)使用onstat监控工具
(1)监控数据库日志文件online.log:
onstat-m
(2)监控数据库系统共享内存使用情况:
onstat–gseg
(3)监控数据库系统逻辑日志使用情况:
onstat–l
(4)监控数据库系统chunk使用情况:
onstat–d
(5)监控数据库系统在线session情况:
onstat–gses
(6)监控数据库系统某个在线session情况:
onstat–gsessessid
(7)监控数据库系统在线userthread情况:
onstat–u
(8)监控数据库系统锁资源使用情况:
onstat–k
(9)监控数据库系统缓冲区刷新操作情况:
onstat–F
(10)监控数据库系统LRU队列使用情况:
onstat–R
(11)监控数据库系统对所有chunk对协操作情况:
onstat–giof
(12)监控数据库系统在线thread情况:
onstat–gath
(13)监控数据库系统在线VPs情况:
onstat–gglo
(14)监控数据库系统使用效率情况:
onstat–p
(15)监控数据库系统PDQ使用情况:
onsat–gmgm
(16)监控数据库系统就绪队列(readyqueue)情况:
onstat–grea
(17)监控数据库系统等待队列(waitqueue)情况:
onstat–gwai
(18)监控数据库系统休息队列(sleepqueue)情况:
onstat–gsle
(19)监控数据库系统活动事务情况:
onstat–X
第二章并发控制
并发是指多个用户在同一个时间操作相同数据。
由于并发操作就带来了数据一致性得问题。
IDS是通过锁(lock)技术来保证并发数据得一致性的。
1、锁的类型
1)共享锁(sharedlock)
共享锁可以防止其他用户修改被锁住的目标,但多个用户对同一目标可以实施加共享锁。
2)排它锁(exclusivelock)
排它锁锁住的对象将谢绝所有其他用户的访问。
3)提升锁((promotablelock/updatelock)
提升锁是用户在使用update游标时使用的锁。
提升锁在数据修改之前是一个共享锁,当数据修改时,共享锁提升为一个排它锁。
下面是一张锁冲突表:
A
---------------------------------------------------------------
SXUnone
BSynyy
Xnnny
Uynny
-------------------
说明:
S:
共享锁X:
排它锁U:
提升锁
A:
持有锁的用户B:
申请锁的用户
y:
锁申请成功n:
锁申请失败
2、锁的粒度(granularity)
锁的粒度是指被加锁的对象的大小或范围。
锁的粒度越大,并发程度越低,锁资源开销越小;锁的粒度越小,并发程度越高,锁资源开销越大。
1)数据库级锁(databaselock)
databasedbname[exclusive/share];
默认情况下,IDS对数据库使用共享锁,如用户打开数据库:
databasedbname。
2)表级锁(tablelock)
locktabletablenameinexclusive/sharemode;
当做如下操作时,IDS将自动对操作的表施加排它锁:
(1)alterindex
(2)altertable
(2)createindex(3)dropindex
(4)renamecolumn(5)renametable
表级共享锁锁住的表将谢绝其他用户对该表数据的任何修改,但其他用户可以读该表的数据。
表级排它锁锁住的表将谢绝其他用户的任何访问(除非使用“脏读”方式)。
对于一个表的大量数据修改操作可以考虑使用表级排它锁。
3)页面锁(pagelock)、记录锁(rowlock)、键值锁(keylock)
页面锁锁住的对象是一个IDS数据页面,记录锁锁住的对象是一个记录。
用户在创建表时可以选择对该表操作时使用页面锁或者记录锁。
IDS建表时默认的锁方式是页面锁:
createtabletablename
(
…
)lockmodepage/row;
当IDS试图对该表的记录加锁时,它将根据创建该表时定义的锁类型加锁。
键值锁是IDS用来锁住不存在的记录的方法,实际上是锁住该记录在表中的位置不被他用。
例如:
IDS在事务中删除一个表中的某一记录时,它将锁住该记录对应的键值,以免其他用户同时插入同一记录。
3、锁的生命周期
数据库级锁只有在关闭数据库时才能被释放。
对于表级锁、记录锁、键值锁的生命周期依赖于所进行的数据库操作:
select,update,delete等和数据库事务是否使用。
如果数据库没有使用日志,那么只有当用户显示释放该锁时(unlocktabletablename),IDS才释放表级锁。
总之:
当数据库事务结束时,它将释放所有在本事务中使用的锁;事务中对数据库数据修改时所加的锁将保持到事务结束。
4、锁的隔离等级(isolationlevel)
隔离等级是指在并发环境下,一个应用隔离其他并发应用的等级。
通过使用隔离等级,应用可以在读数据时指定使用锁资源的方式。
使用隔离等级必须打开数据库日志。
1)setisolationtodirtyread;
指定应用读数据时,对所读对象不施加任何锁。
应用读数据时将不检查是否其他应用正在操作该数据。
仅仅考虑系统开销,这种方式读数据是效率最高的。
2)setisolationtocommitedread;
指定应用读数据之前,首选对所读数据检查是否有其他应用正在修改该数据,以确保本应用读数据是已提交的数据。
但这种方式在读数据时,并不对数据施加任何类型的锁,所以用户正在读的数据有可能其他用户正在修改。
这种方式时IDS默认的读数据方式。
3)setisolationtocursorstability;
指定应用读数据时,如果使用“游标”,则对所读数据施加共享锁,该共享锁在读取下一记录时将被释放掉,也就是只对所读当前一条记录保持共享锁:
如果不使用“游标”,该种读数据的方式与上一种相同。
4)setisolationtorepeatableread;
指定应用读数据时,对所读数据全部施加共享锁,所有的锁资源在事务结束才被释放。
使用这种方式,所有扫描过的数据全部施加共享锁,即使部分数据不满足读数据条件,但在扫描过程种扫描过。
(如果全表扫描,则这种方式与使用表级锁效果是一样的)。
5、锁冲突模式
当应用由于锁资源引起冲突时,可以通过设置锁冲突来解决。
1)setlockmodetowait;
这种方式下,应用遭遇锁冲突时,将无限制等待下去直到申请到所需锁资源为止。
2)setlockmodetonowait;
这种方式下,应用遭遇锁冲突时,将立即返回应用:
数据库操作错,如:
107:
Recordislocked.这种方式是IDS默认的冲突等待方式。
3)setlockmodetowaitn;(n是应用设置的等待时间)
这种方式下,应用遭遇锁冲突时,将在时间n内反复申请所需锁资源直到申请成功或者设置时间n用完。
在IDS处理OLTP(OnlineTransactionProcessing)联机交易(如MCS中储蓄、会计、信用卡日间实时交易)时,应该在E/C程序首部,首先设置锁冲突等待时间,这样以来可以避免很多不必要的由于锁冲突引起的数据库操作失败。
6、死锁(deadlock)
假设用户A持有x锁,用户B持有y锁。
此时,用户A申请y锁,同时用户B申请x锁。
这样一来就会出现用户A、B同时等待对方释放自己的锁,于是出现“死锁”。
对于“死锁”,IDS本身提供了一套检测、恢复机制来避免“死锁”的发生。
7、举例:
假设有两个用户同时在操作同一数据库workdb中的表test,表test的脚本:
$createtabletest
(
codechar(3),
timechar(20),
namechar(20)
)lockmodepage;
$createupiqueindexm_idxontest(code);
先进行如下练习:
(1)用户A进行如下操作:
beginwork;
updatetestsettime=”2”wherecode=”sam”;
(2)用户B同时进行如下操作:
select*fromtestwherecode=”abc”;
问题:
上述操作结果如何?
用户B的select操作失败了。
因为用户A操作时对表test施加了页面级的排他锁(这些锁将保留到事务结束),而用户B试图扫描被页级排它锁锁住的页面,所以操作失败。
(3)用户A进行如下操作:
rollbackwork;
altertabletestlockmode(row);
beginwork;
updatemanufactsettime=”2”wherecode=”sam”;
说明:
本次操作成功。
因为该操作通过索引读取记录,而记录未被步骤3的记录锁锁住。
(4)用户B进行如下操作:
select*fromtestwherecode=”hro”;
说明:
本次操作成功。
因为该操作通过索引读取记录,而该记录未被步骤3的记录锁住。
(5)用户B进行如下操作:
select*fromtest;
说明:
本次操作失败。
因为该操作试图顺序扫描表test,而步骤3对test施加了记录排它锁,
而且本操作使用了”commitedread”的读数据方式(系统默认)。
(6)用户B进行如下操作:
setisolationtodirtyread;
select*fromtest;
说明:
本次操作成功。
因为该操作设置了“脏读“方式,将忽略说有锁冲突。
(7)用户B进行如下操作:
setisolationtocommitedread;
setlockmodetowait;
select*fromtest;
说明:
本次操作处于等待方式。
因为该操作设置了“commitedread“和“锁冲突等待”方式,
所以本操作被步骤3申请的锁阻塞,等待其释放锁资源。
(8)用户A进行如下操作:
commitwork;
说明:
本次操作将释放步骤3申请的锁资源,步骤7操作成功。
(9)用户A进行如下操作:
setisolationtorepeatableread;
beginwork;
updatetestsettime=”2”wherename=”Julio”;
说明:
本次name字段没有索引,所以本次操作将采取顺序扫描方式;
另外,由于设置了”repeatableread”读模式,所以test表的所有记录都将被锁住。
(10)用户B进行如下操作:
setlockmodetonowait;
updatetestsettime=”2”andcode=”sam”;
说明:
本次操作失败。
虽然本次操作通过索引定位记录,但是步骤9中用户A已经锁住(共享锁)test中表所有记录,而且用户B设置了”nowait”锁冲突方式,所以操作失败。
(11)用户B进行如下操作:
select*fromtestwherecode=”sam”;
说明:
本次操作成功。
因为本次
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Informix 动态 伸缩 体系结构