三英战SQL:解析NoSQL的可靠性及扩展操作

2023-11-10

摘要:NoSQL的高性能、易扩展及可靠性一直深受数据工作者的喜爱,然而对比传统关系型数据库NoSQL的优势究竟又在何处。Esen Sagynov在DZone上发布了一篇文章,从运行方面分析Cassandra,HBase以及MongoDB产品的扩展性和可靠性;详述了3个NoSQL数据库在故障恢复中的性能和可靠性,更谈及了扩展过程中带来的性能影响。

对比关系型数据库,NoSQL的优点在哪里?NoSQL具有高性能、良好的扩展性以及高可靠性等优点。然而,没有一个产品可以在所有的方面都达到完美。当你仔细审视NoSQL的产品,完全可以找到一些弱点,就像那些杰出的优点一样“鲜明出众”。基于此原因,选择经过验证的NoSQL产品就是关键。在本文中,作者从运行方面分析Cassandra,HBase以及MongoDB等产品的扩展性和可靠性。

Cassandra故障恢复以及数据一致性

Cassandra在数据的分布式和可靠性方面展示了自身卓越的性能。首先,作者检测了它的分布能力,Cassandra通过一致性哈希算法来实现数据的分配处理。

Cassandra的一致性哈希算法

通过一致性哈希算法,用户可以不经过查询元数据就能搜索并发现key存储在哪个节点上。用户通过计算key的哈希值就能发现key,同样只通过Hash值就可以找到节点所在。你可以想像一致性哈希被作为哈希值顺序的放在圆环上,每个节点处理环上的一个部分。如果环上增加了一个节点,那么某个拥有很大体积数据的特定节点就会被拆分然后分配给新的节点;如果某个节点被移除,分配给该节点的资源就会转移到邻节点上。利用这种方式,Cassandra使增加或者移除节点带来的影响降到了最小。

Cassandra的运行中不需要主服务器,换句话说:并没有特定的服务器来管理数据的分配或者故障恢复。这就意味着,Cassandra并不存在单点故障(Single Point Of Failure,SPoF)。取代主服务器,每个节点都和其他节点周期性地分享元数据,这个也被称之为Gossip协议。使用Gossip协议,节点可以对其他节点的运行状态进行查询。

Cassandra通过提供一致性级别来实现系统的可靠性。如果使用一个很低的一致性级别,即使一个节点宕掉也可能导致整个服务的停滞。例如,3个节点中的某一个节点在存储副本数据的过程中宕掉了,一个通用的写操作,就不能立刻返回成功信息,这是因为故障节点不能完成写入数据的请求。然而,如果一致性级别被定义成一个约定值或者是1,而存活的节点数大于或者等于设定值,这样的话就能立刻返回成功。如果是这样的话,只有在所有的3个节点都同时宕掉,才会发生请求错误。

但是,读/写操作真的没有受到节点出错的影响吗?

为了证明这点,当有新节点添加时,作者在不断的服务器请求下故意让一个节点发生故障。结果如下所示:

移除一个节点和增加一个新的节点

以下是移除一个节点和增加一个新的节点的结果:

  1. 在管理工具中明确移除一个节点,存储在此节点中的数据就被迁移到剩余的节点中,然后该节点被移除。
  2. 当一个新节点被增加,这个被称之为引导指令,增加的节点就会向种子节点(seed nodes)报告它已经添加完毕。基于配置信息,新节点会被添加在环上配置信息中指定的范围,或者环上资源被占用最高的节的附近—— 当然这是在没有其它节点被引导在这个范围上。
  3. 数据从那个节点迁移到到新节点上。
  4. 一旦数据迁移进程结束,新节点就能进行使用。

节点失败后增加一个新节点

下面是节点失败后新增节点的结果:

  1. 当一个节点宕掉之后,存储在节点上的数据并没有迁移到其他的节点上,服务在于两个副本(节点)共舞。换句话说,并没有返回任何错误信息,即使在这段时间里又收到服务请求。
  2. 当一个新节点被增加的时候,该节点会被分配到环上的一个特定区域。然而,引导指令并没有执行,因为引导指令只有系统中存在3份副本的时候才会被执行!
  3. 新增的节点并没有数据,但是它能处理请求,这是因为它可以提供服务。如果此时接受到一个读请求,节点并不会对key返回数据。如果备份因子是3而读一致性的级别是1,那么1/3的读请求可能不会返回数据。如果一致性级别被设置为约定值,1/6的读请求可能会返回空数据。简单来讲,这没有读一致性的保证,除非故障节点已经恢复。实际上在级别1中,协调节点是最有可能第一个接受来自新节点的响应。出现这种情况是因为没有来自新节点的I/O请求——因为它没有数据。出于这个原因,新的节点比现有节点有更大的机率返回空数据。
  4. 当通过管理工具对新节点做Read Repair时,节点通过读其他节点的同步数据才能得以建立。此时读一致性就被破坏了,只到Read Repair完成。

