TFS(Taobao File System)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器 集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化了文件的访问流程,一定程度上为TFS提供了良好的读写性能。
TFS文件系统的安装说明
安装方法
准备工作
检查服务器是否能正常DNS解析,目的是正常解析域名,可以进行yum更新。
如果你的服务器DNS解析正常,可跳过此步。
CentOS修改DNS方法:(修改后可即时生效,重启后同样有效)
修改对应网卡的DNS的配置文件
# vi /etc/resolv.conf
修改以下内容
nameserver 8.8.8.8 #google域名服务器
nameserver 8.8.4.4 #google域名服务器
验证automake是否安装rpm -qa |grep automake 结果:已安装
验证autoconfig是否安装 /usr/bin/autoconf -V 结果:已安装
查看以安装的rpm包:rpm -qa|grep 包名
rpm -qa|grep libuuid
rpm -qa|grep zlib-devel
rpm -qa|grep mysql-devel
如果你使用RedHat5.x和Centos 5.x会找不到libuuid-devel包,请看下面。
RedHat5.x和Centos 5.x 安装: yum install uuidd
RedHat6.x和Centos 6.x 安装: yum install libuuid-devel
安装其它支持包: yum install libtool zlib-devel
安装ext4格式工具
[root@locatfs local]# yum install e4fsprogs e4fsprogs-devel
加载ext4模块,让系统支持ext4文件系统
[root@locatfs local]# modprobe ext4
说明:
1、TSF使用ext3文件系统,可以工作。
2、TSF的数据盘,只使用一个文件夹,可以工作,研究时不能分区格盘时可以这么做。
安装tb-common-utils
tb-common-utils是淘宝开发使用的一个公共库
tbsys是对操作系统服务的封装,tbnet则提供了网络框架。 tbnet和tbsys被作为tb-common-utils被开源了,可以访问 http://code.taobao.org/trac/tb-common-utils/wiki
TFS依赖于底层开发包tbnet。tb-common-utils里面含有tbsys和tbnet
首先编译安装tblib(tb-common-utils),这里我安装在和tfs同一个路径。
(http://code.taobao.org/svn/tb-common-utils/trunk/ tb-common-utils)
gtest库是单元测试框架,下面安装安装gtest
自行上网下载gtest, (http://code.google.com/p/googletest/downloads/list)(这个需要FQ,如果没有的话请使用链接
新建一个下载目录,并进入这个目录。
wget http://googletest.googlecode.com/files/gtest-1.6.0.zip
[root@locatfs local]# unzip gtest-1.6.0.zip
[root@locatfs local]# cd gtest-1.6.0
[root@locatfs local]# ./configure
[root@locatfs local]# make
[root@locatfs local]# cd make/
[root@locatfs local]# make
[root@locatfs local]# ./sample1_unittest
安装tb-common-utils
新建一个下载目录,并进入这个目录。下载源码:
[root@locatfs local]# svn checkout http://code.taobao.org/svn/tb-common-utils/trunk/ tb-common-utils
编译和安装tbnet, tbsys库
指定环境变量 TBLIB_ROOT为需要安装的目录。这个环境变量在后续tfs的编译安装中仍旧会被使用到. 比如要安装到当前用户的lib目录下, 则指定 export TBLIB_ROOT=”/home/xxxx/lib”
ps:建议将这行命令直接写入~/.bash_profile,然后执行“. ~/.bash_profile”
修改:
[root@locatfs local]# vi /etc/profile
添加:(计划安装在/usr/local/tb/lib目录)
export TBLIB_ROOT=/usr/local/tb/lib
生效:
[root@locatfs local]# source /etc/profile
进入tb-common-utils文件夹, 执行build.sh进行安装.
[root@locatfs local]# cd tb-common-utils/
[root@locatfs local]# chmod +x *.sh
[root@locatfs local]# ./build.sh
安装完成后,在TBLIB_ROOT表示的目录(/usr/local/tb/lib),应该可以看到include、lib 两个目录。
第8步 编译安装TFS
编译安装tfs (安装到 /usr/local/tfs目录)
[root@locatfs local]# svn checkout http://code.taobao.org/svn/tfs/tags/release-2.2.10 tfs-2.2.10 (这个编译成功了)
[root@locatfs local]# svn checkout http://code.taobao.org/svn/tfs/trunk/ tfs (这个编译不成功)
进入 tfs 目录
[root@locatfs local]# cd tfs/
[root@locatfs local]# chmod +x *.sh
[root@locatfs local]# ./build.sh init
[root@locatfs local]# ./configure –prefix=/usr/local/tfs –without-tcmalloc
[root@locatfs local]# make
[root@locatfs local]# make install
#如果提示找不到/usr/local/tfs/scripts/cs_sync
# 把tfs下的cs_sync.sh复制成cs_sync 执行:cp -a ./scripts/cs_sync.sh /root/tfs_bin/scripts/cs_sync
如果出错:checking for tc_cfree in -ltcmalloc… no
这是因为后面的tfs版本使用tcmalloc库了
可以在config时加–without-tcmalloc参数,重新编译,或者装tcmalloc库。我试过前者,是可以编译的。
TCMalloc(Thread-Caching Malloc)是google开发的开源工具
与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高,可以在很大程度上提高服务器在高并发情况下的性能,降低系统负载。
这个模块可以用来让MySQL在高并发下内存占用更加稳定。
参考:http://blog.chinaunix.net/space.php?uid=10449864&do=blog&id=2956849
make完后,如果有类似以下信息,表示编译不成功,如果没有报错,说明安装成功
我make成功了,make install也成功了。到这里本文结束了。
make[3]: *** [read_block_prefix] Error 1
make[3]: Leaving directory `/tmp/tfs/src/tools/dataserver'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/tmp/tfs/src/tools'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/tmp/tfs/src'
make: *** [all-recursive] Error 1
官网
http://code.taobao.org/p/tfs/wiki/index/
淘宝TFS文件系统配置
http://1008305.blog.51cto.com/998305/768258
淘宝TFS分布式文件系统亲测
http://gdcsy.blog.163.com/blog/static/12734360920125624859906/
TFS Nginx模块实现
http://wenku.baidu.com/view/0d3007d4240c844769eaee58.html
nginx-tfs-module
http://code.google.com/p/nginx-tfs-module/
TFS Restful 接口测试总结分享
http://100continue.iteye.com/blog/1456390
redhat 6.3下编译淘宝tfs
http://my.oschina.net/beiyou/blog/76129
淘宝核心系统团队博客
http://rdc.taobao.com/blog/cs/?tag=tfs
淘宝网Nginx定制开发实践指南
http://wenku.baidu.com/view/010a212ecfc789eb172dc80a.html
淘宝海量图片系统
http://wenku.baidu.com/view/cc597ef8941ea76e58fa04a5.html
配置dataserver、分区、 挂载数据盘
目前的情况,tfs安装在/usr/local/tfs/
在 /usr/local/tfs/conf/目录,共有三个文件需要配置:ns.conf、ads.conf和ds.conf
各个文件功能
ns.conf用于配置nameserver,
ds.conf用于配置dataserver,
ads.conf为可选配置文件,用于配置nameserver和dataserver地址信息,可用于快速启动ns和ds。
rc.conf为可选配置文件,用于配置rcserver相关信息,主要适用于集群多,应用多的用户,可实现应用资源和集群资源的管理。
meta.conf为可选配置文件,用于配置metaserver相关信息,主要用于自定义文件名功能。
rs.conf为可选配置文件,用于配置rootserver相关信息,主要用于自定义文件名功能。
ds.conf 中注意修改的项目
public->log_level=debug #日志文件的级别
public->port = 9998 #监听端口
public->work_dir=/usr/local/tfs #工作目录
public->dev_name= eth0 #网络设备
public->ip_addr = 192.168.146.128 #本机IP地址(vip)
dataserver->ip_addr = 192.168.146.128 #NameServer配置HA时请设置为vip,没配置HA时请设置为主ns的ip
dataserver->ip_addr_list = 192.168.146.128|192.168.146.129 #!nameserver IP地址列表(master, salve的ip地址,只能以'|'分隔)
dataserver->port = 8108 #!NameServer 监听的端口, 1024 ~ 55535
dataserver->mount_name = /data/tfs #mount路径
dataserver->mount_maxsize = 141000000 #mount 时磁盘的大小, 单位(KB),TFS将使用这么多的空间134G
dataserver->block_max_size = 67108864 #block 最大size
dataserver->mainblock_size = 67108864 #每个数据存储块的大小
dataserver->extblock_size = 8388608 #扩展块的大小, 单位(字节)
ds.conf 内容 (其中有中文,要保存为UTF-8,不带标签)
[public]
#日志文件的size,default 1GB
log_size=1073741824
#保留日志文件的个数,default 64
log_num = 64
#日志文件的级别, default info,线上使用建议设为info,调试设为debug
#dubug级日志量会很大
log_level=debug
#main queue size default 10240
#工作队列size, default 10240
task_max_queue_size = 10240
#listen port
#监听端口, 1024 ~ 65535
port = 9998
#work directoy
#工作目录
work_dir=/usr/local/tfs
#device name
#网络设备
dev_name= eth0
#work thread count default 4
#工作线程池 default 4
thread_count = 4
#ip addr
#本机IP地址(vip)
ip_addr = 192.168.119.217
[dataserver]
#NameServer ip addr(vip)
#!NameServer vip地址
#NameServer配置HA时请设置为vip,没配置HA时请设置为主ns的ip
ip_addr = 192.168.119.145
#!nameserver IP地址列表(master, salve的ip地址,只能以'|'分隔)
#如果没有salve,第二个ip随便写一个
ip_addr_list = 192.168.119.145|192.168.119.147
#nameserver port
#!NameServer 监听的端口, 1024 ~ 55535
port = 8108
#备集群NameServer的vip地址, 没有搭建主副集群的可以不用配置此项
#slave_nsip = 192.168.0.2:8108
#无效配置,直接加到slave_nsip项即可
#slave_nsport = 8108
#heart interval time(seconds)
#dataserver 与 nameserver心跳间隔时间, 单位(秒), default: 2
heart_interval = 2
check_interval = 2
#datafile失效时间, 单位(秒), default: 90
#expire_datafile_time = 90
#拷贝一个Block超时时间, 单位(秒), default: 180
#expire_clonedblock_time = 180
#压缩一个Block超时时间, 单位(秒), default: 600
#expire_compactblock_time = 600
#复制Block线程池的大小, default: 2
replicate_threadcount = 2
#是否写同步日志, defalut: 1
#write_sync_flag = 1
#block 最大size
block_max_size = 7549747
#定时dump统计信息的间隔时间, 单位(秒), default: 60
dump_visit_stat_interval = 60
#io操作的阀值, 超过此值时, 会警告
#max_io_warning_time = 0
#备件类型, 1: tfs, 2: nfs
backup_type = 1
#备件路径
backup_path = /data/tfs
#最大datafile值, default: 50
#max_data_file_nums = 50
#crc error的最大个数
#max_crc_error_nums = 4
#eio error的最大个数
#max_eio_error_nums_ = 6
#超时block检测时间, 单位(秒)
#expire_checkblock_time = 86000
#cpu使用率
#max_cpu_usage = 60
#dump 统计信息的间隔时间, 单位(微秒)
#dump_stat_info_interval = 60000000
#mount路径
mount_name = /data/tfs
#mount 时磁盘的大小, 单位(KB),不要大过文件系统实际剩余空间
#最大的挂载空间,如果你的/data/tfs1有1T,而设置了4G ,那只有4G的块可用空间,剩下的被浪费。
#120G ,原来分134G,存储区预分配时报错了
mount_maxsize = 125829120
#文件系统类型: 0: no initialize, 1: ext4, 2: ext3 posix fallocate, 3: ext3 ftruncate
base_filesystem_type = 1
#超级块存存储的保留位置,default: 0
superblock_reserve = 0
#平均文件的大小, 单位(字节)
avg_file_size = 40960
#主块的大小, 单位(字节)
#每个数据存储块的大小
mainblock_size = 7549747
#扩展块的大小, 单位(字节)
extblock_size = 419430
#主块与扩展的比例
block_ratio = 0.5
#hash桶的比例
hash_slot_ratio = 0.5
ds_thread_count = 4
#访问控制ip mask, 可选
#access_control_ipmask = 192.168.0.1
#访问控制文件路径, 可选
#access_control_file = /home/xxxxx/xxxxxx/tfs/control.file
挂数据盘,一台服务器,可以挂载多块数据盘。
查看硬盘
fdisk -l 发现本台服务器上有5块146G的磁盘,第一块是系统盘。其它4块可以做数据盘
Disk /dev/sda: 146.6 GB
Disk /dev/sdb: 146.6 GB
Disk /dev/sdc: 146.6 GB
Disk /dev/sdd: 146.6 GB
Disk /dev/sde: 146.6 GB
umount
分区,格式化之前,如果已挂载,要先反挂载
umount /dev/sdb1
umount /dev/sdc1
umount /dev/sdd1
umount /dev/sde1
分区
对数据盘进行分区,一块盘分一个区就行。
执行“fdisk /dev/sdb”命令,对数据盘进行分区;
根据提示,依次输入“n”,“p”“1”,两次回车,“wq”,分区就开始了,很快就会完成。
fdisk /dev/sdb
fdisk /dev/sdc
fdisk /dev/sdd
fdisk /dev/sde
格式化
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdc1
mkfs.ext4 /dev/sdd1
mkfs.ext4 /dev/sde1
挂载
建好目录,第一块磁盘就挂载在第一个目录上。目录数据取决于你磁盘的数量。
mkdir /data/tfs1
mkdir /data/tfs2
mkdir /data/tfs3
mkdir /data/tfs4
mount /dev/sdb1 /data/tfs1
mount /dev/sdc1 /data/tfs2
mount /dev/sdd1 /data/tfs3
mount /dev/sde1 /data/tfs4
加入启动时自动挂载
设置开机自动挂载
[root@loctfs scripts]# vi /etc/fstab
加入以下信息
/dev/sdb1 /data/tfs1 ext4 defaults 1 2
/dev/sdc1 /data/tfs2 ext4 defaults 1 2
/dev/sdd1 /data/tfs3 ext4 defaults 1 2
/dev/sde1 /data/tfs4 ext4 defaults 1 2
重启系统
查看mount情况
![](http://7xiur2.com1.z0.glb.clouddn.com/0593.png)
存储区预分配
注意:挂载目录是/data/tfs1至/data/tfs(i),其中i为磁盘号。
而ds.conf配置文件中的配置 mount_name = /data/tfs 没有加(i)
执行scripts下的stfs format n (n为挂载点的序号,具体用法见stfs的Usage)。例如stfs format 2,4-6 则会对/data/tfs2,
/data/tfs4,/data/tfs5,/data/tfs6,进行预分配。运行完后会在生成/data/tfs2, /data/tfs4,/data/tfs5,/data/tfs6下预先创建主块,扩展块及相应的统计信息。
[root@locname conf]# cd /usr/local/tfs/scripts
[root@locname scripts]# ./stfs format 1-4 //分配第1,2,3,4个存储区
![](http://7xiur2.com1.z0.glb.clouddn.com/0594.png)
运行data server
有两种方法:
1)通过adminserver来启动dataserver(推荐): 执行scripts下的./tfs admin_ds
2)直接启动dataserver,执行scripts下的./tfs start_ds 2,4-6, 则会启动dataserver2,dataserver4,dataserver5,dataserver6
目前我们没有配置adminserver的ads.conf, 我们使用方法2来启动。
cd /usr/local/tfs/scripts
./tfs start_ds 1-4
![](http://7xiur2.com1.z0.glb.clouddn.com/0595.png)
我们一台服务器上启动了4个进程
![](http://7xiur2.com1.z0.glb.clouddn.com/0596.png)
停止: ./tfs stop_ds 1-4
配置nameserver
ns.conf 中注意修改的项目
public->log_level=debug #日志文件的级别
public->port = 8108 #nameserver监听端口
public->work_dir=/usr/local/tfs #工作目录,也就是tfs的安装目录
public->dev_name= eth0 #网络设备,即通信网卡,一般用内网
public->ip_addr = 192.168.119.145 #本机IP地址(vip),配置ha时为vip,没配置可以为主ns的ip
nameserver->ip_addr_list = 192.168.119.145|192.168.119.147 #nameserver IP地址列表(master, salve的ip地址,只能以’|’分隔)
nameserver->block_max_size = 67108864 #Block size的最大值, 单位(字节),必须 >= dataserver的mainblock_size,推荐设置一致。
nameserver->max_replication = 3 #Block 最大备份数, default: 2,单台dataserver时,需要配置为1
nameserver->min_replication = 3 #Block 最小备份数, default: 2,#单台dataserver时,需要配置为1
nameserver->cluster_id = 1 # 集群号
ns.conf 内容 (其中有中文,要保存为UTF-8,不带标签)
[public]
#log file size default 1GB
#日志文件的size,默认 1GB
log_size=1073741824
#保留日志文件的个数,默认 64
log_num = 64
#log file level default debug
#日志文件的级别, default info,线上使用建议设为info,调试设为debug
#dubug级日志量会很大
log_level=debug
#main queue size default 10240
#工作队列size, 默认 10240
task_max_queue_size = 10240
#listen port
#nameserver监听端口
port = 8108
#work directoy
#工作目录,也就是tfs的安装目录
work_dir=/usr/local/tfs
#device name
#网络设备,即通信网卡,一般用内网
dev_name= eth0
#work thread count default 4
#工作线程池 default 4
thread_count = 4
#ip addr(vip)
#本机IP地址(vip),配置ha时为vip,没配置可以为主ns的ip
ip_addr = 192.168.119.145
[nameserver]
#系统保护时间,单位(秒), default: 300
#保护时间内不进行任何操作,包括添加block等
safe_mode_time = 300
#nameserver IP地址列表(master, salve的ip地址,只能以'|'分隔)
#单台nameserver时,另一个ip配置为无效ip即可
ip_addr_list = 192.168.119.145|192.168.119.147
#Ip地址 mask
#用于区分dataserver所在的子网,选择不同子网的dataserver备份数据
group_mask = 255.255.255.255
#Block size的最大值, 单位(字节)
#必须 >= dataserver的mainblock_size,推荐设置一致。
block_max_size = 83886080
#Block 最大备份数, default: 2,单台dataserver时,需要配置为1
max_replication = 3
#Block 最小备份数, default: 2,#单台dataserver时,需要配置为1
min_replication = 3
#DataServer 容量使用的百分比, default: 98
use_capacity_ratio = 98
#Block使用的百分比, default: 95
block_max_use_ratio = 98
#heart interval time(seconds)
#Dataserver 与 nameserver 的心跳时间, 单位(秒), default: 2
heart_interval = 2
# object dead max time(seconds) default
# object 死亡的最大时间, 单位(秒), default: 86400
object_dead_max_time = 3600
# cluster id defalut 1
# 集群号
cluster_id = 1
# block lost, replicate ratio
# Block当前备份数与最大备份数百分比,如果大于这个百分比,就开始复制
replicate_ratio_ = 50
#每个DataServer 主可写块的大小, default: 3
max_write_filecount = 16
#dataserver 与 nameserver 的心跳线程池的大小, default: 2
heart_thread_count = 2
#dataserver 与 nameserver 的心跳工作队列的大小, default: 10
heart_max_queue_size = 10
#replicate block wait time
#block 缺失备份时, 需要等待多长时间才进行复制, 单位(秒), default: 240
repl_max_time = 60
#block进行压缩的比例, block 删除的文件的比例达到这个值时进行压缩
compact_delete_ratio = 15
#block进行压缩时, dataserver的最大负载,超出这个值dataserver,不进行压缩
compact_max_load = 200
# object 死亡的最大时间, 单位(秒), default: 86400
object_dead_max_time = 86400
# object 清理的时间, 单位(秒), default: 300
object_clear_max_time = 300
#nameserver上出现租约等待时, 阻塞线程最大个数, 这个值最好是工作线程的一半
max_wait_write_lease = 15
#租约删除的最长时间, 单位(小时), default: 1
lease_expired_time = 3
#最大租约超时时间
max_lease_timeout = 3000
#清理租约的阀值, default: 102400
cleanup_lease_threshold = 102400
#创建计划的间隔时间, 单位(秒), default: 30
build_plan_interval = 10
#计划超时时间, 单位(秒), default: 120
run_plan_expire_interval = 120
#创建计划的百分比, 计划数量 = dataserver 数量 * build_plan_ratio
build_plan_ratio = 25
#定时dump统计信息的间隔时间, 单位(微秒), default: 60000000
dump_stat_info_interval = 60000000
#创建计划等待时间, 主要用有很多紧急复制时,单位(秒), default: 2
build_plan_default_wait_time = 2
#负载均衡时block相关的个数(这个参数有点问题, 以后会改成百分比), default: 5
balance_max_diff_block_num = 5
#每次新增Block的个数, default: 3
add_primary_block_count = 3
#存储block桶的个数, default: 32
block_chunk_num = 32
#每个任务处理的预期时间, 单位(微秒), default: 200
task_percent_sec_size = 200
#每个任务队列的最大size
task_max_queue_size = 10000
#同步日志缓冲区slot的大小, 超出这个值会写入磁盘, default: 1
oplog_sync_max_slots_num = 1024
#同步日志线程池的大小, default: 1
oplog_sync_thread_num = 1
启动nameserver
执行scripts目录下的tfs
/usr/local/tfs/scripts/tfs start_ns
查看监听端口:netstat -ltnp
停止nameserver
/usr/local/tfs/scripts/tfs stop_ns
验证
[root@localhost scripts]# netstat -tnlppa |grep 147
![](http://7xiur2.com1.z0.glb.clouddn.com/0597.png)
列出dataserver的block块
首先保证服务已经全部启动!
确认防火墙没有阻止到连接!
查看dataserver连接情况:
在nameserver端执行ssm命令查看检查到的dataserver的一些基本情况。
/usr/local/tfs/bin/ssm -s 192.168.119.147:8108 (要使用主ns的IP与端口,请注意根据实际情况修改)
server -b \随即列出dataserver的block块
![](http://7xiur2.com1.z0.glb.clouddn.com/0598.png)
server -w \随机列出dataserver的可写块
machine -a \列出dataserver的使用报道。
![](http://7xiur2.com1.z0.glb.clouddn.com/0599.png)
这里需要注意如果用server -b 、-w后面的BLOCK数字,如果是0,说明没有可写块。检测ns ads ds的配置文件,包括备份个数、主块大小知否一致.
如果看到上面的信息,那基本没问题了。
用tfstool上传一张图片
客户端首先向nameserver发起写请求,nameserver需要根据dataserver上的可写块,容量和负载加权平均来选择一个可写的 block。并且在该block所在的多个dataserver中选择一个作为写入的master,这个选择过程也需要根据dataserver的负载以 及当前作为master的次数来计算,使得每个dataserver作为master的机会均等。master一经选定,除非master宕机,不会更 换,一旦master宕机,需要在剩余的dataserver中选择新的master。返回一个dataserver列表。
客户端向master dataserver开始数据写入操作。master server将数据传输为其他的dataserver节点,只有当所有dataserver节点写入均成功时,master server才会向nameserver和客户端返回操作成功的信息。“
也就是说客户端发起一个请求,nameserver先根据dataserver的 容量和负载 来选择一个dataserver来做为所有dataserver的master(除非master宕机,不会更换,宕机则自动重新选择)然后根据ns.conf的配置的备份数全部写入,才向nameserver和客户端返回操作成功信息。
/usr/local/tfs/bin/tfstool -s 192.168.119.147:8108 (这是备ns,不是主,还未配置HA呢,使用它的上传失败了)
/usr/local/tfs/bin/tfstool -s 192.168.119.145:8108 (这是主ns ,请注意根据实际情况修改)
![](http://7xiur2.com1.z0.glb.clouddn.com/0600.png)
这里我使用put上传/opt/666.jpg这张图。TFS目前限制了文件大小为2M,适合于一些小于2M数 据的存放。终端默认上传命令put ,超过2M用putl,回车后会返回一大堆字符,注意看最后一行是fail还是success,如果是fail,请检测下配置文件、端口等。如果是 success则说明已经上传上去。
上传666.jpg大小 是58407字节
![](http://7xiur2.com1.z0.glb.clouddn.com/0601.png)
可以看到 blockid=349,size=58407,ip=192.168.119.214:9998
查349这个块的信息。
在ns、ds中随便找一台机器,执行:
/usr/local/tfs/bin/ds_client -d 192.168.119.214:9998
![](http://7xiur2.com1.z0.glb.clouddn.com/0602.png)
可以看到块349中有一个文件,文件名是:T0oRJTByJT1RCvBVdK
读最文件
read_file_data 349 1 /opt/777/jpg
![](http://7xiur2.com1.z0.glb.clouddn.com/0603.png)
成功了,到 /opt/777/jpg,去看一看文件。
JavaClient使用经验
TFS Java客户端的说明
tfs-client-java版本选择:
tfs-client-java的版本有:
release-2.0.0/
tfs-with-large-2.1.1/
tfs-client-java-2.1.3/
release-2.2.2/
release-2.2.3/
release-2.2.4/
release-2.2.6/
最终我选用了tfs-client-java-2.1.3/ 版本,因为最高的2.2.x版本,工作时必需要与rcserver通信。
我目前不需要rcserver所有没有安装rcserver,所以使用2.1.3版本。
检出
svn checkout http://code.taobao.org/svn/tfs-client-java/tags/release-2.2.6/
svn checkout http://code.taobao.org/svn/tfs-client-java/tfs-client-java-2.1.3/
依赖包说明
common-tair.jar
下载地址:http://code.taobao.org/p/tair-client-java/wiki/index/
可以下载编译好的 tair-client-2.3.1.jar ,也可以下载源码自己编译。
common-monitor.jar
tfs-client-java 2.1.3不需要common-monitor.jar包,但2.2.x以后需要common-monitor.jar。
TMD,真的没找到这个common-monitor.jar包。分析tfs-client-java 2.2.x源码,只有一处记日志的地方需要使用它的,注释这段代码。
tfs-client-java源码中还有一处:
String tfsFileName …..
if (tfsFileName != null && !tfsFileName.isEmpty())
找不到isEmpty()方法,修改一下,就OK了.
使用tfs-client-java 访问TFS集群
TFS 2.2.10 , 1台NameServer,4台DataServer,每台4块SAS数据盘, 30并发以上写入文件时(10并发时也有少量报错),有较多的报错。压力越大,报错的次数越多。
DataServer上的日志内容大体如下,我只记了error级别的日志。
[2012-11-29 18:14:44] ERROR check_block_version (index_handle.cpp:360) [1113774400] remote version is larger, set block version. blockid: 5367, remote version: 674, local version: 673
[2012-11-29 18:14:44] ERROR check_block_version (index_handle.cpp:360) [1176713536] remote version is larger, set block version. blockid: 3796, remote version: 706, local version: 705
[2012-11-29 18:14:44] ERROR check_block_version (index_handle.cpp:360) [1176713536] remote version is larger, set block version. blockid: 4651, remote version: 675, local version: 674
[2012-11-29 18:14:44] ERROR check_block_version (index_handle.cpp:360) [1155733824] remote version is larger, set block version. blockid: 5153, remote version: 634, local version: 633
后来重新部署了TFS 2.0.4,不再报上面的错误了,情况有所好转。但报了其它错误数量不多。