TFS(Taobao File System)完整部署文檔

一、測試環境準備

拓撲:

wKiom1Yt246Q4-ChAADLwkZJUo0546.jpg

服務器NS

系統:CentOS release 5.8 (Final)(Kernel:2.6.18-308.el5)

IP:192.168.0.250

硬盤:1塊硬盤硬盤(sda)

服務器DS1

系統:CentOS release 5.8 (Final)(Kernel:2.6.18-308.el5)

IP:192.168.0.251

硬盤:3塊硬盤(sda、sdb、sdc)

服務器DS2

系統:CentOS release 5.8 (Final)(Kernel:2.6.18-308.el5)

IP:192.168.0.252

硬盤:3塊硬盤(sda、sdb、sdc)

注:以上系統以最少化安裝,無需安裝任何組件,且系統最佳兼容爲GCC4.1.2

二、獲取並安裝TFS

在NA、DS1、DS2上全部安裝,如需測試,在客戶端也可以裝一個(注:以下步驟三臺NS、DS1、DS2服務器都要安裝)

1、安裝依賴包:不同LINUX系統有不同的依賴包環境,建議環境與文檔一致才能保證不走彎路。

獲取官方文檔:http://tfs.taobao.org/

                      http://blog.yunnotes.net/index.php/category/tfs/


yum install -y automake.noarch libtool.x86_64 readline-devel.x86_64 zlib-devel.x86_64     

此以依賴包是官方定義的安裝包,這裏不涉及mysql,所以不安裝mysql-devel.                                  yum -y install subversion                                                                        

默認centos 5.8不集成svn客戶端,這裏需要安裝一下,方便獲取TFS官方軟件

yum -y install gcc*                                                                      

tb-common-utils所需要的依賴包

yum -y install ncurses ncurses-devel                                               

tfs需要的另一個依賴包


2、安裝tb-common-utils:TFS使用tb-common-utils軟件包,tb-common-utils包含淘寶使用的基礎系統庫tbsys和網絡庫tbnet兩個組件。

安裝tb-common-utils前需要設置環境變量TBLIB_ROOT,tbsys和tbnet將會被安裝TBLIB_ROOT對應的路徑(必須是絕對路徑)下,TFS會在這個路徑下查找tbsys、tbnet頭文件和庫。


下例爲設置TBLIB_ROOT環境變量:

vim /etc/profile                           

編輯profile文件

export TBLIB_ROOT=/home/tb-common-utils  

添加/home/tb-common-utils,且一定是絕對路徑,而且一定要寫準確你的tb-common-utils一定存在/home目錄下

source /etc/profile                          

刷新環境變量


獲取tb-common-utils源碼並安裝

[root@Test-2 home]# svn co -r 18 http://code.taobao.org/svn/tb-common-utils/trunk tb-common-utils   

注意: 這裏不要checkout最新版本,version18以後的修改導致部分接口不能前向兼容。

[root@Test-2 home]# cd tb-common-utils/                                                    

[root@Test-2 tb-common-utils]# sh build.sh                                                 

直接安裝

[root@Test-2 tb-common-utils]# echo $?


3、安裝TFS(Taobao File System)


[root@Test-2 home]# svn co http://code.taobao.org/svn/tfs/branches/dev_for_outer_users tfs 

獲取nfs

[root@Test-2 tfs]# cd tfs/  

[root@Test-2 tfs]# sh build.sh init                                                        

[root@Test-2 tfs]# ./configure --prefix=/app/tfs --without-tcmalloc --with-release         

參數請看備註1

[root@Test-2 tfs]# make 

[root@Test-2 tfs]# make install


備註1:--prefix 指定tfs安裝路徑,默認會被安裝到~/tfs_bin目錄

           --with-release 指定按release版本的參數進行編譯,如果不指定這個參數,則會按開發版本比較             嚴格的參數編譯,包含-Werror參數,所有的警告都會被當錯誤,在高版本gcc下會導致項目編               譯不過,很多開源用戶反饋  的編譯問題都跟這個有關,因爲gcc高版本對代碼的檢查越來越嚴               格,淘寶內部使用的gcc版本是gcc-4.1.2。

至此,TFS已經安裝成功了,你可以開始部署TFS服務。

三、部署TFS(Taobao File System)

