最近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
确定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
确定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
需要确定你的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.
正式开干,如下步骤可以参考: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
编译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的过程。