SVN 两种存储格式(BDB和FSFS)区别

版本库数据存储

在Subversion1.2中,版本库中存储数据有两种方式。一种是在Berkeley DB数据库中存储数据;另一种是使用普通的文件,使用自定义格式。因为Subversion的开发者称版本库为(版本化的)文件系统,他们接受了称后一种存储方式为FSFS[14]的习惯,也就是说,使用本地操作系统文件系统来存储数据的版本化文件的系统。

建 立一个版本库时,管理员必须决定使用Berkeley DB还是FSFS。它们各有优缺点,我们将详细描述。这两个中并没有一个是更正式的,访问版本库的程序与采用哪一种实现方式无关。访问程序并不知道版本库 如何存储数据,它们只是从版本库的API读取到修订版本和事务树。

表 5.1 “版本库数据存储对照表”从总体上比较了Berkeley DB和FSFS版本库,下一部分将会详细讲述细节。

表 5.1. 版本库数据存储对照表

特性 Berkeley DB FSFS
对操作中断的敏感 很敏感;系统崩溃或者权限问题会导致数据库“塞住”,需要定期进行恢复。 不敏感。
可只读加载 不能 可以
存储平台无关 不能 可以
可从网络文件系统访问 不能 可以
版本库大小 稍大 稍小
可扩展性:修订版本树的数量 数据库,没有限制 许多古老的本地文件系统在处理单一目录包含上千个条目时出现问题。
可扩展性:文件较多的目录 较慢 较快
速度:检出最新的代码 较快 较慢
速度: 大的提交 较慢,但是时间被分配在整个提交操作中 较快,但是最后较长的延时可能会导致客户端操作超时
组访问权处理 对于用户的umask设置十分敏感,最好只由一个用户访问。 对umask设置不敏感
功能成熟时间 2001年开始使用 2004年开始使用

Berkeley DB

在Subversion的初始设计阶段,开发者因为多种原因而决定采用Berkeley DB,比如它的开源协议、事务支持、可靠性、性能、简单的API、线程安全、支持游标等。

Berkeley DB提供了真正的事务支持-这或许是它最强大的特性,访问你的Subversion版本库的多个进程不必担心偶尔会破坏其他进程的数据。事务系统提供的隔 离对于任何给定的操作,Subversion版本库代码看到的只是数据库的静态视图-而不是一个在其他进程影响不断变化的数据库-并能够根据该视图作出决 定。如果该决定正好同其他进程所做操作冲突,整个操作会回滚,就像什么都没有发生一样,并且Subversion会优雅的再次对更新的静态视图进行操作。

Berkeley DB另一个强大的特性是热备份-不必“脱机”就可以备份数据库环境的能力。我们将会在“版本库备份”一节讨论如何备份你的版本库,能够不停止系统对版本库做全面备份的好处是显而易见的。

Berkeley DB同时是一个可信赖的数据库系统。Subversion利用了Berkeley DB可以记日志的便利,这意味着数据库先在磁盘上写一个日志文件,描述它将要做的修改,然后再做这些修改。这是为了确保如果如果任何地方出了差错,数据库 系统能恢复到先前的检查点—一个日志文件认为没有错误的位置,重新开始事务直到数据恢复为一个可用的状态。关于Berkeley DB日志文件的更多信息请查看“管理磁盘空间”一节

但 是每朵玫瑰都有刺,我们也必须记录一些Berkeley DB已知的缺陷。首先,Berkeley DB环境不是跨平台的。你不能简单的拷贝一个在Unix上创建的Subversion版本库到一个Windows系统并期望它能够正常工作。尽管 Berkeley DB数据库的大部分格式是不受架构约束的,但环境还是有一些方面没有独立出来。其次,使用Berkeley DB的Subversion不能在95/98系统上运行—如果你需要将版本库建在一个Windows机器上,请装到Windows2000或 WindowsXP上。另外,Berkeley DB版本库不能放在网络共享文件夹中,尽管Berkeley DB承诺如果按照一套特定规范的话,可以在网络共享上正常运行,但实际上已知的共享类型几乎都不满足这套规范。

