1:介绍
一个集群 文件 系统能使运行在集群中所有节点并发的通过标准文件系统接口来访问存储设备。这给 管理跨越整个集群的应用系统带来方便。
OCFS1问世于2002年10月,它是Oracle公司为了让 RAC 用户避免必须要与裸设备打交道而开发出来的。这个文件系统用来存放 数据库相关的文件,比如 数据文件,控制文件,在线日志文件,归档日志文件等。
OCFS2是下一代的 ORACLE集群文件系统,它已经被设计成为一种为通用的文件系统,它不仅可以存放数据库相关的文件,还可以存放oracle二进制文件(指Oracle_home下的软件文件-译者注)和配置文件,从而使RAC的管理更加轻松。
2:安装
OCFS2的发行版包括了2个安装包,一个称为核心模块,另一个叫 工具包。
核心模块可以从以下链接下载:
http://oss.oracle.com/projects/ocfs2/files/
工具包可以从以下链接下载;
http://oss.oracle.com/projects/ocfs2-tools/files/
首先要下载相应的软件包.对于核心模块,下载时要考虑它的发行号,适用的平台,操作系统内核版本以及内核的类型(比如SMP,HUGEMEM,PSMP等),对于工具包,只要符合发行版本和平台就可以了。
工具包又分为两部分,ocfs2-tools 命令行工具,ocfs2console图形工具,用户可以选择不安装这部分,但它的确可以令操作简单化。
使用rpm命令来安装软件包,使用 rpm -install 进行新的安装或者使用rpm -upgrade来升级现有的软件包。
3:配置
OCFS2有一个配置配置文件,路径为/etc/ocfs2/cluster.conf.在这个文件中,你需要指定RAC中所有的节点信息,并且所有的节点上都应该保留相同的一份。你可以动态的增加新节点到RAC,或者改变一些节点的IP,名字,但这需要重起RAC以便于使更改生效。
我们强烈建议用户使用OCFS2-CONSOLE工具来对RAC中所有的节点进行配置。
运行OCFS2-CONSOLE,进入cluster菜单,选择configure nodes.如果cluster已经停止,控制台会启动它,并且返回一个成功的信息。如果cluster.conf文件不存在,控制台将会创健一个并给一个默认的集群名字ocfs2.点击add按钮将节点添加到RAC中,每一个节点需要输入节点名称,ip和端口号。控制台从0-254顺序的分配节点序号。一旦所有的节点都添加到RAC当中,通过点击菜单cluster里propagate configration项,我们可以在任何一台节点上将配置文件cluster.conf分发到所有节点相应的位置上去,由于控制台使用的是ssh协议来传送文件,所以之前需要在所有节点上建好彼此的信任,以避免在文件传递过程中出现提出输入口令的问题。
附录A是一个cluster.conf的示例。
4:O2CB集群 服务
OCFS2有自己的集群服务结构,叫做O2CB,它包括:
NM:节点管理器,它对cluster.conf文件中所有节点进行的监控。
HB:心跳服务(Heart beat service),他在节点离开或加入rac时提示up和down的消息。
TCP:控制节点间的通讯。
DLM:分布式锁管理器,它持续跟踪所有的锁,锁的所有者及状态。
CONFIGFS:用户配置文件系统驱动 空间,挂节点是/config
DLMFS:用户空间和内核空间DLM的接口。
所有这些cluster服务都已经被打包在o2cb系统服务当中,所有的操作,比如format,mount等,都需要cluster可用。在使用format等命令前,要先启动这些服务。
可以通过以下方式检查所有服务的状态:
# /etc/init.d/o2cb status
Module “configfs”: Not loaded
Filesystem “configfs”: Not mounted
Module “ocfs2_nodemanager”: Not loaded
Module “ocfs2_dlm”: Not loaded
Module “ocfs2_dlmfs”: Not loaded
Filesystem “ocfs2_dlmfs”: Not mounted
通过以下方式启动所有服务:
# /etc/init.d/o2cb load
Loading module “configfs”: OK
Mounting configfs filesystem at /config: OK
Loading module “ocfs2_nodemanager”: OK
Loading module “ocfs2_dlm”: OK
Loading module “ocfs2_dlmfs”: OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
通过以下方式使cluster ocfs2 启动:
# /etc/init.d/o2cb online ocfs2
Starting cluster ocfs2: OK
通过以下方式停止cluster ocfs2:
# /etc/init.d/o2cb offline ocfs2
Cleaning heartbeat on ocfs2: OK
Stopping cluster ocfs2: OK
通过以下方式停止所有服务:
# /etc/init.d/o2cb unload
Unmounting ocfs2_dlmfs filesystem:
Unloading module “ocfs2_dlmfs”: OK
Unmounting configfs filesystem: OK
Unloading module “configfs”: OK
通过以下方式使O2CB在系统启动时自动被加载:
# /etc/init.d/o2cb configure
Configuring the O2CB driver.
This will configure the on-boot properties of the O2CB driver.
The following questions will determine whether the driver is loaded on
boot. The current values will be shown in brackets (’[]‘). Hitting
without typing an answer will keep that current value. Ctrl-C
will abort.
Load O2CB driver on boot (y/n) [n]: y
Cluster to start on boot (Enter “none” to clear) []: ocfs2
Writing O2CB configuration: oK
#
如果cluster已经被配置为系统启动时加载,可以通过以下方式启动和停止它:
# /etc/init.d/o2cb load
Loading module “configfs”: OK
Mounting configfs filesystem at /config: OK
Loading module “ocfs2_nodemanager”: OK
Loading module “ocfs2_dlm”: OK
Loading module “ocfs2_dlmfs”: OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
5:格式化(format)
如果O2CB CLUSTER没有启动,首先启动它。格式化操作依赖于这些服务。同时它需要你确保所有的节点上都没有挂载需要格式化的设备。
你可以使用图形界面或者命令行来格式化分区。
如果你使用图形界面,选择task/Format来执行操作,在下拉列表中选择可用的设备。同时控制台会尽可能的列出设备上存在的文件系统。
为要格式化的设备输入一个标签,为了便于管理,我们建议你输入一个标签,你仍然可以在格式化之后修改它。
为设备选择一个集群单元大小(cluster size),它支持从4k到1M。如果这个设备用来存储数据文件或者大的文件,比较合适的大小是128K。
选择一个块单元大小( block size),它支持从512字节到4k,由于OCFS2在格式化的时候并不分配一个静态的inode 区域,所以4k是我们强烈推荐的大小,它几乎适合所有的磁盘大小,换句话说,即时这些磁盘支持512字节,但我们仍然不建议使用小的单元。
一旦格式化完毕,集群单元和块单元都不可以再改变。
输入一个节点槽位(node slots),这个数值决定了允许多少节点同时挂载这个设备。这个数值随后可以修改,但只能增加,不能减小。
点击ok按钮执行格式化操作。
要格式化一个3k块大小,32k集群单元大小,包括4个节点的设备,在命令行下,可以通mkfs.ocfs2工具按如下操作完成:
# mkfs.ocfs2 -b 4K -C 32K -N 4 -L oracle_home /dev/sdf2
mkfs.ocfs2 1.2.0
Overwriting existing ocfs2 partition.
Proceed (y/N): y
Filesystem label=oracle_home
Block size=4096 (bits=12)
Cluster size=32768 (bits=15)
Volume size=21474820096 (655359 clusters) (5242872 blocks)
21 cluster groups (tail covers 10239 clusters, rest cover 32256 clusters)
Journal size=33554432
Initial number of node slots: 4
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing lost+found: done
mkfs.ocfs2 successful
可以通过man 获得mkfs.ocfs2的帮助信息。
6:挂载(mount)
启动o2cb服务,mount操作需要这些服务的支持。
你可以使用图形界面或者命令行工具:mount来完成操作。
如果使用图形界面:运行ocfs2console,选中一个设备,点击mount按钮,在弹出的对话框中输入挂接点,在可选项中输入defaults,点击ok.成功执行者后,你在列表中会看到这个设备以及它的挂接点。
命令行下的操作:
# mount -t ocfs2 /dev/sdf2 /u01
要取消挂接(umount)一个设备,可以在控制台上选中该设备点击umount或者在命令行下输入:
# umount /u01
Oracle数据库用户在将Ocfs2挂接点用来存放voting disk( CRS),cluster registry( OCR),数据文件,redo file,归档日志和控制文件时,在mount操作时,一定要使用’datavolume,nointr’ 的mount选项。
其中datavolume选项确保Oracle 进程在打开文件时使用o_direct标记。nointr选项确保在这个设备上的读写不会被一些信号中断。其他的设备,比如用于存放Oracle_Home文件的挂节点不需要使用这些选项。
通过以下命令来完成包含数据文件,voting disk等设备的挂载:
# mount -t ocfs2 -o datavolume,nointr /dev/sdf2 /u01
# mount
/dev/sdf2 on /u01 type ocfs2 (rw,datavolume,nointr)
如果你想在系统启动时挂接ocsf2,你需要保证o2bc和ocfs2服务使用chkconfig来配置o2bc在启动时被加载。并且要在/etc/fstab文件中加入如下项:
# cat /etc/fstab
…
/dev/sdf2 /u01 ocfs2 _netdev,datavolume,nointr 0 0
/dev/sdg2 /orahome ocfs2 _netdev 0 0
…
_netdev选项对于mount ocfs2设备是必须的,这个选项说明设备需要在网络启动时候挂载,在网络关闭之后取消挂载(datavolume 和 nointr选项只在存储数据文件等设备上需要)。
ocfs2的服务可以用来挂载和取消挂在ocfs2设备,它通常用来确保ocfs2 设备必须在网络服务关闭之后再取消挂载。
# chkconfig –add ocfs2
ocfs2 0
# chkconfig –add o2cb
o2cb 0
#
#
# /etc/init.d/o2cb configure
…
Load O2CB driver on boot (y/n) [n]: y
Cluster to start on boot (Enter “none” to clear) []: ocfs2
Writing O2CB configuration: OK
可以通过标签来挂载设备:
# mount -L datafiles /u01
7:调整(tune)
调整的操作允许你增加节点数(增加并发访问mount设备的节点数),修改设备的标签和修改。
tunefs.ocfs2命令行工具用来完整这个操作,你也可以使用控制台来完成。
确保O2cb服务启动,tune操作需要这些服务的支持。
如果是用控制台增加节点数,点击:task,选择Edit Node Slot count,在对话框中输入你需要的节点数,Ok完成。
通过以下命令从命令行完成上面的操作:
# tunefs.ocfs2 -N 8 /dev/sdf2
tunefs.ocfs2 1.2.0
Changing number of node slots from 4 to 8
Proceed (y/N): y
Added node slots
Wrote Superblock
在控制台下修改一个设备的标签,点击:task/Change Label,在对话框中输入新的标签。
命令行下的操作:
# tunefs.ocfs2 -L “old datafiles” /dev/sdf2
tunefs.ocfs2 1.2.0
Changing volume label from datafiles to old datafiles
Proceed (y/N): y
Changed volume label
Wrote Superblock
通过man命令来获得tunefs.ocfs2的完整帮助。
{$PageTitle=CDSL(Context Dependent Symbolic Links)}
9:CDSL(Context Dependent Symbolic Links)
在一个共享存储的cluster环境, 实例需要通过cluster来访问一些文件和路径,通常它可能只对这个路径感兴趣,比如在一个共享的ORACLE_HOME中,/admin/ listener.ora对所有的节点都是相同的,但listener.ora的内容却各不相同,同理,对于一个共享的启动环境,/etc/对所有节点是相同的,但它里面的内容却各不相同。
对于所有的这些实例,这个文件或者路径的内容依赖于各个节点的主机名,而对于另外的一些实例,它可能会依赖于各个节点的 架构(x86,x86_64或者IA64),也可能会依赖于各个节点的节点号。
为了 解决这些问题,OCFS2使用了一种称为CDSL(Context Dependent Symbolic Links)的 技术,简单的说,就是它使用软连接来实现各个节点自己需要的文件内容。
可以使用ocfs2cdsl命令行工具来建立这些软链接:
建立一个节点需要的文件:
root@node32:admin/# ocfs2cdsl listener.ora
root@node32:admin/# ls –l listener.ora
lrwxrwxrwx 1 root root 50 Aug 8 11:41 listener.ora ->
../.cluster/hostname/{hostname}/10g/network/admin/listener.ora
编辑这个文件,然后保存,要从其他节点山访问这个文件,先要在那个节点上创建CDSL,然后再像刚才那样把正确的内容写进去。
root@node31:admin/# ocfs2cdsl listener.ora
把一个已经存在的文件变成cdsl文件:
root@node32:admin/# ocfs2cdsl –c sqlnet.ora
同理,在其他节点上也这样做。
root@node31:admin/# ocfs2cdsl sqlnet.ora
这是你也许会发现对于所有的节点这个文件里面的内容是一样的,在任何一个检点上对该文件的更新对于其他节点都是不可见的。
删除一个CDSL链接:
root@node31:admin/# rm listener.ora
可以通过man来获得ocfs2cdsl的完全帮助。
10:其他的一些工具
mounted.ocfs2
mounted.ocfs2是一个命令行下列出一个节点上所有OCFS2设备的工具。它扫描/proc/partitions文件中列出的所有分区。
列出一个节点上ocfs2分区信息:
# mounted.ocfs2 -d
Device FS UUID Label
/dev/sdb1 ocfs2 e70c75a0-a08c-480a-bf50-ebda4191da30 mm_v2_dbf1
/dev/sdb2 ocfs2 f49163e8-6288-43c4-a792-e9401fde45fa mm_v2_ctrl
/dev/sdb3 ocfs2 2d441be2-adb6-4c52-9e19-9a7c2c485dc4 mm_v2_dbf2
/dev/sdb5 ocfs2 8607eae9-8e4f-4495-84e8-8db0bc9da60c mm_v2_log1
/dev/sdb6 ocfs2 acfb7b7d-a277-4741-9791-620ea9b82670 mm_v2_log2
/dev/sdf1 ocfs2 84749537-df45-4a97-aa28-fad63760b674 9ihome
/dev/sdq1 ocfs2 dca2901b-241f-406e-80e9-85dd6b452d1a oracle_home
/dev/sdcf1 ocfs2 663764bd-1eed-4b3c-aa48-a98f0be0e574 10ghome
/dev/sdcf2 ocfs2 8e2d9c21-ef47-4fea-8ac5-2306cc60455e mm_v2_log3
列出所有节点上ocfs2分区信息:
# mounted.ocfs2 -f
Device FS Nodes
/dev/sdb1 ocfs2 node31, node32, node33, node34
/dev/sdb2 ocfs2 node31, node32, node33, node34
/dev/sdb3 ocfs2 node31, node32, node33, node34
/dev/sdb5 ocfs2 node31, node32, node33, node34
/dev/sdb6 ocfs2 node91, node90
/dev/sdf1 ocfs2 Not mounted
/dev/sdq1 ocfs2 node34, node35
/dev/sdcf1 ocfs2 Not mounted
/dev/sdcf2 ocfs2 Not mounted
注意:这个命令只列出起了o2bc服务的节点机的名字,对于那些没
注意:这个命令只列出起了o2bc服务的节点机的名字,对于那些没有起o2bc服务的节点,将以节点号代替。
通过man命令获得mounted.ocfs2的完全帮助。
附录A
一个cluster.conf例子:
Sample /etc/ocfs2/cluster.conf
cluster:
node_count = 2
name = racdb
node:
ip_port = 7777
ip_address = 192.168.0.107
number = 7
name = node7
cluster = racdb
node:
ip_port = 7777
ip_address = 192.168.0.106
number = 6
name = node6