在Oracle 11g中引入了Direct Network File System(Oracle Direct NFS)的新特性,通过一个打包在Oracle内核中的NFS客户机以改善实例使用NFS时的性能,同时进一步完善了通过NFS实现RAC的解决方案。常规的NFS客户端软件一般由操作系统供应商提供,这类NFS客户端不会专门为Oracle数据文件的IO做优化。而通过内建的Oracle Direct NFS,数据库将可以直接访问NFS服务器上的文件,避免由OS内核NFS造成的额外开销。Oracle宣称由以上优化所带来的性能提升,在DSS环境中超过40%,而在OLTP环境中超过10%(详见<Oracle Database 11g Direct NFS Client a white paper>)。
接下来我们将通过实例来演示如何构建Oracle Direct NFS客户机,实际上这并不困难;Direct NFS客户机会以如下顺序查找装载点的设置信息:
- $ORACLE_HOME/dbs/oranfstab 作用域为$ORACLE_HOME相关的数据库
- /etc/oranfstab 作用域为主机上所有可用数据库
- 最后为/etc/mtab配置文件,以确定可用的NFS装载点
我们一般推荐使用$ORACLE_HOME/dbs/oranfstab来配置Direct NFS客户机;该oranfstab配置文件可以包括Server,path,export以及mount参数,各参数代表的属性如下:
- Server:NFS服务器名
- Path:到达NFS服务器的最多4个网络路径,可以是IP或者主机名
- Export:从NFS服务器导出的路径
- Mount:NFS的本地装载点
需要注意的是如果是在使用NFS实现RAC的情景中,那么必须使用/etc/oranfstab配置文件。并且该配置文件应当在所有节点上时同步的。
在正式启用Direct NFS客户机前,NFS文件系统应当已由常规NFS方式mount并且可用。为了启用Direct NFS client,我们还需要将标准的Oracle磁盘管理库(Oracle Disk Manager (ODM) library)替换为支持Direct NFS client的NFS ODM。可以通过建立从标准ODM库指向NFS ODM库的符号链接来完成以上工作,但是需要注意的是以上操作仅能在实例关闭的情况下才能实施并且有效。
SQL> shutdown immediate; [maclean@rh2 ~]$ cd $ORACLE_HOME/lib [maclean@rh2 lib]$ mv libodm11.so libodm11.so.old [maclean@rh2 lib]$ ln -s libnfsodm11.so libodm11.so [maclean@rh2 lib]$ ls -l libodm11.so lrwxrwxrwx 1 maclean oinstall 14 Feb 18 19:27 libodm11.so -> libnfsodm11.so
接下来我们将正式启用Direct NFS Client,并会简单测试其性能:
[root@rh2 ~]# showmount -e nas Export list for nas: /d01 rh2 /* 以常规方式装载NFS文件系统 */ [root@rh2 ~]# mount -t nfs nas:/d01 /d01 [maclean@rh2 ~]$ cat $ORACLE_HOME/dbs/oranfstab server: nas path: 192.168.1.188 export: /d01 mount: /d01 SQL> startup; 启动阶段告警日志会出现以下信息: Oracle instance running with ODM: Oracle Direct NFS ODM Library Version 3.0 ................. Direct NFS: attempting to mount /d01 on filer nas defined in oranfstab Direct NFS: channel config is: channel id [0] local [] path [192.168.1.188] Direct NFS: mount complete dir /d01 on nas mntport 998 nfsport 2049 SQL> desc v$dnfs_servers; Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER SVRNAME VARCHAR2(255) DIRNAME VARCHAR2(1024) MNTPORT NUMBER NFSPORT NUMBER WTMAX NUMBER RTMAX NUMBER /*可以通过查询V$DNFS_SERVERS动态视图来了解NFS客户机的装载情况 */ SQL> col svrname for a10 SQL> col dirname for a10 SQL> select svrname,dirname,mntport,nfsport from v$dnfs_servers; SVRNAME DIRNAME MNTPORT NFSPORT ---------- ---------- ---------- ---------- nas /d01 998 2049 /* 此外V$DNFS_FILES视图提供了当前Direct NFS打开的文件 V$DNFS_CHANNELS视图提供了DNFS为服务器打开的网络路径 V$DNFS_STATS视图提供了DNFS的性能统计信息 */ SQL> set timing on; SQL> create tablespace nfs_perf datafile '/d01/perf01.dbf' size 2000M; Tablespace created. Elapsed: 00:00:30.91 SQL> shutdown immediate; /* 通过还原libodm11.so库文件和删除oranfstab配置文件可以禁用Direct NFS */ [maclean@rh2 lib]$ cp libodm11.so.old libodm11.so [maclean@rh2 lib]$ rm $ORACLE_HOME/dbs/oranfstab SQL> select svrname,dirname,mntport,nfsport from v$dnfs_servers; no rows selected SQL> set timing on; SQL> create tablespace nfs_kernel datafile '/d01/kernel01.dbf' size 2000M; Tablespace created. Elapsed: 00:00:29.45 /* 似乎从简单的数据文件创建时间上体现不出Oracle Direct Nfs的优势...*/ That's ok