from:
博客地址:
http://blog.163.com/a12333a_li/
李坤山
2012-5-8 修改:
使用了centos5.4 64位系统
tfs -Version=2.1.1
#行表示注释
对于淘宝TFS分布式文件系统的功能、原理、优势等就不多做介绍了,这里主要说明配置方面。
如果你对TFS一无所知,那直接跳到第(四)部份,看看它能做什么吧。
有想了解的同学可访问TFS开源官网:
tfs相关文档:http://code.taobao.org/p/tfs/wiki/index/
tfs交流论坛:http://code.taobao.org/p/tfs/issues/
新浪微博: @淘宝tfs
系统环境:
3台 64位centos5.4 1G内存
nameserver 192.168.41.140
dataserver1
192.168.41.141
dataserver2 192.168.41.142 下面的一些配置不考虑单机跑多个dataserver、
dataserver+ nameserver 的情况.
一些普通的命令我就不注释了,不明白的可以新浪微博上
@li_83 一:
下载安装(亦可参照官网):
svn co http://code.taobao.org/svn/tfs/branches/tfs-dev-2.1.1 tfs //版本
yum install -y libuuid-devel zlib-devel mysql-devel //一些基本库
yum install e4fsprogs e4fsprogs-devel -y //ext4
svn checkout http://code.taobao.org/svn/tb-common-utils/trunk/ tb-common-utils
cd tb-common-utils/
export TBLIB_ROOT="/usr/local/tb/lib" //定于tbsys和tbnet的安装目录
chmod 777 build.sh
./build.sh
cd ..
cd tfs-1.4
./build.sh init
./configure --prefix=/usr/local/tfs
make
#如果make出错执行以下语句
find ./ -name Makefile -exec sed -i 's/\-Werror//g' {} \; //忽烈一些警告信息
#如果提示数据库出错
#修改mysql_database_helper.cpp
#include </usr/local/mysql/include/mysql/mysql.h> //原文值<mysql.h>根据自己的mysql路径修改,可用find查找.
make
make install
到这里安装就结束了,其实任何工具安装都不难,难的是怎么配置,维护,调优。嗯,继续吧
二:
配置:
目前的情况
tfs安装在
/usr/local/tfs tbsys、tbnet 安装在
/usr/local/tb/
/usr/local/tfs/conf/共有三个文件需要配置:
ns.conf、ads.conf和ds.conf
其中
ns.conf 用于启动nameserver //只运行dataserver的服务器不用配置。ads.conf和ds.conf 用于启动dataserver //只运行nameserver的服务器不用配置。
nameserver和dataserver的启动顺序不限
这里直接贴测试后的配置文件:a) ns.conf ns.conf ns.conf ns.conf ns.conf ns.conf ns.conf ns.conf ns.conf nameserver IP 192.168.41.151 需要修改的加深了
cat ns.conf[public]
##日志文件的size,默认 1GB
log_size=1073741824
#保留日志文件的个数,默认 64
log_num = 4
#日志文件的级别, 默认 debug
log_level = error //不然日志会很大
#工作队列size, 默认 10240
task_max_queue_size = 10240
#nameserver监听端口
port =8888
#工作目录,也就是tfs的安装目录
work_dir=/usr/local/tfs
#网络设备,即通信网卡,一般用内网
dev_name= eth0
#工作线程池 default 4
thread_count = 4
#本机IP地址(vip),配置ha时为vip,没配置可以为主ns的ip
ip_addr = 192.168.41.140
[nameserver]
#系统保护时间,单位(秒), default: 300
#保护时间内不进行任何操作,包括添加block等
safe_mode_time = 300
#nameserver IP地址列表(master, salve的ip地址,只能以'|'分隔)
#单台nameserver时,另一个ip配置为无效ip即可
ip_addr_list = 192.168.41.140|192.168.0.2
#Ip地址 mask
#用于区分dataserver所在的子网,选择不同子网的dataserver备份数据
group_mask = 255.255.255.255
#Block size的最大值, 单位(字节)
block_max_size = 7549747 //这个值到底怎么配置好,有待实验。 必须 >= dataserver的mainblock_size,推荐设置一致。
#Block 最大备份数, default: 2
#单台dataserver时,需要配置为1
max_replication = 1
#Block 最小备份数, default: 2
#单台dataserver时,需要配置为1
min_replication = 1
#DataServer 容量使用的百分比, default: 98
use_capacity_ratio = 98
#Block使用的百分比, default: 95
block_max_use_ratio = 98
#Dataserver 与 nameserver 的心跳时间, 单位(秒), default: 2
heart_interval = 2
# object 死亡的最大时间, 单位(秒), default: 86400
object_dead_max_time = 3600
# 集群号
cluster_id = 1
# 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
#block 缺失备份时, 需要等待多长时间才进行复制, 单位(秒), default: 240
repl_max_time = 60
#block进行压缩的比例, block 删除的文件的比例达到这个值时进行压缩
compact_delete_ratio = 15
#block进行压缩时, dataserver的最大负载,超出这个值dataserver,不进行压缩
compact_max_load = 200
# 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
b1)
ds.conf ds.conf ds.conf ds.conf ds.conf ds.conf ds.conf ds.conf ds.conf ds.conf dataserver1
192.168.41.141 总的有2个文件 ds.conf 、ads.conf [dataserver2]只要改下对应的IP即可cat
ds.conf[public]
#日志文件的size,默认 1GB
log_size = 1073741824
#保留日志文件的个数, 默认 64
log_num = 4#日志文件的级别, 默认 debug
log_level = error
#工作队列size,
默认 10240
task_max_queue_size = 10240
#dataserver监听端口
port = 9998
#工作目录 tfs安装目录
work_dir=/usr/local/tfs
#网络设备 一般值内网,与nameserver通信的网卡
dev_name= eth0
#工作线程池 default 4
thread_count = 4
#本机IP地址
ip_addr = 192.168.41.141
[dataserver]
#NameServer 地址 如果有ha,用ha的vip地址
ip_addr = 192.168.41.140
#!nameserver IP地址列表(master, salve的ip地址,只能以'|'分隔) nameserver主从IP
ip_addr_list = 192.168.41.140|192.168.0.2
#NameServer 监听的端口,必须写nameserver上配置的端口
port = 8888
#备集群NameServer的vip地址, 可以不用配置
#slave_nsip = 192.168.0.2
#备集群NameServer监听端口, 可以不用配置
#slave_nsport = 9999
#dataserver 与 nameserver心跳间隔时间, 单位(秒), default: 2
heart_interval = 2
check_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: 2
replicate_threadcount = 2
#是否写同步日志, defalut: 1
#write_sync_flag = 1
#block 最大size
block_max_size = 7549747 // 这个定义不是明白,跟下面的mainblock_size有什么区别,有什么联系,待更新
#定时dump统计信息的间隔时间, 单位(秒), default: 60
dump_visit_stat_interval = 60
#io操作的阀值, 超过此值时, 会警告
#max_io_warning_time = 0
#备件类型, 1: tfs, 2: nfs
backup_type = 1
#备件路径
backup_path = /mnt
#最大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路径 很关键,一定要写对,不用加id号 如hda1挂载在/data/tfs1,也就是格式化成ext4的磁盘挂载点。
mount_name = /data/tfs
#mount 时磁盘的大小, 单位(KB) //这个功能不知道为什么要限制
mount_maxsize = 4194304 //最大的挂载空间,如果你的/data/tfs1有1T,而这里是设置了4G ,那只有4G的块可用空间,剩下的全部浪费。感谢hgp7369@126的提示.
#文件系统类型: 0: no initialize, 1: ext4, 2: ext3 posix fallocate, 3: ext3 ftruncate
base_filesystem_type = 1
#超级块存存储的保留位置,default: 0
superblock_reserve = 0
#平均文件的大小, 单位(字节)
avg_file_size = 40960
#主块的大小, 单位(字节) 重点,需要与nameserver的配置一样或者比它小
mainblock_size = 7549747 //每个数据存储块的大小
#扩展块的大小, 单位(字节)
extblock_size = 419430
#主块与扩展的比例
block_ratio = 0.5 //这个参数也有带研究
#hash桶的比例
hash_slot_ratio = 0.5
ds_thread_count = 4
#访问控制ip mask, 可选
#access_control_ipmask = 192.168.0.1
#访问控制文件路径, 可选
#access_control_file = /home/xxxxx/xxxxxx/tfs/control.file
b2)
ads.conf ads.conf ads.conf ads.conf ads.conf ads.conf ads.conf ads.conf dataserver1
[dataserver2]的只要改下IP即可 ads实际上这个我实验的时候没有配置也是可以用。cat ads.conf
[public]
#日志文件的size,default 1GB
log_size=1073741824
#保留日志文件的个数,default 64
log_num = 4
#日志文件的级别, default debug
log_level=error
#工作队列size,default 10240
task_max_queue_size = 10240
#监听端口 adminserver
port = 12000
#工作目录 tfs安装目录
work_dir=/usr/local/tfs
#网络设备 一般内网网卡,与nameserver通信网卡名称
dev_name= eth0
#工作线程池size, default 4
thread_count = 4
#本机ip地址
ip_addr = 192.168.41.141
[adminserver]
#检测的间隔时间, 单位(秒), default: 5
check_interval = 5
#失败的次数的阀值, default: 5
check_count = 5
#死亡个数的阀值
warn_dead_count = 3
#kill server之前等待时间
ds_fkill_waittime = 15
#dataserver启动命令脚本
ds_script = /usr/local/tfs/bin/dataserver -f /usr/local/tfs/conf/ds.conf -d
#监控的dataserver列表
ds_index_list = 1,2,3
[nameserver]
#!NameServer的vip
ip_addr = 192.168.41.140
#!NameServer监听的端口
port = 8888
[dataserver]
#!DataServer监听的端口
port = 9999
#!DataServer lock file路径
lock_file = /usr/local/tfs/logs/dataserver
#!DataServer 加载点路径
mount_name = /data/tfs
到这里配置文件就结束了,好好理解上的一些注释。
三:
启动服务:
nameserver启动:执行scripts目录下的tfs
cd /usr/local/tfs/scripts
./tfs start_ns
执行正常返回:
查看监听端口:
dataserver启动:
首先需要格式化一个分区为ext4文件系统,并挂载到/data/tfs1至/data/tfs(i),其中i为磁盘号。注意上面的 mount_name = /data/tfs 没有加(i)
假设你是用虚拟机,添加一个硬盘hda,然后执行:
fdisk /dev/hda
n //具体看fdisk用法
e //具体看fdisk用法
w //具体看fdisk用法
mkfs.ext4 /dev/hda11
mount /dev/hda1 /data/tfs1/
这样就挂载上去了
cd /usr/local/tfs/scripts
stfs format 1 (1为挂载点的序号 具体可以看官网说明) //分配第一个存储区
./scripts/tfs start_ds 1 //启动dataserver的存储区1
检测与nameserver的通讯
192.168.41.141
四:
验证:
首先保证服务已经全部启动!
确认防火墙没有阻止到连接!
查看dataserver连接情况:
在nameserver端执行ssm命令查看检查到的dataserver的一些基本情况。
/usr/local/tfs/bin/ssm -s 192.168.41.140:8888
server -b \\随即列出dataserver的block块
server -w \\随机列出dataserver的可写块
machine -a \\列出dataserver的使用报道。
这里需要注意如果用server -b 、-w后面的BLOCK数字,如果是0,说明没有可写块。检测ns ads ds的配置文件,包括备份个数、主块大小知否一致. 如果看到上面的信息,那基本没问题了。用tfstool上传一张图片:
这里稍微解释下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和客户端返回操作成功的信息。“
也就是说客户端发起一个请求,nameserver先根据dataserver的 容量和负载 来选择一个dataserver来做为所有dataserver的master(除非master宕机,不会更换,宕机则自动重新选择)然后根据ns.conf的配置的备份数全部写入,才向nameserver和客户端返回操作成功信息。
OK,开始试试:
我们测试上传一张a12333a_li.jpg,大小为1550162,记住这个大小,一会读取的时候对比下。
/usr/local/tfs/bin/tfstool -s 192.168.41.140:8888
这里我使用put上传/root/a12333a_li.jpg这张图,顺便说下,TFS目 前限制了文件大小为2M, 适合于一些小于2M数 据的存放。终端默认上传命令put ,超过2M用putl,回车后会返回一大堆字符,注意看最后一行是fail还是success,如果是fail,请检测下配置文件、端口等。如果是success则说明已经上传上去。
往返回的信息上找些我们要的数据 : Block ID和block中的File ID;我们传的文件大小为1550162,下图可以看到文件被割成2个块 1048576和501586 ;储存在192.168.41.141 blockid: 3022, fileid: 1
读取文件:
现在我们有几个信息:
192.168.41.141 上的 blockid: 3022, fileid: 1 上传了一个1550162 的文件(a12333a_li.jpg)
好的,我们上去把它取出来。取文件的机器在linux只要有ds-client这个命令文件就可以,拷过来既可用。不一定要在name\data的其中一台上。
取之前,我们先来看个东西,看一个块里面存了什么/ust/local/tfs/bin/ds_client -d 192.168.41.141:9998
list_file 3022
上图可以看到,block 3022 里面只有一个文件fileid 1 size为1550162(跟我们上传的一样大)。
取出来:read_file_data 3022 1 /tmp/test141.jpg
没有报错。我们去看看/tmp/test141.jpg 是的,我们取出来了!!!
还没有完,tfs的强项我们还没看到,这里展示下:
刚刚我们是去192.168.41.141取文件,我们到另一台dataserve_192.168.41.142取看看,就当是141这台宕机了(备注:192.168.41.142 dataserver设置的监听端口是9999)/ust/local/tfs/bin/ds_client -d 192.168.41.142:9999 \\
同样取blockid: 3022, fileid: 1 保存成test142.jpg也是成功的!然后我们对比下test141.jpg和test142.jpg是的,是一样的!
PHP接口:
tfs的php接口暂时还依赖rcserver这点让我觉得有点吃惊,觉得有点多余,而rcserver直接又与mysql有关系,至今我还不是很明白rcserver给的数据表里面各字段的含义。所以在php接口上,还是有点问题。
今天先把tfs的php插件先写出来,一开始安装这个插件真是费了很多劲,后来在雪崖(淘宝)童鞋的帮助下,终于解决了问题.
测试环境
64位Centos的
tft --versoion 2.1.1
tail --version 2.3
php --version 5.3.9 // 5.2.x的环境没有测试,雪崖给的php版本是20090626
方法:1.安装淘宝的tair
wget http://code.taobao.org/p/tair/file/19/tair-2.3-46.el5.x86_64.rpm
rpm -ivh tair-2.3-46.el5.x86_64.rpm
2.配置系统环境变量
export TFS_ROOT='/usr/local/tfs' //tfs的安装目录
export TBLIB_ROOT='/usr/local/tb/lib' //tbsys和tbnet的lib目录
export TAIR_ROOT='/opt/csr/tair-2.3' //tair的安装路径
3.编译安装tfs的php插件
cd /root/tfs/src/phpclient
/usr/local/php/bin/phpize --clean
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
cp -a ../new_client/fsname.h ./ //否则make的时候会提示错误
cp -a ../common ./ //否则make的时候会提示错误
find ./ -name Makefile -exec sed -i 's/\-Werror//g' {} \; //否则make的时候会提示错误
make
make install
之后会生成在/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/(路径跟php的安装环境有关系)下生成一个tfs_client.so 文件,把它添加到php.ini里面即可。
查看插件是否生效方式 /usr/local/php/bin/php -m 当然,你也可以用phpinfo的形式来看
php的插件就到这里结束。 php接连tfs中间还有个rcserver,这个问题还没解决,把我的问题贴出来,如果有谁已经解决,一定要告诉我,谢谢了!
rcserver我跟tfs的nameserver放在同一台。
rcserver依赖mysql数据库,我们把数据库放在192.168.41.158
cd tfs/sql/rcs
mysql -uroot -p
>create database tfs_stat;
>exit
mysql tfs_stat <./create_table.sql
mysql tfs_stat <./rc_test_info.sql
这样数据库里面的数据是淘宝提供的一些测试数据,需要改成自己环境的配置,这里我测试了很久,都没办法php解决接连问题,给的错误提示没看明白错在哪里。
cd /usr/local/tfs/conf
vi rc.conf 输入:
######
[public]
log_level = info (方便调试,线上感觉用error好点)
log_num = 20
log_size = 134217728
work_dir = /usr/local/tfs
thread_count = 4
ip_addr = 192.168.41.140 //rcserver所在的IP
dev_name = eth0
port = 7777 //监听端口
[rcserver]
rc_monitor_interval = 60
rc_stat_interval = 30
rc_update_interval = 10
rc_db_info = 192.168.41.158:3306:tfs_stat //数据库信息
rc_db_user = a12333a_li //数据库用户
rc_db_pwd = 123456 //数据库密码
#######
启动rc服务:
/usr/local/tfs/scripts/tfs start_rc
然后切回到php的那台
cd tfs/tests/phpclient //源包的目录
执行
/usr/local/php/bin/php test.php 192.168.41.140:7777 tappkey00001 192.168.41.142
PHP rcserver:port key(在数据库里面) 本机IP
我就栽在这里了,老是提示错误,错误提示: 这是为什么呢。。。
待更新....
2012.6.16