分布式环境中使用基于共享存储的LVM块设备时的元数据同步方案对比
声明:本文转载自https://my.oschina.net/LastRitter/blog/1542081,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。
红帽HA集群概述
特性
-
使用基于使用令牌环的totem协议(待确认,感觉像是paxos协议),多数投票通过才可以生效。
-
支持多个节点,理论上是没有节点限制的。
-
对于两个节点,只不过是当其中一个节点失效时,整个集群由于无法获得多数票而挂起,也可以使用主备模式。
-
支持仲裁设备(Quorum Devices),但目前处于技术预览阶段,且需要仲裁设备运行Linux系统。
组成
必备组件
-
资源(Resources)以及资源代理(Resources Agent),支持LSB、OCF、systemd和Upstart等类型的资源代理。
-
消息传递(CoroSync),基础的分布式消息传递框架。
-
集群配置及管理(PaceMaker),基于CoroSync进行同步,使用XML格式的配置文件。
基础组件
可选组件
这些组件都依赖分布式锁DLM,间接依赖隔离设备。
LVM特性
-
LVM操作分两个部分:元数据读写和使用DeviceMapper创建删除MappedDevice(激活、去激活)。
-
所有操作都需要锁操作,共支持6中锁,常用的是本地锁(flock)。
-
集群环境使用clvmd(flock的替代),或lvmlockd(flock的补充)。
-
锁操作的对象主要是:全局、卷组(孤立的物理卷)、逻辑卷激活去激活。
-
锁操作类型主要是:锁定、解锁、更新。
-
锁操作的主要模式是:共享读、独占写、完全独占。
-
lvmetad元数据服务在启动时或者有设备变更(注册udev通知)时更改自己内部缓存的状态,执行LVM命令时首先从lvmetad获取状态,然后根据状态决定是否扫描磁盘,如果扫描,则将新的元数据传给lvmetad,lvmetad自身并不进行扫描。
-
当不使用lvmetad时,每次执行LVM命令都需要从磁盘读取元数据,性能较差。
LVM最佳实践
-
一个磁盘创建一个分区、创建一个PV,每个VG只包含一个PV,减少元数据读写数量。
-
将LVM的正常使用分为:创建删除、激活去激活、查询修改三类,进行合理封装。
-
禁止开机VG或LV自动激活(可通过修改lvm.conf来实现),虚拟机使用时激活,不使用时取消激活。
-
如果通过LVM命令查询命令(lvs等)执行较多,则建议使用元数据服务lvmetad(不能与CLVM共存),有效减少扫面磁盘元数据次数。
-
当存在多个VG或PV时,使用pvscan命令时,可通过指定PV路径来减扫描数量。
-
所有对LVM的增删查改等操作均通过LVM命令进行,尽量不要通过其他接口进行(比如/dev或/sys目录),避免可能出现不一致的情况。
-
如果在共享存储上,多节点使用LVM,且开启lvmetad元数据服务,则要么在底层使用lvmlockd或clvm,要么使用者要自己处理好不一致问题。
可选同步方案
应用层自己进行多节点LVM同步
只在单一节点进行元数据更改并部署LVM状态服务,其他节点在进行LVM相关操作先从LVM状态服务获取LVM当前状态,然后根据情况更新本地元数据缓存。或者关闭lvmetad元数据服务,只在单一节点尽心LVM变更操作等实用技巧来规避不一致的问题。
lvmetad + lvmlockd + sanlock(wdmd)
lvmetad + lvmlockd + dlm + corosync(pacemaker) + fence(scsi prs)
lvmetad + external_lock
自己写一个动态链接库,实现LVM中所需的锁功能。
clvmd + dlm + corosync(pacemaker) + fence(scsi prs)
抱拳了,老铁!
本文发表于2017年09月23日 08:37
(c)注:本文转载自https://my.oschina.net/LastRitter/blog/1542081,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.
阅读 3569 讨论 0 喜欢 0