fastdb 容错支持

 

Fault tolerant support

从2.49版本开始fastdb提供了可选的容错支持。可以启动一个主要的(活动的)和几个备用的结点,所有在主要结点发生的变化同时被复制到备用结点上。如果主结点崩溃,其中一个备用结点将变为活动的并成为主结点。一旦一个崩溃的结点重新启动,它要进行恢复,与主结点的状态同步,然后作为备用结点投入使用。结点通过套接字连接并规定放置在不同的计算机上。通信被假定为时可靠的。
要使用容错支持,应该使用REPLICATION_SUPPORT可选项来重新编译fastdb.makefile开始把FAULT_TOLERANT变量设置为1来把它打开。应该使用dbReplicatedDatabase来代替dbDatabase。在open方法的参数中,除了数据库名和文件名之外,应当指定这个结点的标志符(0N-1的整数),包含所有结点地址(主机:端口)的数组以及结点数(N).然后就可以在N个结点的每一个启动程序。一旦所有的实例都启动,ID=0的结点成为活动的(主结点)。在这个实例中open方法返回true.其他结点在open方法堵塞。如果主结点崩溃,其中一个备用结点被激活(open方法返回true,然后这个实例继续执行。如果崩溃的实例重新启动,它将尝试连接所有服务器,恢复其状态然后作为备用结点,等待其代替崩溃的主结点的机会。如果主结点正常终止,所有备用结点的close方法返回false.
在容错模式下fastdb保留两个文件:一个包含数据库本身,另一个则是页更新计数器。带有页更新计数器的文件用于增量恢复。当崩溃结点重启动时,它将向主结点发送页计数器,并只接受这段时间在主结点发生变化的页(其时间戳大于被恢复的结点所发送的页)。
在复制模式中(在主结点)应用程序在事务提交期间并不阻塞知道所有的变化被刷新到硬盘。以改变的页由独立的线程异步的刷新到磁盘上。这样带来了显著的性能提升。但如果所有的结点都崩溃了,数据库就可能处于不一致状态。也可以指定向硬盘刷新数据的时间延迟:延迟越大,磁盘IO开销越小。但在崩溃的情况下,需要从主结点发送更多的数据以进行恢复。
可以在无盘模式中使用容错模式(DISKLESS_CONFIGURATION构建选项)。在这种情况下,没有数据保存在磁盘上(没有数据库文件,也没有页更新计数器).假定至少有一个结点总是活动的。只要有一个在线结点数据就不会丢失。当崩溃结点恢复时,主结点向其发送完整的数据库快照(增量恢复是无法实现的因为崩溃结点的状态已经丢失)。由于这种模式没有磁盘操作,操作性能是非常高的并且只受限于网络吞吐量。
当复制结点启动后就开始在指定的时限内尝试连接所有其他的结点。如果在这个时间内无法建立连接,则该结点被假定为自主启动的并作为普通(非复制)数据库开始工作。如果结点与其它结点建立了连接,则具有最小ID的节点被选为复制主结点。所有的其他结点被切换到旁置模式并等待来自主结点的复制请求。如果主结点和从结点的数据库的内容不一致(使用页计数器数组来决定),则主结点进行旁置结点的恢复,向其发送最近的页面。如果主结点崩溃,则旁置结点选择一个新的主结点(最小ID的节点)。所有的旁置结点都在open方法堵塞直到下面的情况之一发生:
1. 主结点崩溃并且该节点被选为新的主结点。在这种情况下open方法返回true
2. 主结点正常关闭数据库。在这种情况下所有复制结点的open方法返回false
可以从其他应用程序中对复制数据库进行只读的访问。在这种情况,复制的结点必须通过dbReplicatedDatabase(dbDatabase::dbConcurrentUpdate)构造掉用来创建。其他应用程序可以用dbDatabase(dbDatabase::dbConcurrentReadMode)实例来访问同一数据库。
并非所有应用都需要容错。许多应用使用复制只是为了提高可测量性,在许多结点间分担负载。对于这些应用,fastdb提供了简化复制模型。在这种情况下,有两种结点:读者和写者。任何一个写者结点都可以作为复制主结点。而读者结点只能从主结点接收复制的数据而不能自己更新数据库。与上面所述的复制模型的最主要区别是读者永远不能变成主结点并且这个结点的open方法一旦与主结点建立了连接就马上归还控制权。来自主结点的更新通过单独的县城接收。读者结点要用dbReplicatedDatabase(dbDatabase::dbConcurrentRead)构造器来创建。必须使用预主结点同样的数据库模式(类)。当主结点关闭连接时来自读者结点的数据库连接并不自动关闭,其仍然保持打开并且应用仍然可以以只读模式访问数据库。一旦主结点重启,就会与所有的旁置结点建立连接并继续向它们发送更新。如果没有读者结点,则复制模型就等同于前面所述的容错模型,如果只有一个写者结点和一个或多个读者结点,这就是经典的主从复制。
可以使用Guess例子来测试容错模式。这个例子用-DREPLICATION_SUPPORT编译展示了3个结点的簇(所有地址指向localhost,但你当然也可以用你的网络中真实的主机来代替他们)。必须用参数0..2来启动guess应用的3个实例。当所有的实例启动后,用参数0启动的应用开始正常的用户对话(这是游戏:“guess an animal).如果你用Crtl-c来模拟该应用程序的崩溃,则其中的一个备用结点继续执行。
testconc示例演示了更复杂的复制模型。有3个复制结点,通过使用testconc update N 命令来启动,其中N是这些结点的标志符:012。启动了这3个结点后,它们就会互相连接,结点0成为主结点并开始更新数据库,把改变复制到结点12。可以启动一个或多个检查者,即用只读模式(使用dbConcurrentRead访问类型)来连接到复制的数据库的应用程序。检查者可以用testconc inspect N T来启动,其中N是检查者要连接的复制结点的标志符,T是检查线程的编号。
同一个testconc示例可以用来演示简化的复制模型。启动一个主结点:testconc update 0,然后启动两个只读复制结点:testconc coinspect 1testconc coinspect 2。请注意与前面所述的场景的区别:在容错模式下,普通的复制结点使用testconc update N命令启动,而连接到同一数据库的只读结点(不包括复制进程)通过testconc inspect N命令启动。在简化的主-从复制模型中,有只读的复制结点,其不能变成主结点(因此如果最初的主结点崩溃,没有人能够扮演这个角色),但运行在这个结点上的应用可以同通常的只读应用一样访问复制结点。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
概述FastDB是一个高效率的内存数据库系统,具有实时性能和方便的C++接口。 FastDB并不支持客户端/服务器结构,所有使用FastDB数据库的应用程序都必须运行在同一台主机上。FastDB为具有主导读取访问模式的应用程序作了优化。通过消除数据传输的开销和使用高性能的锁工具实现了查询执行的高速度。数据库文件和使用该数据库的每一个应用程序占用的虚拟内存空间相映射。所以查询在应用程序的任务中执行,不需要进行任务切换和数据传输。在FastDB中,通过原子指令来实现对数据库并发访问的同步,对查询处理几乎不增加任何开销。FastDB假设整个数据库都在当前内存中,并且在这个假设的基础上优化查询算法和结构。另外,数据库缓存管理几乎不会给FastDB增加任何开销,同时FastDB也不需要在数据库文件和缓冲池中进行数据传送。这就是为什么FastDB比将所有数据放在缓冲池中的传统数据库明显速度快的原因。   FastDB支持事务、在线备份和系统崩溃之后的自动恢复。事务提交协议基于一个影子根页算法,对数据库执行原子更新操作。恢复操作执行起来非常快,给关键应用程序提供了高效率。另外,它还取消了事务日志,提高了系统的整体性能,并且能够更加有效地使用系统资源。   FastDB是面向应用程序的数据库,使用应用程序的类信息来构建数据库的表。FastDB支持自动系统赋值,只允许你在一个地方——你的应用程序的类中,改变它们的值。FastDB为从数据库中提取数据提供了一个灵活而方便的接口。使用类似于SQL的语言来书写查询语句。这些非原子字段、嵌套数组、用户自定义类型和方法、直接指向对象内部的指针等后关系性能,简化了数据库应用程序的设计,并且使得它们更加高效。   虽然FastDB的优化是基于整个数据库都存放在机器的物理内存的这个假设上的,我们依然可以将FastDB使用在那些大小超过系统物理内存的数据库上。最后,标准操作系统的交换机制将会起作用。但是所有的FastDB的算法和结构的优化都是基于数据存放在内存中这个假设上的,所以数据交换的效率不会很高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值