1. 程式人生 > 實用技巧 >淘寶分散式檔案系統TFS安裝配置手冊

淘寶分散式檔案系統TFS安裝配置手冊

TFS檔名的結構

TFS的檔名由塊號和檔案號通過某種對應關係組成,最大長度為18位元組。檔名固定以T開始,第二位元組為該叢集的編號(可以在配置項中指定,取值範圍 1~9)。餘下的位元組由Block ID和File ID通過一定的編碼方式得到。檔名由客戶端程式進行編碼和解碼,它對映方式如下圖:

wKiom1LWTKSRWHiYAACvG_FxW9s003.png

TFS客戶程式在讀檔案的時候通過將檔名轉換為BlockID和FileID資訊,然後可以在!NameServer取得該塊所在!DataServer資訊(如果客戶端有該Block與!DataServere的快取,則直接從快取中取),然後與!DataServer進行讀取操作。

TFS寫操作資料流

TFS系統中,nameserver會保證一個檔案有多個副本儲存於不同的dataserver上以保證冗餘。當由於dataserver伺服器宕機或由於其他原因退出系統導致某些檔案副本數量下降時,nameserver將會排程新的dataserver節點儲存檔案備份。同樣為了保證資料一致性,當寫入一個檔案時,只有所有參與的dataserver均寫入成功時,該操作才算成功。TFS的寫操作資料流圖如下所示:

wKioL1LWTKvzCrm_AACZTD4ri3E590.png

客戶端首先向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和客戶端返回操作成功的資訊。

獲得Block ID和File ID

根據TFS檔名解析出Block ID和block中的File ID。

獲取dataserver地址

向nameserver傳送查詢請求得到Block ID所在的dataserver地址。

由於nameserver中維護了block和dataserver的對應關係,所以nameserver能夠提供相應的資訊。

Note: 由於TFS是把大量小檔案放在一個block裡面,

所以TFS的檔案複製是基於block的,而且複製出來的block的block id應該是一致的

請求檔案

通過傳送Block_ID、File_ID和offset為引數的讀請求到對應的dataserver,得到檔案內容。

dataserver會根據本地記錄的資訊來得到File ID所在block的偏移量,從而讀取到正確的檔案內容.

wKiom1LWTOGD2xtOAAAvoWQat7I608.jpg

TFS 在2.0版本增加了一個server, 叫做 rcserver. 這個 server 主要是為了淘寶內部管理使用 TFS 的各個應用. 我們給每個應用分配一個唯一的 AppKey. TFS 客戶端使用這個 AppKey 登入到 rcserver, 取得自己應該訪問的 TFS 叢集資訊. 客戶端還會定期把自己的一些統計值傳送給 rcserver. 具體資訊可以參看原始碼中 doc 目錄下的關於 rcserve 的文件。


TFS(Taobao File System)是一個高可擴充套件、高可用、高效能、面向網際網路服務的分散式檔案系統,主要針對海量的非結構化資料,它構築在普通的Linux機器叢集上,可為外部提供高可靠和高併發的儲存訪問。TFS為淘寶提供海量小檔案儲存,通常檔案大小不超過1M,滿足了淘寶對小檔案儲存的需求,被廣泛地應用 在淘寶各項應用中。它採用了HA架構和平滑擴容,保證了整個檔案系統的可用性和擴充套件性。同時扁平化的資料組織結構,可將檔名對映到檔案的實體地址,簡化了檔案的訪問流程,一定程度上為TFS提供了良好的讀寫效能。

上面說有太美好了,實際使用起來還是挺周折的。TFS有三個主要大版本:1.x,2.0.x,2.2.x,我先後試用了多個版本,認為2.0.4相對來說 比較穩定,其它版本(2.2.8,2.2.10)問題很多。這話是2012年11月說的,如果以後TFS的新版本穩定了另當別論。

TFS檔案系統的安裝說明

— 注:本文字作業系統是RedHat5.6

—- 第1步 準備工作—-