最后,因为Berkeley DB的库直接链接到了Subversion中,它对于中断比典型的关系型数据库系统更为敏感。大多数SQL系统,举例来说,有一个主服务进程来协调对数据 库表的访问。如果一个访问数据库的程序因为某种原因出现问题,数据库守护进程察觉到连接中断会做一些清理。因为数据库守护进程是唯一访问数据库表的进程, 应用程序不需要担心访问许可的冲突。但是,这些情况与Berkeley DB不同。Subversion(和使用Subversion库的程序)直接访问数据库的表,这意味着如果有一个程序崩溃,就会使数据库处于一个暂时的不 一致、不可访问的状态。当这种情况发生时,管理员需要让Berkeley DB恢复到一个检查点,这的确有点讨厌。除了崩溃的进程,还有一些情况能让版本库出现异常,比如程序在数据库文件的所有权或访问权限上发生冲突。因为 Berkeley DB版本库非常快,并且可以扩展,非常适合使用一个单独的服务进程,通过一个用户来访问—比如Apache的httpdsvnserve(参见第 6 章 配置服务器)—而不是多用户通过file:///或svn+ssh://URL的方式多用户访问。如果将Berkeley DB版本库直接用作多用户访问,请先阅读“支持多种版本库访问方法”一节

FSFS

在 2004年中期,另一种版本库存储系统慢慢形成了:一种不需要数据库的存储系统。FSFS版本库在单一文件中存储修订版本树,所以版本库中所有的修订版本 都在一个子文件夹中有限的几个文件里。事务在单独的子目录中被创建,创建完成后,一个单独的事务文件被创建并移动到修订版本目录,这保证提交是原子性的。 因为一个修订版本文件是持久不可改变的,版本库也可以做到热备份,就象Berkeley DB版本库一样。

修订版本文件格式代表了一个修订 版本的目录结构,文件内容,和其它修订版本树中相关信息。不像Berkeley DB数据库,这种存储格式可跨平台并且与CPU架构无关。因为没有日志或用到共享内存的文件,数据库能被网络文件系统安全的访问和在只读环境下检查。缺少 数据库花消同时也意味着版本库的总体体积可以稍小一点。

FSFS也有一种不同的性能特性。当提交大量文件时,FSFS使用O(N)算法来追 加条目,而Berkeley DB则用(N^2)算法来重写整个目录。另一方面,FSFS通过写入与上一个版本比较的变化来记录新版本,这也意味着获取最新修订版本时会比 Berkeley DB慢一点,提交时FSFS也会有一个更长的延迟,在某些极端情况下会导致客护端在等待回应时超时。

最重要的区别是当出现错误时FSFS不会楔住的能力。如果使用Berkeley DB的进程发生许可错误或突然崩溃,数据库会一直无法使用,直到管理员恢复。假如在应用FSFS版本库时发生同样的情况,版本库不会受到任何干扰,最坏情况下也就是会留下一些事务数据。

唯一真正对FSFS不利的是相对于Berkeley DB的不成熟,缺乏足够的使用和压力测试,许多关于速度和可扩展性的判断都是建立在良好的猜测之上。在理论上,它承诺会降低管理员新手的门槛并且更加不容易发生问题。在实践中,只有时间可以证明。

