一、Tair介绍

1、Tair简介

Tair(Taobao Pair)是淘宝开发的分布式Key-Value存储引擎

服务器端自动负载均衡

分为持久化和非持久化两种方式存储

  • 非持久化:分布式缓存使用 Memcached(mdb)、Redis(rdb)
  • 持久化:
    SQL-DB使用FireBird(fdb)
    NoSQL-DB:使用Kyoto Cabinet(kdb)、LevelDB(ldb)

Tair采用可插拔存储引擎设计,以上这些存储引擎可以很方便的替换,还可以引入新的存储引擎比如:MySQL

2、使用场景

  1. 分布式缓存
    大多数使用场景,大访问少量临时数据的存储(kb左右)用于缓存,降低对后端数据库的访问压力
    session场景
    高速访问某些数据结构的应用和计算(rdb)
  2. 数据源存储
    快速读取数据(fdb)
    持续大数据量的存入读取(ldb),交易快照
    高频度的更新读取(ldb),库存

3、Tair整体架构分析


一个Tair集群主要包括client、Config server和Dataserver 三个不同的应用。
Client在初始化时,从Config server处获取数据的分布信息,根据分布信息和相应的Data server交互完成用户的请求。
Config Server通过和Data Server的心跳(HeartBeat)维护集群中可用的节点,并根据可用的节点,构建数据的在集群中的分布信息
Data server负责数据的存储,并按照Config server的指示完成数据的复制和迁移工作。

4、Config Server

Config Server是单点,采用一主一备的方式保证可靠性。
管理所有的data server, 维护data server的状态信息
用户配置的桶数量、副本数、机房信息
数据分布的对照表
协调数据迁移、管理进度,将数据迁移到负载较小的节点上

Client和ConfigServer的交互主要是为了获取数据分布的对照表,当client获取到对照表后,会cache这张表,然后通过查这张表决定数据存储的节点,所以不需要和configserver交互,这使得Tair对外的服务不依赖configserver,所以它不是传统意义上的中心节点

Config server维护的对照表有版本概念,由于集群变动或管理触发,构建新的对照表后,对照表的版本号递增,并通过Data server的心跳,将新表同步给数据节点。

客户端和Data server交互时,Dataserver每次都把自己缓存的对照表版本号放入response结构中,返回给客户端,客户端将Data server的对照表版本号和自己缓存的对照表版本号比较,如果不相同,会主动和Config server通信,请求新的对照表。

Tair的Configserver使客户端使用时候,不需要配置数据节点列表,也不需要处理节点的的状态变化,这使得Tair对最终用户来说使用和配置都很简单。

5、Data Server

Data server负责数据的物理存储,并根据Configserver构建的对照表完成数据的复制和迁移工作。
Data server具备抽象的存储引擎层,可以很方便地添加新存储引擎。Data server还有一个插件容器,可以动态地加载/卸载插件。

Tair的存储引擎有一个抽象层,只要满足存储引擎需要的接口,便可以很方便地替换Tair底层的存储引擎。比如你可以很方便地将bdb、tc甚至MySQL作为Tair的存储引擎,而同时使用Tair的分布方式、同步等特性。

Tair默认包含两个存储引擎:mdb和fdb。

mdb是一个高效的缓存存储引擎,它有着和memcached类似的内存管理方式。mdb支持使用sharememory(tmpfs),这使得我们在重启Tair数据节点的进程时不会导致数据的丢失,从而使升级对应用来说更平滑,不会导致命中率的较大波动。

fdb是一个简单高效的持久化存储引擎,使用树的方式根据数据key的hash值索引数据,加快查找速度。索引文件和数据文件分离,尽量保持索引文件在内存中,以便减小IO开销。使用空闲空间池管理被删除的空间

二、Tair的安装与使用

1、环境准备

  1. GIT

     yum install gityum update -y nss curl libcurl
    
  2. svn

     yum install subversion
    
  3. Libtool

     yum install libtool
    
  4. boost-devel

     yum install boost-devel
    
  5. zlib

     yum install zlib-devel
    
  6. C++

     yum install gcc-c++
    

