LZ就是想问一些使用raw device的应用怎么识别raw中的数据,怎么处理并发读写的问题吧?
我对存储不熟悉,对oracle小有了解,说的不对请指正。
oracle有自己的db_block,一般是4kb,8kb,16kb,这些块的内部结构都可以通过oracle的转储命令dump出来,而且还是格式化好的,有兴趣可以自己试试。举个不太严谨的例子,一个数据文件当中可能有的数据对象有表、索引、簇等。每个对象都有自己的头和内容部分,其所占的块个数可能不一样,但是每个块都是严格的一致的大小,这个大小就是在创建数据库的时候指定的。一个数据库的默认db block size是不变的。
如果使用文件系统,那么在需要向磁盘写数据的时候,oracle的DBWn进程通知操作系统去IO。
如果使用裸设备,oracle自己IO,绕过操作系统。
oracle使用裸设备,在性能方面好处多多,比如不用OS的IO cache。这样就节省了内存和cpu时间等。
oracle有自己的一套庞大的内存结构,还有一套复杂的进程。这些都是为数据库应用优化的,而操作系统是普适的。
http://www.ixora.com.au/tips/avoid_buffered_io.htm
raw device是不会阻止用户去毁坏自己的数据的,预防机制是由应用来实现的,oracle就有,看一下oracle的多版本和锁机制就明白怎么回事了。
再说一下RAC为什么要么选择raw要么选择cfs,原因就在于它们可以提供同时写的能力,比如在同一时间node1向file1的第10个block(db block)写数据,node2向file1的第20个block写数据(但是不可能同时向同一个block写数据,能力是有的,但是oracle不许这么做)。(这个file1是/dev/rawn的soft link)
在你看来是不是这个file1已经不一致了?恰好不是这样,反而这种机制提高了oracle的并发能力和数据的一致性。
唉,到此为止。说的不好,自己都不忍心看了。
[
本帖最后由 feelfall 于 2007-2-9 18:20 编辑 ]