檢查伺服器是否能正常DNS解析,目的是正常解析域名,可以進行yum更新。

如果你的伺服器DNS解析正常,可跳過此步。

CentOS修改DNS方法:(修改後可即時生效,重啟後同樣有效)

修改對應網絡卡的DNS的配置檔案:

  1. # vi /etc/resolv.conf

修改以下內容:

  1. nameserver 8.8.8.8 #google域名伺服器

  2. nameserver 8.8.4.4 #google域名伺服器

—- 第2步 準備工作—-

RedHat5.6使用centos yum源:由於RedHat的yum線上更新是收費的,我們的RedHat沒有註冊,不能線上更新下載rpm包。需將RedHat的yum解除安裝後,重啟安裝Centos的yum,再配置其他yum源。

如果你的伺服器yum可正常工作,可跳過此步。

具體操作請看: RedHat5.6、6.0使用CentOS yum源

—- 第3步 準備工作—-

先更新yum:

  1. yum update

到這裡yum已可以正常工作。後面都需要使用的yum。

—- 第4步 準備工作—-

RedHat5.x和Centos 5.x使用gcc版本是4.1.2,RedHat6.x和Centos 6.x使用gcc版本是4.4.6,對編譯的語法檢查更嚴格,編譯TFS給報錯。

淘寶的tfs官網上要求使用gcc版本是4.1.2。

確認gcc版本:

  1. gcc -v

結果:以上所有機器返回結果 :gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)

如果你使用RedHat6.x和Centos 6.x,就要重新安裝低版本的gcc,g++。

—- 第5步 升級安裝高版本mysql—-

TFS要求MySql版本>= 5.1.40,不然編譯時報錯:checking if MySQL version is >= 5.1.40… no

但我的CentOS 5的yum源中最新只有 5.0.95版本,所有使用這個yum源線上安裝最高也只能安裝5.0.95,換一個yum來解決問題。

1.安裝配置yum源:

  1. wget http://centos.ustc.edu.cn/epel/5/x86_64/epel-release-5-4.noarch.rpm

  2. wget http://rpms.famillecollet.com/enterprise/5/remi/x86_64/remi-release-5-8.el5.remi.noarch.rpm

  3. rpm -ivh *.rpm

2.向以下3個檔案尾部追加一個文字(可以不做):

  1. echo ‘priority=1>> /etc/yum.repos.d/remi.repo

  2. echo ‘priority=1>> /etc/yum.repos.d/epel-testing.repo

  3. echo ‘priority=1>> /etc/yum.repos.d/epel.repo

3.檢查mysql 是否有可升級版本。發現有版本可以升級到mysql5.5.11。

  1. yum –enablerepo=remi list mysql

4.檢查是否有可升級版本。發現有版本可以升級到mysql5.5.11。

  1. yum –enablerepo=remi list mysql5.刪除作業系統自帶的低版本的mysql

  2. yum remove mysql

6.通過新yum源安裝高版本的mysql

  1. yum -y –enablerepo=remi install mysql mysql-server mysql.x86_64 mysql-devel.x86_64

—- 第6步 安裝支援包—-

需要確保安裝了automake autoconfig 和 libtool,一般情況下已安裝。

auotmake 1.4以上版本需要安裝libuuid-devel,zlib-devel,mysql-devel三個開發包驗證automake是否安裝:

  1. rpm -qa |grep automake

結果:已安裝

驗證autoconfig是否安裝:

  1. /usr/bin/autoconf -V

結果:已安裝

檢視以安裝的rpm包:rpm -qa|grep 包名:

  1. rpm -qa|grep libuuid

  2. rpm -qa|grep zlib-devel

  3. 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