2、项目源码下载和编译

tbsys库和tbnet库下载(tair底层依赖tbsys库和tbnet库)

#git源码下载
git clone https://github.com/kayaklee/tb-common-util.git
#设置环境变量
mkdir /var/tblib
export TBLIB_ROOT="/var/tblib"
#因为tbnet和tbsys在两个不同的目录,但它们的源码文件里头文件的互相引用却没有加绝对或相对路径,
将两个目录的源码加入到C++环境变量中即可。否则编译时会出现:“fatal error:tysys.h: No such
file or directory”的错误。
CPLUS_INCLUDE_PATH=/home/tair/tb-common-util/tbsys/src:/home/tair/tb-commonutil/tbnet/src
export CPLUS_INCLUDE_PATH
#修改tbsys代码
cd ~/tb-common-util/trunk/tbsys/src
下载的代码有个错误:具体是tbsys/src/tblog.cpp中323行代码:需要将CLogger::CLogger&
CLogger::getLogger()改为CLogger& CLogger::getLogger()
#编译tbsys和tbnet
cd tb-common-utils
./build.sh
注:安装成功后,TBLIB_ROOT所指示的目录下会有include和lib两个目录。

3、tair下载

#git源码下载
git clone https://github.com/alibaba/tair.git
#安装依赖
yum install -y openssl-devel libcurl-devel
#编译
./bootstrap.sh
#检测和生成 Makefile
./configure
#编译和安装到目标目录
make -j
make install
注:默认安装位置是 ~/tair_bin

4、Tair配置和启动

以MDB引擎为例配置一个最小化的Tair集群(1 * ConfigServer + 1 * DataServer)

#查看和设置系统tmpfs
#MDB 引擎默认使用共享内存,所以需要查看并设置系统的tmpfs的大小
# 这里根据实际机器内存情况配置,必须大于Tair使用内存的配置
vim /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=1024M 0 0
#生效
mount -o remount /dev/shm
#查看tmpfs
cat /etc/fstab | grep /dev/shm
显示tmpfs /dev/shm tmpfs rw,size=1G 0 0
# 定义配置文件 复制配置文件
cp etc/configserver.conf.default etc/configserver.conf
cp etc/group.conf.default etc/group.conf
etc/dataserver.conf.default etc/dataserver.conf
# configserver.conf
[public]
config_server=192.168.127.133:5198
#config_server=192.168.1.2:5198
#config_server=10.211.55.9:5198
#config_server=192.168.1.2:5198
dev_name=eno16777736
#group.conf
# data center A
_server_list=192.168.127.133:5191
#_server_list=192.168.1.2:5191
#_server_list=192.168.1.3:5191
#_server_list=192.168.1.4:5191
# 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
#dataserver.conf
[public]
config_server=192.168.127.133:5198
#config_server=192.168.1.2:5198
dev_name=eno16777736
mdb_inst_shift=0
process_thread_num=4
io_thread_num=4
#这里 slab_mem_size控制MDB内存池的总大小,mdb_inst_shift 控制实例的个数,注意这里一个实例
必须大于512MB且小于64GB。
slab_mem_size=512
#修改 tair.sh启动脚本
#在CentOS 7下,安装目录下的 tair.sh 启动脚本有一行代码需要修改
tmpfs_size=`df -m |grep /dev/shm | awk '{print $2}'`
#启动Tair实例
#启动dataserver
tair_bin $ ./tair.sh start_ds
#启动configserver
tair_bin $ ./tair.sh start_cs
#查看进程
ps -ef |grep tair
注:执行后没有两行记录显示,说明启动失败,可查看logs中的log查看错误信息

5、Tair测试

#客户端读写测试
tair_bin $ ./sbin/tairclient -c 192.168.127.133:5198 -g group_1
TAIR> health
TAIR> put key value
TAIR> get key
TAIR> remove key
TAIR> get key

6、Tair停止

#停止dataserver
tair_bin $ ./tair.sh stop_ds
#停止configserver
tair_bin $ ./tair.sh stop_cs

三、Tair高可用和负载均衡

