首页 理论教育 私有云架构设计与实践:定义NFS、iSCSI存储池

私有云架构设计与实践:定义NFS、iSCSI存储池

时间:2023-10-28 理论教育 版权反馈
【摘要】:以上操作完成后,我们开始定义对应的NFS、iSCSI存储池。

私有云架构设计与实践:定义NFS、iSCSI存储池

存储池是平台对存储资源的抽象,按照外部存储提供的内容可分为块设备存储(SAN)、目录存储(NAS)、对象存储(object storage)三种。块设备存储将存储域划分为多个块分区(比如LUN)直接提供给虚拟机或者平台,目录存储则提供用于存储虚拟镜像文件的外部目录,对象存储则直接提供单独的虚拟硬盘镜像。

Libvirt本身虽然提供了存储池功能,但是由于其糟糕的容错机制,所以多数云平台使用自己的实现,OpenStack Nova、oVirt等平台皆是如此。但作为最容易上手的虚拟化管理器,libvirt的设计思想与锁机制仍然值得我们借鉴学习,接下来笔者将就libvirt典型存储池类型和同步机制予以说明,希望对读者设计共享存储池有所帮助。

1.典型池类型

目前libvirt支持的存储池类型较多,笔者仅就NFS和iSCSI予以介绍,它们分别是NAS和SAN的典型代表。

为了方便进行快速实验,笔者在此列分别举出Fedora 23中NFS与iSCSI的创建方法,其他发行版命令类似。

□NFS服务(node1:/nfs_data)

配置NFS服务一般依赖rpcbind服务,且需要根据实际环境中的libvirt/QEMU权限而设置对应的目录导出参数。

□iSCSI服务(target:username:password@node1/iqn.libvirt.test:pool-1,initiator:node1/iqn.libvirt.test:myinitiator)

在Linux中创建iSCSI服务的方式比较多,比如tgtd、targetcli等,笔者以tgtd为例,分别创建target与initiator。

以上操作完成后,我们开始定义对应的NFS、iSCSI存储池。

(www.xing528.com)

2.同步机制

当多个主机间使用共享存储时,那么数据访问时的同步机制就非常必要了,因为一旦有主机错误地访问其他主机上正在运行的虚拟机硬盘,就会产生数据不一致甚至损坏等严重问题。

很多集群软件中会使用消息机制与共享存储文件锁混合的同步机制,比如ZooKeeper、Google Chubby、Redis Redlock等,它们很大程度上都参考了在90年代就被提出直到10年后才开始应用的Paxos算法。在OpenStack和oVirt平台中的存储同步机制实现,分别是以virtlock和sanlock为基础的模块,在PaaS平台则分别以ZooKeeper和Etcd为代表(Etcd使用的Raft算法可看作Paxos的工程实现,即Multi Paxos的一种简化)。

首先我们知道,基于共享文件锁的实现一般是向这个文件中写入当前锁状态,比如哪个主机进程在请求哪些资源的什么操作(读或写),其他主机向访问资源时需要首先访问这个共享文件中的内容,看看要访问的资源是以哪种操作被占用,然后再决定下一步动作。然后如果对文件加锁的进程或主机离线,那么它加的锁便一直处于加锁状态,此时需要给这个锁添加一个“租借时间(lease)”,期间主机或进程可对其“续租”,当时间到了以后锁会自动释放。Sanlock的实现基本也是这个流程,一般它会与高可用措施比如看门狗、corosync、heartbeat等共同使用,以实现较为完整的存储集群同步机制。但是由于它使用了Paxos算法,整个过程变得并不是那么容易理解,有兴趣的读者可以参考Paxos的工程实现,包括Basic Paxos、Multi Paxos等。

Sanlock的实现中会维护两个文件,内容分别是共享存储的使用信息和主机动态获取的全局ID,前者叫做Paxos Lease,后者叫做Delta Lease。Paxos Lease一般是一个1MB的文件或者8MB的文件(与扇区大小有关),它是特定资源使用情况的抽象,每个sanlock客户端(主机)都在其中有独占的区块,区块内容一般是主机ID、提案编号、时间戳等,主机可以写自己的区块,但只能读取别人的区块;Delta Lease中的每个区块则有当前ID的所有者主机以及时间戳,它保证集群中的主机都拥有不同的编号。

图7-3中主机A、B、C分别获得的ID为1、2、3,且ID为1的主机尝试获取锁成功,然后在ID 1的专有区块中写入信息,ID为3的主机稍后尝试获取锁失败,它将提案编号递增并写入ID 3的专有区块中。图中箭头方向表示数据方向,虚线为读,单向实线为写,双向实线为读写。

图7-3 Sanlock示意图

Sanlock提供了命令行工具以及Python库,笔者以其工具演示单机双进程的使用过程,然后介绍如何在libvirt中开启sanlock。

如果在libvirt中使用sanlock,我们需要修改配置文件以在指定的共享目录中启用sanlock,如果在本地目录则只能是本机的多个QEMU进程不能同时访问同一个硬盘镜像文件,如下所示。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