/etc/lvm/lvm.conf 也需要被修改。在全局参数 locking_type 的值默认为 1,必须改为 3:
找一台集群中的服务器,在指定的共享卷上面创建一个卷组,一个逻辑卷和一个文件系统: 1 2 3 4 5 6 7 8 9 | $ sudo pvcreate /dev/sdb
$ sudo vgcreate -cy shared_vg /dev/sdb
$ sudo lvcreate -L 50G -n ha_lv shared_vg
$ sudo mkfs.ext4 /dev/shared_vg/ha_lv
$ sudo lvchange -an shared_vg /ha_lv
|
上例中消耗卷组中的50GB的来创建逻辑卷,然后用其创建4个拓展的文件文件系统。vgcreate (创建卷组命令)的 -cy 选项 用于启动,并在集群中锁定卷组。lvchange (逻辑卷修改命令)的 -an 选项用来停用逻辑组。但是你必须依赖CLVM和资源管理器的进程,按上面创建的/etc/cluster/cluster.conf的配置中的故障转移的策略来激活他们。一旦逻辑卷被激活,你就可以从/dev/shared_vg/ha_lv访问共享的卷了。
在 cluster.conf 文件中添加故障转移的详细配置信息: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | < rm >
< failoverdomains >
< failoverdomain name = "FD" ordered = "1" restricted = "0" >
< failoverdomainnode name = "serv-0001" priority = "1" />
< failoverdomainnode name = "serv-0002" priority = "2" />
</ failoverdomain >
</ failoverdomains >
< resources >
< lvm name = "lvm" vg_name = "shared_vg" lv_name = "ha-lv" />
< fs name = "FS" device = "/dev/shared_vg/ha-lv"
↪ force_fsck = "0" force_unmount = "1" fsid = "64050"
↪ fstype = "ext4" mountpoint = "/mnt" options = ""
↪ self_fence = "0" />
</ resources >
< service autostart = "1" domain = "FD" name = "serv"
↪ recovery = "relocate" >
< lvm ref = "lvm" />
< fs ref = "FS" />
</ service >
</ rm >
|
"rm"中的内容会作用到资源管理器上(rgmanager)。这部分的配置通知集群管理器,serv-0001优先独占访问共享卷。数据会挂载在/mnt 这个绝对目录下面。 如果serv-0001因为某些原因当机了,资源管理器就会做故障转移处理,使serv-0002独占访问共享卷,数据会挂载在serv-0002的/mnt的这个目录下。所有发送到serv-0001的处于等待的I/O请求会由serv-0002响应。
在所有服务器中,重启cman服务是配置修改生效: 1 | $ sudo /etc/rc .d /init .d /cman restart
|
同样,还需要再所有服务器中重启 rgmanager 和 clvmd 服务: 1 2 3 4 5 | $ sudo /etc/rc .d /init .d /rgmanager start
Starting Cluster Service Manager: [ OK ]
$ sudo /etc/rc .d /init .d /clvmd start
Starting clvmd: [ OK ]
|
如果都没问题,那么你就配置好了一个主/从的集群配置。你可以通过查看服务器对共享卷的访问权限来校验配置是否生效。实验应该可以发现,serv-0001 可以挂在共享卷,但是 serv-0002 不可以。接着就是检验真理的时刻了——那就是测试故障转移。手动对 serv-0001 断电,你可以发现rgmanager 影子,并且 serv-0002 可以访问/挂在共享卷了。
注意: 为了使所有的相关服务在开机的时候自动启动,用chkconfig命令在合适的运行等级(runlevels)中启动这些服务.
总结 对应一个理想的配置,fencing相关的配置必须出现在/etc/cluster/cluster.conf文件中。fencing的目的是在有问题的节点对集群造成显而易见的问题之前就对其进行处理。比如,某台服务器发生Kernel panic,或者无法与集群中的其他服务器通信,再或者遇到其他各种灾难性的崩溃等情况下,可以配置IPMI来重启问题服务器: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | < clusternode name = "serv-0001" nodeid = "1" >
< fence >
< method name = "1" >
< device name = "ipmirecover1" />
</ method >
</ fence >
</ clusternode >
< clusternode name = "serv-0002" nodeid = "2" >
< fence >
< method name = "1" >
< device name = "ipmirecover2" />
</ method >
</ fence >
</ clusternode >
[ ... ]
< fencedevices >
< fencedevice agent = "fence_ipmilan" ipaddr = "192.168.1.50"
↪ login = "ADMIN" passwd = "ADMIN" name = "ipmirecover1" />
< fencedevice agent = "fence_ipmilan" ipaddr = "192.168.10"
↪ login = "ADMIN" passwd = "ADMIN" name = "ipmirecover2" />
</ fencedevices >
|
HA-LVM的设计初衷是为数据中心提供廉价的容错处理机制。没有人希望服务器当机,话说回来,只有配置得当,当机也不是肯定的。从数据中心到家庭办公,几乎任何场景都可以实施这套方案。
资源链接clvmd(8): Linux man page Appendix F. High Availability LVM (HA-LVM): https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Cluster_Administration/ap-ha-halvm-CA.html |