即使节点失败,Cassandra也能提供无错的服务。尽管Cassandra在写数据的时候,展示了自身强大的性能,但是在读数据的时候并非如此,因为Read Repair的延迟必然导致数据的非一致性的延迟。因此,为了在节点故障中保持读一致性,需要使用以下的方法:

  • 设置读一致性水平为“all”然后执行读操作。在这种情况下,就能获得所有来自副本的最新数据。
  • 一旦读请求失败,Cassandra会再次进行尝试。这是因为在第一次读写的时候Read Repair可能会作为第二次读写时的恢源数据源。然而,这种方法能确保Rread Repair在二次读之前完成。(当一致性的水平较低,那么读修复就会在后台执行,这是一个独立的线程,区别于读操作过程的线程)

HBase的失败因子和恢复方法

HBase包含以下几个组件:

HRegionServer负责数据的分布处理,由HMaster进行监控。HDFS存储和复制数据,Zookeeper存储了HMaster以及备选HMaster的储存单元信息。如果没有为每个组件建立冗余,所有的组件都会成为SPoF。

HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效。(百度百科)

HRegionServer把数据分布到一些称之为“region”的单元中,region就是将一张大表格通过指定字段对数据进行排序,然后针对排序键的范围拆分出的结果(就像大表中的一小块)。每个region排序字段的值范围存储在一个单独的region中,被称为meta region。而region和meta region的对应关系被存储在root region中。长话短说,region服务器存储着一个层次树中,包含了root region、meta region以及data region。如果一个region服务器宕机,这个region服务器包含的region都不可以被访问直到被分配给了其它region服务器。因此产生了服务器宕机时间,直到那个region被恢复。

如果是这种情况,宕机的时间能持续多久?

下面我们来估计一下故障恢复中的宕机时间。

在一个region的服务器上如果有故障产生,数据恢复会按照以下描述的步骤进行:

  1. HMaster检测故障点,然后找出一个其他的服务器来执行故障服务器上的服务。
  2. 指定的HRegionServer首先读取新region上的WAL(Write Ahead Log),然后恢复该region上的MemStore。
  3. 一旦MemStore完成恢复,HMaster修正meta region中region存储的位置,并重启该region上的服务。
  4. 存储在磁盘上的region数据将会通过HDFS进行恢复。

总之,故障的恢复时间取决于故障的检测、读日志以及创建一个新的region的时间。因为分配给恢复region的服务器可以访问存储在HDFS中的文件,所以在HDFS中不会发生数据迁移。因此,宕机时间并不是不长。

HDFS故障

HDFS包含一个NameNode和几个DataNode,在这里,NameNode是存储元数据的节点。所以当NameNode宕掉,服务就会出现问题。然而,如果其中的DataNode宕掉了,服务是不会受影响的,这是因为这些数据都拥有副本。但是存储在故障节点中的数据,将通过其他节点中的复制因子来恢复正常。在这个时候,一个巨大的数据复制可能会发生,从而减缓了任何来自服务或者是应用程序的任何读请求,这是由于受到数据复制过程中的磁盘I/O影响。

MongoDB中的复制和故障恢复

MongoDB从主节点给其它从节点异步复制数据。异步复制的好处是不会降低主节点的性能,这样的话在添加从节点的时候也不会降低服务的性能。然而在发放生故障时数据将会丢失,因为数据是不一致的。

MongoDB的故障恢复和DBMS的HA是很相似的。在产生故障时,它也是选择一个master,我们来分开讨论一下:

节点故障

配置三个节点,一个主节点和两个从节点。一旦主节点停止,两个从节中将会自动的选取出一个作为主节点。当故障发生时,选择一个新的主节点的时间仅仅只需要几秒钟,这段时间并不算很久。然而,配置的主节点宕掉,然后选择作为主节点的从节点也宕掉了,就没有主节点可选了!

添加一个节点

向主节点中输入数据,确认数据的大小是5GB,这要保证比内存的容量小。接下来,添加一个新的slave节点到主节点上,在这种情况下,新增的从节点并不会降低主节点的性能,而新增一个从节点复制所有数据的时间只需要几分钟。

