文章目录
  1. 1. 安装方法
  2. 2. 配置dataserver、分区、 挂载数据盘
  3. 3. 配置nameserver
  4. 4. JavaClient使用经验

TFS(Taobao File System)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器 集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化了文件的访问流程,一定程度上为TFS提供了良好的读写性能。

TFS文件系统的安装说明

安装方法

第1步 准备工作
检查服务器是否能正常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)(这个需要翻墙,如果没有的话请使用[链接](http://pan.baidu.com/s/1c0IChVi)

新建一个下载目录,并进入这个目录。
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情况



存储区预分配

注意:挂载目录是/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个存储区



运行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


我们一台服务器上启动了4个进程



停止: ./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


列出dataserver的block块
首先保证服务已经全部启动!
确认防火墙没有阻止到连接!
查看dataserver连接情况:
在nameserver端执行ssm命令查看检查到的dataserver的一些基本情况。
/usr/local/tfs/bin/ssm -s 192.168.119.147:8108 (要使用主ns的IP与端口,请注意根据实际情况修改)
server -b \随即列出dataserver的block块



server -w \随机列出dataserver的可写块

machine -a \列出dataserver的使用报道。



这里需要注意如果用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 ,请注意根据实际情况修改)



这里我使用put上传/opt/666.jpg这张图。TFS目前限制了文件大小为2M,适合于一些小于2M数 据的存放。终端默认上传命令put ,超过2M用putl,回车后会返回一大堆字符,注意看最后一行是fail还是success,如果是fail,请检测下配置文件、端口等。如果是 success则说明已经上传上去。

上传666.jpg大小 是58407字节



可以看到 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



可以看到块349中有一个文件,文件名是:T0oRJTByJT1RCvBVdK

读最文件

read_file_data 349 1 /opt/777/jpg



成功了,到 /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,不再报上面的错误了,情况有所好转。但报了其它错误数量不多。

文章目录
  1. 1. 安装方法
  2. 2. 配置dataserver、分区、 挂载数据盘
  3. 3. 配置nameserver
  4. 4. JavaClient使用经验