很久之前写的Lustre测试报告
前言:好久之前写的,当中可能有理解不到位的地方,请谅解。这里介绍了Lustre的使用,HA的简单介绍,一些磁盘初步的整合方案。希望能启发大家的思维,呵呵~~~因为字数太多,有所删减,如果查看原文请点:http://blog.chinaunix.net/u2/73914/showart_1098901.html
分布式文件系统之Lustre功能测试报告
前言
省略。。。
Lustre简单介绍
Lustre文件系统是基于对象存储的文件系统,它有三个部分组成:
1. 元数据服务器(Meta Data Server,MDS)
2. 对象存储服务器(Object Storage Server,OSS)
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
其他软件
Perl,Python,PyXML等
功能测试内容
1. 单节点的Lustre
2. 多节点的Lustre
3. Lustre的Failover
4. Lustre的quota
单节点的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
按照OST,MDS,client的顺序启动:
# 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
test227,sda7,4G
OST1
test225,hda8,55G
OST2
test229,hdc8,55G
Client
任意机器
Client:使用的配置文件如下,配置脚本改为config.sh,XML文件改为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配置文件,然后将该配置文件复制到每一台服务器。下面按照OST-MDS-Client的顺序初始化并启动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贡献的存储容量。
Lustre的Failover
省略。。。
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
由于MDS和OSS的Failover原理一样,在这里我只进行了MDS的Failover。
Failover环境的搭建
为了模拟类似共享存储体的架构,我使用了NFS的方式。如下图:
NFS服务器export出目录/mds_fo,分别挂载到前面两台客户端的/mds_fo目录,这样,在NFS客户端看来,就是有了相同的目录,且访问到的数据也是一样的。中间的两台NFS客户端同时也作为Lustre的MDS,即元数据服务器,这两台MDS要实现的功能是Failover,使用的方式是MDS Failover中唯一的方式:active/passive,任意时间只有一台MDS提供服务,MDS之间的切换用Heartbeat来实现。最前面的是Lustre的OST,同时也作为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
在定义节点的时候我定义了两个MDS:mds1和mds2,配置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
此时在ost(test225)上查看网络连接:
[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现在是与mds1(test226)进行通讯的。
手工mds切换
Mds1(test226)上先将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来查看磁盘空间了。此时在ost(test225)上看到的网络连接是:
[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.cf,authkeys,haresources。
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文件里配置了主节点为test226,HA资源为lustre,lustre启动脚本位于/etc/init.d目录,使用lustre脚本可以根据配置文件/etc/luster/config.xml的配置来启动本机的Lustre资源。Heartbeat就是使用/etc/init.d/luster start/stop来启动和停止Lustre的。
这里要说的是,我并没有真正实现用Heartbeat来做的Failover。目前的现象是,当主节点失效时,Heartbeat已经把MDS的资源转移到了备份节点,但是客户端并没有能够和备份节点建立通讯。
Lustre的manual上说还需要建立一个虚拟的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
在添加mds和ost的时候指定了--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. 将剩余的磁盘放入磁盘阵列柜,在阵列中对磁盘做Raid5或Raid6的磁盘冗余方案,对阵列前端的机头做HA,这样可以保证磁盘和服务器节点的冗余了。
3. 在2的基础上,将多个磁盘阵列柜做成Lustre文件系统,这样我们就可以得到一个大容量的存储池,磁盘I/O和数据的冗余都将得到保证。而我们的投入仅仅是几个阵列柜。
[ 本帖最后由 micheas.liao 于 2008-8-25 21:46 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
半夜发贴?
支持 这个很好 的
可惜还是1.4版本的,现在都不这样安装了.
分析的很精辟,支持你
写的很好。
好文章,目前再用lustre.lustre确实只能做IO节点冗余。并且有MDS单点故障的风险。维护还是比较逗逼的