近來接獲一個任務,想要建置一套Distrubution File System, 在討論結果後,捨棄HDFS而改採KFS,據說他是用c++實現,所以在Support上應該跟我們比較Match(畢竟我們也都用c++),而它能支援c++,Java,以及python的用戶端
在安裝上,初期也吃了不少苦頭,這裡先把第1次安裝成功的過程PO出來,原則上,只是確認服務啟動, 但實際驗證還得後續處理
(1)系統環境準備
1)此次使用的環境,使用為virtual machine來實現
host : CentOS-6.0
kernel: 2.6.32-71.el6.x86_64 #1 SMP
MemTotal: 7891424 kB(/proc/meminfo)
CPU(Quad core) : Intel(R) Core(TM) i3-2130 CPU @ 3.40GHz
HDD: 1TB*2 (LVM ==> 2T)
guest: CentOS-6.0
kernel: 2.6.32-71.el6.x86_64 #1 SMP
MemTotal: 1G
CPU *1
HDD: 100GB
KFS的環境使用virtual machine的NAT環境,也把dhcp打開
guest總共佈建4台,1台metaserver, 3台chunkserver
這4台/etc/hosts設定如下
192.168.65.1 mserver #host's ip
192.168.65.135 metaserver
192.168.65.136 chunkserver1
192.168.65.137 chunkserver2
192.168.65.138 chunkserver3
2)使用kickstart檔來進行初期的部署較容易也較快(4台guest都照此安裝),簡單描述幾個重點
:
selinux --disabled
firewall --disabled
:
bootloader --location=mbr --driveorder=sda --append="rhgb quiet"
:
#在host,我們佈建了vsftpd以及httpd,
#預設在/var/ftp/pub,/var/www/html(soft link to /var/ftp/pub)
install
url --url=http://192.168.65.1/pub
:
clearpart --drives=sda --all --initlabel
part / --asprimary --fstype="ext4" --ondisk=sda --grow --size=1024
part /boot --asprimary --fstype="ext4" --ondisk=sda --size=200
part swap --fstype="swap" --ondisk=sda --recommended
:
#安裝極為陽春,主要到時候才能抓到需要的安裝包,日後製作安裝光碟才好處理
%packages
@core
@server-policy
ftp
%end
#後面就純粹個人覺得方便的設定
%post
echo "----------------------kickstart post-install-----------------------" >> /root/kickstart-cmd.log
ipaddr=`/sbin/ifconfig eth0 | awk -F'[ :]+' '/Bcast/{print $4}'`
gateway=`/sbin/route -n | sed '/^0.0.0.0/!d' | awk '{print $2}'`
netmask=`/sbin/ifconfig eth0 | awk -F'[ :]+' '/Bcast/{print $8}'`
echo "DEVICE=eth0" > /etc/sysconfig/network-scripts/ifcfg-eth0
echo "ONBOOT=yes" >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo "IPADDR=$ipaddr" >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo "NETMASK=$netmask" >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo "GATEWAY=$gateway" >> /etc/sysconfig/network-scripts/ifcfg-eth0
hostname="cent""$(/sbin/ifconfig eth0 | awk -F'[ :]+' '/Bcast/{print $4}' | cut -d '.' -f 4)"
echo "NETWORKING=yes" > /etc/sysconfig/network
echo "NETWORKING_IPV6=no" >> /etc/sysconfig/network
echo "HOSTNAME=$hostname" >> /etc/sysconfig/network
echo "nameserver=168.95.1.1 > /etc/resolv.conf"
echo "/usr/sbin/ntpdate -b time.stdtime.gov.tw;/sbin/hwclock --systohc --utc" >> /etc/rc.local
(2)安裝與設定
1)作業系統安裝完成後,便可以開始KFS的安裝(4台都作一樣安裝)
(A)安裝boost
yum install boost.x86_64 boost-devel.x86_64 -y
(B)安裝gcc/gcc-c++以及 make套件
yum install gcc.x86_64 gcc-c++.x86_64 make.x86_64 -y
(C)安裝cmake(tarball)
cd /usr/local/src
wget
http://www.cmake.org/files/v2.6/cmake-2.6.4.tar.gz
tar -zxvf cmake-2.6.4.tar.gz
cd /usr/local/src/cmake-2.6.4
./bootstrap --prefix=/usr/local
make
make install
(D)安裝log4cpp(tarball)
cd /usr/local/src
wget
http://downloads.sourceforge.net/project/log4cpp/log4cpp-1.0.x%20%28current%29/log4cpp-1.0/log4cpp-1.0.tar.gz
tar zxvf log4cpp-1.0.tar.gz
cd log4cpp-1.0
./configure
make
make install
在make時可能會遇到第一個error
BasicLayout.cpp:37: error: expected constructor, destructor, or type conversion before'< 'token
原因是因為GCC4.4的預設不包含某些程式庫,所以如果要使用這些程式庫的語法時,需要#include。打開src/BasicLayout.cpp,加入如下標示紅斜體字部份
:
#include "PortabilityImpl.hh"
#include < log4cpp /BasicLayout.hh >
#include < log4cpp /Priority.hh >
#include < log4cpp /FactoryParams.hh >
#ifdef LOG4CPP_HAVE_SSTREAM
#include < sstream >
#endif
#include < memory >
namespace log4cpp {
:
再make時可能會遇到第二個error
PatternLayout.cpp:373: error: call of overloaded 'abs(int&)' is ambiguous
這個問題自GCC4.3版以來己經存在,解決方法將原本的abs(int&)取代成如下
component = new FormatModifierComponent(component, std::abs(minWidth), maxWidth, minWidth < 0);
取代如下
component = new FormatModifierComponent(component, minWidth > 0 ? minWidth : -minWidth, maxWidth, minWidth < 0);
如果其他設定沒問題,再make就應該會通過
(E)安裝xfs相關套件
yum install xfsprogs.x86_64 xfsprogs-devel.x86_64 -y
(F)安裝其他剩下套件
yum install expat.x86_64 -y
yum install openssl-devel.x86_64 -y
yum install java-1.6.0-openjdk.x86_64 java-1.6.0-openjdk-devel.x86_64 -y
yum install uuid.x86_64 uuid-devel.x86_64 libuuid.x86_64 libuuid-devel.x86_64 -y
yum install python.x86_64 python-devel.x86_64 -y
yum install ntpdate.x86_64 -y
設定每次開機均進行一次校時,或在排程中加入
vi /etc/rc.local
:
/usr/sbin/ntpdate -b time.stdtime.gov.tw;/sbin/hwclock --systohc --utc
crontab -e
*/1 * * * * *
/usr/sbin/ntpdate -b time.stdtime.gov.tw;/sbin/hwclock --systohc --utc
請注意java相關include的目錄位置
shell>rpm -ql java-1.6.0-openjdk-devel.x86_64
:
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin/wsimport
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/bin/xjc
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/classfile_constants.h
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/jawt.h
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/jdwpTransport.h
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/jni.h
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/jvmti.h
:
(G)安裝KFS(tarball)
在接下來安裝KFS之前,有個注意事項提醒。原本筆者安裝kfs-0.3版,在make(gmake),會遇到error, 發現是KFS舊版寫法(uint64_t的用法問題),後來筆者去下載最新的tarball檔,發現KFS的開發團隊己經改了寫法(改用int),後續的make都解決了,所以以下直接說明新版KFS的安裝
cd /usr/local/
wget http://kosmosfs.googlecode.com/files/kfs-0.5.tar.gz
tar zxvf kfs-0.5.tar.gz
cd kfs-0.5
mkdir build
cd build
vi /usr/local/kfs-0.5/CMakeLists.txt (跳到110行,在緊接set (CMAKE_BUILD_TYPE "Debug")之後,加入以下2行)
set (JAVA_INCLUDE_PATH "
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include")
set (JAVA_INCLUDE_PATH2 "
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include")
cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo /usr/local/kfs-0.5/
gmake
gmake install
上面紅字的部分,就是在rpm -ql java-....查到的include路徑
上述安裝過程就是時間給他,他給你make完成
2)設定
以下設定,也是4台做一模一樣的設定。以下設定,筆者都是在host上設好後,放到ftp目錄,讓4台guest去下載到自己的目錄裡
(A)設定machines.cfg
mkdir /export/kosmix
vi /usr/local/kfs-0.5/scripts/machines.cfg
[metaserver]
node: metaserver
#這裡請注意你的meta server hostname
clusterkey: kfs-test-cluster
rundir: /export/kfsmix/kfs/meta
baseport: 20000
loglevel: INFO
numservers: 3
[chunkserver_defaults]
rundir: /export/kfsmix/kfs/chunk
chunkDir: /export/kfsmix/kfs/chunk/bin/kfschunk
baseport: 30000
space: 3400 G
loglevel: INFO
設定完成後,請確認4台都有這份相同的設定檔
(B)設定machines.txt
vi /usr/local/kfs-0.5/conf/machines.txt
#這裡不用設定meta server
chunkserver1
#這裡請注意你的3台chunk server hostname
chunkserver2
chunkserver3
設定完成後,請確認4台都有這份相同的設定檔
(C) 設定ChunkServer.prp
vi /usr/local/kfs-0.5/conf/ChunkServer.prp
# Configuration for chunk server:
# meta server location
chunkServer.metaServer.hostname = metaserver
#這裡請注意你的meta server hostname
chunkServer.metaServer.port = 30000
# port to open for client connections
chunkServer.clientPort = 22000
# Directory for storing the chunks
chunkServer.chunkDir = ./chunks
chunkServer.logDir = ./logs
# provide 300G of storage space
chunkServer.totalSpace = 300000000000
設定完成後,請確認4台都有這份相同的設定檔(主要是3台chunk server一定要有,筆者就只設定在3台chunk server上而已)
3)同步與啟動
(A)同步作業
這裡的同步作業使用rsync,請在3台的chunk server上都執行以下指令
rsync -av /usr/local/kfs-0.5/ chunkserver1:/usr/local/kfs-0.5/
rsync -av /usr/local/kfs-0.5/ chunkserver2:/usr/local/kfs-0.5/
rsync -av /usr/local/kfs-0.5/ chunkserver3:/usr/local/kfs-0.5/
過程要跑一下,也會要你輸入一堆密碼,想要解決不用輸入密碼的問題,就請上網查一下相關設定方法(password-less ssh),或日後再補充說明
(B)啟動與關閉
啟動前需要先執行一次以下指令
cd /usr/local/kfs-0.5/scripts
python kfssetup.py -f machines.cfg -m ../conf/machines.txt -b ../build -w ../webui
跑完後如果沒有錯誤,接下指令就可以啟動1台meta server以及3台chunk server(在1台上執行即可)
python kfslaunch.py -f machines.cfg -m ../conf/machines.txt -s
注意:最後一個參數是小s。過程會要你輸入一堆密碼
你可以在meta server上觀察到
[root@metaserver scripts]# ps -ef | grep server
root 9727 1 0 13:30 ? 00:00:00 bin/metaserver bin/MetaServer.prp logs/metaserver.log
[root@metaserver scripts]# netstat -tplnu | grep 20000
tcp 0 0 0.0.0.0:20000 0.0.0.0:* LISTEN 9727/metaserver
你可以在chunk server上觀察到
[root@chunkserver2 scripts]# ps -ef | grep server
root 11159 1 0 13:29 ? 00:00:00 bin/chunkserver bin/ChunkServer.prp logs/chunkserver.log
[root@chunkserver2 scripts]# netstat -tplnu | grep 30000
tcp 0 0 0.0.0.0:30000 0.0.0.0:* LISTEN 11159/chunkserver
關閉的方法跟啟動很像,一樣只要在一台執行
python kfslaunch.py -f machines.cfg -m ../conf/machines.txt -S
注意:最後一個參數是大S。過程會要你輸入一堆密碼
後記:之後的處理可以朝(1)全RPM,以利安裝光碟的建置
(2)集中配置各node,方便維護與新增
(3)password-less ssh
參考:
http://www.pginjp.org/modules/newbb/viewtopic.php?topic_id=775
http://now-code.com/archives/118
後記:如果只想裝一台chunkserver + metaserver,可以試著將上述幾個設定修改如下,以下將原本metaserver變成加上chunkserver,獨立一台達成KFS
(1)修改/etc/hosts
192.168.65.1 mserver #host's ip
192.168.65.135 metaserver
192.168.65.135 chunkserver
192.168.65.136 chunkserver1
192.168.65.137 chunkserver2
192.168.65.138 chunkserver3
(2)設定machines.txt
vi /usr/local/kfs-0.5/conf/machines.txt
#這裡不用設定meta server
chunkserver
#只剩1台,而已是chunkserver
(3)設定machines.cfg
vi /usr/local/kfs-0.5/scripts/machines.cfg
[metaserver]
node: metaserver
clusterkey: kfs-test-cluster
rundir: /export/kfsmix/kfs/meta
baseport: 20000
loglevel: INFO
numservers: 1[chunkserver_defaults]
rundir: /export/kfsmix/kfs/chunk
chunkDir: /export/kfsmix/kfs/chunk/bin/kfschunk
baseport: 30000
space: 3 G
loglevel: INFO
(4)同步作業
rsync -av /usr/local/kfs-0.5/ chunkserver:/usr/local/kfs-0.5/
如果(1)password-less ssh沒做,也請補上
(2)如果1台變多台,或系統的server數量有變化,請再上述修改完設定後,再執行一次
python kfssetup.py -f machines.cfg -m ../conf/machines.txt -b ../build -w ../webui
其他就都跟上述一樣, 完成後啟動KFS,可以發現Chunkserver & Metaserver同時在執行