Taobao FIle System 编译和使用

慕乐池
2023-12-01

前言

最近android项目里要用到小文件存储集群,老大决定调研一下各个集群文件存储系统是否能完成相关的工作,之前我测试了一下mongoDb存储视频文件(4MB),在局域网里速度应该是秒级的,不过mongo是文档型的数据库,并不太适合做视频存储,做笔记的目的是想记录一下编译TFS的过程,因为这方面网上的教程较少,可能TFS停止更新好长时间了。

编译

编译前确定编译环境是linux 64位系统,不然会产生很多错,首先的错误是:

make[2]: *** [tfs_meta_helper.lo] Error 1
make[2]: Leaving directory `/home/zkh/TFS/release-2.2.16/src/new_client'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/zkh/TFS/release-2.2.16/src'
make: *** [all-recursive] Error 1
Step 1:

确定gcc版本,如果想更加顺利,可以在centos5.5上编译,因为centos5.5上的gcc版本是4.1.2,如果要降级,我在centos7上测试了,可以通过下载gcc源码进行编译安装,我用到的gcc下载地址为:

ftp://ftp.gnu.org/gnu/gcc/gcc-4.1.2/gcc-4.1.2.tar.bz2

对源码需要做一些改动,对configure,texinfo对该版本不支持,打开configure全局查找texinfo,把如下正则表达式:

| egrep ‘texinfo[^0-9]*([1-3][0-9]|4\.[2-9]|[5-9])’ >/dev/null 2>&1; then

改为:

| egrep ‘texinfo[^0-9]*([1-3][0-9]|4\.[2-9]|4\.[1-9][0-9]*|[5-9])’ >/dev/null 2>&1; then

然后确定不要缺相关必要的工具,glibc-devel,根据系统版本安装相关的软件包,然后一顿:

./configure
make
make install
Step 2:

确定yum时候可以正常安装,这个步骤建议做,因为官方的源可能无法正常使用(18年3月可用):

wget http://archives.fedoraproject.org/pub/archive/epel/5/x86_64/epel-release-5-4.noarch.rpm

wget http://rpms.famillecollet.com/enterprise/5/remi/x86_64/remi-release-5.9-1.el5.remi.noarch.rpm

rpm -ivh *.rpm
Step 3:

需要确定你的mysql版本时候过低,TFS要求MySql版本>= 5.1.40,不然编译时报错:checking if MySQL version is >= 5.1.40,我们换好yum源了,那就很容易切换mysql版本,检查是否有可升级版本。发现有版本可以升级到mysql5.5.54。

yum --enablerepo=remi list mysql
yum remove mysql
yum -y --enablerepo=remi install mysql mysql-server mysql.x86_64  mysql-devel.x86_64

如下步骤之后,系统已经切换到mysql 5.5.54.

Step 4:

正式开干,如下步骤可以参考:http://code.taobao.org/p/tfs/wiki/get/
官网步骤,我下面简单写一下这些步骤:

yum install automake.noarch
yum install libtool.x86_64
// readline 其实可以省略,只需要./configure的时候加上--disable-readline
yum install readline-devel.x86_64
// 压缩解压缩
yum install zlib-devel.x86_64
yum install e2fsprogs-devel.x86_64
// 这个库我没能找到,我通过源码编译了这个库
// 链接:https://github.com/gperftools/gperftools
yum install google-perftools.x86_64

上面提到了编译gperftools库,下载源码到本地之后,安装必要的库,很不幸,丫的yum装不了:

wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz
tar -xf libunwind-1.1.tar.gz
cd libunwind-1.1
./configure
make
make install

这里装好了libunwind,直接对gperftools编译(到指定目录):

./configure  
make  
sudo make install  
Step 5:

编译tfs官方库,TFS使用tb-common-utils软件包,tb-common-utils包含淘宝使用的基础系统库tbsys和网络库tbnet两个组件;安装tb-common-utils前需要设置环境变量TBLIB_ROOT,tbsys和tbnet将会被安装TBLIB_ROOT对应的路径(必须是绝对路径)下,TFS会在这个路径下查找tbsys、tbnet头文件和库。

svn co -r 18 http://code.taobao.org/svn/tb-common-utils/trunk tb-common-utils
cd tb-common-utils
// 设置环境变量
export TBLIB_ROOT=/usr/local/tfslib
chmod u+x build.sh              
./build.sh 

编译安装好以后在/usr/local/tfslib目录下就会有tbsys和tbnet的头文件和库文件了。

接着编译tfs了,我选择了网上说比较稳定的版本2.2.10,过程如下:

cd release-2.2.10     # 进入TFS源代码目录

./configure --prefix=/usr/local/tfs --with-tblib-root=/usr/local/tfslib/ --without-tcmalloc

make                           

make install

编译安装好以后在/usr/local/tfs目录下就有tfs相关目录,如bin目录,conf目录,logs目录等。到这里,恭喜你已经成功安装了TFS.

部署使用

这里没太多要说的,关于配置项的说明官方会比较清晰,我们用到了ns和ds所以我们参考配置这两个文件,其中编译好之后并没有conf文件,需要我们将刚刚下载tfs的配置文件copy过来到安装目录conf。我贴一下ds和ns的指导文档。http://code.taobao.org/p/tfs/wiki/deploy/ns.conf/

http://code.taobao.org/p/tfs/wiki/deploy/ds.conf/

贴一下这块的官方的说明,已经我的两个文件:

1.如果搭建单台ds,请在ns.conf中将备份数改为1,否则集群将无法正常运行。
#Block 最大备份数, default: 2[[BR]]
max_replication = 2

#Block 最小备份数, default: 2[[BR]]
min_replication = 2
2.ds.conf中关于Nameserver的三个配置项必须和ns.conf中的一致,
[dataserver]

#!NameServer vip地址[[BR]]
ip_addr = 192.168.0.1

#!nameserver IP地址列表(master, salve的ip地址,只能以'|'分隔)[[BR]]
ip_addr_list = 192.168.0.1|192.168.0.2

#!NameServer 监听的端口, 1024 ~ 55535[[BR]]
port = 9999
否则ds将无法和ns通信。

3.ns.conf中block_max_size一般设为和ds.conf中的mainblock_size相同或略大于,这样可以尽量少使用扩展块。

1.我虚拟机的ns.conf

[public]
#log file size default 1GB
log_size=1073741824

#log file num default 64
log_num = 64

#log file level default debug
log_level=debug

#main queue size default 10240
task_max_queue_size = 10240

#listen port
port = 8108

#work directoy
work_dir=/usr/local/tfs

#device name
dev_name= eth0

#work thread count default 4
thread_count = 4

#ip addr(vip)  自己centos的ip地址
ip_addr = 192.168.15.131

[nameserver]

safe_mode_time = 300

ip_addr_list = 192.168.15.131|192.168.0.2

group_mask = 255.255.255.0

#
block_max_size = 838860800

#
max_replication = 1

#
min_replication = 1

# use capacity ratio
use_capacity_ratio = 98

# block use ratio
block_max_use_ratio = 98

#heart interval time(seconds)
heart_interval = 2

# object dead max time(seconds) default
object_dead_max_time = 3600

# cluster id defalut 1
cluster_id = 1

# block lost, replicate ratio
replicate_ratio_ = 50

max_write_filecount = 16

heart_thread_count = 2

heart_max_queue_size = 10

#replicate block wait time
repl_max_time = 60

compact_delete_ratio =  15

compact_max_load = 200

object_dead_max_time = 86400

object_clear_max_time = 300

max_wait_write_lease = 15

lease_expired_time = 3

max_lease_timeout = 3000

cleanup_lease_threshold = 102400

build_plan_interval = 10

run_plan_expire_interval = 120

build_plan_ratio = 25

dump_stat_info_interval = 60000000

build_plan_default_wait_time = 2

balance_max_diff_block_num = 5

add_primary_block_count = 3

block_chunk_num = 32

task_percent_sec_size = 200

task_max_queue_size = 10000

oplog_sync_max_slots_num = 1024

oplog_sync_thread_num = 1

ds.conf

[public]
#log file size default 1GB
log_size=1073741824

#log file num default 64
log_num = 64

#log file level default debug
log_level=debug

#main queue size default 10240
task_max_queue_size = 10240

#listen port
port = 9998

#work directoy
work_dir=/usr/local/tfs

#device name
dev_name= eth0

#work thread count default 4
thread_count = 4

#ip addr
ip_addr = 192.168.15.131

[dataserver]

#nameserver ip addr(vip)
ip_addr = 192.168.15.131

ip_addr_list = 192.168.15.131|192.168.0.2

#nameserver port
port = 8108

#slave_nsip = 192.168.0.2

#slave_nsport = 9999

#heart interval time(seconds)
heart_interval = 2

check_interval = 2

#expire_datafile_time = 90

#expire_clonedblock_time = 180

#expire_compactblock_time = 600

replicate_threadcount = 2

#write_sync_flag = 1

block_max_size = 754974700

dump_visit_stat_interval = 60

#max_io_warning_time = 0

backup_type = 1

backup_path = /usr/local/tfsrun

#max_data_file_nums = 50

#max_crc_error_nums = 4

#max_eio_error_nums_ = 6

#expire_checkblock_time = 86000

#max_cpu_usage = 60

#dump_stat_info_interval = 60000000

mount_name = /home/tfs/disk

mount_maxsize = 419430400

base_filesystem_type = 1

superblock_reserve = 0

avg_file_size = 5242880

mainblock_size = 838860800

extblock_size = 4194304

block_ratio = 0.5

hash_slot_ratio = 0.5

ds_thread_count = 4

#access_control_ipmask = 192.168.0.1
#
#access_control_file = /home/xxxxx/xxxxxx/tfs/control.file

配置好之后就可以运行nameserver和dataserver了,指令如下(到tfs安装目录的scripts目录下):

[root@localhost tfs]# scripts/tfs start_ns
 nameserver is up SUCCESSFULLY pid: 28009 
[root@localhost tfs]# scripts/tfs start_ds 1
 dataserver 1 is up SUCCESSFULLY pid: 28094 

上传文件测试

bin/tfstool -s 192.168.15.131:8108 -i "put /home/zkh/Desktop/jpgs/1.png NULL .png"
// 上传文件成功后日志里有如下信息:
//put /home/zkh/Desktop/jpgs/1.png => T1T4WTByDT1R4cSCrK success.

下载文件测试

bin/tfstool -s 192.168.15.131:8108 -i "get T1T4WTByDT1R4cSCrK test.png"

下载成功后,当前目录下会有tet.png图片。

停止tfs

[root@localhost tfs]# scripts/tfs stop_ns
 nameserver exit SUCCESSFULLY 
[root@localhost tfs]# scripts/tfs stop_ds 1
 dataserver 1 exit SUCCESSFULLY 

后记

编译其实没什么难度,只不过可能编译过程中会产生一些错,其中的乐趣是解决错误,更大的乐趣是修改源码,不过这次编译没做任何代码的修改(configure不算),想到了之前pjsip添加codec g711的过程。

 类似资料: