Chinaunix首页 | 论坛 | 博客
  • 博客访问: 27111
  • 博文数量: 8
  • 博客积分: 1445
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-19 01:47
文章分类
文章存档

2011年(2)

2008年(6)

我的朋友
最近访客

分类: LINUX

2008-08-01 03:30:27

背景:为前公司写的一份报告,关于Lustre的,但最后否决了它。

分布式文件系统之Lustre功能测试报告

前言

Lustre的研究已经有一段时间了,由刚开始对Lustre的期待,到现在对其在我们目前服务器环境上运用可行性的怀疑,新的技术,必须经受足够的考验,才能成为凤凰涅槃,不断强壮。

在此不免要对我们当前环境再做一次简单的描述。提供动态页面服务的resin服务器和提供前端加速的squid服务器,对磁盘空间的要求很小,因此,每台服务器的硬盘上除了装一个操作系统,就是resin动态应用和squid的磁盘缓存,总的磁盘空间占用不会超过5G。基于这样的环境,我们不免会打这些剩余磁盘空间的主意。我们希望找到一款开源的分布式文件系统软件,来整合我们这些磁盘的剩余空间。

随着对分布式文件系统的深入了解,我们越来越发现,我们最初的想法是不正确的,因为在任何一个大的系统中,存储都是独立的。把应用服务器和存储分开,才能最大限度的发挥二者的性能,并且方便进行管理。因此,基于这样的想法,我构思了几种方案。但本篇报告的重点在Lustre,我构思的那几种方案将另辟一文进行描述。

Lustre简单介绍

Lustre文件系统是基于对象存储的文件系统,它有三个部分组成:

1.  元数据服务器(Meta Data ServerMDS

2.  对象存储服务器(Object Storage ServerOSS

3.  Lustre客户端

更详细的介绍,请参考之前的分布式文件系统报告。

实验环境

因为本次进行的是Lustre的功能测试,故实验环境不进行详细的介绍。

硬件环境包括若干台服务器,软件环境如下:

操作系统

RHEL 4 AS Update 4

内核

2.6.9-42.0.10.EL_lustre.1.4.10(官方提供,打过Lustre补丁)

Lustre版本

lustre-1.4.10

Heartbeat版本

heartbeat-2.0.8

其他软件

PerlPythonPyXML

功能测试内容

1.  单节点的Lustre

2.  多节点的Lustre

3.  LustreFailover

4.  Lustrequota

单节点的Lustre

单节点的Lustre使用如下配置脚本:

#!/bin/sh

# local.sh

 

# Create nodes

rm -f local.xml

lmc -m local.xml --add net --node node-mds --nid test229 --nettype tcp

lmc -m local.xml --add net --node node-ost --nid test229 --nettype tcp

lmc -m local.xml --add net --node client --nid '*' --nettype tcp

 

# Cofigure MDS

lmc -m local.xml --add mds --node node-mds --mds mds-test --fstype ext3 --dev /dev/hdc7

 

# Configures OSTs

lmc -m local.xml --add lov --lov lov-test --mds mds-test --stripe_sz 1048576 --stripe_cnt 1 --stripe_pattern 0

lmc -m local.xml --add ost --node node-ost --lov lov-test --ost ost-test --fstype ext3 --dev /dev/hdc8

 

# Configure client (this is a 'generic' client used for all client mounts)

lmc -m local.xml --add mtpt --node client --path /mnt/lustre --mds mds-test --lov lov-test

 

运行local.sh脚本,生成XML配置文件。

# ./local.sh

按照OSTMDSclient的顺序启动:

# lconf --reformat --node node-ost local.xml

# lconf --reformat --node node-mds local.xml

# lconf --node client local.xml

至此,单机上的Lustre已经启动完毕,我们可以通过df命令查看现在的磁盘情况:

# df

Filesystem           1K-blocks      Used   Available Use%  Mounted on

/dev/hdc1             2016016    229380   1684224  12%  /

none                  128080         0    128080   0%  /dev/shm

/dev/hdc2             3020172    321968   2544784  12%  /home

/dev/hdc5             3020140   2144644    722080  75%  /usr

/dev/hdc3             3020172     98888   2767864   4%  /var

local                53346112    463452  50129060   1%  /mnt/luster

我们看到的挂载在/mnt/lustre目录下的local就是我们配置的Lustre文件系统,单节点的Lustre功能已经实现。

多节点的Lustre

本次实验将实现这样的系统,一个MDS节点,多个OST节点和Client节点。具体分配如下:

MDS

test227sda74G

OST1

test225hda855G

OST2

test229hdc855G

Client

任意机器

Client:使用的配置文件如下,配置脚本改为config.shXML文件改为config.xml

#!/bin/bash

# config.sh

 

# Create nodes

rm -f config.xml

lmc -m config.xml --add net --node node-mds --nid test227 --nettype tcp

lmc -m config.xml --add net --node node-ost1 --nid test225 --nettype tcp

lmc -m config.xml --add net --node node-ost2 --nid test229 --nettype tcp

lmc -m config.xml --add net --node client --nid '*' --nettype tcp

 

# Cofigure MDS

lmc -m config.xml --add mds --node node-mds --mds mds-test --fstype ext3 --dev /dev/sda7

 

# Configures OSTs

lmc -m config.xml --add lov --lov lov-test --mds mds-test --stripe_sz 1048576 --stripe_cnt 1 --stripe_pattern 0

lmc -m config.xml --add ost --node node-ost1 --lov lov-test --ost ost1-test --fstype ext3 --dev /dev/hda8

lmc -m config.xml --add ost --node node-ost2 --lov lov-test --ost ost2-test --fstype ext3 --dev /dev/hdc8

 

# Configure client (this is a 'generic' client used for all client mounts)

lmc -m config.xml --add mtpt --node client --path /mnt/lustre --mds mds-test --lov lov-test

生成confg.xml配置文件,然后将该配置文件复制到每一台服务器。下面按照OSTMDSClient的顺序初始化并启动Lustre节点。

初始化OST

[root@test225 ~]# lconf --reformat --node node-ost1 config.xml

[root@test229 ~]# lconf --reformat --node node-ost2 config.xml

初始化MDS

[root@test227 ~]# lconf --reformat --node node-mds config.xml

初始化Client

[root@test227 ~]# lconf --node client config.xml

此时可以通过df命令查看现在的磁盘情况:

[root@test227 ~]# df

Filesystem                1K-      已用       可用 已用% 挂载点

/dev/sda1               2016016    313720    1599884  17%  /

none                    517956         0     517956   0%  /dev/shm

/dev/sda5              2016016    320396    1593208  17%  /home

/dev/sda3              4032124   2274132    1553164  60%  /usr

/dev/sda2              4032124    105048    3722248   3%  /var

config               108394620    926904  101872560   1%  /mnt/luster

我们看到的挂载在/mnt/lustre目录下的config就是我们配置的Lustre文件系统,其总的大小刚好等于两个OST贡献的存储容量。

LustreFailover

可用性的实现是将硬件或软件进行复制,当其中的一台出现故障,另一台可以顶替出故障的机器的工作。我们所说的“Failover”是指这样的一种方法:当主服务器失效时,能够自动的将它的应用和资源切换到从服务器。Failover对应用来说是透明的。

LustreFailover需要两个节点(一个Failover对),它们连接到一个共享存储介质。Lustre支持元数据和对象存储的Failover

Lustre提供一个文件系统资源。Lustre支持在服务器级别的FailoverLustre没有提供系统组件级别的工具集,而这些确实完全实现Failover(失效节点检测、电源控制等)所需要的,这些工具集可以从第三方得到。例如Heart beat

硬件的需求是:一个连接到共享存储体(物理存储,例如SANNAS、硬件RAIDSCSIFC等)的服务器对。共享的存储体在两个节点来看,应该是一样的,即有相同的物理LUN。而物理存储级别的高可用,推荐使用RAID来避免驱动器级别的失效。

为得到一个全自动的高可用Lustre,需要电源管理和HA软件,用来提供:

1.  资源防护:物理存储避免同时被两个节点访问。

2.  资源控制:使启动和停止Lustre进程成为Failover的一部分,维护集群状态等。

3.  健康监控:校验硬件和网络的可用,并反映给Lustre

为实现正确的资源防护,Heartbeat软件必须能够完全停掉服务器或者断开其与共享存储设备的连接。绝对不要让两个活动的节点访问相同的分区,否则将导致数据的毁坏。当Heartbeat软件检测到一个服务器失效了,它将调用一个进程来停掉失效节点;然后在第二台主机上启动LustreHA软件通过一个脚本来控制Lustre资源。为达这个目的,CFS提供了这样的一个脚本/etc/init.d/lustre

为达Failover的目的,提供Lustre资源的服务器将被配置成主/从对。Failover可以通过lconf来手动实现。当执行lconf --cleanup --failover命令时,磁盘设备将被设置为只读。这将允许第二个节点使用相同的磁盘。这是软件Failover,此时主从节点都是健康的且是联网的。而硬件Failover则是指关掉一台服务器的电源。

Lustre Failover的实现需要电源管理,远程电源控制,HA软件。

配置Failover对有两种方式:active/activeactive/passiveActive的节点正常提供服务,passive节点平时是空闲的,当失效时自动转换为active来提供服务。在使用共享存储的两个节点上,可以实现的Failover配置是:

Active/passive

Active/active

他们的区别是:active/passive中两个节点使用共享存储的一个分区,每一个时刻只有一个节点提供服务,同一个节点访问磁盘。Active/active中的共享存储体必须分成两个分区,两个节点在一个分区看来,都是active/passive的,即一个节点访问一个分区,另一个节点作为该分区的passive节点。

Failover在配置上的体现:

Active/passive

lmc --add ost --ost ost1 --failover --node nodeA --lov lov1 --dev /dev/sda1

lmc --add ost --ost ost1 --failover --node nodeB --lov lov1 --dev /dev/sda1

Active/active

lmc --add ost --ost ost1 --failover --node nodeA --group nodeA --lov lov1 --dev /dev/sda1

lmc --add ost --ost ost1 --failover --node nodeB --lov lov1 --dev /dev/sda1

lmc --add ost --ost ost2 --failover --node nodeA --lov lov1 --dev /dev/sdb1

lmc --add ost --ost ost2 --failover --node nodeB --group nodeB --lov lov1 --dev /dev/sdb1

由于MDSOSSFailover原理一样,在这里我只进行了MDSFailover

Failover环境的搭建

为了模拟类似共享存储体的架构,我使用了NFS的方式。如下图:

NFS服务器export出目录/mds_fo,分别挂载到前面两台客户端的/mds_fo目录,这样,在NFS客户端看来,就是有了相同的目录,且访问到的数据也是一样的。中间的两台NFS客户端同时也作为LustreMDS,即元数据服务器,这两台MDS要实现的功能是Failover,使用的方式是MDS Failover中唯一的方式:active/passive,任意时间只有一台MDS提供服务,MDS之间的切换用Heartbeat来实现。最前面的是LustreOST,同时也作为Lustre的客户端。Lustre中任意一台服务器都可以做Lustre的客户端。

NFS的配置这里不做赘述。

Lustre的配置文件如下:

#!/bin/sh

#config.sh

 

# 创建节点

rm -f config.xml

lmc -m config.xml --add net --node test225 --nid test225 --nettype tcp

lmc -m config.xml --add net --node test226 --nid test226 --nettype tcp

lmc -m config.xml --add net --node test227 --nid test227 --nettype tcp

lmc -m config.xml --add net --node client --nid '*' --nettype tcp

 

# 配置主MDS和备份MDS

lmc -m config.xml --add mds --dev /mds_fo/mds --size 50000 --failover --group n-mds --node test226 --mds n-mds --fstype ldiskfs

lmc -m config.xml --add mds --dev /mds_fo/mds --size 50000 --failover --group n-mds --node test227 --mds n-mds --fstype ldiskfs

 

# 配置OST

lmc -m config.xml --add lov --lov lov1 --mds n-mds --stripe_sz 1048576 --stripe_cnt 3 --stripe_pattern 0

lmc -m config.xml --add ost --node test225 --lov lov1 --ost n01-ost1 --fstype ldiskfs --dev /ost_fo/ost --size 50000

 

# 配置客户端

lmc -m config.xml --add mtpt --node client --path /mnt/lustre --mds n-mds --lov lov1

在定义节点的时候我定义了两个MDSmds1mds2,配置MDS的时候用--mds n-mds选项制定两个node为同一个MDS--failover指定了是Failover配置,--dev /mds_fo/mds使用NFS目录里的一个文件块来做MDS的数据存储。

整个Lustre的启动顺序如下:

启动ost

[root@test225 lustre]# lconf --reformat --node test225 config.xml

启动mds1

[root@test226 lustre]# lconf --reformat --node test226 config.xml

启动mds2

[root@test227 lustre]# lconf --reformat --node test227 config.xml

从命令运行后的输出我们可以看到,虽然使用了--reformat选项,但Lustre并没有真正的再去reformat共享的mds存储体,而仅仅是让mds2连上网络。

启动Client

[root@test225 lustre]# lconf --node client config.xml

此时可以用df看到磁盘空间:

[root@test225 lustre]# df

Filesystem           1K-blocks      Used   Available Use%  Mounted on

/dev/hda1              1035660    265124    717928  27%  /

none                    517988         0    517988   0%  /dev/shm

/dev/hda3              2063536    579692   1379020  30%  /home

/dev/hda5              3099260   1877624   1064204  64%  /usr

/dev/hda6              3099260     91332   2850496   4%  /var

test229:/etc/lustre/       2016032    216096   1697536  12%  /etc/lustre

config                    46856      4312     39980  10%  /mnt/luster

此时在osttest225)上查看网络连接:

[root@test225 lustre]# netstat -na

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address          Foreign Address             State

tcp       0      0 0.0.0.0:32770           0.0.0.0:*                   LISTEN

tcp       0      0 0.0.0.0:111             0.0.0.0:*                   LISTEN

tcp       0      0 0.0.0.0:22              0.0.0.0:*                   LISTEN

tcp       0      0 0.0.0.0:988             0.0.0.0:*                   LISTEN

tcp       0      0 192.168.11.225:800      192.168.11.229:2049       ESTABLISHED

tcp       0    108 192.168.11.225:22       192.168.10.13:4757        ESTABLISHED

tcp       0      0 192.168.11.225:988      192.168.11.226:1021       ESTABLISHED

tcp       0      0 192.168.11.225:988      192.168.11.226:1022       ESTABLISHED

tcp       0      0 192.168.11.225:988      192.168.11.226:1023       ESTABLISHED

udp       0      0 0.0.0.0:32768           0.0.0.0:*

udp       0      0 0.0.0.0:111             0.0.0.0:*

可以看到,ost现在是与mds1test226)进行通讯的。

