1、測試環境準備php
拓撲:mysql
服務器NSsql
系統:CentOS release 5.8 (Final)(Kernel:2.6.18-308.el5)vim
IP:192.168.0.250centos
硬盤:1塊硬盤硬盤(sda)服務器
服務器DS1網絡
系統:CentOS release 5.8 (Final)(Kernel:2.6.18-308.el5)
app
IP:192.168.0.251
負載均衡
硬盤:3塊硬盤(sda、sdb、sdc)運維
服務器DS2
系統:CentOS release 5.8 (Final)(Kernel:2.6.18-308.el5)
IP:192.168.0.252
硬盤:3塊硬盤(sda、sdb、sdc)
注:以上系統以最少化安裝,無需安裝任何組件,且系統最佳兼容爲GCC4.1.2
2、獲取並安裝TFS
在NA、DS一、DS2上所有安裝,如需測試,在客戶端也能夠裝一個(注:如下步驟三臺NS、DS一、DS2服務器都要安裝)
一、安裝依賴包:不一樣LINUX系統有不一樣的依賴包環境,建議環境與文檔一致才能保證不走彎路。
獲取官方文檔:http://tfs.taobao.org/
http://blog.yunnotes.net/index.php/category/tfs/
yum install -y automake.noarch libtool.x86_64 readline-devel.x86_64 zlib-devel.x86_64
此以依賴包是官方定義的安裝包,這裏不涉及mysql,因此不安裝mysql-devel. yum -y install subversion
默認centos 5.8不集成svn客戶端,這裏須要安裝一下,方便獲取TFS官方軟件
yum -y install gcc*
tb-common-utils所須要的依賴包
yum -y install ncurses ncurses-devel
tfs須要的另外一個依賴包
二、安裝tb-common-utils:TFS使用tb-common-utils軟件包,tb-common-utils包含淘寶使用的基礎系統庫tbsys和網絡庫tbnet兩個組件。
安裝tb-common-utils前須要設置環境變量TBLIB_ROOT,tbsys和tbnet將會被安裝TBLIB_ROOT對應的路徑(必須是絕對路徑)下,TFS會在這個路徑下查找tbsys、tbnet頭文件和庫。
下例爲設置TBLIB_ROOT環境變量:
vim /etc/profile
編輯profile文件
export TBLIB_ROOT=/home/tb-common-utils
添加/home/tb-common-utils,且必定是絕對路徑,並且必定要寫準確你的tb-common-utils必定存在/home目錄下
source /etc/profile
刷新環境變量
獲取tb-common-utils源碼並安裝
[root@Test-2 home]# svn co -r 18 http://code.taobao.org/svn/tb-common-utils/trunk tb-common-utils
注意: 這裏不要checkout最新版本,version18之後的修改致使部分接口不能前向兼容。
[root@Test-2 home]# cd tb-common-utils/
[root@Test-2 tb-common-utils]# sh build.sh
直接安裝
[root@Test-2 tb-common-utils]# echo $?
三、安裝TFS(Taobao File System)
[root@Test-2 home]# svn co http://code.taobao.org/svn/tfs/branches/dev_for_outer_users tfs
獲取nfs
[root@Test-2 tfs]# cd tfs/
[root@Test-2 tfs]# sh build.sh init
[root@Test-2 tfs]# ./configure --prefix=/app/tfs --without-tcmalloc --with-release
參數請看備註1
[root@Test-2 tfs]# make
[root@Test-2 tfs]# make install
備註1:--prefix 指定tfs安裝路徑,默認會被安裝到~/tfs_bin目錄
--with-release 指定按release版本的參數進行編譯,若是不指定這個參數,則會按開發版本比較 嚴格的參數編譯,包含-Werror參數,全部的警告都會被當錯誤,在高版本gcc下會致使項目編 譯不過,不少開源用戶反饋 的編譯問題都跟這個有關,由於gcc高版本對代碼的檢查愈來愈嚴 格,淘寶內部使用的gcc版本是gcc-4.1.2。
至此,TFS已經安裝成功了,你能夠開始部署TFS服務。
3、部署TFS(Taobao File System)
在成功安裝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_bin/conf目錄下包含TFS的配置文件模板,在部署前須要根據環境修改配置文件,下面對NS,DS一些關鍵的配置項進行說明,全部配置項使用key=value的形式進行配置,每行一項,在行首加#可直接註釋配置項使之不生效;使用者應該根據實際狀況,修改conf/ns.conf、conf/ds.conf這兩個配置文件,本次個人安裝中,安裝目錄conf下沒有這些.conf結尾的配置文件。
一、安裝NS(NameServer)
安裝過程當中若是報錯,請參考FAQ,大部分緣由多是由於GCC版本的問題。
開始安裝前,先介紹一下ns.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=xx.xx.xx.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=xx.xx.xx.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%,就會被選爲數據遷移目標
安裝過程
注:請嚴格安裝一的依賴包安裝,不然會報錯。
[root@Qinglin-NS tfs]# cp -a conf/ns.conf /app/tfs/conf/
拷貝下載的目錄中的ns.con到安裝目錄下在的/app/tfs/conf中
[root@Qinglin-NS conf]# cd /app/tfs/conf/
[root@Qinglin-NS conf]# vim ns.conf
編輯配置文件
[public]
#work directoy
work_dir=/app/tfs
實際安裝好,且在./configuer中指定的路徑。
#listen port
port = 8100
默認的監聽端口
#device name
dev_name= eth0
須要被訪問的網卡名稱,
#ip addr(vip)
ip_addr = 192.168.3.250
本地eth0網卡的ip地址
[nameserver]
safe_mode_time = 360
ip_addr_list = 192.168.3.250|10.0.0.254
本次是NameServer,不須要HA,因此第一個IP要是本身本地IP,第二個IP隨便設置一個,且不能是通的網段,不然會出錯
group_mask=255.255.255.255
按照4個255設置便可
二、安裝DS1與DS2(DataServer)
在本例的環境中,192.168.3.251/252上都附帶兩塊沒有使用的磁盤/dev/sdb、/dev/sdc,磁盤空間均爲一塊10G,另外一塊10G;TFS採用每一個DS進程管理一塊磁盤的方式,也就是說,每一個機器上都會運行2個DS進程,分別管理/dev/sdb、/dev/sdc, 而且這兩塊盤應該掛載到/data/disk一、/data/disk2兩個目錄(由於配置文件中指定mount_path爲/data/disk),啓動DS時指定序號(如一、2)這個DS進程就會加載對應目錄裏的數據(1對應/data/disk一、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的存儲空間在磁盤上連續(理論上),從而避免動態分配時產生大量的磁盤碎片,下降服務效率。
在兩臺機器上分別進行以下操做,準備好數據目錄:
(注,DS1和DS2基本相同,可是請注意IP和一些不同的參數,這裏不浪費篇幅再寫一次)
[root@Qinglin-DS1]# yum -y install e4fsprogs
安裝ext4的格式化包,在後面的的格式化中須要用到,默認centos5.8是不帶的
[root@Qinglin-DS1]# fdisk -l
檢查本身硬盤是否存在兩塊多餘網卡,sda是系統使用的硬盤,這裏不寫了
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
Disk /dev/sdc: 10.7 GB, 10737418240 bytes
[root@Qinglin-DS1 conf]# fdisk /dev/sdb
對硬盤的格式化 n是新建分區,p是主要分區,1是第1個分區(且sdb1),wq爲保存
n
p
1
回車
回車
wq
[root@Qinglin-DS1 conf]# fdisk /dev/sdc
對硬盤的格式化
n
p
1
回車
回車
wq
[root@Qinglin-DS1 ~]# mkfs.ext4 /dev/sdb1
格式化sdb1 文件系統爲ext4
[root@Qinglin-DS1 ~]# mkfs.ext4 /dev/sdc1
[root@Qinglin-DS1 ~]# mkdir -p /data/
建立配置文硬盤掛載默認的路徑
[root@Qinglin-DS1 ~]# mkdir /data/disk1
建立掛載sdb1的文件夾,不建立沒法掛載
[root@Qinglin-DS1 ~]# mkdir /data/disk2
[root@Qinglin-DS1 ~]# mount /dev/sdb1 /data/disk1
掛載第sdb1 到/data/disk1 目錄下
[root@Qinglin-DS1 ~]# mount /dev/sdc1 /data/disk2
[root@Qinglin-DS1 ~]# df
這塊比較重要,記錄sdb1和sdb2的available中的大小,後面要寫到配置文件中
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 18713004 3304476 14442620 19% /
/dev/sda1 101086 12218 83649 13% /boot
tmpfs 513040 0 513040 0% /dev/shm
/dev/sdb1 10317828 154100 9639612 2% /data/disk1
/dev/sdc1 10317828 154100 9639612 2% /data/disk2
[root@Qinglin-DS1 tfs]# cp conf/ds.conf /app/tfs/conf/
移動配置文件到安裝目錄下,與NS同樣
[root@Qinglin-DS1 tfs]# cd /app/tfs/conf/
[root@Qinglin-DS1 tfs]# vim /app/tfs/conf/ds.conf
編輯配置文件
[public]
#listen port
port = 8200
本機端口
#work directoy
work_dir=/app/tfs
工做目錄
#device name
dev_name= eth0
eth0爲工做網卡,鏈接ns
#ip addr
ip_addr = 192.168.3.251
本地eth0網卡IP
[dataserver]
#nameserver ip addr(vip)
ip_addr = 192.168.3.250
NS的IP,向NS發送信息的地址
ip_addr_list = 192.168.3.250|10.0.0.254
和NS一致
#nameserver port
port = 8100
NS的端口
mount_name = /data/disk
/data爲掛載的disk1和disk2的目錄,且爲dataserver的存儲目錄
mount_maxsize = 9639612
掛載硬盤的大小,參考上面標黃處
[root@Qinglin-DS1 tfs]# pwd
/app/tfs
[root@Qinglin-DS1 tfs]# ./scripts/stfs format 1-2
格式化tfs的文件,且爲/data/下的disk1與disk2
注,若是格式化錯誤,請先使用./scripts/stfs clear 1-2,清除硬盤寫的信息。
三、啓動NameServer與DataServer 1/2
啓動順序:先啓動DS,而後啓動NS
啓動DS1/DS2:
DS1:
[root@Qinglin-DS1 tfs]# ./scripts/tfs start_ds 1-2 ==>1-2表明disk1和disk2
dataserver 1 is up SUCCESSFULLY pid: 4180
dataserver 2 is up SUCCESSFULLY pid: 4185
DS2:
[root@Qinglin-DS2 tfs]# ./scripts/tfs start_ds 1-2
dataserver 1 is up SUCCESSFULLY pid: 22174
dataserver 2 is up SUCCESSFULLY pid: 22192
檢查工做:
[root@Qinglin-NS tfs]# ps -ef|grep nameserver
檢查進程已經啓動
root 29127 1 1 18:50 pts/0 00:01:48 /app/tfs/bin/nameserver -f/app/tfs/conf/ns.conf -d
root 29396 3147 0 20:45 pts/0 00:00:00 grep nameserver
[root@Qinglin-NS tfs]# netstat -lntup|grep nameserver
檢查端口已經啓動
tcp 0 0 0.0.0.0:8100 0.0.0.0:* LISTEN 29127/nameserver
啓動NS:
NS:
[root@Qinglin-NS tfs]# ./scripts/tfs start_ns
nameserver is up SUCCESSFULLY pid: 29127
[root@Qinglin-DS1 ~]# ps -ef|grep dataserver
檢查進程啓動,且disk1和disk2都存在
root 4180 1 0 11:56 pts/0 00:00:01 /app/tfs/bin/dataserver -f /app/tfs/conf/ds.conf -d -i 1
root 4185 1 0 11:56 pts/0 00:00:02 /app/tfs/bin/dataserver -f /app/tfs/conf/ds.conf -d -i 2
root 4804 4775 0 13:54 pts/2 00:00:00 grep dataserver
[root@Qinglin-DS1 ~]# netstat -lntup|grep dataserver
監測各端口已經啓動
tcp 0 0 0.0.0.0:8200 0.0.0.0:* LISTEN 4180/dataserver
tcp 0 0 0.0.0.0:8201 0.0.0.0:* LISTEN 4180/dataserver
tcp 0 0 0.0.0.0:8202 0.0.0.0:* LISTEN 4185/dataserver
tcp 0 0 0.0.0.0:8203 0.0.0.0:* LISTEN 4185/dataserver
四、總體測試
[root@Test-2 tfs]# pwd
/app/tfs
[root@Test-2 tfs]# ./bin/ssm -s 192.168.3.250:8100 -i "machine -a"
檢查是否經過ns獲取到DS的信息
SERVER_IP NUMS UCAP / TCAP = UR BLKCNT LOAD TOTAL_WRITE TOTAL_READ LAST_WRITE LAST_READ MAX_WRITE MAX_READ
--------------- ---- ------------------ -------- ---- ----------- ---------- ---------- --------- -------- ---------
192.168.3.251 2 17.97G 18.28G 98% 230 10 1.4K 1 0 0 0 0 0 0 0 0 0 0
192.168.3.252 2 17.89G 18.28G 97% 229 10 0 0 1.4K 1 0 0 0 0 0 0 0 0
Total : 2 4 35.86G 36.56G 98% 459 10 1.4K 1 1.4K 1 0 0 0 0
[root@Test-2 tfs]# ./bin/ssm -s 192.168.3.250:8100 -i "server -m"
檢查是否生成block
SERVER_ADDR CNT MASTER BLOCK
192.168.3.251:8200 58 101 105 116 117 123 128 130 133 139 144
150 151 154 157 161 163 164 171 175 183
189 191 196 197 199 200 202 207 217 223
226 230 231 237 241 242 243 255 256 257
263 264 268 270 275 277 285 286 287 294
303 310 311 319 320 322 330 331
192.168.3.252:8200 55 111 112 115 118 119 127 129 131 135 140
142 146 152 153 165 167 168 173 178 179
180 182 190 204 208 209 218 219 220 227
232 244 245 251 252 258 261 265 269 278
281 288 289 290 292 297 301 302 304 306
312 313 315 323 324
192.168.3.251:8202 62 104 106 107 109 113 114 120 124 125 132
134 136 137 147 149 156 158 159 162 166
169 172 174 192 193 194 195 198 201 203
210 215 216 221 222 224 225 228 233 234
236 240 246 248 253 260 262 271 273 279
280 282 283 295 296 309 314 318 321 325
332 334
192.168.3.252:8202 50 102 108 110 121 122 126 138 141 143 145
148 155 160 176 177 181 185 186 187 188
205 206 211 212 214 229 235 238 239 247
249 254 267 272 274 276 284 291 293 298
299 300 307 308 316 317 326 327 328 329
五、上傳(PUT)與下載(GET)
上傳PUT:將本地testfile存入tfs, -s 指定nameserver的ip:port。
若是成功,會打印 put testfile => T1QEBXXDpXXXXXXXXX success. 相似的消息,其中T開頭一串字符是TFS爲這個文件生成的文件名,一共18個字符;要想從TFS取出該文件時,須要指定該文件名。
[root@Test-2 tfs]#./bin/tfstool -s 192.168.3.251:8100
進入上傳交互式界面
TFS>put /etc/init.d/network
上傳/etc/init.d/network文件到Nameserver
put /etc/init.d/network => T1ItETByJT1RCvBVdK success.
看到succes即完成,且生成一個ID:T1ItETByJT1RCvBVdK,是下載的憑證。
下載GET:從TFS讀取T1QEBXXDpXXXXXXXXX,存儲到本地localfile中;若是成功,會打印fetch T1QEBXXDpXXXXXXXXX => localfile success.相似的消息。
TFS> get T1ItETByJT1RCvBVdK /home/network
get下載,上傳的id號,下載的路徑和文件名
fetch T1ItETByJT1RCvBVdK => /home/network success.
提示下載完成
TFS> quit
退出
[root@Test-2 tfs]# ls /home/network
檢查路徑是否存在/home/network這個文件
/home/network