您的位置:首页 > 其它

淘宝分布式文件系统TFS安装配置手册

2014-02-19 11:19 531 查看
TFS文件名的结构TFS的文件名由块号和文件号通过某种对应关系组成,最大长度为18字节。文件名固定以T开始,第二字节为该集群的编号(可以在配置项中指定,取值范围 1~9)。余下的字节由Block ID和File ID通过一定的编码方式得到。文件名由客户端程序进行编码和解码,它映射方式如下图:

TFS客户程序在读文件的时候通过将文件名转换为BlockID和FileID信息,然后可以在!NameServer取得该块所在!DataServer信息(如果客户端有该Block与!DataServere的缓存,则直接从缓存中取),然后与!DataServer进行读取操作。TFS写操作数据流TFS系统中,nameserver会保证一个文件有多个副本存储于不同的dataserver上以保证冗余。当由于dataserver服务器宕机或由于其他原因退出系统导致某些文件副本数量下降时,nameserver将会调度新的dataserver节点存储文件备份。同样为了保证数据一致性,当写入一个文件时,只有所有参与的dataserver均写入成功时,该操作才算成功。TFS的写操作数据流图如下所示:

客户端首先向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的偏移量,从而读取到正确的文件内容.

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源安装高版本的mysql
yum -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————–重启系统—————————–

查看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_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



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

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

——–列出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,去看一看文件。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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: