首页 > 代码库 > 21.TFS文件系统搭建笔记
21.TFS文件系统搭建笔记
TFS文件系统搭建笔记
参考地址:
https://github.com/alibaba/tfs/blob/master/INSTALL.md
https://github.com/alibaba/tfs/blob/master/DEPLOY.md
http://tfs.taobao.org/
http://code.taobao.org/p/tfs/wiki/get/
http://csrd.aliapp.com/
软件下载地址(源码):
TFS:https://github.com/alibaba/tfs
Nginx模块:https://github.com/alibaba/nginx-tfs
utils:https://github.com/raywill/tb-common-utils
安装命令:
gcc环境官方推荐gcc-4.1.2(gcc4.8.2亲测失败)
1.安装GCC
http://ftp.gnu.org/gnu/gcc 下载GCC
wgethttp://ftp.gnu.org/gnu/gcc/gcc-4.1.2/gcc-4.1.2.tar.bz2 在线下载GCC
tar -jxvf gcc-4.8.2.tar.bz2 解压GCC源码
cd gcc-4.8.0
./contrib/download_prerequisites 下载编译所需配置文件
mkdir gcc-build-4.1.2
cd gcc-build-4.1.2
../configure-enable-checking=release -enable-languages=c,c++ -disable-multilib 生成安装文件
make -j4 根据电脑核心数,编译
make install
gcc -v 查看版本
2.安装tfs环境
yum源最好自己配置一下,我用网易yum源,以下命令使用yum即可,apt-get是Ubuntu命令
安装依赖的软件包
- automake TFS基于automake工具构建
- 下载源码安装
- apt-get install automake
- yum install automake.noarch
- libtool automake需要使用libtool
- 下载源码安装
- apt-get install libtool
- yum install libtool.x86_64
- realine 用于命令行编辑的库
- 下载源码安装
- apt-get install libreadline-dev
- yum install readline-devel.x86_64
- libz-devel 用于数据压缩/解压缩
- 下载源码安装
- apt-get install zlib1g-dev
- yum install zlib-devel.x86_64
- uuid-devel 用于生成全局唯一ID
- 下载源码安装
- apt-get install uuid-dev
- yum install e2fsprogs-devel.x86_64
- tcmalloc google的内存管理库
- 下载源码安装
- apt-get install libgoogle-perftools-dev
- yum install google-perftools.x86_64
###tar包安装tcmalloc;google的内存管理工具(TFS参考了google的GFS,所以用到了这个工具)###
参考:http://blog.csdn.net/chen19870707/article/details/40301783
软件包我自己在网上找的:
libunwind-1.1.tar.gz
gperftools-2.4.tar.gz
libunwind安装:
tar zxvflibunwind-1.1.tar.gz
cd libunwind-1.1
./configure
make
make install
安装google-perftools:
tar zxvf tar zxvfgperftools-2.1.tar.gz
cd gperftools-2.1
./configure
make
make install
TCMalloc库加载到Linux系统中:
echo"/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
/sbin/ldconfig
#安装uuid工具
yum install libuuid-devel
3.Linux环境好了,开始安装tfs环境
#安装tb-common-utils
unzip tb-common-utils-master.zip
vim /etc/profile
设置环境变量,tb-common-utils-master.zip解压目录(随意)
TBLIB_ROOT=/home/tb-common-utils-master
source /etc/profile 重新加载配置文件
cd tb-common-utils-master 进入解压目录开始编译
chmod +x build.sh 给文件+可执行权限
./build.sh执行编译
如果一切顺利,tb-common-utils已经安装成功到$TBLIB_ROOT路径下
4.编译安装tfs
cd ../ 进入github下载的源码目录
unzip tfs-master.zip #解压tfs源码
cd tfs-master
sh build.sh init #初始化编译脚本生成configure等文件
./configure--prefix=/opt/tfs-master --with-release #生成编译文件makefile
make #执行编译,看最后有没有error,没有就是幸运
make install #执行安装
cd /opt/tfs-master/ #进入程序安装目录可以看到可执行文件可配置文件
安装后目录结构:
复制源码中的conf下配置文件到安装目录的conf.
修改nameserver(NS)配置文件:
#work directoy
work_dir=/opt/tfs/tfsData
#ip addr(vip)
ip_addr = 192.168.20.102
ip_addr_list =192.168.20.102|192.168.0.254
group_mask = 255.255.255.255
修改dataserver(DS)配置文件:
在成功安装TFS之后,在你的安装目录(默认为~/tfs_bin),包含几个子目录bin、conf、include、lib、logs、script等。
- bin:包含tfs所有的可执行程序文件,如nameserver(NS)、dataserver(DS)、tfstool。
- conf:包含tfs的配置文件,如NS的配置文件ns.conf,DS的配置文件ds.conf。
- include:包含TFS客户端库相关的头文件,应用程序使用TFS需要包含这些头文件。
- lib:包含TFS客户端的静/动态库,应用程序使用TFS需要连接libtfsclient。
- logs:用于存储TFS运行过程中的日志。
- script:包含tfs常用的一些运维脚本,如stfs用于格式化DS, tfs启动/停止NS、DS。
本文介绍如何搭建TFS存储集群,以两台存储节点(4个DS进程)为例,部署拓扑图如下所示:
配置TFS
~/tfs_bin/conf目录下包含TFS的配置文件模板,在部署前需要根据环境修改配置文件,下面对NS,DS一些关键的配置项进行说明,所有配置项使用key=value的形式进行配置,每行一项,在行首加#可直接注释配置项使之不生效;使用者应该根据实际情况,修改conf/ns.conf、conf/ds.conf这两个配置文件。
[public] 通用配置
log_size=1073741824 日志文件大小,当日志大小超过这个配置值时,TFS会进行rotate,产生新的日志文件, 建议不修改
log_num=64 最多保存的日志文件个数,超出会删除最旧的日志文件,建议不修改
log_level=info 日志级别(error,warn,info,debug),生产环境建议info级别,测试环境建议使用debug级别
task_max_queue_size=10240 server最大的请求队列长度,超出会直接丢掉请求包,可根据实际情况修改
work_dir=/home/xxxx/tfs TFS工作目录,强烈建议直接设置为TFS的安装目录,以方便运维管理
dev_name=bond0 server使用的网卡名,需要修改为你机器的某个网卡名
ip_addr=10.232.36.201 server服务的ip地址,必须是dev_name网卡上的IP地址,如果NS配置了HA,此处配置vip
port=8100 server服务的端口号,根据实际环境修改, 该配置项建议所有DS保持相同
[nameserver]该区域的配置只针对NS有效
safe_mode_time=360 seconds NS启动后的保护时间,在该时间内,NS不会构建任何复制、迁移等任务
ip_addr_list=10.232.36.201|192.168.0.254 如果使用HA,则配置vip对应的两个节点的实际ip;如果没有使用HA,第一项配置与ip_addr相同,第二项可以随便配置一个无效的地址(如本例中192.168.0.254是无效的IP地址)
group_mask=255.255.255.255 用于区分机架的子网掩码,可根据实际网络环境修改。如果你配置为255.255.255.255,那么任意两个ip不同的机器都被认为在不同的机架;如果你配置为255.255.255.0,那么192.168.0.x与192.168.0.y将被认为在同一个机架,依次类推;TFS数据块的多个副本不能分布在同一个机架内,以提高可靠性。
max_replication=2 副本数,机器数必须大于副本数,单机环境测试,只能设置为1,否则不能存数据
cluster_id=1 集群ID,存文件后生成的文件名会包含这个ID,建议不修改
block_max_size=75497472 Bytes,保持与dataserver下mainblock_size配置一致,建议不修改
repl_wait_time=180 seconds 当NS检测到block丢失时,等待多长时间开始复制block,可根据实际情况修改
compact_delete_ratio=10 代表10%,当NS发现block中文件删除比例超出该比例,开始对block进行压缩,回收删除文件的存储空间
compact_hour_range=1~10 代表1点~10点,NS只会在1-10点间进行block压缩,建议设置为访问低峰时间段
balance_percent=0.05 代表5%,负载均衡时,当DS存储容量超出平均值5%时,就会被选择为数据迁移源,低于平均值5%,就会被选为数据迁移目标
[dataserver]该区域的配置只针对DS有效
ip_addr=10.232.36.203 NS的ip地址,如果配置了HA,则为vip
ip_addr_list=10.232.36.201|192.168.0.254 与nameserver区域的ip_addr_list配置保持一致
port=8100 NS服务监听的端口
heart_interval=2 seconds,DS向NS发送心跳的时间间隔,可根据实际环境修改
mount_name=/data/disk DS数据目录,如果机器上有2块盘,则它们应该挂载在/data/disk1、/data/disk2,依次类推
mount_maxsize=961227000 KB, 磁盘实际使用的空间,应该小于df命令Available一项的输出
base_filesystem_type=1 1代表ext4、3代表ext3,强烈建议使用ext4文件系统
avg_file_size=15360Bytes 集群内平均文件大小,预测值,可根据实际负载调整
mainblock_size=75497472 Bytes 块的大小,建议不修改
extblock_size=4194304 Bytes 扩展块,扩展块主要用于更新,建议不修改
运行Nameserver
# cd~/tfs_bin
#./scripts/tfs start_ns 或者./bin/nameserver -f conf/ns.conf -d
如果没有提示错误,则NS就已经在后台开始运行了,可通过ps查看相应进行,或进入logs下,查看nameserver.log,如包含“nameserverrunning”则说明启动正常
运行Dataserver
在本例的环境中,10.232.36.203/204上都有两块磁盘/dev/sda、/dev/sdb,磁盘空间均为1TB;TFS采用每个DS进程管理一块磁盘的方式,也就是说,每个机器上都会运行2个DS进程,分别管理/dev/sda、/dev/sdb, 并且这两块盘应该挂载到/data/disk1、/data/disk2两个目录(因为配置文件中指定mount_path为/data/disk),启动DS时指定序号(如1、2)这个DS进程就会加载对应目录里的数据(1对应/data/disk1、2对应/data/disk2,依次类推)开始服务。
对每个机器上多个DS进程使用的端口,TFS也做了统一以方便运维,比如DS配置port为8200,那么序号为1的DS进程会在8200端口监听,序号为2的DS进程会在8202端口监听,依次类推,序号为n的DS在8200 + (n - 1)* 2 号端口上监听。强烈建议每个DS public下的port项都配置相同的值,这样根据端口号就能直接换算出DS的序号(序号一旦确定,通过df命令就能确定具体磁盘),对定位问题很方便。
另外,TFS的DS对存储空间有自己独特的管理方式,将可用的存储空间分成多个block进行管理,使用前DS需要先进行format(使用TFS提供的工具),预分配各个block的存储空间,保证block的存储空间在磁盘上连续(理论上),从而避免动态分配时产生大量的磁盘碎片,降低服务效率。
在两台机器上分别进行如下操作,准备好数据目录
#mkfs.ext4 /dev/sda // 请确保你有相应权限
# mount -text4 /dev/sda /data/disk1
#mkfs.ext4 /dev/sdb
# mount -text4 /dev/sdb /data/disk2
在两台机器上,对数据目录进行format
# cd~/tfs_bin
#./script/stfs format 1 // 结果会在命令行提示
#./script/stfs format 2
以上两条命令也可合并为 ./script/stfs format 1-2 或./script/stfs format 1,2
如果要清理格式化产生的数据,将上述命令中format换成clear即可
格式化成功后,会发现/data/disk1,/data/disk2下面产生了一堆以数字命名的文件(1-n),因为TFS的block文件是以数字命名的,从1开始递增编号。
在两台机器上,启动DS服务
# cd~/tfs_bin
#./scripts/tfs start_ds 1-2 // 序号的使用与stfs类似,可通过","分隔序号,通过"-"指定范围序列
或./bin/dataserver -f conf/ds.conf -i 1 -d (-i 指定序号)
通过ps可查看DS是否正常启动,也可进入logs目录,查看dataserver_i.log(i用相应的序号代替),如果包含“dataservice start”,则说明DS启动正常。
开始TFS存储之旅
此时NS,DS的服务已经成功的启动了,TFS客户端可以向TFS存取文件,tfstool是tfs的命令行工具,可通过该工具向TFS存文件,从TFS取文件。
#./bin/tfstool -s 10.232.36.201:8100 -i "put testfile"
将本地testfile存入tfs, -s 指定nameserver的ip:port。如果成功,会打印 put testfile => T1QEBXXDpXXXXXXXXXsuccess. 类似的消息,其中T开头一串字符是TFS为这个文件生成的文件名,一共18个字符;要想从TFS取出该文件时,需要指定该文件名。
#./bin/tfstoo -s 10.232.36.201:8100 -i "get T1QEBXXDpXXXXXXXXXlocalfile"
从TFS读取T1QEBXXDpXXXXXXXXX,存储到本地localfile中;如果成功,会打印fetch T1QEBXXDpXXXXXXXXX => localfilesuccess.类似的消息。
部署FAQ
Q: formatTFS数据目录的过程中失败了?
A: 可能的原因:你对这个目录写权限;目录空间不足,先检查mount_maxsize的配置;目录已经被格式化过,先clear,再format;磁盘换了;具体错误,根据提示的errno来分析。
Q: 启动服务的过程中,提示ip ‘xxxx‘is not local ip, local ip: yyyy类似错误?
A: 确认dev_name对应的网卡是否存在;ip_addr的配置是否是该网卡上的ip地址。
Q: 通过tfstool存数据一致不能成功,错误码-5001?
A: 检查max_replication的配置,机器数一定要大于副本数。
Q: ns.conf、ds.conf中为什么要配置ip_addr_list,而不是都直接使用vip?
A: 主备NS为了实现宕机切换后,备NS能够立即服务;主ns会异步将操作日志同步到备NS;同时所有的DS会同时向主备NS发心跳;这样备NS上拥有的信息与主NS基本相同(异步同步会有延时,做不到完全相同),可随时提供服务。基于此原因,nameserver必须知道备NS的real ip,DS也必须知道vip对应的主备NS的real ip。
Q: TFS HA怎么配置?
A: 这个让google回答你吧,淘宝HA的使用方式和配置可能并不适合你;tfs对HA软件及配置没有特殊要求,只要能实现主NS宕机vip飘移到备NS即可。
Q: 我部署好了TFS服务,有压力测试工具么,我想测试下性能?
A: TFS源代码下test/batch目录里有test_batch_write、test_batch_read、test_batch_mix三个工具。
示例:./test_batch_write -d ns-ip:port -c 1000 -r10240:20480 -t 4
该命令代表往ns-ip:port对应的集群,开启4个线程,每个线程写1000个10K-20K范围内大小的文件。
虚拟磁盘(如果有条件肯定是服务器挂多块物理硬盘测试环境条件不允许那就自己创建虚拟磁盘玩呗,我只给每块虚拟磁盘分了1G容量,以后不够再动态分配)
需要挂载4块硬盘
1.在第一台dataNode上挂载第2块虚拟磁盘:
dd if=/dev/zero of=hdisk1.img bs=1k count=10240000 #创建虚拟磁盘10G
file hdisk1.img #查看磁盘信息;data
losetup /dev/loop1 hdisk1.img #挂载虚拟设备
losetup -a #显示所有虚拟设备,losetup -d /dev/loop1 卸载设备
fdisk /dev/loop1#查看虚拟磁盘初始状态DOS
mkfs -t ext4 /dev/loop1#格式化成ext4
mkfs.ext4 /dev/loop1 #格式化ext4;如上
file hdisk1.img#查看格式化后属性
hdisk1.img: Linux rev 1.0 ext4 filesystem data (extents) (large files) (huge files)
mount /dev/loop1 /data/disk1 #挂载虚拟磁盘到/data/disk1目录
mount -t ext4 /dev/loop1 /data/disk1 #挂载虚拟磁盘到/data/disk1目录,并指定格式
2.在第一台dataNode上挂载第2块虚拟磁盘:
dd if=/dev/zero of=hdisk2.img bs=1k count=10240000 #创建虚拟磁盘10G
losetup /dev/loop2 hdisk2.img #挂载虚拟设备
losetup -a #显示所有虚拟设备
mkfs -t ext4 /dev/loop2#格式化成ext4
mkfs.ext4 /dev/loop2 #格式化ext4;如上
file hdisk2.img#查看格式化后属性
hdisk2.img: Linux rev 1.0 ext4 filesystem data (extents) (large files) (huge files)
mount /dev/loop2 /data/disk2 #挂载虚拟磁盘到/data/disk1目录
mount -t ext4 /dev/loop2 /data/disk2 #挂载虚拟磁盘到/data/disk1目录,并指定格式
3.另一台机器同理
4.stfs脚本执行tfs格式化和启动dataNode
./scripts/stfs format 1-2
./scripts/tfs start_ds 1-2
./bin/tfstool -s 192.168.20.102:8100 -i "put testfile" #上传文件
##因为在配置文件指定文件大小,文件太小刚创建的没有写入任何内容会存入失败###
./bin/tfstool -s 192.168.20.102:8100 -i "put bin.tar.gz" #这个文件较大
红框内提示成功,并且声成了一个唯一文件名称(put bin.tar.gz => T19yETByJT1RCvBVdK success.)
##tfstool操作文件上传下载删除等###
./bin/tfstool -s 192.168.20.102:8100 -i "put bin.tar.gz" 执行此命令将文件存入TFS
(-i 立即执行,-h help,-s nameserver ip port,-r rcserver ip port)
./bin/tfstool -s 192.168.20.102:8100 -i "get T19yETByJT1RCvBVdK tangwan.gz" 执行此命令将存入的文件取出
./bin/tfstool -s 192.168.20.102:8100 -i "put 8.png" #上传一个图片一会用浏览器查看
./bin/tfstool -s 192.168.20.102:8100 -i "rm T1SaETByJT1RCvBVdK" #删除tfs中文件
###TFS命令工具
$ /opt/tfs/bin/ssm -s 172.29.1.101:8100
show >server -b #查看节点
show >server -w
show > machine -a #查看硬盘使用信息
tfstool的其他命令行使用方法请参考文档:
<<TFS官方文档>>.pdf 运维篇--->工具介绍
##安装Nginx和Nginx-tfs模块,实现TFS的rest API
1.编译环境
yum -y install ruby cmake pcre pcre-devel openssl openssl-devel perl perl-devel perl-ExtUtils-Embed #安装几个软件,安装yajl,nginx-tfs编译需要
export GIT_SSL_NO_VERIFY=true
ruby -v #查看ruby版本
cd /home/
tar -zxvf yajl-2.0.1.tar.gz #解压yajl,版本严格按照官方要求2.0.1
cd yajl-2.0.1
./configure #生成编译配置文件
make #编译
make install #安装yajl
vim /etc/ld.so.conf.d/ymjl.conf #加一个配置文件
写入:/usr/local/lib/ #导入yajl的lib库
ldconfig -v #重新加载lib
tar -zxvf nginx-1.4.7.tar.gz #
unzip nginx-tfs-master.zip #解压github下载的模块代码
tar -zxvf tengine-1.5.1.tar.gz #解压tengine,这个是淘宝开源的基于Nginx的改装的服务器软件,和Nginx用法完全一致
cd tengine-1.5.1
./configure --add-module=/home/nginx-tfs-master #带tfs模块编译tengine
make && make install #编译安装tengine;默认安装到/usr/local/nginx下
cd /usr/local/nginx/conf
mv nginx.conf nginx.conf.bak #备份nginx.conf,也可以直接删除,里面有一个备份
touch nginx.conf #创建一个nginx.conf配置文件
vim nginx.conf #内容参考下面我的配置
./nginx -t #检查nginx.conf是否有语法错误
sh ../sbin/nginx #启动nginx
#启动Nginx时如果报错找不到yajl.so库文件,执行下面命令把编译在32位lib下的库软链接到lib64下
ln -s /usr/local/lib/libyajl.so.2 /usr/lib64/libyajl.so.2
ldd $(which /usr/local/nginx/sbin/nginx)
sh ../sbin/nginx -s reload #重启nginx
关键时刻来了:
http://192.168.20.102/v1/tfs/T1SRETByKT1RCvBVdK #直接浏览器访问地址可以查看之前上传的图片;最后一个参数是上传图片是返回的是文件唯一标识ID;访问路径格式都是
http//:ip:port/v1/tfs/ID
#下面红色部分不需要了,但是个经验
cd objs/
vim Makefile #忽略警告,不然警告也被当成错误
删掉:-Werror (大约第3行)
参考我的其他文档:
<<TFS官方文档>>.pdf 看使用篇--Nginx模块 内容即可.
<<TFS的java客户端>>.pdf c++篇我就不整理的,看不懂c++
配置参考:官方文档
nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
tfs_upstream tfs_rc {
server 192.168.20.102:8100;
type ns;//这里我改了,我没用rcs,所以我就配置nameserver即可
rcs_zone name=tfs1 size=128M;
rcs_interface eth0;
rcs_heartbeat lock_file=/logs/lk.file interval=10s;
}
# sendfile on;
# keepalive_timeout 65;
server {
listen 80;
server_name localhost;
tfs_keepalive max_cached=100 bucket_count=10;
tfs_log "pipe:/usr/sbin/cronolog -p 30min /path/to/nginx/logs/cronolog/%Y/%m/%Y-%m-%d-%H-%M-tfs_access.log";
location /{
tfs_pass tfs://tfs_rc;
}
error_page 500502503504 /50x.html;
location =/50x.html {
root html;
}
}
}
#TFS的java接口(tfs-javaclient)
java-client我下载源码然后maven打包后已上传私服20.198(3个版本1.3.0 1.3.1 2.1.1)
<dependency>
<groupId>com.taobao.common.tfs</groupId>
<artifactId>tfs-javaclient</artifactId>
<version>2.1.1</version>
</dependency>
nexus上传tfs-javaclient-2.1.1.jar包:
进入jar包目录,用压缩软件打开jar包,找到里面的pom,按照里面的坐标配置下面的命令
源码地址:http://code.taobao.org/p/tfs-client-java/src/tags/
svn地址:http://code.taobao.org/svn/tfs-client-java/
#jar包安装到本地仓库
mvn install:install-file -Dfile=tfs-javaclient-2.1.1.jar -DgroupId=com.taobao.common.tfs -DartifactId=common-tfs -Dversion=2.1.1 -Dpackaging=jar
#上传到nexus
21.TFS文件系统搭建笔记