而对MongoDB来说,由于故障或者增加节点带来的性能降低是非常小的。然而当主节点和从节点的备份信息是不一致的,一旦主节点出现故障 —— 那些还没有复制到从节点中的数据有可能会丢失。在MongoDB中,主节点将操作记录写入本地服务器的Oplog日志中,然后从节点读取日志并且储存在自己的数据库中。如果在故障发生时从节点仍然未完成日志读取并保存,未经读取的数据将会丢失。此外,即使主节点的日志已满,但是从节点还未完成文件的复制,所有主节点的数据都被读取并存入从节点,而不是复制到日志中。这被称为数据同步。如果上面这种情况发生主节点故障,那么大量的数据将会丢失。

结论:

到现在为止,作者对Cassandra, HBase以及MongoDB的故障恢复逐一做了论述。

Cassandra提供高可用性的写操作,然而,它需要很长时间来从一个失败中恢复数据。这是因为Cassandra识别要恢复的所有数据,然后读和写每个数据的最新版本。它还因在响应服务请求添加新节点时,仍在恢复数据,导致错误的读取结果返回。此外,Read Repair会在读取数据用以恢复的时候运行两次。尽管它在新节点添加同时发生节点失败会有相对处理,但是如果在数据恢复之前进行读取仍然会返回错误的结果。因此一致性等级的性能不被提高,它仍然不能用于需要读操作的服务。

由于它的配置问题,HBase自身存在很多因素可能导致问题的产生。不过对比Cassandra节点失败时必须进行数据的恢复,HBase却不需要恢复数据,除非HDFS出现问题。这样HBase宕机时间就会很短,即使HDFS出现问题宕机时间也不会很长。虽然读性能在数据的恢复过程中会受到影响,但是数据的一致性完全可以得到保证。用这种方式,如果SPoF部分成为冗余,我们将从HBase获得很高的可靠性。

MongoDB提供了一个自动故障恢复并且发生宕机的时间很短。然而,异步复制方式在故障恢复的过程中很容易造成数据的丢失。

当然,在最终选择适合自己的数据库解决方案之前,应该对比每个产品的特点。举个例子,CUBRID 关系型数据库系统,为数据的一致性提供了同步的高可用性体系,虽然没有数据的丢失问题,但是它远远比不上NoSQL解决方案的性能。(编译/王鹏、仲浩 审校/包研)

原文链接:The Availability and Operational Stability of NoSQL

欢迎关注@CSDN云计算微博,了解更多云信息。

