- 論壇徽章:
- 0
|
973項目驗收終于落下帷幕,如釋重負,終于可以清閑一段時間,趁現(xiàn)在還清醒,把最近的工作做個總結。
關于試驗平臺的搭建
由于后來系統(tǒng)對聚合帶寬要求提高了很多,而dnfs系統(tǒng)的性能提升空間已經很少了,及時想到辦法,時間也來不及了,所以只能通過擴大系統(tǒng)的規(guī)模來提高聚合帶寬了,曹sir下令將機房B區(qū)都整出來跑dnfs,于是從連線,裝機,服務配置等一大堆問題都出來了。
最開始,yj在B去的幾臺機子上通過clonezilla已經裝了幾臺機子(包括ubuntu和windows),我對ubuntu一直沒什么好感,用過幾次ubuntu都感覺不好。用redhat時間長了,人也變懶了,redhat DVD的鏡像包含大部分你可能需要的軟件包,你只需要安裝的時候選上就Ok了,但這樣學東西的機會就少了(最近想裝個gentoo玩下),感覺redhat很適合于機房的環(huán)境。后來跟cj商量了下,決定把機器上都裝redhat(當時的想法是想為了以后實驗的方便,并且到時候跑dnfs不會有很多問題)。
于是開始刻碟(rhel5),安裝到一臺機器上(裝的時候把光驅放置反了,托盤一直彈不出來,非常之郁悶),然后用clonezilla做鏡像掛到192.168.1.1機器上,然后通過U盤系統(tǒng)啟動使用clonezilla到1.1上恢復備份的數(shù)據(jù)到本地硬盤,由于clonezilla是全盤的備份包括mbr,所以拷貝過來的系統(tǒng)直接可以使用,除了網(wǎng)卡的名字會由eth0變成eth1,因為原來系統(tǒng)網(wǎng)卡的條目通過clonezilla被拷貝過來,但系統(tǒng)啟動時,發(fā)現(xiàn)拷貝過來的網(wǎng)卡信息(網(wǎng)卡mac地址)與當前系統(tǒng)網(wǎng)卡的mac地址不同,也就無法啟動該網(wǎng)卡,通過udev管理,系統(tǒng)發(fā)現(xiàn)了當前系統(tǒng)的網(wǎng)卡,于是將其命名為eth1,并與其mac相關聯(lián),這些信息在/etc/udev/rules.d/*net*文件中。如果想把網(wǎng)卡名恢復為eth0,可以將該文件中eth0(實際上是遠端系統(tǒng)的條目)刪掉,將本機網(wǎng)卡條目的名字改為eth0即可。
當天晚上(貌似是9月1號通宵加班),我和yj裝了大概10多臺,其他的人一部分做網(wǎng)線,一部分布線,終于把機房整得像個樣子了。(后來B區(qū)的機子好像都是有l(wèi)xy和lxh裝的)
但事情并沒有想象中的那么順利,在裝系統(tǒng)的時候我選了xen服務(支持虛擬化),導致這批redhat啟動會很慢(看了下,主要是啟動xen服務啟動時間較長),讓人非常之郁悶,而且在網(wǎng)上看了下說停掉xen服務機器可能不能正常啟動,也沒敢動(有點后悔,準備抽個時間試一下)。
系統(tǒng)弄好后就是把網(wǎng)絡配通了,網(wǎng)絡需求是將B區(qū)設置在一個局域網(wǎng)環(huán)境,由一個節(jié)點做網(wǎng)關(192.168.1.1),連接到外網(wǎng),然后通過網(wǎng)關做端口映射使得實驗室能夠訪問到該局域網(wǎng)內其他的機器,當天晚上接準備把已經裝好系統(tǒng)的機子的網(wǎng)絡都配好,以方便第二天的實驗于是
#ifconfig ethx 192.168.1.x netmask 255.255.255.0
#route add default gw 192.168.1.1
#ping 192.168.1.1
接著把啟動項改成redhat(使用的是ubuntu的grub),但重啟后系統(tǒng)并沒有進入redhat(第五項),而是直接進ubuntu(第一項),之后重啟幾次都是這樣,于是想改用redhat的grub試下,是否是引導的問題。
#grub
$find /boot/grub/stage1
(hd0,1) //ubuntu裝在/dev/sda2上
(hd0,4) //redhat 裝在/dev/sda5上
$root (hd0, 4)
$setup (hd0) //將(hd0,4)上的grub寫入到mbr
重啟后redhat還是進不去(grub后一會就自動重啟了),更糟糕的是ubuntu也進不去了,提示unrecongnized file or directory,是因為redhat企業(yè)版的grub(版本比較老)不能識別ubuntu的文件系統(tǒng)(據(jù)yj說在08年ext3被改過),于是找了張ubuntu較新的live cd進光盤系統(tǒng)重新把ubuntu的grub寫到mbr,此時已經是晚上12點多了,匆匆的將其他機子的網(wǎng)絡都配好后睡覺了。
第二天,lx帶來了不好的消息,說配置的網(wǎng)絡信息重啟后都失效,需要重新配置,查了下,原來ifconfig,route所配置的信息只是供臨時的實驗所用,要想配置消息永久生效,有三種方法:
使用各個linux發(fā)行版所帶的配置工具,如redhat的setup
將網(wǎng)絡配置信息寫到配置文件中。
redhat為/etc/sysconfig/network-scripts/ifcfg-ethx,ubuntu為/etc/network/interfaces
一個redhat的例子
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.X
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
配置命令寫到開機會加載的腳本中,如/etc/rc.local
局域網(wǎng)連通后,接下來就是網(wǎng)關連外網(wǎng)的問題了,需要通過mystar認證才能上網(wǎng)(華工的校園網(wǎng)),之前和cj使用mystar時,到白云down了一個mystar,結果一直提示serching for server,仔細檢查了mystar的配置文件,用戶名,密碼,網(wǎng)卡信息(其他還有自動重連等選項)都沒錯,后來在yj的幫助下把問題解決了,原來我down到的是一個比較老的mystar,新的mystar配置文件要拷貝到/etc/mystar.conf。
插曲:一次配置網(wǎng)關的兩塊網(wǎng)卡的信息時,把角色搞反了,主要是當時錯誤的“確定”連外網(wǎng)的是個千兆卡,然后通過ethtool查看,將千兆卡設為外網(wǎng)ip,結果一直不通,當時把千兆卡的ip改為內網(wǎng)通過,但當時的思想太固化了,根本沒想到會把兩塊網(wǎng)卡的角色弄反了。
能連通外網(wǎng)了,該配置iptables了,主要需要達到兩個目的:機房的節(jié)點能夠訪問外網(wǎng),實驗室能夠訪問到機房每個節(jié)點的服務(主要是ssh)。前者需要配置nat,后者則通過端口映射完成。
更改所有來自192.168.1.0/24的數(shù)據(jù)包的源ip地址為1.2.3.4:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4 //snat
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4 //dnat
前者先進行nat,在進行路由和過濾;后者先進性路由和過濾再進行nat;
iptables -t nat -A PREROUTING -d 202.114.6.63 -p tcp --dport 6422 -j DNAT --to 192.168.1.64:22
將訪問202.114.6.63:6422請求映射到192.168.1.64:22(內網(wǎng)機器的ssh)
這樣實驗室就可以通過6422端口訪問到機房192.168.1.64機器。
關于dnfs的安裝
基本的系統(tǒng)搭建完成后,需要開始安裝dnfs了,安裝dnfs需要先安裝fuse,fuse是一個用戶空間的文件系統(tǒng),包含一個fuse內核模塊,fuse用戶空間空間庫,以及一個mount工具。
問題出現(xiàn)了,以前一直用的fuse-2.7.0,sf上提供的包包含了完整的三部分,后來fuse從2.8開始支持了大于4k的寫請求(在不修改內核的情況下達到128k),同時內核模塊加入到內核源碼中,所以fuse2.8就只包含了user lib和mount tool,而為了提高系統(tǒng)的性能,我們又需要fuse支持大寫的請求。
B區(qū)機器的系統(tǒng)有兩種,ubuntu(kernel 2.6.28, 包含了fuse-2.7.3),rhel(kernel 2.6.15)。所以針對rehl,需要先安裝fuse-2.7(主要是添加內核模塊,fuse的三部分不能分開安裝),然后安裝fuse2.8(必須安裝在相同目錄),將2.7的用戶lib覆蓋掉,原來指向libfuse.so.2.7.0的軟鏈接lib.so會指向fuse.so.2.8.0,從而支持big_writes選項。
針對ubuntu,只需要安裝fuse-2.8,但安裝后,dnfs還是鏈接接到了/lib下的libfuse.so.2(指向libfuse-2.7.0),而libfuse-2.8.0在/usr/lib下,ld默認到/lib,/usr/lib下查找鏈接庫,在/lib下先找到了就直接鏈接了,要想ld先找到/usr/lib下的libfuse,需要將/usr/lib加入到/etc/ld.so.conf中,然后執(zhí)行l(wèi)dconfig,ld先查找ld.so.conf中的目錄,再查找默認路徑,就會先鏈接到/usr/lib下的libfuse。或者將/lib下的libfuse.so的軟連接指向/usr/lib下的libfuse-2.8.0.
針對不同的系統(tǒng),寫好腳本,安裝基本上沒遇到問題,為了保證機器重啟后自動加載fuse.ko,可以再/etc/modprobe.conf 或/etc/rc.local中加入modprobe fuse。
由于我每次安裝都在configure時制訂了—prefix=/usr,而pkg-config默認搜索.pc的路徑也是/lib/pkgconfig, /usr/lib/pkgconfig,所以不需要再配置PKG_CONFIG_PATH變量,否則如果按照默認配置,fuse會被安裝到/usr/local,這是PKG_CONFIG_PATH要加上/usr/local/lib/pkgconfig,否則編譯的時候會提示找不到fuse.pc。
fuse安裝成功后,dnfs的安裝也就簡單了,進入src,直接make就ok。
關于dnfs集群性能的測試
一直覺得dnfs的性能是個問題,會影響它的應用,當時想過幾種方式,提高其性能。
如使用prefetch一次讀更多的數(shù)據(jù),使用更大的客戶端緩存(多次寫一次刷新),但一直沒靜下心去實現(xiàn)。
之前做畢設的時候用iozone測dnfs的性能,讀的性能最高能達到40+m,寫的性能很多時候低于1m,讓人心寒,后來fuse-2.8支持big_writes,寫的性能提高很多。這次我們使用xdd測試,xdd包含一個timeserver模塊,gettimeserver模塊,和一個xdd模塊,timeserver用于做時間服務器,用于同步時間,各個測試節(jié)點通過timeserver來同步,可以做到并發(fā)產生讀寫請求。先測試了幾組數(shù)據(jù),發(fā)現(xiàn)性能不是很好,后來使用投機取巧的方法,多次讀一個小文件,提高系統(tǒng)緩存命中率來提高性能,的卻it works。另外dnfs的負載均衡算法似乎存在一定的問題,經常導致有一些機器負載很大,而其他一些機器則基本沒有提供服務,為了提高整體的聚合帶寬,需要將數(shù)據(jù)均勻的分布,如B去有39個節(jié)點,每組3個做數(shù)據(jù)分布,然后3組間做交叉讀,以使聚合帶寬達到最大(大概200-300MB/S)。后來聽姚老師說他在fuse中加了個200m的緩沖區(qū),能把性能提高到360MB/S,佩服…….
如 11,12,13node存放數(shù)據(jù)72m1
14,15,43node存放數(shù)據(jù)72m2
17,18,19node存放數(shù)據(jù)72m3
測試的腳本如下:RC變量為同步測試的時間
#11,12,13讀取72m2
ssh root@192.168.1.x /root/xdd63/bin/xdd.linuxsmp -op read -target /mnt/dnfs/72m2 -reqsize 128 -blocksize 1024 -numreqs 100 -passes 9 -verbose -output /root/xdd.txt -timeserver 192.168.1.1 -starttime ${RC} &
#14,15,43讀取72m3
ssh root@192.168.1.x /root/xdd63/bin/xdd.linuxsmp -op read -target /mnt/dnfs/72m3 -reqsize 128 -blocksize 1024 -numreqs 100 -passes 9 -verbose -output /root/xdd.txt -timeserver 192.168.1.1 -starttime ${RC} &
#17,18,19讀取72m1
ssh root@192.168.1.x /root/xdd63/bin/xdd.linuxsmp -op read -target /mnt/dnfs/72m1 -reqsize 128 -blocksize 1024 -numreqs 100 -passes 9 -verbose -output /root/xdd.txt -timeserver 192.168.1.1 -starttime ${RC} &
關于grub的一些問題
在實驗平臺搭建一部分已經提過一點關于grub的問題,再說說其他幾種系統(tǒng)啟動時遇到的問題。
裝windows,linux雙系統(tǒng)后,直接把linux分區(qū)刪除后,系統(tǒng)是啟動不了的,因為window的引導工具不能引導linux,所以裝雙系統(tǒng)通常是使用linux的grub去引導(grub能鏈式引導windows),當linux分區(qū)被刪除后,windows當然不能被正確引導了,可以用windows系統(tǒng)引導盤進恢復模式,運行fixboot fixmbrr或是進入dos執(zhí)行fdisk /mbr以修復mbr。
系統(tǒng)引導時,提示can’t find stage1.5,error 22,開始一直以為是grub的問題,用ubuntu的livecd將grub重寫后還是如此,然后我就不知道怎么去考慮問題了,又是yj出馬解決問題,原來裝有系統(tǒng)的那塊盤都不在引導設備之列,所以每次引導都會失敗。
grub通過之后,出現(xiàn)
FS cannot open root device "" or unknown-block(8,37)
Please append a correct "root=" boot option;here are the available partition:
kernel panic - not syncing: VFS : unable to mount root fs on unknown-block(8,37)
解決方法:在grub.conf中kernel那一行加上"root=/dev/sdax",當然如果設備是IDE的,就/dev/hdx了,比如這是我的:
"kernel /boot/bzImage-2.6.26-gentoo-r1 root=/dev/sdb1"
關于磁盤空間的管理
機房的機器大多配備有三塊硬盤,每塊300g,而一個linux系統(tǒng)通常只分配了10-30g的空間,dnfs是應用層的文件系統(tǒng),osd將數(shù)據(jù)寫到一個特定目錄(/mnt/osd)來保存,如果不做任何處理,/mnt/osd只能使用裝系統(tǒng)時分配的空間,去掉系統(tǒng)數(shù)據(jù)估計剩下的空間為20g左右,跑30個節(jié)點悠久600g,為了盡量利用磁盤空間,需要將所有的可用的磁盤空間都利用起來,以前就聽說過linux的邏輯卷管理,不過一直處于一個概念上的認識,在wcw的blog上發(fā)現(xiàn)了他畢業(yè)設計實驗時也遇到了這個問題,使用lvm解決的,lvm工具將磁盤或磁盤分區(qū)創(chuàng)建為物理卷,并整合成為卷組,然后在卷組上劃分多個邏輯卷,邏輯卷的容量在卷組范圍內可以動態(tài)調整,管理起來相當方便;镜牟襟E如下:
1, 如果是邏輯分區(qū),先在其上創(chuàng)建新的分區(qū)
fdisk /dev/sdc … //新建的分區(qū)為sdc6
2, 創(chuàng)建物理卷
pvcreate /dev/sdc6
pvdisplay顯示物理卷信息
3, 創(chuàng)建卷組
vgcreate dnfs /dev/sdc6
如果卷組已經存在,可使用vgextend將/dev/sdc6加入。
vgextend dnfs /dev/sdc6
4,創(chuàng)建邏輯卷
lvcreate –n osd –L 500G dnfs //在dnfs邏輯卷中創(chuàng)建osd邏輯卷,大小為200G
可使用lvextend動態(tài)改變邏輯卷的容量
lvextend –L +200G /dev/dnfs/osd //將osd的空間增加200G
5, 創(chuàng)建文件系統(tǒng)
在osd邏輯卷上使用mkfs創(chuàng)建文件系統(tǒng)
mkfs –t ext3 /dev/dnfs/osd
或 mkfs.ext3 /dev/dnfs/osd
6, 掛載文件系統(tǒng)
mount –t ext3 /dev/dnfs/osd /mnt/osd
系統(tǒng)開機自動掛載邏輯卷,在/etc/fstab中加入
/dev/dnfs/osd /mnt/osd ext3 defaults 0 0
這樣DNFS系統(tǒng)就能使用/dev/dnfs/osd的空間作為實際文件數(shù)據(jù)的存儲空間,可以靈活的加入磁盤擴展容量。
改變ext3文件系統(tǒng)大小
# resize2fs /dev/dnfs/osd
這樣會改變osd邏輯卷上的ext3文件系統(tǒng)的大小到osd邏輯卷的總大小,resize2fs也可以指定大小, resize2fs支持在線改變ext3文件系統(tǒng)大小,不需卸載即可調整大小。
刪除操作
如果不想用邏輯卷管理器了,可以從LV,VG到PV逐層刪除
# lvremove /dev/dnfs/osd
把dnfs轉為休眠狀態(tài):
# vgchange -an dnfs
# lvremove dnfs
# pvremove /dev/sdc6
關于溝通與交流
越來越多體會到溝通交流的重要性了,尤其是與自己一塊干事的人,真的體會到wcw當時說的“沉默寡言未必是真英雄”的意思了,一個人的時間和精力都是有限的,在團隊合作時,一定要充分發(fā)揮每個人的優(yōu)勢,才能最有效的完成任務。拿20號晚上的事來說吧,曹sir希望我們盡可能出一份B區(qū)的測試結果,而當時已經是20晚上了,cj太累了也會去休息了。當時最大的問題就是vnc登錄到網(wǎng)關的ubuntu系統(tǒng),多打開一些控制終端就會死掉,而是用ssh工具直接短路又不好全局掌控各個機器的運行情況,跟lx商量了下,準備晚上加班測一組數(shù)據(jù)出來,其實一開始我們的想法就不一樣,一直沒溝通好就開始做了。
我的想法是在機房的ubuntu系統(tǒng)上一個個登錄到其它的機器上,把所有的工作都移到機房做,這樣即使晚上實驗沒成功,第二天cj來了后就可以接著做;而lx的想法是無論使用什么方法盡快測試一組數(shù)據(jù)出來。導致我在一個個登錄節(jié)點機的時候,lxh發(fā)現(xiàn)在命令前加上nohup可以讓虛擬終端上的命令在后臺運行(no hup 忽略所有的終端信號),即使虛擬終端關閉。于是lx提出寫腳本,當時他們一說,我沒有堅持我的想法,開始寫腳本,后來發(fā)現(xiàn)腳本not works,又一臺臺的ssh,并加入nohup執(zhí)行,然后退出,把所有的機器跑起來后已測試,一堆錯誤,當時有點崩潰,整個人都有點昏了。yj看我們搞了一晚上都沒什么結果就主動來幫我們,分析了下原因,一下子提出幾種解決方案:(vnc死的原因至今未查出,我覺得vnc跟ubuntu之間可能有點。。。)
1,把我的虛擬機(fedora)拷到網(wǎng)關上用
2,把個人機器換到網(wǎng)關用(實驗室的機子或機房的其他redhat,之前進網(wǎng)關的redhat,gnome無法加載applet工具,任務欄等東東都加載不了)
3,直接在機房登錄測試(我最初的想法)
除了第一種方法,其他兩種方法之前都討論過,不過無果而終。當時想為什么這么多方案,我們確搞成當時那個結果----測試沒有順利完成,一些節(jié)點已經掛掉,并且不知道是哪些。根源就是之前沒跟lx,于是去跟lx聊了下…….后來在yj的幫助下,我們重新?lián)Q了網(wǎng)關,那臺實驗室曾經用過的網(wǎng)管用的redhat系統(tǒng)似乎跟原來網(wǎng)關的系統(tǒng)一樣,vnc登錄,同樣是gnome環(huán)境無法加載applet,所以問題一些回到了晚上吃晚飯我重啟系統(tǒng)時候(這就是覺少交流的后果),后來yj在rhel上裝了個xfce桌面環(huán)境(yj果然是見多識廣,佩服),終于把問題解決了,當時已經是23號早上接近4點,由于自己的錯誤讓yj沒睡好覺,致以誠摯的歉意。
關于致謝
上面寫的差不多是最近工作的一個大致輪廓,細節(jié)上的問題不知道發(fā)生了多少,之所以沒寫成技術文檔,介紹什么問題應該怎么解決,是因為我感覺這段時間收獲的不只是技術,我想把當時的一些感受也記錄下來。以上很多工作我都只是一個輔助,更確切的說是扮演著學習者的角色,主要的工作由師兄yj,fyf,師姐cj,lx們完成的,還有實驗室研一的xdjm的努力。非常感謝他們的幫助,希望我們以后的學習工作會更加愉快。
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/87570/showart_2060517.html |
|