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