本文为CSDN编译整理,未经允许不得转载。如需转载请联系market@csdn.net

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三英战SQL:解析NoSQL的可靠性及扩展操作 的相关文章

  • Java操作json的通用类

    package com baiyyy polabs util json import java text ParseException import java util ArrayList import java util Date imp
  • 408还是自主命题?计算机考研应该怎么选

    计算机考研一共考4科 政治 英语 数学 和专业课 专业课有两类选择 联考408和自主命题 联考408 408是教育部命题 不同的学校考试科目只要是408 就是相同的题目 历年真题在网络上都是公开的 公众号回复408即可获取408真题 学校也
  • (一)、Sun FtpClient

    项目实践中遇到Ftp传输问题 在这里做个专辑 第一篇还是介绍一下sun提供的FtpClient 这个也是网上说的最多的 在这里我只是给出例程 不再做详细的解释 sun提供的FtpClient简单宜用 不支持任何加密方式 并没有提供相应的ap
  • Java实现PDU编码

    代码一 package com zte test import java io UnsupportedEncodingException PDU编码实现 7bit 8bit 以及UCS2编码 代码主体是网上来源 Url我忘记了 很遗憾 自己
  • 将 Hibernate 会话与 Quartz 结合使用

    我有一个使用 Struts 和 Hibernate 等框架的 Web 应用程序 目前我正在使用 Quartz 为该应用程序开发一个调度程序 在编码时 我意识到使用 Quartz 线程不可能使用 Hibernate 会话 有人有使用石英作业类
  • Struts逻辑标签等于不工作

    非常快的问题 有人可以向我解释为什么这段代码不起作用吗 myValue br
  • 在 Struts 2 中动态生成名称和值属性

    我正在将代码从 Struts1 迁移到 Struts2 Struts1代码
  • 如何获取struts标签中的JSP scriptlet值

    这是我的代码 如果我执行以下操作 我将不会获得该值
  • 如何在 Eclipse 中使用引用的项目

    好吧 也许每个人都知道如何做到这一点 但我从来没有尝试过 因为我从来没有需要它 所以 你如何在 Eclipse 中处理多个引用的项目 我有几个 Struts 1 Web 应用程序 它们必须使用另一个 struts 1 库 项目 现在我正在使
  • Struts2 ActionContext 和 ValueStack?

    我的问题是 在Struts2中 是不是每个action对象都有自己对应的ActionContext和ValueStack呢 换句话说 对于每个新请求 都会创建一个新的操作对象 这是否意味着每次创建新的操作对象时 也会创建新的 ActionC
  • 两个单选按钮同时选择

    我正在添加一个单选按钮divjsp页面的 但是新添加的单选按钮始终处于选择状态 当我单击第二个单选按钮时 它也会选择 有没有脚本可以写这个 div style padding left 15px div Entry Mode Code wa
  • 和 ${param} 之间有什么区别

    在 struts 中 我注意到有两种不同的方式来访问变量 我很好奇它们之间有什么区别以及何时正确使用它们 例如 假设我们像这样设置变量高度
  • 有什么方法可以预测会话超时吗?

    有没有办法 捕获 会话超时事件 以便在 HttpSession 失效之前检索数据 我们正在实现 Filter 接口 并且在 doFilter 方法中 当会话超时时 我们在登录时存储在会话对象中的用户为 null 提前致谢 您应该能够注册Ht
  • 相当于 Struts 1.x“bean:define”标签?

    我正在致力于将旧的 Struts 1 x 应用程序转换为 Spring MVC 并且在一些 JSP 页面中 bean define标签用于从资源包中获取字符串 然后在页面中稍后使用
  • 我可以在 Struts 中提供 SEO 友好的 url 吗?

    我想在我的应用程序中拥有 SEO 友好的 url 它将使用 Struts 1 2 在 java j2ee 中构建 我有一些分类如下 county countryname county state statename county state
  • 警告:找不到指定操作的配置:

    我遇到以下异常 请帮助解决这个问题 Jul 16 2013 11 18 40 AM org apache struts2 components Form evaluateExtraParamsServletRequest WARNING N
  • XSD 验证错误:在 web.xml 中找不到 TagLib 标记

    我详细显示错误如下 cvc complex type 2 4 a 发现以元素开头的无效内容 taglib One of http java sun com xml ns javaee 描述 http java sun com xml ns
  • struts2-rest 插件..使 struts 操作 + 休息操作一起工作,但是。给出 java.lang.reflect.InitationTargetException

    我正在将现有的 struts 2 应用程序转换为通过一些基于休息的服务来提供服务 我使用了两个插件 struts2 rest插件和struts convention插件 除了这些之外 我还使用了 asm jar 因为上面给出了 asm ja
  • struts.xml 和 struts-config.xml

    struts xml 和 struts config xml 有什么区别 两者是相同的还是有什么区别 Struts框架的核心配置文件默认是struts xml对于 Struts 2 和struts config xml对于Struts 1
  • Tomcat 热部署到托管多个应用程序的实例

    我的问题是关于部署到托管多个应用程序并托管 Struts Spring 和 Hibernate 的应用程序上下文的 Tomcat 服务器实例 我想在不重新启动 Tomcat 服务器的情况下将更改部署到一个应用程序 举个例子 在我们公司很多时

