zoukankan      html  css  js  c++  java
  • TFS(Taobao File System)安装办法

    TFS(Taobao File System)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器 集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化了文件的访问流程,一定程度上为TFS提供了良好的读写性能。

    TFS文件系统的安装说明

    安装方法

    准备工作
    检查服务器是否能正常DNS解析,目的是正常解析域名,可以进行yum更新。
    如果你的服务器DNS解析正常,可跳过此步。
    CentOS修改DNS方法:(修改后可即时生效,重启后同样有效)
    修改对应网卡的DNS的配置文件

    # vi /etc/resolv.conf

    修改以下内容
    nameserver 8.8.8.8 #google域名服务器
    nameserver 8.8.4.4 #google域名服务器

    验证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

    安装ext4格式工具
    [root@locatfs local]# yum install e4fsprogs e4fsprogs-devel

    加载ext4模块,让系统支持ext4文件系统
    [root@locatfs local]# modprobe ext4

    说明:
    1、TSF使用ext3文件系统,可以工作。
    2、TSF的数据盘,只使用一个文件夹,可以工作,研究时不能分区格盘时可以这么做。

    安装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同一个路径。
    (http://code.taobao.org/svn/tb-common-utils/trunk/ tb-common-utils)

    gtest库是单元测试框架,下面安装安装gtest
    自行上网下载gtest, (http://code.google.com/p/googletest/downloads/list)(这个需要FQ,如果没有的话请使用链接

    新建一个下载目录,并进入这个目录。
    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 两个目录。

    第8步 编译安装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在高并发下内存占用更加稳定。

    参考:http://blog.chinaunix.net/space.php?uid=10449864&do=blog&id=2956849

    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

    官网
    http://code.taobao.org/p/tfs/wiki/index/

    淘宝TFS文件系统配置
    http://1008305.blog.51cto.com/998305/768258

    淘宝TFS分布式文件系统亲测
    http://gdcsy.blog.163.com/blog/static/12734360920125624859906/

    TFS Nginx模块实现
    http://wenku.baidu.com/view/0d3007d4240c844769eaee58.html

    nginx-tfs-module
    http://code.google.com/p/nginx-tfs-module/

    TFS Restful 接口测试总结分享
    http://100continue.iteye.com/blog/1456390

    redhat 6.3下编译淘宝tfs
    http://my.oschina.net/beiyou/blog/76129

    淘宝核心系统团队博客
    http://rdc.taobao.com/blog/cs/?tag=tfs

    淘宝网Nginx定制开发实践指南
    http://wenku.baidu.com/view/010a212ecfc789eb172dc80a.html

    淘宝海量图片系统
    http://wenku.baidu.com/view/cc597ef8941ea76e58fa04a5.html

    配置dataserver、分区、 挂载数据盘

    目前的情况,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.146.128 #本机IP地址(vip)
    
    dataserver->ip_addr = 192.168.146.128 #NameServer配置HA时请设置为vip,没配置HA时请设置为主ns的ip
    
    dataserver->ip_addr_list = 192.168.146.128|192.168.146.129 #!nameserver IP地址列表(master, salveip地址,只能以'|'分隔)
    dataserver->port = 8108 #!NameServer 监听的端口, 1024 ~ 55535
    dataserver->mount_name =  /data/tfs #mount路径
    dataserver->mount_maxsize = 141000000  #mount 时磁盘的大小, 单位(KB),TFS将使用这么多的空间134G
    dataserver->block_max_size = 67108864 #block 最大size
    dataserver->mainblock_size = 67108864 #每个数据存储块的大小
    
    dataserver->extblock_size = 8388608  #扩展块的大小, 单位(字节)
    

    ds.conf 内容 (其中有中文,要保存为UTF-8,不带标签)

    [public]
    #日志文件的size,default 1GB
    log_size=1073741824
    
    #保留日志文件的个数,default 64
    log_num = 64
    
    #日志文件的级别, default info,线上使用建议设为info,调试设为debug
    #dubug级日志量会很大
    log_level=debug
    
    #main queue size default 10240
    #工作队列size, default 10240
    task_max_queue_size = 10240
    
    #listen port
    #监听端口, 1024 ~ 65535
    port = 9998
    
    #work directoy
    #工作目录
    work_dir=/usr/local/tfs
    
    #device name
    #网络设备
    dev_name= eth0
    
    #work thread count default 4
    #工作线程池 default 4
    thread_count = 4
    
    #ip addr
    #本机IP地址(vip)
    ip_addr = 192.168.119.217
    
    [dataserver]
    
    #NameServer ip addr(vip)
    #!NameServer vip地址
    #NameServer配置HA时请设置为vip,没配置HA时请设置为主ns的ip
    ip_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 ~ 55535
    port = 8108
    
    #备集群NameServer的vip地址, 没有搭建主副集群的可以不用配置此项
    #slave_nsip = 192.168.0.2:8108
    
    #无效配置,直接加到slave_nsip项即可
    #slave_nsport = 8108
    
    #heart interval time(seconds)
    #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
    
    #定时dump统计信息的间隔时间, 单位(秒), default: 60
    dump_visit_stat_interval = 60
    
    #io操作的阀值, 超过此值时, 会警告
    #max_io_warning_time = 0
    
    #备件类型, 1: tfs, 2: nfs
    backup_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 ftruncate
    base_filesystem_type = 1
    
    #超级块存存储的保留位置,default: 0
    superblock_reserve = 0
    
    #平均文件的大小, 单位(字节)
    avg_file_size = 40960
    
    #主块的大小, 单位(字节)
    #每个数据存储块的大小
    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

    挂数据盘,一台服务器,可以挂载多块数据盘。

    查看硬盘
    fdisk -l 发现本台服务器上有5块146G的磁盘,第一块是系统盘。其它4块可以做数据盘
    Disk /dev/sda: 146.6 GB
    Disk /dev/sdb: 146.6 GB
    Disk /dev/sdc: 146.6 GB
    Disk /dev/sdd: 146.6 GB
    Disk /dev/sde: 146.6 GB

    umount
    分区,格式化之前,如果已挂载,要先反挂载
    umount /dev/sdb1
    umount /dev/sdc1
    umount /dev/sdd1
    umount /dev/sde1

    分区
    对数据盘进行分区,一块盘分一个区就行。
    执行“fdisk /dev/sdb”命令,对数据盘进行分区;
    根据提示,依次输入“n”,“p”“1”,两次回车,“wq”,分区就开始了,很快就会完成。

    fdisk /dev/sdb
    fdisk /dev/sdc
    fdisk /dev/sdd
    fdisk /dev/sde

    格式化

    mkfs.ext4 /dev/sdb1
    mkfs.ext4 /dev/sdc1
    mkfs.ext4 /dev/sdd1
    mkfs.ext4 /dev/sde1

    挂载

    建好目录,第一块磁盘就挂载在第一个目录上。目录数据取决于你磁盘的数量。
    mkdir /data/tfs1
    mkdir /data/tfs2
    mkdir /data/tfs3
    mkdir /data/tfs4

    mount /dev/sdb1 /data/tfs1
    mount /dev/sdc1 /data/tfs2
    mount /dev/sdd1 /data/tfs3
    mount /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_ds
    2)直接启动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

    配置nameserver

    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的ip

    nameserver->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,去看一看文件。

    JavaClient使用经验

    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,不再报上面的错误了,情况有所好转。但报了其它错误数量不多。

  • 相关阅读:
    蛙蛙推荐:微软MSDN导航菜单演示(Javascript+CSS2)
    看来偶的WEB软件开发基本功还得再扎实一些
    蛙蛙请教:c#面向对象编程的有些抉择问题?
    蛙蛙请教:偶在CSDN发的好多问题都没有解决呢,我集中了一下,大家给看看
    Hive UDF开发
    ubuntu下设置开机自启动项
    ubuntu 扩展存储空间
    ubuntu 快速回到桌面
    编译Hive/Hadoop总结
    Linux MC——终端环境的文件管理器
  • 原文地址:https://www.cnblogs.com/ainima/p/6331802.html
Copyright © 2011-2022 走看看