Tair的叢集安裝
1、 開發需要的開發環境
(1) CentOS6.5作業系統
(2) tair-2.3.1.6.tar.gz (或者Tair的源碼包)
http://code.taobao.org/p/tair/file/30/tair-2.3.tar.gz
(3) tb-common-utils(或者Tbnet和tbsys的源碼包)
http://code.taobao.org/svn/tb-common-utils/trunk/tb-common-utils
(4) 四台linux虛拟機,分别表示ConfigServer(主),ConfigServer(從),DataServer,DataServer
ConfigServer(主) 192.168.40.114
ConfigServer(從) 192.168.40.115
DataServer 192.168.40.116
DataServer 192.168.40.117
在192.168.40.114這台機器上安裝tair
注意:
(I) 在安裝tair之前因為要安裝一些相關的插件,比如libtool、autoconfig、automake、boost-devel、zlib-devel、是以必須確定192.168.40.114可以聯網安裝。(可以通過橋接的方式,然後修改ip位址)
(II) 所有機器的防火牆都要關了(service iptables stop),設定防火牆不可以開機啟動(chkconfig iptables off)
(III) 每一台機器都要安裝libtool、boost-devel、zlib-devel、gcc-c++,而且也要安裝tb_common_utils(也就是tbnet和tbsys),安裝的位置要一樣
(IV) 在一台安裝好以後,可以把安裝好的tair_bin包,複制到其他機器同樣的位置中。
2、 安裝libtool(自動安裝automake和autoconfig)
執行指令 yum -y install libtool
3、 安裝boost-devel
執行指令 yum install boost-devel
4、 安裝gcc-c++ (g++)
執行指令yum install gcc-c++
5、安裝zlib-devel
執行指令 yum install zlib-devel
6、通過svn擷取tb-common-utils(裡面主要是tbnet和tbsys)
tb-common-tair源碼位址:http://code.taobao.org/svn/tb-common-utils/trunk
7、把下載下傳好的源碼放到linux系統的/usr/local/目錄下
8、在安裝tbnet和tbsys之前,先配置他們的安裝路徑,在/etc/profile檔案中添加以下内容
export TBLIB_ROOT=/usr/local/tairlib
執行指令 vi /etc/profile
9、讓/etc/profile配置立即生效
執行指令 source /etc/profile
10、安裝tbnet和tbsys,進入/usr/local/tb-common-utils
執行build.sh腳本 ./build.sh
可以看到,安裝完成之後,在/usr/local/目錄下,多了一個tairlib的檔案夾
11、安裝tair
(1)把tair-2.3.1.6.tar.gz放到/usr/local/目錄下,并進入到該目錄下
(2)執行指令 tar -zxvf tair-2.3.1.6.tar.gz 進行解壓縮
(3)進入/usr/local/tair-2.3.1.6目錄下,執行腳本bootstrap.sh
./bootstrap.sh
(4)執行configure指令 ./configure
(5)執行make指令編譯 make
(6)執行make install 指令安裝
(7)如果安裝完成之後,會在/root/目錄下生成一個tair_bin安裝檔案
(8)進入/root/tair_bin目錄下建立兩個檔案夾,data和logs
執行指令 mkdir data
執行指令 mkdir logs
(9)進入/root/tair_bin/etc目錄下,修改預設檔案的檔案名,修改如下
configserver.conf.default 改為 configserver.conf
dataserver.conf.default 改為 dataserver.conf
group.conf.default 改為 group.conf
執行指令 mv configserver.conf.default configserver.conf
執行指令 mv dataserver.conf.default dataserver.conf
執行指令 mv group.conf.default group.conf
修改之前
修改之後
(10)修改configserver.conf檔案(因為本機是一個主configserver,是以隻要修改configserver.conf檔案和修改group.conf檔案)
執行指令 vi configserver.conf
#
# tair 2.3 --- configserver config
#
[public]
config_server=192.168.40.114:51980 #主的configserver節點
config_server=192.168.40.115:51980 #從的configserver節點
[configserver]
port=51980 #端口号
log_file=/root/tair_bin/logs/config.log #日志檔案存放的路徑
pid_file=/root/tair_bin/logs/config.pid #pid檔案存放的路徑
log_level=warn #日志級别
group_file=/root/tair_bin/etc/group.conf #組檔案所在的路徑
data_dir=/root/tair_bin/data/data #資料存放的位置
dev_name=eth1 #使用的網卡,預設是eth0,這個要根據真實機器所使用的網卡而定,可以使用ifconfig指令來檢視
(11)修改group.conf檔案
執行指令 vi group.conf
#group name
[group_1]
# data move is 1 means when some data servedown, the migrating will be start.
# default value is 0
_data_move=0 #當這個配置為1的時候, 如果發生了某個data server當機, 則系統會盡可能的通過備援的備份對資料進行遷移. 注意, 如果 copy_count 為大于1的值, 則這個配置無效, 系統總是會發生遷移的. 隻有copy_count為1的時候, 該配置才有作用
#_min_data_server_count: when data servers left in a group less than thisvalue, config server will stop serve for this group
#default value is copy count.
_min_data_server_count=1 #最少的dataserver數,少于這個配置值時,将不提供服務
_plugIns_list=libStaticPlugIn.so # 需要加載的插件的動态庫名
_build_strategy=1 #1 normal 2 rack 配置設定政策 1為負載均衡優先 2為位置安全優先 3優先采用位置安全優先
_build_diff_ratio=0.6 #how much difference is allowd between different rack
# diff_ratio = |data_sever_count_in_rack1 - data_server_count_in_rack2| / max(data_sever_count_in_rack1, data_server_count_in_rack2)
# diff_ration must less than _build_diff_ratio
_pos_mask=65535 # 65535 is0xffff this will be used to gerneraterack info. 64 bit serverId & _pos_mask is the rack info,
_copy_count=3 #資料在系統中存放的數量,預設是1,表示存放一份
_bucket_number=1023 #這個是hash桶的個數, 一般要 >> dataserver的數量(10倍以上). 資料的分布, 負載均衡, 資料的遷移都是以桶為機關的.
# data center A
_server_list=192.168.40.116:51910 #資料存儲節點
_server_list=192.168.40.117:51910 #資料存儲節點
# data center B
#_server_list=192.168.2.1:5191
#_server_list=192.168.2.2:5191
#_server_list=192.168.2.3:5191
#_server_list=192.168.2.4:5191
#quota info
_areaCapacity_list=0,1124000; #這是每一個area的配額資訊. 這裡的機關是 byte.
(12)修改dataserver.conf
執行指令 vi dataserver.conf
#
# tair2.2 --- tairserver config
#
[public]
config_server=192.168.40.114:51980 #主configserver
config_server=192.168.40.115:51980 #從configserver
[tairserver]
#
#storage_engine:
#
# mdb
# fdb
# kdb
#
storage_engine=mdb
local_mode=0
#
#mdb_type:
# mdb
# mdb_shm
#
mdb_type=mdb_shm #mdb類型
#
# if you just run 1 tairserver on a computer, you may ignore this option.
# if you want to run more than 1 tairserver on a computer, each tairservermust have their own "mdb_shm_path"
#
#
mdb_shm_path=/mdb_shm_path01 #如果dataserver處于同一台真實實體機器上,要區分開來,比如第二個資料節點就為/mdb_shm_path02
#tairserver listen port
port=51910 #工作端口号
heartbeat_port=61910 #心跳端口号
process_thread_num=16 #最大處理程序
#
#mdb size in MB
#
slab_mem_size=1024
log_file=/root/tair_bin/logs/server.log #日志檔案的路徑
pid_file=/root/tair_bin/logs/server.pid #pid檔案的路徑
log_level=warn #日志級别
dev_name=eth1 #使用的實體網卡,可以使用ifconfig檢視使用的真實網卡
ulog_dir=/root/tair_bin/data/ulog #ulog路徑
ulog_file_number=3 #ulog檔案數量
ulog_file_size=64 #ulog檔案大小
check_expired_hour_range=2-4
check_slab_hour_range=5-7
[fdb]
# in MB
index_mmap_size=30
cache_size=256
bucket_size=10223
free_block_pool_size=8
data_dir=/root/tair_bin/data/fdb
fdb_name=tair_fdb
[kdb]
# in byte
map_size=10485760 # the size ofthe internal memory-mapped region
bucket_size=1048583 # the numberof buckets of the hash table
record_align=128 # the power ofthe alignment of record size
data_dir=/root/tair_bin/data/kdb # the directory of kdb's data
12、把/root/tair_bin複制到configserver和兩個dataserver相同的目錄下
注意:在複制之前,要先在其他機器安裝好libtool、boost-devel、zlib-devel、gcc-c++,還有安裝tbnet和tbsys
執行指令 scp -r /root/tair_bin [email protected]:/root/
執行指令 scp -r /root/tair_bin [email protected]:/root/
執行指令 scp -r /root/tair_bin [email protected]:/root/
13、啟動tair
啟動的順序是,先啟動dataserver,啟動完所有的dataserver之後,再啟動configserver
(1) 先啟動192.168.40.116這台機器的dataserver,進入這台機器的/root/tair_bin/目錄
執行指令 sbin/tair_server -f etc/dataserver.conf
(2) 啟動192.168.40.117這台機器的dataserver,進入這台機器的/root/tair_bin/目錄
執行指令 sbin/tair_server -f etc/dataserver.conf
(3) 啟動192.168.40.115這台機器的configserver,進入這台機器的/root/tair_bin/目錄
執行指令sbin/tair_cfg_svr -f etc/configserver.conf
(4) 啟動192.168.40.114這台機器的configserver,進入這台機器的/root/tair_bin/目錄
執行指令 sbin/tair_cfg_svr -f etc/configserver.conf
14、啟動完成之後,可以驗證是否tair安裝成功
(1) 選擇任意一台機器,進入/root/tair_bin/目錄
執行指令 sbin/tairclient -c 192.168..40.114:51980 -g group_1
(2)執行put key value 和 get key指令
15、java用戶端連接配接驗證
(1)需要到的jar包如下:
commons-logging-1.1.3.jar
log4j-1.2.17.jar
mina-core-1.1.7.jar
slf4j-api-1.7.7.jar
slf4j-log4j12-1.7.7.jar
tair-client-2.3.1.jar
(2)編寫代碼,這裡主要有兩個類,一個是JAVABean類,一個是測試類,代碼如下所示
(I)因為對象要在網絡中傳輸,是以這裡實作了序列化,DataBean類
importjava.io.Serializable;
publicclass DataBeanimplements Serializable {
privateString username;
privateString address;
privateString password;
publicDataBean(String username, String address, String password) {
super();
this.username =username;
this.address =address;
this.password =password;
}
publicString getUsername() {
returnusername;
}
publicvoidsetUsername(String username) {
this.username =username;
}
publicString getAddress() {
returnaddress;
}
publicvoidsetAddress(String address) {
this.address =address;
}
publicString getPassword() {
returnpassword;
}
publicvoidsetPassword(String password) {
this.password =password;
}
@Override
publicString toString() {
// TODOAuto-generated method stub
returnthis.username+":"+this.password+":"+this.address;
}
}
(II)測試類
importjava.util.ArrayList;
importjava.util.List;
importcom.taobao.tair.DataEntry;
importcom.taobao.tair.Result;
importcom.taobao.tair.ResultCode;
import com.taobao.tair.impl.DefaultTairManager;
public classTairTest {
public static void main(String []args){
//建立configserver清單
List <String> confServers = newArrayList<String>();
confServers.add("192.168.40.114:51980");
confServers.add("192.168.40.114:51950");
//建立用戶端執行個體
DefaultTairManager tairManager = newDefaultTairManager();
tairManager.setConfigServerList(confServers);
//設定組名
tairManager.setGroupName("group_1");
//初始化用戶端
tairManager.init();
DataBean dataBean = new DataBean("龐麗彬", "廣西博白","123456789");
ResultCode resultCode =tairManager.put(0, "data", dataBean);
if(resultCode.isSuccess()){
System.out.println("插入資料成功!");
}
Result<DataEntry> result =tairManager.get(0,"data");
System.out.println("擷取資料:"+result.isSuccess());
if(result.isSuccess()){
DataEntry entry = result.getValue();
if(entry!=null){
DataBean bean= (DataBean)entry.getValue();
System.out.println("username="+bean.getUsername());
System.out.println("password="+bean.getPassword());
System.out.println("address="+bean.getAddress());
System.out.println("valueis:"+entry.getValue().toString());
}
else{
System.out.println("this key is not exists");
}
}
}
}
(3)測試結果如下