前些日子把lustre安装完毕了,考虑到了如果一个节点死了怎么办?所以就想到了主辅切换,开始就想到了两个工具,第一个就是iscsitarget网络共享磁盘,第二个就是drbd,因为出于对drbd熟悉一点,就先测试drbd,中途遇到不少问题,慢慢的一一解决了!这次测试我开了不5台虚拟机,为了完全模拟生产环境。如你测试可以相应的少开虚拟机。mds :192.168.6.20mds1 :192.168.6.21ost :192.168.6.22ost1 :192.168.6.23client:192.168.6.24mds mds1 ost ost2 每台机器都有 1G 的 sdb硬盘 用于测试!需要 安装软件 drbd-8.3.0 hearbeat-2.30 1.首先在每台机器上编译内核安装lustre 如有不会的请看我上篇写的文章lustre 安装: [url]http://deidara.blog.51cto.com/400447/125071[/url] 因为我出于方便就把 两个deb包考过来安装,在每台机器上安装!2.在mds mds1 上编译安装drbd shell $> tar zxvf drbd-8.3.0.tar.gzshell $> cd drbd-8.3.0shell $> make cleanshell $> make KDIR=/usr/src/linux-2.6.22 (注意这个地方必须是你编译lustre的内核,如果不是,你从网上下载 linux-2.6.22内核,然后打上lustre补丁,make modules后才能正常编译 drbd不然会报错!)shell $> groupadd haclient 建立组不然会提示警告shell $> chgrp haclient /sbin/drbdsetupshell $> chmod o-x /sbin/drbdsetupshell $> chmod u+s /sbin/drbdsetup安装drbd 如果有问题,可以看我的blog :[url]http://deidara.blog.51cto.com/400447/105875[/url]3.配置mds mds1 上的 drbd.conf查找 after "r2";注释掉这一行,因为我们 只需要 r0修改默认的 . amd { device /dev/drbd0; disk /dev/hde5; address 192.168.22.11:7788; flexible-meta-disk internal;} on alf { device /dev/drbd0; disk /dev/hdc5; address 192.168.22.12:7788; meta-disk internal; }}改为on mds { device /dev/drbd0; disk /dev/sdb; address 192.168.6.20:7788; flexible-meta-disk internal; . mds1 { device /dev/drbd0; disk /dev/sdb; address 192.168.6.21:7788; meta-disk internal; }}最后,把 后边的 全部注释掉或者删掉! mds与mds1配置一样!5,调试drbd 手动切换 drbd 主辅在mds与mds1上 执行mds $> drbdadm create-md r0 #“r0”是我们在drbd.conf里定义的,初始化mds1 $> drbdadm create-md r0mds $> /etc/init.d/drbd startmds1 $> /etc/init.d/drbd startmds $> cat /proc/drbd显示了drbd当前的状态.第一行的st表示两台主机的状态,都是”备机”状态.ds是磁盘状态,都是”不一致”状态. mds $> drbdsetup /dev/drbd0 primary -omds $> cat /proc/drbd就可以看到主备机状态分别是”主/备”,主机磁盘状态是”实时”,备机状态是”不一致”.且数据开始同步稍等一会,在数据同步完后,再查看一下drbd1的DRBD状态mds $>cat /proc/drbd好了,磁盘状态都是”实时”,表示数据同步完成了.你现在可以把主机上的DRBD设备挂载到一个目录上进行使用.备机的DRBD设备无法被挂载,因为它是用来接收主机数据的,由DRBD负责操作.在mds 执行mds $> mkfs.lustre --reformat --fsname=testfs --mdt --mgs --failnode=mds1 /dev/drbd0### 创建 lustre文件系统 reformat 参数是格式化,fsname 文件名字 --failnode参数是 lustre failover 功能~mds $> mount -t lustre /dev/drbd0 /opt (挂载到/opt 目录)DRBD的主备机切换有时,你需要将DRBD的主备机互换一下.可以执行下面的操作: 在主机上,先要卸载掉DRBD设备mds $> umount /opt将主机降级为”备机”mds $> drbdadm secondary r0mds $> cat /proc/drbdversion: 8.3.0 (api:88/proto:86-89)GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@mds, 2009-01-14 02:05:53 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r--- ns:132 nr:20480 dw:20612 dr:270 al:5 bm:15 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0已经降到了备机在mds1上执行mds1 $> drbdadm primary r0mds1 即为升为 主!6,在mds 和 mds1 安装使用 hearbeat,让drbd 手动切换为自动切换,hearbeat我出于升力气,就apt-get 安装了,大家可以使用源码包安装shell $> apt-get install hearbeatshell $> cd /usr/share/doc/heartbeatshell $> gunzip ha.cf.gzshell $> gunzip haresources.gzshell $> mv ha.cf haresouroes authkeys /etc/ha.d/shell $> chmod 600 authkeysshell $> vim authkeysauth 11 crc把这两行注释去掉shell $> vim ha.cfdebugfile /var/log/ha-debuglogfile /var/log/ha-loglogfacility local0keepalive 2deadtime 30warntime 10initdead 120udpport 694auto_failback offnode mdsnode mds1ping 192.168.6.1respawn hacluster /usr/lib/heartbeat/ipfailshell $> vim haresouroesmds 192.168.6.25 drbddisk::r0 Filesystem::/dev/drbd0::/opt::lustre7.最后的调试,于查看日志!mds $> /etc/init.d/hearbeat startmds $> tailf /var/log/messgesmds1 $> /etcinit.d/hearbeat startmds $> tailf /var/log/messagesJan 15 21:40:11 mds kernel: [ 4000.216541] Lustre: MGS MGS startedJan 15 21:40:11 mds kernel: [ 4000.240713] Lustre: Enabling user_xattrJan 15 21:40:11 mds kernel: [ 4000.242264] Lustre: 8634:0:(mds_fs.c:460:mds_init_server_data()) RECOVERY: service testfs-MDT0000, 1 recoverable clients, last_transno 57Jan 15 21:40:11 mds kernel: [ 4000.268658] Lustre: MDT testfs-MDT0000 now serving dev (testfs-MDT0000/130da46d-1bef-9e79-4da2-a0e5005f60ab), but will be in recovery for at least 5:00, or until 1 client reconnect. During this time new clients will not be allowed to connect. Recovery progress can be monitored by watching /proc/fs/lustre/mds/testfs-MDT0000/recovery_status.Jan 15 21:40:11 mds kernel: [ 4000.268691] Lustre: 8634:0:(lproc_mds.c:262:lprocfs_wr_group_upcall()) testfs-MDT0000: group upcall set to /usr/sbin/l_getgroupsJan 15 21:40:11 mds kernel: [ 4000.268709] Lustre: testfs-MDT0000.mdt: set parameter group_upcall=/usr/sbin/l_getgroupsJan 15 21:40:11 mds kernel: [ 4000.269073] Lustre: 8634:0:(mds_lov.c:1008:mds_notify()) MDS testfs-MDT0000: in recovery, not resetting orphans . testfs-OST0000_UUIDJan 15 21:40:11 mds kernel: [ 4000.269079] Lustre: 8634:0:(mds_lov.c:1008:mds_notify()) Skipped 1 previous similar messageJan 15 21:40:11 mds kernel: [ 4000.287049] Lustre: Server testfs-MDT0000 . device /dev/drbd0 has startedJan 15 21:40:11 mds Filesystem[8579]: INFO: Success我们可以看到很多信息,看到最后一行,已经 Success文件系统已经被挂载,mds $> cat /proc/drbdversion: 8.3.0 (api:88/proto:86-89)GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@mds, 2009-01-14 00:39:29 0: cs:WFConnection ro:Primary/Secondary ds:UpToDate/UpToDate C r--- ns:20596 nr:660 dw:788 dr:20750 al:5 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:12然后我们把mds关机~在mds1一直执行这 tailf /var/log/message查看日志mds $> shutdown -h nowmds1 $> tailf /var/log/messageJan 15 22:00:56 mds1 kernel: [ 5250.672618] drbd0: role( Secondary -> Primary ) Jan 15 22:00:56 mds1 Filesystem[5920]: INFO: Resource is stoppedJan 15 22:00:56 mds1 ResourceManager[5665]: info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /opt lustre startJan 15 22:00:56 mds1 Filesystem[5996]: INFO: Running start for /dev/drbd0 . /optJan 15 22:00:57 mds1 kernel: [ 5251.766369] kjournald starting. Commit interval 5 secondsJan 15 22:00:57 mds1 kernel: [ 5251.768068] LDISKFS-fs warning: maximal mount count reached, running e2fsck is recommendedJan 15 22:00:57 mds1 kernel: [ 5251.771802] LDISKFS FS . drbd0, internal journalJan 15 22:00:57 mds1 kernel: [ 5251.771944] LDISKFS-fs: recovery complete.Jan 15 22:00:57 mds1 kernel: [ 5251.776258] LDISKFS-fs: mounted filesystem with ordered data mode.Jan 15 22:00:57 mds1 kernel: [ 5251.894315] kjournald starting. Commit interval 5 secondsJan 15 22:00:57 mds1 kernel: [ 5251.899051] LDISKFS-fs warning: maximal mount count reached, running e2fsck is recommendedJan 15 22:00:57 mds1 kernel: [ 5251.903082] LDISKFS FS . drbd0, internal journalJan 15 22:00:57 mds1 kernel: [ 5251.903095] LDISKFS-fs: mounted filesystem with ordered data mode.Jan 15 22:00:57 mds1 kernel: [ 5252.158408] Lustre: MGS MGS started可以看到 mds1 已经接管了,执行命令看一下~mds1 $> cat /proc/drbd version: 8.3.0 (api:88/proto:86-89)GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@mds1, 2009-01-14 00:39:29 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r--- ns:20596 nr:660 dw:788 dr:20750 al:5 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:12mds1 $> mountroot@mds1:~# mount/dev/sda1 . / type ext3 (rw,relatime,errors=remount-ro)tmpfs . /lib/init/rw type tmpfs (rw,nosuid,mode=0755)/proc . /proc type proc (rw,noexec,nosuid,nodev)sysfs . /sys type sysfs (rw,noexec,nosuid,nodev)varrun . /var/run type tmpfs (rw,nosuid,mode=0755)varlock . /var/lock type tmpfs (rw,noexec,nosuid,nodev,mode=1777)udev . /dev type tmpfs (rw,mode=0755)tmpfs . /dev/shm type tmpfs (rw,nosuid,nodev)devpts . /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)fusectl . /sys/fs/fuse/connections type fusectl (rw)securityfs . /sys/kernel/security type securityfs (rw)/dev/drbd0 . /opt type lustre (rw) ---已经挂载上了好了我们现在 把mds开机开机后 mds $> cat /proc/drbdversion: 8.3.0 (api:88/proto:86-89)GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@mds, 2009-01-14 02:05:53 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r--- ns:0 nr:12 dw:12 dr:0 al:0 bm:2 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0好已经变为辅机了,8,开机 启动ln -s /etc/init.d/drbd /etc/rc2.d/S60drbdln -s /etc/init.d/drbd /etc/rc3.d/S60drbdln -s /etc/init.d/drbd /etc/rc4.d/S60drbdln -s /etc/init.d/drbd /etc/rc5.d/S60drbd9,配置 ost ost1shell $>mkfs.lustre --reformat --fsname=testfs --ost --mgsnode=mds@tcp0 --mgsnode=mds1@tcp0 /dev/sdb## --mgsnode=mds@tcp0 --mgsnode=mds1@tcp0 意思是有一台正常就不会影响使用~shell $> mount -t lustre /dev/sdb /opt10,配置 client shell $> mount -t lustre mds@tcp0:mds1@tcp0:/testfs /optshell $> cd /optshell $> touch testshell $> lstestshell $> dd if=/dev/zero of=test1 bs=1024 count=40000执行后 在ost 与 ost1 上执行 df -lh 查看结果ost $> df -lh/dev/sdb 1008M 34M 924M 4% /optost1 $> df -lh/dev/sdb 1008M 73M 885M 8% /opt我们可以清楚看到 40M 的数据写到了 ost1上再在 client 上执行 client $> dd if=/dev/zero of=test2 bs=1024 count=40000再去 两台 ost 上查看 结果数据写到了 ost 上11,在线切换,看 ost 与 client 是否能正常工作~,因为刚刚做过切换测试,现在的 主机是 mds1,那么我就把 mds1关机,看mds接管后,是否正常~mds1 $> shutdown -h nowost $> taif /var/log/message 在一台OST 上查看日志Jan 15 22:24:33 ost kernel: [ 1424.924073] Lustre: Request x49 sent from MGC192.168.6.20@tcp to NID 192.168.6.21@tcp 100s ago has timed out (limit 100s).Jan 15 22:26:13 ost kernel: [ 1524.787044] Lustre: Request x54 sent from MGC192.168.6.20@tcp to NID 192.168.6.21@tcp 100s ago has timed out (limit 100s).Jan 15 22:26:13 ost kernel: [ 1524.787135] Lustre: Changing connection for MGC192.168.6.20@tcp to MGC192.168.6.20@tcp_0/192.168.6.20@tcpJan 15 22:26:13 ost kernel: [ 1524.802552] Lustre: 3501:0:(import.c:700:ptlrpc_connect_interpret()) MGS@MGC192.168.6.20@tcp_0 changed server handle from 0xcb3cb29f8eba6fc0 to 0x441e063eb5523617 - evicting.Jan 15 22:26:13 ost kernel: [ 1524.803661] Lustre: MGC192.168.6.20@tcp: Reactivating importJan 15 22:26:13 ost kernel: [ 1524.803673] Lustre: MGC192.168.6.20@tcp: Connection restored to service MGS using nid 192.168.6.20@tcp这里会有一段时间的,好服务已经切换到 mds上了 我们去 client去看一下。client $> lstest test1 test2 三个文件没有我呢题~好了 热切换已经OK了,注意的是切换的时候会有一段时间不能读写是正常的!注意了,测试的时候不要在虚拟机禁用网卡,因为你禁用网卡 eth0:0 这个虚拟IP并没有卸载掉,所以你在 开启网卡的时候会导致 drbd 都认为自己是 主服务器,会导致 drbd_split-brain错误,如果出现这个错误,在 当前 辅机器上执行(注意是当前, cat /proc/drbd查看)drbdadm secondary r0 (我的是r0你的是多少就多少)drbdadm disconnect r0drbdadm -- --discard-my-data connect r0在当前 主机上执行drbdadm connect r0我之演示的是 MDS 切换,OST 切换也是如此,不过是 mkfs.lustre 创建文件系统的时候也要加,slave机器!--failnode=ost_slave 只有加了 slave才会接管~~!好了再有不理解的地方希望可以多多交流!
本文转自Deidara 51CTO博客,原文链接:http://blog.51cto.com/deidara/126714,如需转载请自行联系原作者