返回顶部
首页 > 资讯 > 数据库 >HBase中Replication的用法详解
  • 282
分享到

HBase中Replication的用法详解

2024-04-02 19:04:59 282人浏览 薄情痞子
摘要

这篇文章主要介绍“HBase中Replication的用法详解”,在日常操作中,相信很多人在HBase中Replication的用法详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大

这篇文章主要介绍“HBase中Replication的用法详解”,在日常操作中,相信很多人在HBase中Replication的用法详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HBase中Replication的用法详解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Replication:复制,指的是持续的将同一份数据拷贝到多个地方进行存储,是各种存储系统中常见而又重要的一个概念,可以指数据库中主库和从库的复制,也可以指分布式集群中多个集群之间的复制,还可以指分布式系统中多个副本之间的复制。它的难点在于数据通常是不断变化的,需要持续的将变化也反映到多个数据拷贝上,并保证这些拷贝是完全一致的。

通常来说,数据复制到多个拷贝上有如下好处:

  • 多个备份提高了数据的可靠性

  • 通过主从数据库/主备集群之间的复制,来分离OLTP和OLAP请求

  • 高可用性,即使在单副本挂掉的情况下,依然可以有其他副本来提供读写服务

  • 可扩展,通过增加副本来服务更多的读写请求

  • 跨地域数据中心之间的复制,Client通过读写最近的数据中心来降低请求延迟

HBase中的Replication指的是主备集群间的复制,用于将主集群的写入记录复制到备集群。HBase目前共支持3种Replication,分别是异步Replication、串行Replication和同步Replication。

异步Replication

如果想把HBase的Replication搞清楚,首先需要了解下HBase的架构

HBase集群是由一组进程组成的,进程按角色分为Master和RegionServer,其中Master负责DDL操作,比如建表、删表,而RegionServer负责DML操作,比如数据的读写操作等。从数据视图上讲,HBase中的Table会按Range切分为多个Region,然后由不同的RegionServer来负责对外提供服务。

HBase中Replication的用法详解

RegionServer的内部则主要有BlockCache,MemStore和WAL等几部分组成,需要注意的是每个Region的每个Column Family有自己独享的MemStore,但是BlockCache和WAL则是多个Region共享的。WAL(Write-ahead logging)是数据库中的常用技术,所有的修改在写入数据库之前都需要持久化到WAL中,从而确保了在出现故障的时候,可以从WAL中回放出已经成功写入的数据。

HBase中Replication的用法详解

HBase中的Replication也是基于WAL的,其在主集群的每个RegionServer进程内部起了一个叫做ReplicationSource的线程来负责Replication,同时在备集群的每个RegionServer内部起了一个ReplicationSink的线程来负责接收Replication数据。ReplicationSource记录需要同步的WAL队列,然后不断读取WAL中的内容,同时可以根据Replication的配置做一些过滤,比如是否要复制这个表的数据等,然后通过replicateWALEntry这个rpc调用来发送给备集群的RegionServer,备集群的ReplicationSink线程则负责将收到的数据转换为put/delete操作,以batch的形式写入到备集群中。

HBase中Replication的用法详解

因为是后台线程异步的读取WAL并复制到备集群,所以这种Replication方式叫做异步Replication,正常情况下备集群收到最新写入数据的延迟在秒级别。

串行Replication

串行Replication指的是:对于某个Region来说,严格按照主集群的写入顺序复制到备集群,其是一种特殊的Replication。同时默认的异步Replication不是串行的,主要原因是Region是可以移动的,比如HBase在进行负载均衡时移动Region。假设RegionA首先在RegionServer1上,然后其被移动到了RegionServer2上,由于异步Replication是存在延迟的,所以RegionA的最后一部分写入记录还没有完全复制到备集群上。在Region移动到RegionServer2之后,其开始接收新的写入请求,并由RegionServer2来复制到备集群,所以在这个时候RegionServer1和RegionServer2会同时向备集群进行复制,而且写入记录复制到备集群的顺序是不确定的。

HBase中Replication的用法详解

如上图所示这种极端情况下,还会导致主备集群数据的不一致。比如RegionServer1上最后一个未同步的写入操作是Put,而RegionA被移动到RegionServer2上的第一个写入操作是Delete,在主集群上其写入顺序是先Put后Delete,如果RegionServer2上的Delete操作先被复制到了备集群,然后备集群做了一次Major compaction,其会删除掉这个Delete marker,然后Put操作才被同步到了备集群,因为Delete已经被Major compact掉了,这个Put将永远无法被删除,所以备集群的数据将会比主集群多。