转载于:https://my.oschina.net/u/919580/blog/131565

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SVN全名Subversion,即版本控制系统,实现服务系统的软件。 SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操作系统。作为一个开源的版本控制系统,Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库 (repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。Subversion 是一个通用的系统, 可用来管理任何类型的文件, 其中包括了程序源码。 SVN的安装和配置 安装:(1) apache Http Server 2.2.4 。 用于和 SVN 整合 (2) svn-win32-1.4.5.zip SVN 服务器端 配置步骤:安装完毕之后就开始了APACHE与SVN的整合配置。 (1),将SVN的bin目录下的扩展名为*.so的文件复制到apache的modoles文件夹下 (2),将SVN的bin 目录下的扩展名为*.dll的文件复制到apache的bin文件夹下 (3),将前面的#去掉(有#即被注释掉了): LoadModule dav_module modules/mod_dav.so LoadModule dav_fs_module modules/mod_dav_fs.so 添加:LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so (4),修改apache目录下conf文件中的httpd.conf文件: Listen 9090 #修改端口号为9090,因为Apache默认安装为80端口,需要关闭IIS避免端口冲突所以我们在安装好之后调整端口。 ServerAdmin zzxy@xinyuan.com.cn # ServerName localhost:9090 在最后添加: <Location /svn> #其中 /svn就是访问时第一级目录的名字 DAV svn SVNParentPath e:/svn/repository # SVNParentPath是物理地址 AuthzSVNAccessFile e:/svn/authz.conf #用户权限列表 AuthType Basic #访问方式 AuthName "Subversion.zoneyump" AuthUserFile e:/svn/authfile.cfg #创建用户列表文件,由apache的bin目录下htpasswd程序创建,密码为密文。 Require valid-user #设置用户的访问权限为读写均受限制 </Location> (5),用语句svnadmin create e:/ svn/repository/project1 创建库 (6),重启Apache服务器,使用浏览器打开 http://localhost:9090/svn/project 将会看到要求登录的对话框,输入你刚设置的用户名和口令即可。 这样Apache和SVN的整合就基本完成了 (7),现在在浏览器中输入: http://localhost:9090/svn/project就会出现SVN的库的内容了 (8),Apache提供一个htpasswd工具来管理用户名和口令,现在我们设置用户名为user的用户:htpasswd –c d:\passwd\passwords user 控制台会提示输入密码的。 第一次不存在passwd文件时用参数c,以后用户的创建就可以用m或者是p了。 htpasswd用法(htpasswd -?): -c Create a new file. -n Don't update file; display results on stdout. -m Force MD5 encryption of the password (default). -d Force CRYPT encryption of the password. -p Do not encrypt the password (plaintext). -s Force SHA encryption of the password. -b Use the password from the command line rather than prompting for it. -D Delete the specified user. On Windows, NetWare and TPF systems the '-m' flag is used by default. On all other systems, the '-p' flag will probably not work. 用-c必须是在建立文件时候使用,且密码为密文,当在有文件后继续使用时原来的用户信息将全部丢失,相当于重新建立了用户信息列表。在已经建立了文件之后使用-m/p时,列表中出现的密码将是明文。如果在建立文件之后仍然想在列表中建立密码为密文的用户时直接使用: htpasswd d:\passwd\passwords user (9),设置用户权限,可以直接修改权限列表文件,格式为: [groups] m-dev = kxlele, yangle, renyuan,lulifang o-dev = zhangjunwang, luoyuehua, zhiyanfeng readonly = user, test everyone = @m-dev, @o-dev [/] @everyone = r @readonly = rw [project:/] @everyone = r @readonly = r [project1:/] @m-dev = rw @readonly = r 后记:svn远程控制用户名及密码的修改方法:将附件中的apchepasswd.cgi以及apchepasswd.cgi.ini配置文件放入apache根目录下的cgi-bin目录中。修改apchepasswd.cgi.ini中的usersfile文件,改为配置中的路径。运行:http://localhost:9090/cgi-bin/apachepasswd.cgi就可以看到修改密码的页面了。  ApacehPasswd就是用来修改上面配置中的C:\SVN_repos\passwd这个文件的   使用方法:   1将文件ApachePasswd.cgi及ApacehPasswd.cgi.ini复制到Apache的CGI脚本目录下,通常是cgi-bin目录。   2确保cgi-bin目录可以运行cgi脚本   3修改配置文件ApachePasswd.cgi.ini中authuserfile路径,如下 [path] authuserfile=这里改为你的Subversion所用的authuserfile全路径,如e:\SVN\passwd   4现在访问你服务器的http://localhost:9090/cgi-bin/ApachePasswd.cgi就可以看到修改subversion密码的界面了。 备注: 1配置文件可用的配置项 [path] authuserfile=这里改为你的Subversion所用的authuserfile全路径,如C:\SVN_repos\passwd 日志文件名 logfile=svnpass.log [setup] passminlen=1 [html] title=修改SubVersion密码 description=修改SubVersion密码 yourname = 用户名 oldpasswd = 旧密码 newpasswd1 = 新密码 newpasswd2 = 验证新密码 btn_change = 修 改 btn_reset = 重 置 changepassok=成功修改密码 changepassfailed=修改密码失败 oldpasserror=旧密码错误 servererror=服务器错误 passmustgreater=密码位数必须大于 twopassnotmatched=两密码不一致 entername=请输入用户名 back=返回 2我一般用时都是将ApachePasswd.cgi改名为svnpass,这样用户修改密码时可以少打些字, 如访问http://193.193.193.242:9090/cgi-bin/svnpass就可以修改密码了, 当改名为svnpass时,配置文件ApachePasswd.cgi.ini要相应地改为svnpass.ini,因为这个脚本是根据自己的文件名找配置文件的. 问题:运行CGI文件时报错原因: 将ApachePasswd.cgi改名为ApachePasswd.exe后系统提示缺少几个dll文件,把Apache2.0中bin的几个dll文件复制倒Apache 2.2.4 的cgi-bin目录下就可以解决了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值