在成功安裝TFS之後,在你的安裝目錄(默認爲~/tfs_bin),包含幾個子目錄bin、conf、include、lib、logs、script等。

bin:包含tfs所有的可執行程序文件,如nameserver(NS)、dataserver(DS)、tfstool。

conf:包含tfs的配置文件,如NS的配置文件ns.conf,DS的配置文件ds.conf。

include:包含TFS客戶端庫相關的頭文件,應用程序使用TFS需要包含這些頭文件。

lib: 包含TFS客戶端的靜/動態庫,應用程序使用TFS需要連接libtfsclient。

logs:用於存儲TFS運行過程中的日誌。

script:包含tfs常用的一些運維腳本,如stfs用於格式化DS, tfs啓動/停止NS、DS。

~/tfs_bin/conf目錄下包含TFS的配置文件模板,在部署前需要根據環境修改配置文件,下面對NS,DS一些關鍵的配置項進行說明,所有配置項使用key=value的形式進行配置,每行一項,在行首加#可直接註釋配置項使之不生效;使用者應該根據實際情況,修改conf/ns.conf、conf/ds.conf這兩個配置文件,本次我的安裝中,安裝目錄conf下沒有這些.conf結尾的配置文件。

1、安裝NS(NameServer)

安裝過程中如果報錯,請參考FAQ,大部分原因可能是因爲GCC版本的問題。

開始安裝前,先介紹一下ns.conf的相關重要參數,如下:

[public] 通用配置

log_size=1073741824   

日誌文件大小,當日志大小超過這個配置值時,TFS會進行rotate,產生新的日誌文件, 建議不修改

log_num=64  

最多保存的日誌文件個數,超出會刪除最舊的日誌文件,建議不修改

log_level=info  

日誌級別(error,warn,info,debug),生產環境建議info級別, 測試環境建議使用debug級別

task_max_queue_size=10240  server

最大的請求隊列長度,超出會直接丟掉請求包,可根據實際情況修改

work_dir=/home/xxxx/tfs  

TFS工作目錄,強烈建議直接設置爲TFS的安裝目錄,以方便運維管理

dev_name=bond0  

server使用的網卡名,需要修改爲你機器的某個網卡名

ip_addr=xx.xx.xx.201  

server服務的ip地址,必須是dev_name網卡上的IP地址,如果NS配置了HA,此處配置vip

port=8100 

server服務的端口號,根據實際環境修改, 該配置項建議所有DS保持相同

[nameserver] 該區域的配置只針對NS有效

safe_mode_time=360  

seconds NS啓動後的保護時間,在該時間內,NS不會構建任何複製、遷移等任務

ip_addr_list=xx.xx.xx.201|192.168.0.254  

如果使用HA,則配置vip對應的兩個節點的實際ip;如果沒有使用HA,第一項配置與ip_addr相同,第二項可以隨便配置一個無效的地址(如本例中192.168.0.254是無效的IP地址)

group_mask=255.255.255.255  

用於區分機架的子網掩碼,可根據實際網絡環境修改。如果你配置爲255.255.255.255,那麼任意兩個ip不同的機器都被認爲在不同的機架;如果你配置爲255.255.255.0, 那麼192.168.0.x與192.168.0.y將被認爲在同一個機架,依次類推;TFS數據塊的多個副本不能分佈在同一個機架內,以提高可靠性。

max_replication=2  

副本數,機器數必須大於副本數,單機環境測試,只能設置爲1,否則不能存數據

cluster_id=1  

集羣ID,存文件後生成的文件名會包含這個ID,建議不修改

block_max_size=75497472  Bytes

保持與dataserver下mainblock_size配置一致,建議不修改

repl_wait_time=180  

seconds 當NS檢測到block丟失時,等待多長時間開始複製block,可根據實際情況修改

compact_delete_ratio=10  

代表10%,當NS發現block中文件刪除比例超出該比例,開始對block進行壓縮,回收刪除文件的存儲空間

compact_hour_range=1~10  

代表1點~10點,NS只會在1-10點間進行block壓縮,建議設置爲訪問低峯時間段

balance_percent=0.05  

代表5%,負載均衡時,當DS存儲容量超出平均值5%時,就會被選擇爲數據遷移源,低於平均值5%,就會被選爲數據遷移目標

安裝過程

