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 root@192.168.40.115:/root/
执行命令 scp -r /root/tair_bin root@192.168.40.116:/root/
执行命令 scp -r /root/tair_bin root@192.168.40.117:/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)测试结果如下