2012年7月24日 星期二

[KFS](KosmosFS) 安裝方法一

近來接獲一個任務,想要建置一套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同時在執行









沒有留言:

張貼留言

文章分類