一、测试环境准备

拓扑:

TFS(Taobao File System)完整部署文档_第1张图片

服务器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