Tair的高可用和负载均衡,主要通过对照表和数据迁移两大功能进行支撑。

对照表将数据分为若干个桶,并根据机器数量、机器位置进行负载均衡和副本放置,确保数据分布均匀,并且在多机房有数据副本。

在集群发生变化时,会重新计算对照表,并进行数据迁移。

1、对照表

在Tair系统中,采用对照表将数据均衡的分布在DataServer上

还能动态适应节点的扩容和缩容

Tair基于一致性Hash算法存储数据,根据配置建立固定数量的桶(bucket)

桶为Hash环节点,hash(key) 顺时针 设置桶

桶是负载均衡和数据迁移的基本单位

config server 根据一定的策略把每个桶指派到不同的data server上,
因为数据按照key做hash算法,所以可以认为每个桶中的数据基本是平衡的,保证了桶分布的均衡性, 就保证了数据分布的均衡性。

比如:

bucket data server
0 192.168.127.132 192.168.127.134
1 192.168.127.133 192.168.127.135
2 192.168.127.132 192.168.127.134
3 192.168.127.133 192.168.127.135
4 192.168.127.132 192.168.127.134
5 192.168.127.133 192.168.127.135

Tair支持自定义的备份数,比如你可以设置数据备份为2,以提高数据的可靠性。对照表可以很方便地支持这个特性。

第二列为主节点的信息,第三列为辅节点信息。在Tair中,客户端的读写请求都是和主节点交互。

当有节点不可用时,如果是辅节点,那么configserver会重新为其指定一个辅节点,如果是持久化存储,还将复制数据到新的辅节点上。如果是主节点,那么configserver首先将辅节点提升为主节点,对外提供服务,并指定一个新的辅节点,确保数据的备份数。

  1. 对照表的初始化
    第一次启动ConfigServer会根据在线的DataServer生成对照表
    ConfigServer会启动一个线程(table_builder_thread),该线程会每秒检查一次是否需要重新构造对照表

Tair 提供了两种生成对照表的策略:

  • 负载均衡优先
    config server会尽量的把桶均匀的分布到各个data server上
    一个桶的备份数据不能在同一台主机上

  • 位置安全优先
    一般我们通过控制 _pos_mask(Tair的一个配置项) 来使得不同的机房具有不同的位置信息
    一个桶的备份数据不能都位于相同的一个位置(不在同一个机房)

2、数据迁移

当DataServer增加时,config server负责重新计算一张新的桶在data server上的分布表

将桶较为平均的分配到各个DataServer上

当DataServer发生故障时, config server负责重新计算一张新的桶在data server上的分布表,将原来由故障机器服务的桶的访问重新指派到其它的data server中

这时需要做数据迁移,具体流程如下:
1、设置当前正在迁移的桶ID
2、DataServer写入桶数据时,会写入redolog
3、migrate_manager迁移内存中的桶数据
4、migrate_manager迁移redolog数据
5、redolog数据迁移完成后,将桶标记为迁移完成
6、将信息发送给ConfigServer用于同步对照表

