基于ocfs2内核代码的个人理解(一)

来源:互联网 发布:软件欢迎界面 素材 编辑:程序博客网 时间:2024/04/27 17:48

    OCFS1问世于2002年10月,它是Oracle公司为了让RAC(Real Application Cluster)用户避免必须要与裸设备打交道而开发出来的。这个文件系统用来存放数据库相关的文件,比如数据文件,控制文件,在线日志文件,归档日志文件等。

    OCFS2是下一代的ORACLE集群文件系统,它已经被设计成为一种为通用的文件系统,它不仅可以存放数据库相关的文件,还可以存放oracle二进制文件(指Oracle_home下的软件文件)和配置文件,从而使RAC的管理更加轻松。目前oracle公司同样将其用于虚拟化场景,其用于保存虚拟机镜像文件和相应的配置文件。

    OCFS2文件系统在内核中处于VFS(虚拟文件系统)下层,如果对OCFS2文件系统中的文件进行读写操作,与其他具体的文件系统一样,用户都是通过普通的read和write接口调入到VFS层通用接口,然后再根据具体的文件系统指针找到对应的文件系统处理函数进行处理,因此linux内核能够方便的处理多个具体的文件系统。

    在OCFS2内核代码结构主要包括以下几个方面:集群服务结构cluster(TCP、o2hb、o2nm、quorum)、分布式锁管理器DLM、用户空间和内核空间DLM的接口(DLMFS)、具体文件系统层。

     

    1、集群服务结构cluster:主要用于集群管理,由于ocfs2文件系统是集群文件系统,因此会出现多个节点同时挂载同一个文件系统的情况,固然在该情况下需要有一个节点间的管理工具。目前在cluster中主要有四个结构:

     o2nm:节点管理器,它对cluster.conf文件中所有节点进行的监控。当模块加载后,其会通过o2cb工具将配置文件里的信息通过configfs文件系统接口给加载到内核中,保持内核和用户态的一致性,如果此时用户态改变cluster.conf配置文件,模块需要重新卸载再加载,其内核中的内容才能生效。

     o2hb:存储心跳,其用于检测自身及其余节点与存储设备之间的连接是否正常。当节点挂载文件系统时,mount.ocfs2工具会通过configfs文件系统接口进行用户态与内核态之间的信息传递,进而启动一个存储心跳进程。该进程每2s读一次其余节点的存储心跳,同时写一次自身节点的存储心跳。如果一定时间内不能读写存储,则会被文件系统隔离。

      TCP:网络心跳,其用于检测自身与其他节点之间的管理网络连接是否正常。当节点加载集群服务时,自身节点会启动TCP监听线程,监听是否此时有节点与其建立socket连接。当节点挂载文件系统时,会先检测到其余已挂载文件系统上节点的存储心跳,然后分别与其建立socket连接,进而每2s会发送网络心跳包。如果一定时间内无法发送网络心跳包,则同样会通过文件系统隔离机制将其隔离。

      quorum:文件系统隔离机制。根据一定的算法将文件系统内部的故障节点进行隔离,能有效保障文件系统内部的正常节点操作正常。

     2、分布式锁管理器DLM:ocfs2文件系统是一个分布式的集群文件系统,其与集中式最大的区别是,每一个文件的拥有者可以是不同节点,而不是固定为一个节点。每一个文件对应一个锁资源,如果节点先打开并读取这个文件,则会成为该锁资源的master。此时如果其余节点想要去读写该文件时则需要向该节点申请,我们称之为请求加锁,直到加锁成功才能对该锁资源进行操作。DLM内部非常复杂,后续会根据代码详细介绍其中的加锁、解锁、锁迁移、锁恢复等流程。

     3、用户空间和内核空间DLM的接口(DLMFS):该接口其实是用于用户空间与内核空间数据传输交流,类似于procfs、sysfs、debugfs及configfs,这些文件系统接口都将用户空间的数据传入到内核空间中,同时将内核空间的数据导出到用户空间。DLMFS主要用于在执行ocfs2-tools(与ocfs2相配的用户态工具)命令操作时,如果文件系统正挂载着,需要将相应的锁资源的锁加上,以确保修改文件的唯一性,以防止其余节点在操作该文件时造成文件被写坏。

     4、具体文件系统接口:该文件系统接口与ext3、ext4类似,就是其普通默认的文件系统接口,如seek、open、read、write、ioctl、mount、umount等等,其形成了一个具体文件系统必须的要素。后续会依照代码深入阐述。

      另外,OCFS2文件系统还使用到jbd2文件系统来保证数据的一致性。总的来说,OCFS2文件系统主要包括以上部分,接下来会对上述各个部分进行详述介绍!

0 0
原创粉丝点击