注:請嚴格安裝一的依賴包安裝,否則會報錯。

[root@Qinglin-NS tfs]# cp  -a conf/ns.conf /app/tfs/conf/   

拷貝下載的目錄中的ns.con到安裝目錄下在的/app/tfs/conf中

[root@Qinglin-NS conf]# cd /app/tfs/conf/     

[root@Qinglin-NS conf]# vim ns.conf                           

編輯配置文件

[public]

#work directoy

work_dir=/app/tfs                                            

實際安裝好,且在./configuer中指定的路徑。

#listen port

port = 8100                                                   

默認的監聽端口

#device name

dev_name= eth0                                                

需要被訪問的網卡名稱,

#ip addr(vip) 

ip_addr = 192.168.3.250                                     

本地eth0網卡的ip地址

[nameserver]

safe_mode_time = 360                                          

ip_addr_list = 192.168.3.250|10.0.0.254                      

本次是NameServer,不需要HA,所以第一個IP要是自己本地IP,第二個IP隨便設置一個,且不能是通的網段,否則會出錯

group_mask=255.255.255.255                                    

按照4個255設置即可

2、安裝DS1與DS2(DataServer)

在本例的環境中,192.168.3.251/252上都附帶兩塊沒有使用的磁盤/dev/sdb、/dev/sdc,磁盤空間均爲一塊10G,另一塊10G;TFS採用每個DS進程管理一塊磁盤的方式,也就是說,每個機器上都會運行2個DS進程,分別管理/dev/sdb、/dev/sdc, 並且這兩塊盤應該掛載到/data/disk1、/data/disk2兩個目錄(因爲配置文件中指定mount_path爲/data/disk),啓動DS時指定序號(如1、2)這個DS進程就會加載對應目錄裏的數據(1對應/data/disk1、2對應/data/disk2,依次類推)開始服務。

對每個機器上多個DS進程使用的端口,TFS也做了統一以方便運維,比如DS配置port爲8200,那麼序號爲1的DS進程會在8200端口監聽,序號爲2的DS進程會在8202端口監聽,依次類推,序號爲n的DS在8200 + (n - 1)* 2 號端口上監聽。強烈建議每個DS public下的port項都配置相同的值,這樣根據端口號就能直接換算出DS的序號(序號一旦確定,通過df命令就能確定具體磁盤),對定位問題很方便。

另外,TFS的DS對存儲空間有自己獨特的管理方式,將可用的存儲空間分成多個block進行管理,使用前DS需要先進行format(使用TFS提供的工具),預分配各個block的存儲空間,保證block的存儲空間在磁盤上連續(理論上),從而避免動態分配時產生大量的磁盤碎片,降低服務效率。

在兩臺機器上分別進行如下操作,準備好數據目錄:

(注,DS1和DS2基本相同,但是請注意IP和一些不一樣的參數,這裏不浪費篇幅再寫一次)


[root@Qinglin-DS1]# yum -y install e4fsprogs    

安裝ext4的格式化包,在後面的的格式化中需要用到,默認centos5.8是不帶的

[root@Qinglin-DS1]# fdisk -l                    

檢查自己硬盤是否存在兩塊多餘網卡,sda是系統使用的硬盤,這裏不寫了

Disk /dev/sdb: 10.7 GB, 10737418240 bytes

Disk /dev/sdc: 10.7 GB, 10737418240 bytes

[root@Qinglin-DS1 conf]# fdisk /dev/sdb          

對硬盤的格式化    n是新建分區,p是主要分區,1是第1個分區(且sdb1),wq爲保存

n

p

1

回車

回車

wq

[root@Qinglin-DS1 conf]# fdisk /dev/sdc           

對硬盤的格式化 

n

p

1

回車

回車

wq

[root@Qinglin-DS1 ~]# mkfs.ext4 /dev/sdb1      

格式化sdb1 文件系統爲ext4

[root@Qinglin-DS1 ~]# mkfs.ext4 /dev/sdc1

[root@Qinglin-DS1 ~]# mkdir -p /data/             

創建配置文硬盤掛載默認的路徑

[root@Qinglin-DS1 ~]# mkdir  /data/disk1          

創建掛載sdb1的文件夾,不創建無法掛載

[root@Qinglin-DS1 ~]# mkdir  /data/disk2         

