Oracle 集群文件系统(Cluster File System – OCFS2)用户指南
1. 引言
集群文件系统允许集群中的所有节点通过标准文件系统接口并发访问设备。如此可以轻松管理需在集群中运行的应用程序。
OCFS(版本1)于2002年12月发布,这使 Oracle Real Application Cluster(RAC)用户无需处理 RAW 设备即可运行集群数据库。该文件系统旨在存储与数据库相关的文件,例如数据文件,控制文件,重做日志,存档日志,等等。
OCFS2 是”下一代” Oracle 集群文件系统。它被设计为通用集群文件系统。使用它,不仅可以将数据库相关文件存储在共享磁盘上,还可以存储 Oracle 二进制文件和配置文件(共享的 Oracle 主目录),从而使 RAC 的管理更加容易。
2. 安装
OCFS2 发行版包含两组软件包。即内核模块和工具。
可从 http://oss.oracle.com/projects/ocfs2/files/ 下载内核模块,并从 http://oss.oracle.com/projects/ocfs2-tools/files/ 下载工具。
下载适当的软件包。对于内核模块来说,请下载与发行版、平台、内核版本和内核风格(smp、hugemem、psmp等)匹配的模块。对于工具,只需匹配平台和发行版。
工具包分为两部分。ocfs2-tools
包含命令行工具,而ocfs2console
包含这些工具的GUI前端。 尽管为了易于使用而建议使用控制台,但安装该控制台不是必需的。
CentOS / RedHat
在将成为 OCFS2 集群一部分的每个节点上,使用rpm --install
或rpm --upgrade
命令安装软件包。
Debian / Ubuntu
以 Ubuntu 20.04 LTS 为例,发行版的内核已默认内置 OCFS2,因此仅需安装工具包:
# apt install ocfs2-tools
3. 配置
OCFS2 具有一个配置文件,即/etc/ocfs2/cluster.conf
。在其中,需要指定集群中的所有节点。该文件在集群中的所有节点上都应该相同。虽然可以动态地将新节点添加到集群,但是其他任何更改(例如名称、IP地址)都需要重新启动集群,以使更改生效。
强烈建议用户使用ocfs2console
来设置cluster.conf
并将其传播到集群中的所有节点。这仅需要在集群中的一个节点上完成。完成此步骤后,用户将在集群中的所有节点上看到相同的/etc/ocfs2/cluster.conf
。请注意,不同的cluster.conf
将导致不可预测的行为。
启动ocfs2console
并单击菜单项Cluster
,然后单击Configure Nodes
。如果集群处于脱机状态,则控制台将启动它并显示一条消息。如果不存在cluster.conf
,则控制台将创建一个默认群集名称为ocfs2
的集群。
单击添加将节点添加到集群。需要输入节点名称(与主机名相同)、IP地址和端口。控制台从0到254顺序分配节点序数。注意:此处需确保节点名称与对应配置的主机名称完全一致。
一旦添加了所有节点,就可以通过单击菜单项Cluster
和Propagate Configuration
,将配置传播到所有节点。控制台使用ssh
传播配置文件。如果尚未为自动ssh
登录身份验证设置节点(请参阅ssh联机帮助页),则控制台将提示用户输入要传播到的节点的root
用户密码。
请参考附录A中的cluster.conf
示例和布局说明。
4. O2CB 集群服务
OCFS2
捆绑了自己的群集堆栈O2CB
。集群堆栈包括:
· NM:跟踪cluster.conf
中所有节点的节点管理器
· HB:心跳服务,在节点加入或离开群集时发出上/下通知
· TCP:处理节点之间的通信
· DLM:分布式锁管理器,可跟踪所有锁,其所有者和状态
· CONFIGFS:挂载在/config
上的用户空间驱动配置文件系统
· DLMFS:内核空间DLM的用户空间接口
所有集群服务都已打包在o2cb
系统服务中。
OCFS2 操作(如格式化、挂载等),要求至少在要执行该操作的节点上启动 O2CB 集群服务。
OCFS2 启动的基本步骤如下:
1)加载nodemanager
、heartbeat
和tcp
模块
2)挂载nodemanager
和heartbeat
伪文件系统。
3)通过o2cb_ctl
加载集群信息。这会将所有已知节点添加到节点管理器的伪文件系统中。
4)加载 DLM 模块。
5)加载 OCFS2 模块。
6)挂载 OCFS2 文件系统。
/etc/init.d/o2cb
程序负责在计算机引导期间处理步骤1-3。
如果您从源代码树运行,则脚本位于vendor/common/o2cb.init
处。
另外,o2cb_ctl
程序也必须位于您的路径中。
它位于源代码树的o2cb_ctl/o2cb_ctl
。
要检查集群的状态,请执行以下操作:
# /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
使集群ocfs2
联机上线:
# /etc/init.d/o2cb online ocfs2
Starting cluster ocfs2: OK
现在,O2CB 集群应该已启动,为 OCFS2 操作(如格式化(下一节中将进行描述))做好准备。
其他 O2CB 操作如下所述。
使集群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: OK
Unloading module "ocfs2_dlmfs": OK
Unmounting configfs filesystem: OK
Unloading module "configfs": OK
将 O2CB 配置为 OS 引导时启动:
# /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
<ENTER> 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
#
如果将集群配置为在引导时加载,则可以启动和停止集群ocfs2
,如下所示:
# /etc/init.d/o2cb start
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
Starting cluster ocfs2: OK
# /etc/init.d/o2cb stop
Cleaning heartbeat on ocfs2: OK
Stopping cluster ocfs2: OK
Unmounting ocfs2_dlmfs filesystem: OK
Unloading module "ocfs2_dlmfs": OK
Unmounting configfs filesystem: OK
Unloading module "configfs": OK
5. 格式化
如果 O2CB 集群处于脱机离线状态,请启动它。格式化操作需要集群处于联机在线状态,因为它需要确保该卷未挂载在集群中的某个节点上。
可以使用控制台或使用命令行工具mkfs.ocfs2
来格式化卷。这需要在集群中的一个节点上完成,其他节点的相同卷不需要重复执行。
当集群运行时,在共享磁盘设备上创建 OCFS2 文件系统:
# mkfs.ocfs2 --cluster-stack=o2cb --cluster-name=ocfs2 /dev/sdc1
要使用控制台进行格式化,请启动ocfs2console
,然后单击菜单项Task
,然后单击Format
。
在可用设备下拉列表中,选择要格式化的设备。控制台将尽可能列出现有的文件系统类型。
输入卷标。建议您在设备上设一个标签,以方便管理。卷标在格式化之后还可以更改。
选择一个簇尺寸(Cluster Size)。支持的尺寸范围从4K到1M。对于数据文件卷,对于大文件,簇尺寸为128K或更大是合适的。
选择块尺寸(Block Size)。支持的尺寸范围从512字节到4K。由于OCFS2在格式化时,不会分配静态inode区域,因此对于大多数磁盘大小,建议使用4K的块尺寸。另一方面,即使支持512字节的块尺寸,也不建议使用这么小的块尺寸。
格式化之后,簇尺寸和块尺寸均不可更改。
输入节点插槽的数量。此数字确定可以同时挂载该卷的节点数。此数字可以在以后增加,但不能减少。
单击确定以格式化该卷。
要使用命令行工具mkfs.ocfs2
格式化具有4K块尺寸,32K簇尺寸和4个节点插槽容量的卷,请执行以下操作:
# 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
有关mkfs.ocfs2
的完整帮助,请参见其手册页。
6. 挂载
如果O2CB集群服务处于脱机离线状态,请启动它。挂载操作要求集群处于联机在线状态。
可以使用控制台或命令行工具挂载卷。此操作应在需要挂载卷的每个节点上执行。
要从控制台挂载,请启动ocfs2console
,选择设备并单击Mount
。在对话框中,输入挂载点目录,和可选的挂载选项。单击OK
。成功挂载后,设备列表将显示挂载点以及设备。
从命令行挂载:
# mount -t ocfs2 /dev/sdf2 /u01
要卸载卷,可以在控制台中选择所需的卷,然后单击Umount
,或执行以下操作:
# umount /u01
Oracle 数据库用户必须使用datavolume
,nointr
挂载选项,来挂载包含表决磁盘文件(CRS)、集群注册表(OCR)、数据文件、重做日志、存档日志和控制文件的卷。
datavolume
挂载选项,可确保 Oracle 进程使用o_direct
标志打开文件。
nointr
挂载选项,可确保该设备上的读取和写入不会被信号打断。包括 Oracle home 在内的所有其他卷,都应在没有这些挂载选项的情况下挂载。
要挂载包含 Oracle 数据文件、表决磁盘等的卷,请执行以下操作:
# mount -t ocfs2 -o datavolume,nointr /dev/sdf2 /u01
# mount
/dev/sdf2 on /u01 type ocfs2 (rw,datavolume,nointr)
要在 OS 引导启动时挂载 OCFS2 卷,需要使用chkconfig
启用o2cb
和ocfs2
服务,将o2cb
配置为在启动时加载,然后将挂载条目添加到/etc/fstab
中,如下所示:
# cat /etc/fstab
...
/dev/sdf2 /u01 ocfs2 _netdev,datavolume,nointr 0 0
/dev/sdg2 /orahome ocfs2 _netdev 0 0
...
_netdev
挂载选项对于 OCFS2 卷是必须的。此挂载选项指示在网络启动后要挂载该卷,在网络关闭前要卸载该卷。 (只有 Oracle 数据文件等才需要datavolume
和nointr
挂载选项。)
ocfs2
服务可用于装载和卸载 OCFS2 卷。应始终启用它,以确保在关机期间停止网络之前已卸载 OCFS2 卷。
# chkconfig --add ocfs2
ocfs2 0:off 1:off 2:on 3:on 4:off 5:on 6:off
# chkconfig --add o2cb
o2cb 0:off 1:off 2:on 3:on 4:off 5:on 6:off
#
#
# /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
请注意,使用systemd
的节点需要其他fstab
选项,文件系统才能在引导时自动挂载:
/dev/sdc1 /srv ocfs2 _netdev,x-systemd.requires=o2cb.service 0 0
remote_fs.target
需要使用选项_netdev
来挂载文件系统,而x-systemd.requires
选项则在文件系统之前启动集群服务(此选项自systemd v220
起可用)。
按卷标挂载:
# mount -L datafiles /u01
7. 调整
调整操作允许增加节点插槽数(增加可同时挂载卷的节点数量),更改卷标和增加日志文件的大小。
tunefs.ocfs2
是执行调整的命令行工具。也可以通过控制台访问此工具。
如果 O2CB 集群服务处于脱机离线状态,请启动它。调整操作需要集群服务联机在线。
要使用控制台增加卷的节点插槽数,请单击菜单项Task
,然后单击Edit Node Slot count
。 输入新数字,然后单击OK
。
使用命令行工具tunefs.ocfs
增加节点插槽数:
# 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
。输入新卷标,然后单击OK
。
使用命令行工具tunefs.ocfs
更改卷标:
# 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
有关tunefs.ocfs2
的完整帮助,请参阅其手册页。
8. 文件系统检测
文件系统检测操作检查文件系统的运行状况。建议定期运行此实用程序,以检测并修复卷中的任何不规则之处。
fsck.ocfs2
是执行检测的命令行工具。也可以通过控制台访问此工具。
启动ocfs2console
,然后单击菜单项Task
,然后单击Check
。这将执行只读检测操作,并且可以在集群上挂载的文件系统上执行。命令行等效项:
# fsck.ocfs2 -n /dev/sdf2
Checking OCFS2 filesystem in /dev/sdf2:
label: oracle_home
uuid: dc a2 90 1b 24 1f 40 6e 80 e9 85 dd 6b 45 2d 1a
number of blocks: 5242872
bytes per block: 4096
number of clusters: 655359
bytes per cluster: 32768
max slots: 4
/dev/sdf2 is clean. It will be checked after 20 additional mounts.
要进行修复,请单击菜单项Task
,然后单击Repair
。此操作要求 O2CB 集群服务联机在线,以确保该卷未安装在集群中的任何节点上。命令行等效项:
# fsck.ocfs2 -y /dev/sdf2
Checking OCFS2 filesystem in /dev/sdf2:
label: oracle_home
uuid: dc a2 90 1b 24 1f 40 6e 80 e9 85 dd 6b 45 2d 1a
number of blocks: 5242872
bytes per block: 4096
number of clusters: 655359
bytes per cluster: 32768
max slots: 4
/dev/sdf2 is clean. It will be checked after 20 additional mounts.
有关fsck.ocfs2
的完整帮助,请参阅其手册页。
9. 上下文相关的符号链接(CDSL)
在共享磁盘集群环境中,有时需要在集群中仅共享文件名或目录名,而不共享内容。例如,在共享的Oracle主目录设置中,network/admin/listener.ora
对于所有节点都是公用的,但其内容因节点而异。同样,在共享的根目录设置中,集群中的每个节点都需要不同的/etc/
。
在这两种情况下,文件或目录的实际内容取决于主机名。在其他情况下,可能需要内容依赖于体系结构(x86,x86-64或IA64)或节点序数。
为处理此问题,OCFS2实现了上下文相关的符号链接(CDSL)。简言之,它使用软链接将文件或目录名称与其内容进行匹配。(请注意,使用datavolume
挂载选项装载的卷未启用此特性。)
ocfs2cdsl
是用于创建这些链接的命令行工具。
要创建与主机名相关的CDSL
文件,请执行以下操作:
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。(由于主机名是默认主机名,因此不需要在命令中指定-t hostname
。)
root@node31:admin/# ocfs2cdsl listener.ora
转换现有文件为CDSL文件:
root@node32:admin/# ocfs2cdsl –c sqlnet.ora
再一次,要从群集中的其他某个节点进行访问,请在访问文件之前在该节点上创建CDSL。
root@node31:admin/# ocfs2cdsl sqlnet.ora
在这种情况下,您会注意到该文件的内容与将其转换为 CDSL 时的内容相同。两个节点上对该文件的任何新更改将对另一个节点不可见。
要编辑属于另一个主机或体系结构的 CDSL 文件或目录,请从 OCFS2 卷的根目录(挂载目录)中,将目录更改为.cluster
,然后遍历到包含所需副本的目录。
例如,要在 node31 上编辑 node32 的listener.ora
副本,请执行以下操作:
root@node31:/# ls -l /ohome/.cluster/hostname/node32/10g/network/admin/l*
-rw-r--r-- 1 root root 3867 Aug 8 11:54 listener.ora
要删除CDSL文件,只需取消链接即可,例如,
root@node31:admin/# rm listener.ora
有关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
注意:仅当 O2CB 集群服务在线时,才列出节点名称。如果不是,它将列出全局节点序数。
有关mount.ocfs2
的完整帮助,请参见其手册页。
附录 A
配置文件为节格式,具有两种节类型,即集群和节点。由于 OCFS2 不支持多个集群,因此典型的cluster.conf
将具有一个集群节和多个节点节。(请注意,cluster.conf
解析器当前期望节
行从第一列开始(无空格),并以冒号结束,并期望参数行以制表符开头,后跟参数名称和值,参数名和值用等于号分隔。)
示例/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
cluster = racdb
集群小节有两个参数:
· node_count – 集群中的节点总数
· name – 集群名称
节点小节有五个参数:
· ip_port – IP 端口
· ip_address – IP 地址
· number – 从0到254的唯一节点序数
· name – 主机名(Hostname)
· cluster – 与集群小节中相匹配的集群名称
附录 B – Debian/Ubuntu 特定的信息
集群设置
在完成集群配置文件编辑后,可以用使用ocfs2-tools
来启用集群服务:
# dpkg-reconfigure ocfs2-tools
然后,重启 o2cb 服务,这将加载需要的内核模块,并启动集群服务:
# service o2cb restart