升級autoconf (不升級也可以):

  1. [[email protected] local]# whereis autoconf

  2. [[email protected] local]# rpm -qf /usr/bin/autoconf

  3. [[email protected] local]# /usr/bin/autoconf -V

  4. [[email protected] local]# rpm -e –nodeps autoconf-2.59-12

  5. [[email protected] local]# wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz

  6. [[email protected] local]# tar zxvf autoconf-latest.tar.gz

  7. [[email protected] local]# cd autoconf-2.69

  8. [[email protected] local]# ./configure –prefix=/usr

  9. [[email protected] local]# make

  10. [[email protected] local]# make install

  11. [[email protected] local]# /usr/bin/autoconf -V #檢視是否安裝成功

下面的readline包系統自帶了,ncurses包系統預設沒有,我也沒有安裝,你安不安自已定吧。

  1. [[email protected] local]# yum install readline-devel readline

  2. [[email protected] local]# yum install ncurses-devel.x86_64 ncurses.x86_64

—- 第7步 安裝ext4格式—-

安裝ext4格式工具:

  1. [[email protected] local]# yum install e4fsprogs e4fsprogs-devel

載入ext4模組,讓系統支援ext4檔案系統

  1. [[email protected] local]# modprobe ext4

說明:

1、TSF使用ext3檔案系統,可以工作。

2、TSF的資料盤,只使用一個資料夾,可以工作,研究時不能分割槽格盤時可以這麼做。

—- 第8步 安裝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同一個路徑

gtest庫是單元測試框架,下面安裝安裝gtest:

自行上網下載gtest,新建一個下載目錄,並進入這個目錄。

  1. wget http://googletest.googlecode.com/files/gtest-1.6.0.zip

  2. [[email protected] local]# unzip gtest-1.6.0.zip

  3. [[email protected] local]# cd gtest-1.6.0

  4. [[email protected] local]# ./configure

  5. [[email protected] local]# make

  6. [[email protected] local]# cd make/

  7. [[email protected] local]# make

  8. [[email protected] local]# ./sample1_unittest

  9. 安裝tb-common-utils

新建一個下載目錄,並進入這個目錄。下載原始碼:

  1. [[email protected] local]# svn checkout http://code.taobao.org/svn/tb-common-utils/trunk/ tb-common-utils

編譯和安裝tbnet, tbsys庫:

指定環境變數 TBLIB_ROOT為需要安裝的目錄。這個環境變數在後續tfs的編譯安裝中仍舊會被使用到. 比如要安裝到當前使用者的lib目錄下, 則指定 export,

  1. TBLIB_ROOT=”/home/xxxx/lib”

ps:建議將這行命令直接寫入~/.bash_profile,然後執行“. ~/.bash_profile”

修改:

  1. [[email protected] local]# vi /etc/profile

新增:(計劃安裝在/usr/local/tb/lib目錄)

  1. export TBLIB_ROOT=/usr/local/tb/lib

生效:

  1. [[email protected] local]# source /etc/profile

進入tb-common-utils資料夾, 執行build.sh進行安裝。

  1. [[email protected] local]# cd tb-common-utils/

  2. [[email protected] local]# chmod +x *.sh

  3. [[email protected] local]# ./build.sh

安裝完成後,在TBLIB_ROOT表示的目錄(/usr/local/tb/lib),應該可以看到include、lib 兩個目錄。

—- 第9步 編譯安裝TFS—-

編譯安裝tfs (安裝到 /usr/local/tfs目錄)

  1. [[email protected] local]# svn checkout http://code.taobao.org/svn/tfs/tags/release-2.2.10 tfs-2.2.10 (這個編譯成功了)

  2. [[email protected] local]# svn checkout http://code.taobao.org/svn/tfs/trunk/ tfs (這個編譯不成功)

進入 tfs 目錄:

  1. [[email protected] local]# cd tfs/

  2. [[email protected] local]# chmod +x *.sh

  3. [[email protected] local]# ./build.sh init

  4. [[email protected] local]# ./configure –prefix=/usr/local/tfs –without-tcmalloc

  5. [[email protected] local]# make

  6. [[email protected] local]# make install

  7. #如果提示找不到/usr/local/tfs/scripts/cs_sync

  8. # 把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在高併發下記憶體佔用更加穩定。(參考部落格