[root@Qinglin-DS1 ~]# mount /dev/sdb1 /data/disk1 

掛載第sdb1 到/data/disk1 目錄下

[root@Qinglin-DS1 ~]# mount /dev/sdc1 /data/disk2  

[root@Qinglin-DS1 ~]# df                           

這塊比較重要,記錄sdb1和sdb2的available中的大小,後面要寫到配置文件中

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda2             18713004   3304476  14442620  19% /

/dev/sda1               101086     12218     83649  13% /boot

tmpfs                   513040         0    513040   0% /dev/shm

/dev/sdb1             10317828    154100   9639612   2% /data/disk1

/dev/sdc1             10317828    154100   9639612   2% /data/disk2

[root@Qinglin-DS1 tfs]# cp conf/ds.conf /app/tfs/conf/ 

移動配置文件到安裝目錄下,與NS一樣

[root@Qinglin-DS1 tfs]# cd /app/tfs/conf/             

[root@Qinglin-DS1 tfs]# vim /app/tfs/conf/ds.conf        

編輯配置文件

[public]

#listen port

port = 8200                                          

本機端口

#work directoy

work_dir=/app/tfs                                       

工作目錄

#device name

dev_name= eth0                                          

eth0爲工作網卡,連接ns

#ip addr 

ip_addr = 192.168.3.251                                  

本地eth0網卡IP

[dataserver]

#nameserver ip addr(vip)

ip_addr = 192.168.3.250                                 

NS的IP,向NS發送信息的地址

ip_addr_list = 192.168.3.250|10.0.0.254                

和NS一致

#nameserver port

port = 8100                                              

NS的端口

mount_name = /data/disk                                  

/data爲掛載的disk1和disk2的目錄,且爲dataserver的存儲目錄

mount_maxsize = 9639612                                  

掛載硬盤的大小,參考上面標黃處

[root@Qinglin-DS1 tfs]# pwd

/app/tfs

[root@Qinglin-DS1 tfs]# ./scripts/stfs format 1-2       

格式化tfs的文件,且爲/data/下的disk1與disk2

注,如果格式化錯誤,請先使用./scripts/stfs clear 1-2,清除硬盤寫的信息。


3、啓動NameServer與DataServer 1/2

啓動順序:先啓動DS,然後啓動NS

啓動DS1/DS2:


DS1:

[root@Qinglin-DS1 tfs]#  ./scripts/tfs start_ds 1-2   ==>1-2代表disk1和disk2

 dataserver 1 is up SUCCESSFULLY pid: 4180 

 dataserver 2 is up SUCCESSFULLY pid: 4185 

DS2:

[root@Qinglin-DS2 tfs]# ./scripts/tfs start_ds 1-2

 dataserver 1 is up SUCCESSFULLY pid: 22174 

 dataserver 2 is up SUCCESSFULLY pid: 22192 

檢查工作:

[root@Qinglin-NS tfs]# ps -ef|grep nameserver       

檢查進程已經啓動

root    29127     1  1 18:50 pts/0    00:01:48 /app/tfs/bin/nameserver -f/app/tfs/conf/ns.conf -d

root     29396  3147  0 20:45 pts/0    00:00:00 grep nameserver

[root@Qinglin-NS tfs]# netstat -lntup|grep nameserver 

檢查端口已經啓動

tcp        0      0 0.0.0.0:8100       0.0.0.0:*    LISTEN      29127/nameserver


啓動NS:


NS:

[root@Qinglin-NS tfs]#  ./scripts/tfs start_ns

nameserver is up SUCCESSFULLY pid: 29127 

[root@Qinglin-DS1 ~]# ps -ef|grep dataserver          

檢查進程啓動,且disk1和disk2都存在

root      4180     1  0 11:56 pts/0    00:00:01 /app/tfs/bin/dataserver -f /app/tfs/conf/ds.conf -d -i 1

root      4185     1  0 11:56 pts/0    00:00:02 /app/tfs/bin/dataserver -f /app/tfs/conf/ds.conf -d -i 2

root      4804  4775  0 13:54 pts/2    00:00:00 grep dataserver

[root@Qinglin-DS1 ~]# netstat -lntup|grep dataserver  

監測各端口已經啓動

tcp        0      0 0.0.0.0:8200                0.0.0.0:*                   LISTEN      4180/dataserver     