解决这个问题的关键在于需要确保RegionServer2上的新写入操作必须在RegionServer1上的写入操作复制完成之后再进行复制。所以串行Replication引入了一个叫做Barrier的概念,每当Region open的时候,就会写入一个新的Barrier,其值是Region open时读到的最大SequenceId加1。SequenceId是HBase中的一个重要概念,每个Region都有一个SequenceId,其随着数据写入严格递增,同时SequenceId会随着每次写入操作一起写入到WAL中。所以当Region移动的时候,Region会在新的RegionServer重新打开,这时就会写入一个新的Barrier,Region被移动多次之后,就会写入多个Barrier,来将Region的写入操作划分成为多个区间。同时每个Region都维护了一个lastPushedSequenceId,其代表这个Region当前推送成功的最后一个写操作的SequenceId,这样就可以根据Barrier列表和lastPushedSequenceId来判断WAL中的一个写入操作是否能够复制到备集群了。

HBase中Replication的用法详解

以上图为例,Pending的写入记录就需要等待lastPushedSequenceId推到Barrier2之后才能开始复制。由于每个区间之间只会有一个RegionServer来负责复制,所以只有和lastPushedSequenceId在同一个区间内的RegionServer才能进行复制,并在复制成功后不断更新lastPushedSequenceId,而在lastPushedSequenceId之后各个区间的RegionServer则需要等待lastPushedSequenceId被推到自己区间的起始Barrier,然后才能开始复制,从而确保了Region的写入操作可以严格按照主集群的写入顺序串行的复制到备集群。

同步Replication

同步Replication是和异步Replication对称的概念,其指的是主集群的写入操作必须被同步的写入到备集群中。异步Replication的最大问题在于复制是存在延迟的,所以在主集群整集群挂掉的情况下,备集群是没有已经写入的完整数据的,对于一致性要求较高的业务来说,是不能把读写完全切到备集群的,因为在这个时候可能存在部分最近写入的数据无法从备集群读到。所以同步Replication的核心思路就是在写入主集群WAL的同时,在备集群上写入一份RemoteWAL,只有同时在主集群的WAL和备集群的RemoteWAL写入成功了,才会返回给Client说写入成功。这样当主集群挂掉的时候,便可以在备集群上根据Remote WAL来回放出来主集群上所有写入记录,从而确保备集群和主集群数据的一致。

HBase中Replication的用法详解

需要注意的是,同步Replication是在异步Replication的基础之上的,也就是说异步Replication的复制链路还会继续保留,同时增加了新的写Remote WAL的步骤。对于具体的实现细节来说,首先是增加了一个Sync replication state的概念,其总共有三个状态, 分别是Active,Downgrade Active和Standby。这几个状态的转换关系如下图所示,Standby在提主的时候需要首先提升为Downgrade Active,然后才能提升为Active。但是Active是可以直接降级为Standby的。目前这个状态是保存在ReplicationPeerConfig中的, 其表示一个集群在这个ReplicationPeer中处于哪个状态。

HBase中Replication的用法详解

然后实现了一个DualAsyncFSWAL来同时写主集群的WAL和备份集群的Remote WAL。写WAL的操作是对于hdfs的rpc请求,其会有三种结果: 成功,失败或者超时。当超时的时候,对于HBase来说结果是不确定的,即数据有可能成功写入到WAL或Remote WAL里了,也有可能没有。只有同时写成功或者同时写失败的时候,主集群和备集群才会有一样的WAL,如果是主集群写WAL成功,写Remote WAL失败或者超时,这时候主集群WAL里的数据就有可能比备集群的Remote WAL多。相反如果写备集群Remote WAL成功了,而主集群的WAL写失败或者超时了,备集群的Remote WAL里的数据就有可能比主集群多。当两边都超时的时候, 就不确定那边多了。所以同步复制的关键就在于在上述情况下,如何确保主备集群数据的最终一致。即在切换主备集群的时候,Client应该始终从主备集群看到一致的数据。而且在主备没有达到一致的中间状态时,需要一些限制来确保Client没法读到这种中间不一致的结果。所以总结一下就是主备集群最终一致,但对于Client来说是强一致,即成功写入的数据无论主备集群都要一定能读到。具体的实现细节可以参考HBaseCon Asia 2018:HBase at Xiaomi[1]。

HBase中Replication的用法详解

对比异步复制来看,同步复制主要是影响的写路径,从我们的测试结果上来看,大概会有14%的性能下降,后续计划在HBASE-20422[2]中进行优化

自定义Replication Endpoint

除了上述3种Replication之外,HBase还支持插件式的Replication Endpoint,可以自定义Replication Endpoint来实现各种各样的功能。具体到小米来说,我们实现了可以在不同表之间的Replication Endpoint,比如可以将主集群的表A复制到备集群的表B,其应用场景有集群迁移,Namespace更换或者表名更换等。同时为了实现Point-in-time Recovery,我们做了可以同步数据到小米消息队列Talos的Replication Endpoint,当出现需要恢复某个时间点t1的场景时,可以首先找到冷备中距离t1最近的一个的Snapshot进行恢复,然后将消息队列中的数据来回放到t1时间点,从而做到Point-in-time Recovery。

