淘宝分布式文件系统TFS安装配置手册
2014-02-19 11:19
531 查看
TFS文件名的结构TFS的文件名由块号和文件号通过某种对应关系组成,最大长度为18字节。文件名固定以T开始,第二字节为该集群的编号(可以在配置项中指定,取值范围 1~9)。余下的字节由Block ID和File ID通过一定的编码方式得到。文件名由客户端程序进行编码和解码,它映射方式如下图:
![](http://s7.51cto.com/wyfs02/M02/11/99/wKiom1LWTKSRWHiYAACvG_FxW9s003.png)
TFS客户程序在读文件的时候通过将文件名转换为BlockID和FileID信息,然后可以在!NameServer取得该块所在!DataServer信息(如果客户端有该Block与!DataServere的缓存,则直接从缓存中取),然后与!DataServer进行读取操作。TFS写操作数据流TFS系统中,nameserver会保证一个文件有多个副本存储于不同的dataserver上以保证冗余。当由于dataserver服务器宕机或由于其他原因退出系统导致某些文件副本数量下降时,nameserver将会调度新的dataserver节点存储文件备份。同样为了保证数据一致性,当写入一个文件时,只有所有参与的dataserver均写入成功时,该操作才算成功。TFS的写操作数据流图如下所示:
![](http://s7.51cto.com/wyfs02/M01/11/98/wKioL1LWTKvzCrm_AACZTD4ri3E590.png)
客户端首先向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和客户端返回操作成功的信息。获得Block ID和File ID根据TFS文件名解析出Block ID和block中的File ID。获取dataserver地址向nameserver发送查询请求得到Block ID所在的dataserver地址。由于nameserver中维护了block和dataserver的对应关系,所以nameserver能够提供相应的信息。Note: 由于TFS是把大量小文件放在一个block里面,所以TFS的文件复制是基于block的,而且复制出来的block的block id应该是一致的请求文件通过发送Block_ID、File_ID和offset为参数的读请求到对应的dataserver,得到文件内容。dataserver会根据本地记录的信息来得到File ID所在block的偏移量,从而读取到正确的文件内容.
![](http://s7.51cto.com/wyfs02/M00/11/99/wKiom1LWTOGD2xtOAAAvoWQat7I608.jpg)
TFS 在2.0版本增加了一个server, 叫做 rcserver. 这个 server 主要是为了淘宝内部管理使用 TFS 的各个应用. 我们给每个应用分配一个唯一的 AppKey. TFS 客户端使用这个 AppKey 登录到 rcserver, 取得自己应该访问的 TFS 集群信息. 客户端还会定期把自己的一些统计值发送给 rcserver. 具体信息可以参看源码中 doc 目录下的关于 rcserve 的文档。
TFS(Taobao File System)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化了文件的访问流程,一定程度上为TFS提供了良好的读写性能。上面说有太美好了,实际使用起来还是挺周折的。TFS有三个主要大版本:1.x,2.0.x,2.2.x,我先后试用了多个版本,认为2.0.4相对来说 比较稳定,其它版本(2.2.8,2.2.10)问题很多。这话是2012年11月说的,如果以后TFS的新版本稳定了另当别论。TFS文件系统的安装说明 — 注:本文本操作系统是RedHat5.6—- 第1步 准备工作—-检查服务器是否能正常DNS解析,目的是正常解析域名,可以进行yum更新。如果你的服务器DNS解析正常,可跳过此步。CentOS修改DNS方法:(修改后可即时生效,重启后同样有效)修改对应网卡的DNS的配置文件:# vi /etc/resolv.conf
修改以下内容:nameserver 8.8.8.8 #google域名服务器
nameserver 8.8.4.4 #google域名服务器
—- 第2步 准备工作—- RedHat5.6使用centos yum源:由于RedHat的yum在线更新是收费的,我们的RedHat没有注册,不能在线更新下载rpm包。需将RedHat的yum卸载后,重启安装Centos的yum,再配置其他yum源。如果你的服务器yum可正常工作,可跳过此步。具体操作请看: RedHat5.6、6.0使用CentOS yum源—- 第3步 准备工作—-先更新yum:yum update
到这里yum已可以正常工作。后面都需要使用的yum。—- 第4步 准备工作—-RedHat5.x和Centos 5.x使用gcc版本是4.1.2,RedHat6.x和Centos 6.x使用gcc版本是4.4.6,对编译的语法检查更严格,编译TFS给报错。淘宝的tfs官网上要求使用gcc版本是4.1.2。确认gcc版本:gcc -v
结果:以上所有机器返回结果 :gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)如果你使用RedHat6.x和Centos 6.x,就要重新安装低版本的gcc,g++。—- 第5步 升级安装高版本mysql—-TFS要求MySql版本>= 5.1.40,不然编译时报错:checking if MySQL version is >= 5.1.40… no但我的CentOS 5的yum源中最新只有 5.0.95版本,所有使用这个yum源在线安装最高也只能安装5.0.95,换一个yum来解决问题。1.安装配置yum源:wget http://centos.ustc.edu.cn/epel/5/x86_64/epel-release-5-4.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/5/remi/x86_64/remi-release-5-8.el5.remi.noarch.rpm
rpm -ivh *.rpm
2.向以下3个文件尾部追加一个文本(可以不做):echo ‘priority=1′ >> /etc/yum.repos.d/remi.repo
echo ‘priority=1′ >> /etc/yum.repos.d/epel-testing.repo
echo ‘priority=1′ >> /etc/yum.repos.d/epel.repo
3.检查mysql 是否有可升级版本。发现有版本可以升级到mysql5.5.11。yum –enablerepo=remi list mysql
4.检查是否有可升级版本。发现有版本可以升级到mysql5.5.11。yum –enablerepo=remi list mysql5.删除操作系统自带的低版本的mysql
yum remove mysql
6.通过新yum源安装高版本的mysqlyum -y –enablerepo=remi install mysql mysql-server mysql.x86_64 mysql-devel.x86_64
—- 第6步 安装支持包—-需要确保安装了automake autoconfig 和 libtool,一般情况下已安装。auotmake 1.4以上版本需要安装libuuid-devel,zlib-devel,mysql-devel三个开发包验证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
升级autoconf (不升级也可以):[root@locatfs local]# whereis autoconf
[root@locatfs local]# rpm -qf /usr/bin/autoconf
[root@locatfs local]# /usr/bin/autoconf -V
[root@locatfs local]# rpm -e –nodeps autoconf-2.59-12
[root@locatfs local]# wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
[root@locatfs local]# tar zxvf autoconf-latest.tar.gz
[root@locatfs local]# cd autoconf-2.69
[root@locatfs local]# ./configure –prefix=/usr
[root@locatfs local]# make
[root@locatfs local]# make install
[root@locatfs local]# /usr/bin/autoconf -V #查看是否安装成功
下面的readline包系统自带了,ncurses包系统默认没有,我也没有安装,你安不安自已定吧。[root@locatfs local]# yum install readline-devel readline
[root@locatfs local]# yum install ncurses-devel.x86_64 ncurses.x86_64
—- 第7步 安装ext4格式—-安装ext4格式工具:[root@locatfs local]# yum install e4fsprogs e4fsprogs-devel
加载ext4模块,让系统支持ext4文件系统[root@locatfs local]# modprobe ext4
说明:1、TSF使用ext3文件系统,可以工作。2、TSF的数据盘,只使用一个文件夹,可以工作,研究时不能分区格盘时可以这么做。—- 第8步 安装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同一个路径。gtest库是单元测试框架,下面安装安装gtest:自行上网下载gtest,新建一个下载目录,并进入这个目录。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 两个目录。—- 第9步 编译安装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在高并发下内存占用更加稳定。(参考博客)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
目前的情况,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.119.217 #本机IP地址(vip)dataserver->ip_addr = 192.168.119.145 #NameServer配置HA时请设置为vip,没配置HA时请设置为主ns的ipdataserver->ip_addr_list = 192.168.119.145|192.168.119.147 #!nameserver IP地址列表(master, salve的ip地址,只能以’|'分隔)dataserver->port = 8108 #!NameServer 监听的端口, 1024 ~ 55535dataserver->mount_name = /data/tfs #mount路径dataserver->mount_maxsize = 141000000 #mount 时磁盘的大小, 单位(KB),TFS将使用这么多的空间134Gdataserver->block_max_size = 67108864 #block 最大sizedataserver->mainblock_size = 67108864 #每个数据存储块的大小dataserver->extblock_size = 8388608 #扩展块的大小, 单位(字节)ds.conf 内容 (其中有中文,要保存为UTF-8,不带标签)
[public]#日志文件的size,default 1GBlog_size=1073741824#保留日志文件的个数,default 64log_num = 64#日志文件的级别, default info,线上使用建议设为info,调试设为debug#dubug级日志量会很大log_level=debug#main queue size default 10240#工作队列size, default 10240task_max_queue_size = 10240#listen port#监听端口, 1024 ~ 65535port = 9998#work directoy#工作目录work_dir=/usr/local/tfs#device name#网络设备dev_name= eth0#work thread count default 4#工作线程池 default 4thread_count = 4#ip addr#本机IP地址(vip)ip_addr = 192.168.119.217[dataserver]#NameServer ip addr(vip)#!NameServer vip地址#NameServer配置HA时请设置为vip,没配置HA时请设置为主ns的ipip_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 ~ 55535port = 8108#备集群NameServer的vip地址, 没有搭建主副集群的可以不用配置此项#slave_nsip = 192.168.0.2:8108#无效配置,直接加到slave_nsip项即可#slave_nsport = 8108#heart interval time(seconds)#dataserver 与 nameserver心跳间隔时间, 单位(秒), default: 2heart_interval = 2check_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: 2replicate_threadcount = 2#是否写同步日志, defalut: 1#write_sync_flag = 1#block 最大sizeblock_max_size = 7549747#定时dump统计信息的间隔时间, 单位(秒), default: 60dump_visit_stat_interval = 60#io操作的阀值, 超过此值时, 会警告#max_io_warning_time = 0#备件类型, 1: tfs, 2: nfsbackup_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 ftruncatebase_filesystem_type = 1#超级块存存储的保留位置,default: 0superblock_reserve = 0#平均文件的大小, 单位(字节)avg_file_size = 40960#主块的大小, 单位(字节)#每个数据存储块的大小mainblock_size = 7549747#扩展块的大小, 单位(字节)extblock_size = 419430#主块与扩展的比例block_ratio = 0.5#hash桶的比例hash_slot_ratio = 0.5ds_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 GBDisk /dev/sdb: 146.6 GBDisk /dev/sdc: 146.6 GBDisk /dev/sdd: 146.6 GBDisk /dev/sde: 146.6 GB———-umount———分区,格式化之前,如果已挂载,要先反挂载umount /dev/sdb1umount /dev/sdc1umount /dev/sdd1umount /dev/sde1———-分区—————对数据盘进行分区,一块盘分一个区就行。执行“fdisk /dev/sdb”命令,对数据盘进行分区;根据提示,依次输入“n”,“p”“1”,两次回车,“wq”,分区就开始了,很快就会完成。fdisk /dev/sdbfdisk /dev/sdcfdisk /dev/sddfdisk /dev/sde———–格式化———-mkfs.ext4 /dev/sdb1mkfs.ext4 /dev/sdc1mkfs.ext4 /dev/sdd1mkfs.ext4 /dev/sde1———–挂载————–建好目录,第一块磁盘就挂载在第一个目录上。目录数据取决于你磁盘的数量。mkdir /data/tfs1mkdir /data/tfs2mkdir /data/tfs3mkdir /data/tfs4mount /dev/sdb1 /data/tfs1mount /dev/sdc1 /data/tfs2mount /dev/sdd1 /data/tfs3mount /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————–重启系统—————————–
![](http://s9.51cto.com/wyfs02/M02/11/8D/wKioL1LU70DAE0Z_AAC0Z2kR8hQ124.jpg)
查看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个存储区:
![](http://s7.51cto.com/wyfs02/M01/11/8E/wKiom1LU72fTwn4_AAGjlNoGTMg821.jpg)
————运行data server————有两种方法:1)通过adminserver来启动dataserver(推荐): 执行scripts下的./tfs admin_ds2)直接启动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://s6.51cto.com/wyfs02/M01/11/8E/wKioL1LU75Lhi5aeAAAh6-mqjcs357.jpg)
![](http://s1.51cto.com/wyfs02/M00/11/8F/wKiom1LU776Bm6PMAAAyygUV7-8431.jpg)
我们一台服务器上启动了4个进程:
![](http://s4.51cto.com/wyfs02/M01/11/8F/wKiom1LU79bRwBFEAACquCK202U355.jpg)
停止: ./tfs stop_ds 1-4。
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的ipnameserver->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://s9.51cto.com/wyfs02/M00/11/97/wKiom1LWHQqj2KdBAAMX_P7m990432.jpg)
——–列出dataserver的block块———— 首先保证服务已经全部启动! 确认防火墙没有阻止到连接! 查看dataserver连接情况: 在nameserver端执行ssm命令查看检查到的dataserver的一些基本情况。 /usr/local/tfs/bin/ssm -s 192.168.119.147:8108 (要使用主ns的IP与端口,请注意根据实际情况修改) server -b \\随即列出dataserver的block块
![](http://s9.51cto.com/wyfs02/M02/11/96/wKioL1LWHRCgquMtAANRVNH7lVo281.jpg)
server -w \\随机列出dataserver的可写块图:略。 machine -a \\列出dataserver的使用报道。
![](http://s3.51cto.com/wyfs02/M01/11/97/wKiom1LWHTOwVdlQAAC13OKuiZs192.jpg)
这里需要注意如果用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://s2.51cto.com/wyfs02/M00/11/96/wKioL1LWHT7xmffaAAD6zTQsltE454.jpg)
这里我使用put上传/opt/666.jpg这张图。TFS目前限制了文件大小为2M,适合于一些小于2M数 据的存放。终端默认上传命令put ,超过2M用putl,回车后会返回一大堆字符,注意看最后一行是fail还是success,如果是fail,请检测下配置文件、端口等。如果是 success则说明已经上传上去。 上传666.jpg大小 是58407字节
![](http://s2.51cto.com/wyfs02/M01/11/96/wKioL1LWHVaDZTCSAAUZKUWZIL0770.jpg)
可以看到 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://s6.51cto.com/wyfs02/M00/11/97/wKiom1LWHX3DYltkAAFKi-7Pu_8293.jpg)
可以看到块349中有一个文件,文件名是:T0oRJTByJT1RCvBVdK—————–读最文件————————read_file_data 349 1 /opt/777/jpg
![](http://s1.51cto.com/wyfs02/M02/11/96/wKioL1LWHYjwQsB1AAA3xxcxUXE249.jpg)
成功了,到 /opt/777/jpg,去看一看文件。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,不再报上面的错误了,情况有所好转。但报了其它错误数量不多。压力测试:
已形成测试报告,略。
官网:http://code.taobao.org/p/tfs/wiki/index/
![](http://s7.51cto.com/wyfs02/M02/11/99/wKiom1LWTKSRWHiYAACvG_FxW9s003.png)
TFS客户程序在读文件的时候通过将文件名转换为BlockID和FileID信息,然后可以在!NameServer取得该块所在!DataServer信息(如果客户端有该Block与!DataServere的缓存,则直接从缓存中取),然后与!DataServer进行读取操作。TFS写操作数据流TFS系统中,nameserver会保证一个文件有多个副本存储于不同的dataserver上以保证冗余。当由于dataserver服务器宕机或由于其他原因退出系统导致某些文件副本数量下降时,nameserver将会调度新的dataserver节点存储文件备份。同样为了保证数据一致性,当写入一个文件时,只有所有参与的dataserver均写入成功时,该操作才算成功。TFS的写操作数据流图如下所示:
![](http://s7.51cto.com/wyfs02/M01/11/98/wKioL1LWTKvzCrm_AACZTD4ri3E590.png)
客户端首先向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和客户端返回操作成功的信息。获得Block ID和File ID根据TFS文件名解析出Block ID和block中的File ID。获取dataserver地址向nameserver发送查询请求得到Block ID所在的dataserver地址。由于nameserver中维护了block和dataserver的对应关系,所以nameserver能够提供相应的信息。Note: 由于TFS是把大量小文件放在一个block里面,所以TFS的文件复制是基于block的,而且复制出来的block的block id应该是一致的请求文件通过发送Block_ID、File_ID和offset为参数的读请求到对应的dataserver,得到文件内容。dataserver会根据本地记录的信息来得到File ID所在block的偏移量,从而读取到正确的文件内容.
![](http://s7.51cto.com/wyfs02/M00/11/99/wKiom1LWTOGD2xtOAAAvoWQat7I608.jpg)
TFS 在2.0版本增加了一个server, 叫做 rcserver. 这个 server 主要是为了淘宝内部管理使用 TFS 的各个应用. 我们给每个应用分配一个唯一的 AppKey. TFS 客户端使用这个 AppKey 登录到 rcserver, 取得自己应该访问的 TFS 集群信息. 客户端还会定期把自己的一些统计值发送给 rcserver. 具体信息可以参看源码中 doc 目录下的关于 rcserve 的文档。
TFS(Taobao File System)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化了文件的访问流程,一定程度上为TFS提供了良好的读写性能。上面说有太美好了,实际使用起来还是挺周折的。TFS有三个主要大版本:1.x,2.0.x,2.2.x,我先后试用了多个版本,认为2.0.4相对来说 比较稳定,其它版本(2.2.8,2.2.10)问题很多。这话是2012年11月说的,如果以后TFS的新版本稳定了另当别论。TFS文件系统的安装说明 — 注:本文本操作系统是RedHat5.6—- 第1步 准备工作—-检查服务器是否能正常DNS解析,目的是正常解析域名,可以进行yum更新。如果你的服务器DNS解析正常,可跳过此步。CentOS修改DNS方法:(修改后可即时生效,重启后同样有效)修改对应网卡的DNS的配置文件:# vi /etc/resolv.conf
修改以下内容:nameserver 8.8.8.8 #google域名服务器
nameserver 8.8.4.4 #google域名服务器
—- 第2步 准备工作—- RedHat5.6使用centos yum源:由于RedHat的yum在线更新是收费的,我们的RedHat没有注册,不能在线更新下载rpm包。需将RedHat的yum卸载后,重启安装Centos的yum,再配置其他yum源。如果你的服务器yum可正常工作,可跳过此步。具体操作请看: RedHat5.6、6.0使用CentOS yum源—- 第3步 准备工作—-先更新yum:yum update
到这里yum已可以正常工作。后面都需要使用的yum。—- 第4步 准备工作—-RedHat5.x和Centos 5.x使用gcc版本是4.1.2,RedHat6.x和Centos 6.x使用gcc版本是4.4.6,对编译的语法检查更严格,编译TFS给报错。淘宝的tfs官网上要求使用gcc版本是4.1.2。确认gcc版本:gcc -v
结果:以上所有机器返回结果 :gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)如果你使用RedHat6.x和Centos 6.x,就要重新安装低版本的gcc,g++。—- 第5步 升级安装高版本mysql—-TFS要求MySql版本>= 5.1.40,不然编译时报错:checking if MySQL version is >= 5.1.40… no但我的CentOS 5的yum源中最新只有 5.0.95版本,所有使用这个yum源在线安装最高也只能安装5.0.95,换一个yum来解决问题。1.安装配置yum源:wget http://centos.ustc.edu.cn/epel/5/x86_64/epel-release-5-4.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/5/remi/x86_64/remi-release-5-8.el5.remi.noarch.rpm
rpm -ivh *.rpm
2.向以下3个文件尾部追加一个文本(可以不做):echo ‘priority=1′ >> /etc/yum.repos.d/remi.repo
echo ‘priority=1′ >> /etc/yum.repos.d/epel-testing.repo
echo ‘priority=1′ >> /etc/yum.repos.d/epel.repo
3.检查mysql 是否有可升级版本。发现有版本可以升级到mysql5.5.11。yum –enablerepo=remi list mysql
4.检查是否有可升级版本。发现有版本可以升级到mysql5.5.11。yum –enablerepo=remi list mysql5.删除操作系统自带的低版本的mysql
yum remove mysql
6.通过新yum源安装高版本的mysqlyum -y –enablerepo=remi install mysql mysql-server mysql.x86_64 mysql-devel.x86_64
—- 第6步 安装支持包—-需要确保安装了automake autoconfig 和 libtool,一般情况下已安装。auotmake 1.4以上版本需要安装libuuid-devel,zlib-devel,mysql-devel三个开发包验证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
升级autoconf (不升级也可以):[root@locatfs local]# whereis autoconf
[root@locatfs local]# rpm -qf /usr/bin/autoconf
[root@locatfs local]# /usr/bin/autoconf -V
[root@locatfs local]# rpm -e –nodeps autoconf-2.59-12
[root@locatfs local]# wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
[root@locatfs local]# tar zxvf autoconf-latest.tar.gz
[root@locatfs local]# cd autoconf-2.69
[root@locatfs local]# ./configure –prefix=/usr
[root@locatfs local]# make
[root@locatfs local]# make install
[root@locatfs local]# /usr/bin/autoconf -V #查看是否安装成功
下面的readline包系统自带了,ncurses包系统默认没有,我也没有安装,你安不安自已定吧。[root@locatfs local]# yum install readline-devel readline
[root@locatfs local]# yum install ncurses-devel.x86_64 ncurses.x86_64
—- 第7步 安装ext4格式—-安装ext4格式工具:[root@locatfs local]# yum install e4fsprogs e4fsprogs-devel
加载ext4模块,让系统支持ext4文件系统[root@locatfs local]# modprobe ext4
说明:1、TSF使用ext3文件系统,可以工作。2、TSF的数据盘,只使用一个文件夹,可以工作,研究时不能分区格盘时可以这么做。—- 第8步 安装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同一个路径。gtest库是单元测试框架,下面安装安装gtest:自行上网下载gtest,新建一个下载目录,并进入这个目录。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 两个目录。—- 第9步 编译安装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在高并发下内存占用更加稳定。(参考博客)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
目前的情况,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.119.217 #本机IP地址(vip)dataserver->ip_addr = 192.168.119.145 #NameServer配置HA时请设置为vip,没配置HA时请设置为主ns的ipdataserver->ip_addr_list = 192.168.119.145|192.168.119.147 #!nameserver IP地址列表(master, salve的ip地址,只能以’|'分隔)dataserver->port = 8108 #!NameServer 监听的端口, 1024 ~ 55535dataserver->mount_name = /data/tfs #mount路径dataserver->mount_maxsize = 141000000 #mount 时磁盘的大小, 单位(KB),TFS将使用这么多的空间134Gdataserver->block_max_size = 67108864 #block 最大sizedataserver->mainblock_size = 67108864 #每个数据存储块的大小dataserver->extblock_size = 8388608 #扩展块的大小, 单位(字节)ds.conf 内容 (其中有中文,要保存为UTF-8,不带标签)
[public]#日志文件的size,default 1GBlog_size=1073741824#保留日志文件的个数,default 64log_num = 64#日志文件的级别, default info,线上使用建议设为info,调试设为debug#dubug级日志量会很大log_level=debug#main queue size default 10240#工作队列size, default 10240task_max_queue_size = 10240#listen port#监听端口, 1024 ~ 65535port = 9998#work directoy#工作目录work_dir=/usr/local/tfs#device name#网络设备dev_name= eth0#work thread count default 4#工作线程池 default 4thread_count = 4#ip addr#本机IP地址(vip)ip_addr = 192.168.119.217[dataserver]#NameServer ip addr(vip)#!NameServer vip地址#NameServer配置HA时请设置为vip,没配置HA时请设置为主ns的ipip_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 ~ 55535port = 8108#备集群NameServer的vip地址, 没有搭建主副集群的可以不用配置此项#slave_nsip = 192.168.0.2:8108#无效配置,直接加到slave_nsip项即可#slave_nsport = 8108#heart interval time(seconds)#dataserver 与 nameserver心跳间隔时间, 单位(秒), default: 2heart_interval = 2check_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: 2replicate_threadcount = 2#是否写同步日志, defalut: 1#write_sync_flag = 1#block 最大sizeblock_max_size = 7549747#定时dump统计信息的间隔时间, 单位(秒), default: 60dump_visit_stat_interval = 60#io操作的阀值, 超过此值时, 会警告#max_io_warning_time = 0#备件类型, 1: tfs, 2: nfsbackup_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 ftruncatebase_filesystem_type = 1#超级块存存储的保留位置,default: 0superblock_reserve = 0#平均文件的大小, 单位(字节)avg_file_size = 40960#主块的大小, 单位(字节)#每个数据存储块的大小mainblock_size = 7549747#扩展块的大小, 单位(字节)extblock_size = 419430#主块与扩展的比例block_ratio = 0.5#hash桶的比例hash_slot_ratio = 0.5ds_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 GBDisk /dev/sdb: 146.6 GBDisk /dev/sdc: 146.6 GBDisk /dev/sdd: 146.6 GBDisk /dev/sde: 146.6 GB———-umount———分区,格式化之前,如果已挂载,要先反挂载umount /dev/sdb1umount /dev/sdc1umount /dev/sdd1umount /dev/sde1———-分区—————对数据盘进行分区,一块盘分一个区就行。执行“fdisk /dev/sdb”命令,对数据盘进行分区;根据提示,依次输入“n”,“p”“1”,两次回车,“wq”,分区就开始了,很快就会完成。fdisk /dev/sdbfdisk /dev/sdcfdisk /dev/sddfdisk /dev/sde———–格式化———-mkfs.ext4 /dev/sdb1mkfs.ext4 /dev/sdc1mkfs.ext4 /dev/sdd1mkfs.ext4 /dev/sde1———–挂载————–建好目录,第一块磁盘就挂载在第一个目录上。目录数据取决于你磁盘的数量。mkdir /data/tfs1mkdir /data/tfs2mkdir /data/tfs3mkdir /data/tfs4mount /dev/sdb1 /data/tfs1mount /dev/sdc1 /data/tfs2mount /dev/sdd1 /data/tfs3mount /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————–重启系统—————————–
![](http://s9.51cto.com/wyfs02/M02/11/8D/wKioL1LU70DAE0Z_AAC0Z2kR8hQ124.jpg)
查看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个存储区:
![](http://s7.51cto.com/wyfs02/M01/11/8E/wKiom1LU72fTwn4_AAGjlNoGTMg821.jpg)
————运行data server————有两种方法:1)通过adminserver来启动dataserver(推荐): 执行scripts下的./tfs admin_ds2)直接启动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://s6.51cto.com/wyfs02/M01/11/8E/wKioL1LU75Lhi5aeAAAh6-mqjcs357.jpg)
![](http://s1.51cto.com/wyfs02/M00/11/8F/wKiom1LU776Bm6PMAAAyygUV7-8431.jpg)
我们一台服务器上启动了4个进程:
![](http://s4.51cto.com/wyfs02/M01/11/8F/wKiom1LU79bRwBFEAACquCK202U355.jpg)
停止: ./tfs stop_ds 1-4。
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的ipnameserver->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://s9.51cto.com/wyfs02/M00/11/97/wKiom1LWHQqj2KdBAAMX_P7m990432.jpg)
——–列出dataserver的block块———— 首先保证服务已经全部启动! 确认防火墙没有阻止到连接! 查看dataserver连接情况: 在nameserver端执行ssm命令查看检查到的dataserver的一些基本情况。 /usr/local/tfs/bin/ssm -s 192.168.119.147:8108 (要使用主ns的IP与端口,请注意根据实际情况修改) server -b \\随即列出dataserver的block块
![](http://s9.51cto.com/wyfs02/M02/11/96/wKioL1LWHRCgquMtAANRVNH7lVo281.jpg)
server -w \\随机列出dataserver的可写块图:略。 machine -a \\列出dataserver的使用报道。
![](http://s3.51cto.com/wyfs02/M01/11/97/wKiom1LWHTOwVdlQAAC13OKuiZs192.jpg)
这里需要注意如果用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://s2.51cto.com/wyfs02/M00/11/96/wKioL1LWHT7xmffaAAD6zTQsltE454.jpg)
这里我使用put上传/opt/666.jpg这张图。TFS目前限制了文件大小为2M,适合于一些小于2M数 据的存放。终端默认上传命令put ,超过2M用putl,回车后会返回一大堆字符,注意看最后一行是fail还是success,如果是fail,请检测下配置文件、端口等。如果是 success则说明已经上传上去。 上传666.jpg大小 是58407字节
![](http://s2.51cto.com/wyfs02/M01/11/96/wKioL1LWHVaDZTCSAAUZKUWZIL0770.jpg)
可以看到 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://s6.51cto.com/wyfs02/M00/11/97/wKiom1LWHX3DYltkAAFKi-7Pu_8293.jpg)
可以看到块349中有一个文件,文件名是:T0oRJTByJT1RCvBVdK—————–读最文件————————read_file_data 349 1 /opt/777/jpg
![](http://s1.51cto.com/wyfs02/M02/11/96/wKioL1LWHYjwQsB1AAA3xxcxUXE249.jpg)
成功了,到 /opt/777/jpg,去看一看文件。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,不再报上面的错误了,情况有所好转。但报了其它错误数量不多。压力测试:
已形成测试报告,略。
官网:http://code.taobao.org/p/tfs/wiki/index/
相关文章推荐
- TFS 2013安装配置参考手册
- 淘宝开源数据库OceanBase编译、安装和配置手册
- TFS 2010 使用手册(一)安装与配置
- TFS 2010 使用手册(一)安装与配置
- 1.淘宝分布式文件系统tfs 在centos6系统上的安装
- TFS 2010 使用手册(一)安装与配置
- TFS 2010 使用手册(一)安装与配置
- Team Foundation Server 2010(TFS2010)安装配置手册
- TFS2010中文版 安装配置手册
- TFS 2010 使用手册(一)安装与配置
- TFS 2010 使用手册(一)安装与配置
- Linux下分布式文件系统FastDFS安装与配置
- 【八】WinXP+IIS6 配置Discuz和phpwind论坛全完手册---phpwind_GBK_8.7安装配置
- FastDFS分布式文件系统集群安装与配置
- Bugzilla环境安装和配置手册
- 操作手册(1)JDK的安装与配置
- Oracle 10.1.0.5 for Solaris10软件安装配置手册
- TFS--淘宝文件系统Nginx模块安装篇
- LNMP安装配置手册
- Redis 学习手册之redis安装和配置