手工mds切换

Mds1test226)上先将mds停止:

[root@test226 lustre]# lconf --verbose --cleanup --node test226 --failover --group n-mds config.xml

然后在从mds节点(test227)上运行:

[root@test227 lustre]# lconf --verbose --failover --node test227 --select n-mds=test227 --group n-mds config.xml

Failover的手动切换是需要一定时间的,由于我心太急马上在client上执行df,导致终端停了一会儿没反应。一会之后就可以再使用df来查看磁盘空间了。此时在osttest225)上看到的网络连接是:

[root@test225 lustre]# netstat -na

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address             State

tcp        0      0 0.0.0.0:32770           0.0.0.0:*                   LISTEN

tcp        0      0 0.0.0.0:111             0.0.0.0:*                   LISTEN

tcp        0      0 0.0.0.0:22              0.0.0.0:*                   LISTEN

tcp        0      0 0.0.0.0:988             0.0.0.0:*                   LISTEN

tcp        0      0 192.168.11.225:799      192.168.11.229:2049       ESTABLISHED

tcp        0      0 192.168.11.225:988      192.168.11.227:1021       ESTABLISHED

tcp        0      0 192.168.11.225:988     192.168.11.227:1023        ESTABLISHED

tcp        0      0 192.168.11.225:988     192.168.11.227:1022        ESTABLISHED