make完後,如果有類似以下資訊,表示編譯不成功,如果沒有報錯,說明安裝成功。

我make成功了,make install也成功了。到這裡本文結束了。

  1. make[3]: *** [read_block_prefix] Error 1

  2. make[3]: Leaving directory `/tmp/tfs/src/tools/dataserver’

  3. make[2]: *** [all-recursive] Error 1

  4. make[2]: Leaving directory `/tmp/tfs/src/tools’

  5. make[1]: *** [all-recursive] Error 1

  6. make[1]: Leaving directory `/tmp/tfs/src’

  7. make: *** [all-recursive] Error 1

目前的情況,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.119.217 #本機IP地址(vip)

dataserver->ip_addr = 192.168.119.145 #NameServer配置HA時請設定為vip,沒配置HA時請設定為主ns的ip

dataserver->ip_addr_list = 192.168.119.145|192.168.119.147 #!nameserver IP地址列表(master, salve的ip地址,只能以’|'分隔)

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

———–加入啟動時自動掛載—————-

設定開機自動掛載

[[email protected] 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

————–重啟系統—————————–

wKioL1LU70DAE0Z_AAC0Z2kR8hQ124.jpg

檢視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下預先建立主塊,擴充套件塊及相應的統計資訊。

[[email protected] conf]# cd /usr/local/tfs/scripts

[[email protected] scripts]# ./stfs format 1-4 //分配第1,2,3,4個儲存區:

wKiom1LU72fTwn4_AAGjlNoGTMg821.jpg

————執行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

wKioL1LU75Lhi5aeAAAh6-mqjcs357.jpg

wKiom1LU776Bm6PMAAAyygUV7-8431.jpg

我們一臺伺服器上啟動了4個程序:

wKiom1LU79bRwBFEAACquCK202U355.jpg

停止: ./tfs stop_ds 1-4。


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

—————驗證—————–

[[email protected] scripts]# netstat -tnlppa |grep 147

wKiom1LWHQqj2KdBAAMX_P7m990432.jpg

——–列出dataserver的block塊———— 首先保證服務已經全部啟動! 確認防火牆沒有阻止到連線! 檢視dataserver連線情況: 在nameserver端執行ssm命令檢視檢查到的dataserver的一些基本情況。 /usr/local/tfs/bin/ssm -s 192.168.119.147:8108 (要使用主ns的IP與埠,請注意根據實際情況修改) server -b \\隨即列出dataserver的block塊

wKioL1LWHRCgquMtAANRVNH7lVo281.jpg

server -w \\隨機列出dataserver的可寫塊

圖:略。 machine -a \\列出dataserver的使用報道。

wKiom1LWHTOwVdlQAAC13OKuiZs192.jpg

這裡需要注意如果用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 ,請注意根據實際情況修改)

wKioL1LWHT7xmffaAAD6zTQsltE454.jpg

這裡我使用put上傳/opt/666.jpg這張圖。TFS目前限制了檔案大小為2M,適合於一些小於2M數 據的存放。終端預設上傳命令put ,超過2M用putl,回車後會返回一大堆字元,注意看最後一行是fail還是success,如果是fail,請檢測下配置檔案、埠等。如果是 success則說明已經上傳上去。

上傳666.jpg大小 是58407位元組

wKioL1LWHVaDZTCSAAUZKUWZIL0770.jpg

可以看到 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

wKiom1LWHX3DYltkAAFKi-7Pu_8293.jpg

可以看到塊349中有一個檔案,檔名是:T0oRJTByJT1RCvBVdK

—————–讀最檔案————————

read_file_data 349 1 /opt/777/jpg

wKioL1LWHYjwQsB1AAA3xxcxUXE249.jpg

成功了,到 /opt/777/jpg,去看一看檔案。

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,不再報上面的錯誤了,情況有所好轉。但報了其它錯誤數量不多。

壓力測試:



已形成測試報告,略。


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


轉載於:https://blog.51cto.com/lucifer119/1360381