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)(這個需要翻牆,如果沒有的話請使用鏈接

新建一個下載目錄,並進入這個目錄。
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,不再報上面的錯誤了,情況有所好轉。但報了其它錯誤數量不多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章