tcp        0      0 0.0.0.0:8201                0.0.0.0:*                   LISTEN      4180/dataserver     

tcp        0      0 0.0.0.0:8202                0.0.0.0:*                   LISTEN      4185/dataserver     

tcp        0      0 0.0.0.0:8203                0.0.0.0:*                   LISTEN      4185/dataserver


4、整體測試


[root@Test-2 tfs]# pwd

/app/tfs

[root@Test-2 tfs]# ./bin/ssm -s 192.168.3.250:8100 -i "machine -a"  

檢查是否通過ns獲取到DS的信息

  SERVER_IP     NUMS UCAP  / TCAP =  UR  BLKCNT  LOAD TOTAL_WRITE  TOTAL_READ  LAST_WRITE  LAST_READ  MAX_WRITE   MAX_READ

--------------- ---- ------------------ -------- ---- -----------  ----------  ----------  ---------  --------  ---------

  192.168.3.251     2 17.97G  18.28G  98%     230  10   1.4K     1     0     0     0     0    0     0   0     0   0     0

  192.168.3.252     2 17.89G  18.28G  97%     229  10      0     0  1.4K     1     0     0    0     0   0     0   0     0

Total : 2          4 35.86G  36.56G  98%     459  10   1.4K     1  1.4K     1     0     0    0     0

[root@Test-2 tfs]# ./bin/ssm -s 192.168.3.250:8100 -i "server -m"      

檢查是否生成block             

SERVER_ADDR           CNT MASTER BLOCK

192.168.3.251:8200     58    101   105   116   117   123   128   130   133   139   144

                            150   151   154   157   161   163   164   171   175   183

                            189   191   196   197   199   200   202   207   217   223

                            226   230   231   237   241   242   243   255   256   257

                            263   264   268   270   275   277   285   286   287   294

                            303   310   311   319   320   322   330   331

192.168.3.252:8200     55    111   112   115   118   119   127   129   131   135   140

                            142   146   152   153   165   167   168   173   178   179

                            180   182   190   204   208   209   218   219   220   227

                            232   244   245   251   252   258   261   265   269   278

                            281   288   289   290   292   297   301   302   304   306

                            312   313   315   323   324

192.168.3.251:8202     62    104   106   107   109   113   114   120   124   125   132

                            134   136   137   147   149   156   158   159   162   166

                            169   172   174   192   193   194   195   198   201   203

                            210   215   216   221   222   224   225   228   233   234

                            236   240   246   248   253   260   262   271   273   279

                            280   282   283   295   296   309   314   318   321   325

                            332   334

192.168.3.252:8202     50    102   108   110   121   122   126   138   141   143   145

                            148   155   160   176   177   181   185   186   187   188

                            205   206   211   212   214   229   235   238   239   247

                            249   254   267   272   274   276   284   291   293   298

                            299   300   307   308   316   317   326   327   328   329


5、上傳(PUT)與下載(GET)

上傳PUT:將本地testfile存入tfs, -s 指定nameserver的ip:port。 

如果成功,會打印 put testfile => T1QEBXXDpXXXXXXXXX success. 類似的消息,其中T開頭一串字符是TFS爲這個文件生成的文件名,一共18個字符;要想從TFS取出該文件時,需要指定該文件名。


[root@Test-2 tfs]#./bin/tfstool -s 192.168.3.251:8100    

進入上傳交互式界面

TFS>put /etc/init.d/network                             

上傳/etc/init.d/network文件到Nameserver

put /etc/init.d/network => T1ItETByJT1RCvBVdK success.    

看到succes即完成,且生成一個ID:T1ItETByJT1RCvBVdK,是下載的憑證。


下載GET:從TFS讀取T1QEBXXDpXXXXXXXXX,存儲到本地localfile中;如果成功,會打印fetch T1QEBXXDpXXXXXXXXX => localfile success.類似的消息。


TFS> get T1ItETByJT1RCvBVdK /home/network               

get下載,上傳的id號,下載的路徑和文件名

fetch T1ItETByJT1RCvBVdK => /home/network success.      

提示下載完成

TFS> quit                                               

退出

[root@Test-2 tfs]# ls /home/network                 

檢查路徑是否存在/home/network這個文件

/home/network



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章