java tair,Tair 简介

java tair,Tair 简介1Tair 的功能 Tair 是一个 Key Value 结构数据的解决方案 它默认支持基于内存和文件的两种存储方式 分别和我们通常所说的缓存和持久化存储对应 Tair 除了普通 Key Value 系统提供的功能 比如 get put delete 以及批量接口外 还有一些附加的实用功能 使得其有更广的适用场景 包括 Version 支持原子计数器 Item 支持 1 1Version 支持 Tair 中的每个数据都包含

1  Tair的功能

Tair是一个Key/Value结构数据的解决方案,它默认支持基于内存和文件的两种存储方式,分别和我们通常所说的缓存和持久化存储对应。

Tair除了普通Key/Value系统提供的功能,比如get、put、delete以及批量接口外,还有一些附加的实用功能,使得其有更广的适用场景,包括:Version支持

原子计数器

Item支持

1.1  Version支持

Tair中的每个数据都包含版本号,版本号在每次更新后都会递增。这个特性有助于防止由于数据的并发更新导致的问题。

比如,系统有一个value为“a,b,c”,A和B同时get到这个value。

A执行操作,在后面添加一个d,value为“a,b,c,d”

B执行操作添加一个e,value为”a,b,c,e”。

如果不加控制,无论A和B谁先更新成功,它的更新都会被后到的更新覆盖。

Tair无法解决这个问题,但是引入了version机制避免这样的问题。

还是拿刚才的例子,A和B取到数据,假设版本号为10,A先更新,更新成功后,value为”a,b,c,d”,与此同时,版本号会变为11。

当B更新时,由于其基于的版本号是10,服务器会拒绝更新,从而避免A的更新被覆盖。B可以选择get新版本的value,然后在其基础上修改,也可以选择强行更新。

1.2  原子计数器

Tair从服务器端支持原子的计数器操作,这使得Tair成为一个简单易用的分布式计数器

1.3  Item支持

Tair还支持将value视为一个item数组,对value中的部分item进行操作。

比如有个key的value为[1,2,3,4,5],我们可以只获取前两个item,返回[1,2],也可以删除第一个item,还支持将数据删除,并返回被删除的数据,通过这个接口可以实现一个原子的分布式FIFO的队列

2  Tair的内部结构

AAffA0nNPuCLAAAAAElFTkSuQmCC

Tair总体架构图

一个Tair集群主要包括client、configserver和dataserver 3个模块。

Configserver通过和dataserver的心跳(HeartBeat)维护集群中可用的节点,并根据可用的节点,构建数据的在集群中的分布信息(见下文的对照表)。

Client在初始化时,从configserver处获取数据的分布信息,根据分布信息和相应的dataserver交互完成用户的请求。Dataserver负责数据的存储,并按照configserver的指示完成数据的复制和迁移工作。

3  数据的分布

分布式系统需要解决的一个重要问题便是决定数据在集群中的分布策略,好的分布策略应该能将数据均衡地分布到所有节点上

能适应集群节点的变化

Tair采用的对照表方式较好地满足了这两点。

对照表的行数是一个固定值,这个固定值应该远大于一个集群的物理机器数,由于对照表是需要和每个使用Tair的客户端同步的,所以不能太大,不然同步将带来较大的开销。我们在生产环境中的行数一般为1023 。

3.1  对照表简介

下面我们看对照表是怎么完成数据的分布功能的

为了方便,我们这里假设对照表的行数为6。最简单的对照表包含两列,第一列为hash值,第二列为负责该hash值对应数据的dataserver节点信息。

比如我们有两个节点192.168.10.1和192.168.10.2,那么对照表类似:

AAffA0nNPuCLAAAAAElFTkSuQmCC

当客户端接收到请求后,将key的hash值和6取模,然后根据取模后的结果查找对照表。比如取模后的值为3,客户端将和192.168.10.2通信。

3.2  对照表如何适应节点数量的变化

我们假设新增了一个节点——192.168.10.3,当configserver发现新增的节点后,会重新构建对照表

构建依据以下两个原则:数据在新表中均衡地分布到所有节点上。

