一、测试环境准备
拓扑:
服务器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