Tair介绍、使用场景、安装使用以及高可用负载均衡相关推荐

  1. 高可用负载均衡反向代理服务

    高可用负载均衡&反向代理服务 概念简介 什么是高可用 高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间. ...

  2. keepalive+nginx实现负载均衡高可用_超详细的LVS+keepalived+nginx实现高性能高可用负载均衡集群教程...

    概述 前面已经介绍了前两部分内容,下面主要介绍在nginx服务器方面的配置和测试整个集群是否可用. 在realserver端配置VIP 1.两台nginx服务器都要执行下面脚本: #vi /etc/r ...

  3. Linux 笔记 - 第十八章 Linux 集群之(三)Keepalived+LVS 高可用负载均衡集群

    一.前言 前两节分别介绍了 Linux 的高可用集群和负载均衡集群,也可以将这两者相结合,即 Keepalived+LVS 组成的高可用负载均衡集群,Keepalived 加入到 LVS 中的原因有以 ...

  4. haproxy keepalived_详解mycat+haproxy+keepalived搭建高可用负载均衡mysql集群

    概述 目前业界对数据库性能优化普遍采用集群方式,而oracle集群软硬件投入昂贵,mysql则比较推荐用mycat去搭建数据库集群,下面介绍一下怎么用mycat+haproxy+keepalived搭 ...

  5. haproxy负载均衡_基于mycat+haproxy+keepalived搭建mysql数据库高可用负载均衡

    概述 目前业界对数据库性能优化普遍采用集群方式,而oracle集群软硬件投入昂贵,mysql则比较推荐用mycat去搭建数据库集群,下面介绍一下怎么用mycat+haproxy+keepalived搭 ...

  6. RabbitMQ+haproxy+keeplived 高可用负载均衡+镜像集群模式_集成高性能高可用组件 Keepalived_03

    服务器IP hostname 节点说明 端口 管控台地址 账号 密码 192.168.0.115 mq-01 rabbitmq master 5672 http://192.168.0.115:156 ...

  7. Centos7+Nginx+Keepalived实现Apache服务的高可用负载均衡

    Centos7+Nginx+Keepalived实现Apache服务的高可用&负载均衡 今天是2017年的第一天,昨天也就是2016年的最后一天,我尝试部署了Centos7+Nginx+Kee ...

  8. 游戏服务器高性能负载均衡,游戏服务器高可用负载均衡

    游戏服务器高可用负载均衡 内容精选 换一换 公有云提供弹性公网IP(EIP).NAT网关.弹性负载均衡(ELB)等方式连接公网.EIPEIP提供独立的公网IP资源,包括公网IP地址与公网出口带宽服务. ...

  9. 案例一(haproxy+keepalived高可用负载均衡系统)【转】

    1.搭建环境描述: 操作系统: [root@HA-1 ~]# cat /etc/redhat-release CentOS release 6.7 (Final) 地址规划: 主机名 IP地址 集群角 ...

最新文章

  1. 自动驾驶十字路口解决方案
  2. 标记meta http-equiv = X-UA-Compatible content = IE=edge,chrome=1
  3. c语言猜数字游戏用while,【C语言基础】有趣的猜数字游戏。(while循环,if语句,switch语句)...
  4. 洛谷P1073最优贸易——双向取值
  5. 在mysql控制台查询有乱码_mysql控制台显示乱码问题
  6. 【企业管理】高效会议关注点
  7. 如何删除webstrom中生成的.idea wrokspace
  8. 使用vant 制作导航栏
  9. 看看差距--完备技术面试
  10. 《Ext详解与实践》节选:自定义单元格的显示格式
  11. 图片动画横条广告带上下滚动
  12. PHP 读取 QQ ip纯真数据库 详解
  13. Arrays数组的常用方法
  14. sql server database mail
  15. 儿童讲堂 - 学科分类
  16. 化妆品展示网页设计作业 静态HTML化妆品网站 DW美妆网站模板下载 大学生简单网页作品代码 个人网页制作 学生个人网页设计作业
  17. java基础类型判空_java基础类型判空
  18. 创建符合MMdetection要求的训练数据集
  19. 天地图矢量数据下载_全球谷歌卫星地图影像数据下载
  20. x86 smbus 下挂eeprom不能写问题

热门文章

  1. 在线支付——微信支付宝二维码合一
  2. 好用的字体图标插件:阿里图标库(iconfont)
  3. 巴比特 | 元宇宙每日必读:上海虹口启动元宇宙方向孵化项目申报,最多可获20万元补贴,有哪些要求?...
  4. 万字长文剖析Dapp生态,《2019 Dapp行业报告》重磅发布
  5. OpenCV 图像处理编程学习笔记
  6. catia2017安装包打开没反应_【机械设计】Catia V5-6R2017软件安装教程
  7. WaSP的简要历史以及为何Web标准很重要
  8. wasp软件怎么安装不了_安装选项 · alibaba/wasp Wiki · GitHub
  9. 6个奇淫小软件,让Windows像杜蕾斯上的油一样爽滑好用
  10. 变频器内部有C语言吗,总结变频器的常用算法,看看你是不是都知道