tcp        0    376 192.168.11.225:22      192.168.10.13:4790         ESTABLISHED

udp        0      0 0.0.0.0:32768         0.0.0.0:*

udp        0      0 0.0.0.0:111           0.0.0.0:*

已经与新的mds进行交互了。

至此,Failover的环境基本搭建起来,手动Failover也已经实现,下面将使用Heartbeat进行失效节点的转移。

使用Heartbeat来进行Failover的切换

Heartbeat的认识可以从几张示意图开始:

Heartbeat对中的备份服务器通过心跳线(串口线,以太网桥接线或普通以太网络)来监测主服务器的健康状态,如果监测到主服务器不健康了,那么备份服务器就将主服务器提供的服务接管过来,这样对外服务并没有因为单一节点的失效而停止,从而达到了高可用的目的。

         Heartbeat主要有三个配置文件:ha.cfauthkeysharesources

Ha.cf

logfile /var/log/ha-log

logfacility local0

keepalive 2

deadtime 20

warntime 10

initdead 60

udpport 694

bcast eth0

ucast eth0 192.168.11.226

auto_failback on

crm no

node test226

node test227

ping 192.168.11.229

respawn hacluster /usr/lib/heartbeat/ipfail

Haresources

test226  lustre

Authkeys

auth 2

2 sha1 PConline

         haresources文件里配置了主节点为test226HA资源为lustrelustre启动脚本位于/etc/init.d目录,使用lustre脚本可以根据配置文件/etc/luster/config.xml的配置来启动本机的Lustre资源。Heartbeat就是使用/etc/init.d/luster start/stop来启动和停止Lustre的。

         这里要说的是,我并没有真正实现用Heartbeat来做的Failover。目前的现象是,当主节点失效时,Heartbeat已经把MDS的资源转移到了备份节点,但是客户端并没有能够和备份节点建立通讯。

         Lustremanual上说还需要建立一个虚拟的IP,但我并没有在manual上看到怎么来使用这个VIP。而如果使用Heartbeat V2的话就不需要再建立虚拟IP,但由于时间关系,以及是第一次接触HA,没有能够做出来。