随机推荐

  • Android 基础知识4-3.11 Adapter(适配器)详解

    一 简介 Adapter是连接后端数据和前端显示的适配器接口 是数据和UI View 之间一个重要的纽带 在常见的View ListView GridView 等地方都需要用到Adapter 如下图直观的表达了Data Adapter Vi
  • 在区块链上开发可更新的智能合约

    由于区块链不可篡改的特性 智能合约一旦部署在区块链上 其执行的逻辑就无法再更改 长期来看 这个重要的特性反而限制了智能合约的弹性和发展 接下来要介绍如何设计及部署合约才能让合约在需要时可以更新 但这里的更新意思不是修改已经部署的合约 而是部
  • 【一网打尽】独立重复事件——常见概率分布

    文章目录 定义 伯努利 Bernouli 试验 n重伯努利试验 伯努利过程 泊松 Poisson 过程 概率分布的意义 0 1分布 伯努利分布 二项 Binomial 分布 负二项 NegativeBinomial 分布 几何 Geomet
  • 区块链的数据结构(一)——区块、链

    区块 区块 block 由区块头 block header 和交易列表 transaction list tx list 组成 block之间通过block header的hash连接成了一个链表结构 但这个链表不同于普通链表 1 bloc
  • JAVA根据PDF文件生成图片

    PDF文件生成图片 实现功能 根据上传的PDF文件 生成图片文件 单页PDF 生成图片文件 多页PDF 则生成zip压缩包 一 文件生成效果 二 引入所需maven依赖 项目采用springboot框架
  • python学习1.2字符串

    一 给变量赋值字符串的时候 要用引号引起来 可以用单引号或者双引号 1 输入 message hello world print message 输出 hello world 2 输入 message hello world print m
  • Java操作ElasticSearch相关内容

    Java连接ES 创建Maven工程 导入依赖
  • 常用遥感SIF和GPP数据集

    一 综述文章 总结一下数据和文章 害怕时间久了忘了 前两篇介绍了SIF 最后一篇介绍了光合作用 1 Remote sensing of solar induced chlorophyll fluorescence SIF in vegeta
  • 【车辆检测】基于背景差分法实现道路行驶车辆检测附matlab代码

    1 简介 该方法的基本思想是 将采集到的车辆图像的每一帧都与一个不含运动车辆的静止参考帧做差值运算 从而突出目标图像 通过分析与处理对车辆计数 其优点是算法简单 处理速度快 且差分结果能直接反应运动目标的位置 形状以及大小等 实用性较强 其
  • css flex布局 —— 容器属性 align-content

    align content 属性定义了多根轴线的对齐方式 如果项目只有一根轴线 该属性不起作用 如果只有一根轴线 align content 几乎等同于 align items 容器属性 align content 生效的条件是 必须显式的
  • 高校校园网使用的认证客户端常见故障自查- 神州数码客户端

    神州数码客户端常见故障自查 一 客户端认证成功前故障 1 接上网线后网卡灯不亮 确定自己电脑网卡带灯 注 测试期间最好是不要接交换机 直接接墙上端口 参考方案 A 更换网线 B 如确认是端口故障 则请致电网络中心报修等待人过来维修 2 如果
  • (每日一练)MATLAB生成斐波那契数和数列

    今天 我学习的内容是利用MATLAB生成斐波那契数 先来介绍一下 斐波那契数列最初是用来解决兔子问题的 问题如下 一个人把一对兔子放在一个四面被墙包围的地方 假设每对兔子每个月都生一对新兔子 不 考虑伦理问题 那么一年可以从这对兔子中生产多
  • C/C++中__builtin_popcount()的使用及原理

    这个函数功能 返回输入数据中 二进制中 1 的个数 对于不同的使用类型 可以采用采用以下函数 builtin popcount int builtin popcountl long int builtin popcountll long l
  • Python列表推导式

    列表推导式 列表推导式使用非常简洁的方式来快速生成满足特定需求的列表 代码具有非常强的可读性 语法形式为 expression for expr1 in sequence1 if condition1 for expr2 in sequen
  • nginx之头部变量x_forwarded_for

    proxy add x forwarded for变量包含客户端请求头中的 X Forwarded For 与 remote addr两部分 他们之间用逗号分开 举个例子 有一个web应用 在它之前通过了2个nginx转发 即用户访问该we
  • P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two

    题目描述 两只牛逃跑到了森林里 Farmer John 开始用他的专家技术追捕这两头牛 你的任务是模拟他们的行为 牛和 John 追击在10 10 的平面网格内进行 一个格子可以是 一个障碍物 两头牛 它们总在一起 或者 Farmer Jo
  • 如何有效使用渲染农场?防止渲染出错的7个方法!

    如何使用渲染农场 又如何有效地使用渲染农场 使用云渲染农场时出错怎么办 众所周知我们可以在任意的笔记本或者终端PC上面来创作 3ds Max 场景 但是实际渲染是这样吗 其实不然 这其中的差距不是一星半点 只能说很可能会有两种不同的呈现 而
  • HTML+CSS+JS列表式视频播放页面

    HTML CSS JS列表式视频播放页面 无插件 应该没有 效果图 html
  • 31 Qt 之绘图之绘制一个漂亮的圆及圆弧

    一 圆形 经常地 我们会在网上看到一些列的抽奖活动 里面就有圆盘抽奖 是不是有点手痒了O O 效果 void MainWindow paintEvent QPaintEvent QPainter painter this painter s
  • 三英战SQL:解析NoSQL的可靠性及扩展操作

    摘要 NoSQL的高性能 易扩展及可靠性一直深受数据工作者的喜爱 然而对比传统关系型数据库NoSQL的优势究竟又在何处 Esen Sagynov在DZone上发布了一篇文章 从运行方面分析Cassandra HBase以及MongoDB产品