到此,关于“HBase中Replication的用法详解”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: HBase中Replication的用法详解

本文链接: https://lsjlt.com/news/60907.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • HBase中Replication的用法详解
    这篇文章主要介绍“HBase中Replication的用法详解”,在日常操作中,相信很多人在HBase中Replication的用法详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • MySQL Replication中的并行复制示例详解
    目录传统单线程复制说明总结mysql5.6基于库级别的并行复制MySQL5.7基于组提交的并行复制组提交说明MySQL8.0基于writeset的并行复制关键参数查看参数配置项说明引用资料:传统单线程复制说明 众所周知,...
    99+
    2022-07-01
    MySQL Replication并行复制 MySQL 并行复制
  • hbase的安装及hbase shell的用法分享
    这篇文章主要讲解了“hbase的安装及hbase shell的用法分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“hbase的安装及hbase shell...
    99+
    2024-04-02
  • 详解HBase表的数据模型
    目录表(Table)1. rowkey行键2. Column Family列族3. Column列4. cell单元格5. Timestamp时间戳理解数据模型各概念的图HBase是...
    99+
    2024-04-02
  • mysql 中replication的作用是什么
    今天就跟大家聊聊有关mysql 中replication的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. master mysql 中...
    99+
    2024-04-02
  • hbase shell基础和常用命令详解
    HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。 ...
    99+
    2022-06-04
    详解 基础 常用命令
  • hbase中put的使用方法是什么
    在HBase中,可以使用Put类来向表中插入数据。Put类的构造函数接受一个rowkey作为参数,然后可以使用addColumn方法...
    99+
    2024-04-02
  • 详解spring封装hbase的代码实现
    前面我们讲了spring封装MongoDB的代码实现,这里我们讲一下spring封装Hbase的代码实现。hbase的简介:此处大概说一下,不是我们要讨论的重点。HBase是一个分布式的、面向列的开源数据库,HBase在Hadoop之上提供...
    99+
    2023-05-31
    spring hbase sprin
  • Asp.net中UpdatePanel的用法详解
    Asp.net UpdatePanel 允许用户构建一个丰富的,以客户端为中心的应用程序,引用UpdatePanel控件,能够实现页面的部分刷新,一个包含scriptManage和 ...
    99+
    2024-04-02
  • vuex中Getter的用法详解
    前言 Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依...
    99+
    2024-04-02
  • Java中的MapStruct用法详解
    目录1 MapStruct配置2 原理&性能2.1 实现原理3 使用方法3.1 转换器的检索3.1.1 使用Mappers工厂获取3.1.2 通过依赖注入的方式获取3.2 简...
    99+
    2024-04-02
  • pandas中pd.groupby()的用法详解
    在pandas中的groupby和在sql语句中的groupby有异曲同工之妙,不过也难怪,毕竟关系数据库中的存放数据的结构也是一张大表罢了,与dataframe的形式相似。 imp...
    99+
    2024-04-02
  • java8中的Collectors.groupingBy用法详解
    Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组 数据准备: public Product(Long id, Integer num, Big...
    99+
    2024-04-02
  • Python中numpy.polyfit的用法详解
    numpy中polyfit的用法 参数 polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False): x:M个采样点的横坐标数组; y:...
    99+
    2023-09-12
    python numpy
  • Python中的QPixmap用法详解
    目录1.使用QPixmap显示图片2.使用QPixmap实现图片的缩放3.使用QPixmap实现图像的旋转4.使用QPixmap实现图像的扭曲QPixmap主要用于绘图,针对图像显示...
    99+
    2023-03-21
    QPixmap使用 python QPixmap用法
  • k8s中secret的用法详解
    secret可以加密用户名和密码文件,将其打包成一个secret并在API服务器上创建对象 echo -n 'admin' > ./username.txt echo -n '...
    99+
    2023-05-15
    k8s secret使用 k8s secret
  • python中yield的用法详解—
    此文转载,侵删,原文地址:https://blog.csdn.net/mieleiz... 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是...
    99+
    2023-01-31
    详解 python yield
  • 详解Reactor中Context的用法
    目录一、使用介绍二、源码解读三、如何桥接现有的ThreadLocal系统四、总结在响应式编程中,多线程异步性成为天然的内在,多线程之间的切换也成为原生的,在处理一个数据流Flux/M...
    99+
    2023-02-19
    Reactor Context用法 Reactor Context
  • C++中的memset用法详解
    memset简介 memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。 void *memset(void *s, int c, size_t n); s指向要...
    99+
    2023-02-04
    memset的用法 c++ memset用法
  • pytorch中的dataset用法详解
    目录1.torch.utils.data 里面的dataset使用方法2.torchvision.datasets的使用方法用法1:使用官方数据集用法2:ImageFolder通用的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作