使用磁盘配额

         Lustre能够根据用户和组来进行文件系统的配额。

         要使磁盘配额生效,必须在创建XML文件的配置脚本里进行指定,例如:

${LMC} --add mds --node ft1 --mds mds-l --fstype ldiskfs --dev $MDSDEV --failover --quota quotaon=ug

${LMC} --add ost --node oss-0 --lov lov-l --ost ost-0 --fstype ldiskfs --dev /dev/sda1 –failover --quota quotaon=ug

         在添加mdsost的时候指定了--quota quotaon=ug选项。同时需要将下列命令加入到/etc/modprobe.conf文件。

install mdc /sbin/modprobe lquota; /sbin/modprobe --ignore-install mdc

install lov /sbin/modprobe lquota; /sbin/modprobe --ignore-install lov

install osc /sbin/modprobe lquota; /sbin/modprobe --ignore-install osc

使用配额进行工作必须使用lfs命令。首先使用不带参数的lfs命令进入lfs环境:

lfs

lfs >

扫描文件系统,创建或更新配额文件。

lfs > quotacheck -gu /mnt/luster

设置用户support的限额

lfs > setquota -u support 10240 20480 1000 2000 /mnt/luster

四个数字分别表示:

显示用户support限额信息

lfs > quota -u support /mnt/lustre

Disk quotas for user support (uid 500):

Filesystem   blocks   quota    limit     grace    files   quota    limit   grace

/mnt/lustre       0   10240   20480               0   1000    2000

mds-test_UUID    0       0       1               0      0       1

ost-test_UUID     0       0       1

小结

尽管Lustre有诸多优点(整合磁盘空间,提供高的I/O等),但它的不足限制了它在我们环境中的使用:

1.  安装Lustre需要内核的配合,需要重新编译内核,工作量巨大。

2.  Lustre并没有对存储设备进行多个拷贝,Failover也仅仅实现的是服务器节点的冗余,如果磁盘发生损坏,整个Lustre空间将损坏,官方manual也声明,Lustre的存储必须基于Raid阵列等硬件冗余才能保证数据的完整。

3.  要实现真正的HA,必须有特殊的硬件,比如说能通过接受软件命令来自动重启的电源装置,而这些硬件我们基本上没有。

如果Lustre应用在我们的现有环境,那么我们需要充分利用Lustre的优点,例如设计如下的架构:

1.  一些对磁盘空间要求不高的应用服务器可以做成无盘的Linux工作站,使用共享的存储体来启动无盘Linux工作站。

2.  将剩余的磁盘放入磁盘阵列柜,在阵列中对磁盘做Raid5Raid6的磁盘冗余方案,对阵列前端的机头做HA,这样可以保证磁盘和服务器节点的冗余了。

3.  2的基础上,将多个磁盘阵列柜做成Lustre文件系统,这样我们就可以得到一个大容量的存储池,磁盘I/O和数据的冗余都将得到保证。而我们的投入仅仅是几个阵列柜。

阅读(2606) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

zqm66662009-06-26 10:08:45

这份文档的技术含量应该很高 拜读......