TFS(Taobao File System)安装办法
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 |
官网
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 #日志文件的级别 |
|
ds.conf 内容 (其中有中文,要保存为UTF-8,不带标签)
[public] |
挂数据盘,一台服务器,可以挂载多块数据盘。
查看硬盘
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 |
我们一台服务器上启动了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] |
启动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/ |
依赖包说明
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 |
后来重新部署了TFS 2.0.4,不再报上面的错误了,情况有所好转。但报了其它错误数量不多。