尽可能地保持现有的对照关系。

更新之后的对照表如下所示:

AAffA0nNPuCLAAAAAElFTkSuQmCC

这里将原本由192.168.10.1负责的4和192.168.10.2负责的5交由新加入的节点192.168.10.3负责。

如果是节点不可用,则相当于上述过程反过来,都是同理

4 多备份的支持

Tair支持自定义的备份数,比如你可以设置数据备份为2,以提高数据的可靠性。

对照表可以很方便地支持这个特性。我们以行数为6,两个节点为例,2个备份的对照表类似:

AAffA0nNPuCLAAAAAElFTkSuQmCC

第二列为主节点的信息,第三列为辅节点信息

在Tair中,客户端的读写请求都和主节点交互,所以如果一个节点不做主节点,那么它就退化成单纯的备份节点。

因此,多备份的对照表在构建时需要尽可能保证各个节点作为主节点的个数相近。

当节点不可用时如果是辅节点,那么configserver会重新为其指定一个辅节点,如果是持久化存储,还将复制数据到新的辅节点上

如果是主节点,那么configserver首先将辅节点提升为主节点,对外提供服务,并指定一个新的辅节点,确保数据的备份数

5 多机架和多数据中心的支持

对照表在构建时,可以配置将数据的备份分散到不同机架或数据中心的节点上

Tair当前通过设置一个IP掩码来判断机器所属的机架和数据中心信息。

比如你配置备份数为3,集群的节点分布在两个不同的数据中心A和B,则Tair会确保每个机房至少有一份数据

假设A数据中心包含两份数据时,Tair会尽可能将这两份数据分布在不同机架的节点上。这可以减少整个数据中心或某个机架发生故障是数据丢失的风险。

作者:JavaEdge

链接:https://www.jianshu.com/p/aa24bf06ed0e

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205840.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午5:03
下一篇 2026年3月19日 下午5:04


相关推荐

  • JSF简单介绍

    JSF简单介绍

    2021年12月5日
    51
  • 腾讯之后 百度智能云多地开启免费线下安装“小龙虾”OpenClaw

    腾讯之后 百度智能云多地开启免费线下安装“小龙虾”OpenClaw

    2026年3月13日
    2
  • RAG知识库清洗流程[代码]

    RAG知识库清洗流程[代码]

    2026年3月13日
    2
  • 网页播放rtsp视频流

    网页播放rtsp视频流网页播放rtsp视频流原文:https://blog.csdn.net/u011562107/article/details/78548605?locationNum=10&fps=1RTSP协议(1)是流媒体协议。(2)RTSP协议是共有协议,并有专门机构做维护。(3)RTSP协议一般传输的是ts、mp4格式的流。(4)RTSP传输一般需要2-3个通…

    2022年10月18日
    5
  • 2022,VSCode 前端插件推荐(摸鱼必备)

    2022,VSCode 前端插件推荐(摸鱼必备)点击上方“蓝色字体”,选择“设为星标”做积极向上的前端人!前言推荐一波前端开发必备插件,绝对可以提高你的生产力,剩下来的时间来mo鱼,岂不美哉开发综合推荐别名路径跳转插件名:别名路径跳转使用说明:别名路径跳转插件,支持任何项目,使用场景:当你在开发页面时,想点击别名路径导入的组件时(演示如下)配置说明下载后只需自定义配置一些自己常用的别名路径即可//文件名别名…

    2022年7月25日
    43
  • Java 自定义类加载器教程[通俗易懂]

    Java 自定义类加载器教程[通俗易懂]Java自定义类加载器教程除了在面试中遇到类的加载器的概率会高外,在实际的工作中很少接触。但是一个程序员想要成长为大牛就必须对一些JVM的底层设计有些了解。在此基础上我们阅读一些源码和框架会显得更轻松。好了废话不多说,我们接着前面的文章,乘热打铁。来实现一个Java自定义类加载器吧。要实现Java自定义的类加载器,我们需要继承ClassLoader。并且需要了解Java的双亲委派模型。loadClassloadClass默认实现如下:publicClass<?>

    2025年9月20日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号