如何对数据库中的数据可以进行的CAP进行选择

2. 对分布式系统的架构和原理有比較深入的了解
5. 优秀的发现和解决问题能力良好的沟通能力,具备团队合作精神
1. 拥抱开源对前沿技术有浓厚的热情和探索欲望,有开源項目经历
2. 熟悉 Spark 内核并阅读过其中的源码

PingCAP 核心技术人员均来自一线互联网公司(豌豆荚、网易、阿里、百度、京东、金山等),已经获得數千万美金的融资受到投资圈的火热追捧。

NewSQL 年轻开放 崇尚自由 技艺高超

PingCAP 是一家开源的新型分布式数据库公司秉承开源是基础软件的未來这一理念,PingCAP 持续扩大社区影响力致力于前沿技术领域的创新实现。其研发的分布式关系型数据库 TiDB 项目具备「分布式强一致性事务、茬线弹性水平扩展、故障自恢复的高可用、跨数据中心多活」等核心 NewSQL 特性

一般 良好 优秀 极好

北京平凯星辰科技发展有限公司

  • 注册资金:2110万え美元
  • 企业类型:有限责任公司(台港澳法人独资)

北京海淀区中关村东升科技园北领地(西门)D-3号楼413

  • 沟通 在线职位及时沟通
  • 任性选 各大行业职位任你选
  • 沟通 在线职位及时沟通
  • 任性选 各大行业职位任你选
  • 沟通 在线职位及时沟通
  • 任性选 各大行业职位任你选

密码登录短信登录扫码登录

使鼡 BOSS直聘 APP 扫码登录扫码帮助

知道了Boss现在也可以使用密码和短信登录了

  • 沟通 在线职位及时沟通
  • 任性选 各大行业职位任你选
  • 招聘效果好 与职场牛囚在线开聊
  • 更多在线牛人 入职速度快
  • 人才匹配度高 获取更精准的牛人
  • 沟通 在线职位及时沟通
  • 任性选 各大行业职位任你选

请用微信“扫一扫”扫描上方二维码

注册成功,即将跳转完善流程

快速完善简历与Boss开聊

与在线Boss直接聊,最快当天拿offer

}

最近与同行科技交流经常被问箌分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章但有些观点与判断昰我觉得是偏激的,脱离环境去评价方案好坏其实有失公允版权/

  • 中间件模式SQL解析、执行计划优化等在中间件与数据库中重复工作,效率楿比较低;
  • NewSQL数据库的分布式事务相比于XA进行了优化性能更高;
  • 新架构NewSQL数据库存储设计即为基于paxos(或Raft)协议的多副本,相比于传统数据库主从模式(半同步转异步后也存在丢数问题)在实现了真正的高可用、高可靠(RTO<30s,RPO=0)
  • NewSQL数据库天生支持数据分片数据的迁移、扩容都是洎动化的,大大减轻了DBA的工作同时对应用透明,无需在SQL指定分库分表键
  • 这些大多也是NewSQL数据库产品主要宣传的点,不过这些看起来很美恏的功能是否真的如此接下来针对以上几点分别阐述下的我的理解。

    想想更早些出现的NoSQL数据库为何不支持分布式事务(最新版的mongoDB等也开始支持了)是缺乏理论与实践支撑吗?并不是原因是CAP定理依然是分布式数据库头上的颈箍咒,在保证强一致的同时必然会牺牲可用性A戓分区容忍性P为什么大部分NoSQL不提供分布式事务?

    那么NewSQL数据库突破CAP定理限制了吗并没有。NewSQL数据库的鼻主Google Spanner(目前绝大部分分布式数据库都昰按照Spanner架构设计的)提供了一致性和大于5个9的可用性宣称是一个“实际上是CA”的,其真正的含义是系统处于 CA 状态的概率非常高由于网絡分区导致的服务停用的概率非常小,究其真正原因是其打造私有全球网保证了不会出现网络中断引发的网络分区另外就是其高效的运維队伍,这也是cloud spanner的卖点。详细可见CAP提出者Eric Brewer写的《Spanner, TrueTime 和CAP理论》说明/

    推荐一篇关于分布式系统有趣的文章,站在巨人的分布式肩膀上其中提到:分布式系统中,您可以知道工作在哪里或者您可以知道工作何时完成,但您无法同时了解两者;两阶段协议本质上是反可用性协议

    兩阶段提交协议是否严格支持ACID,各种异常场景是不是都可以覆盖

    2PC在commit阶段发送异常,其实跟最大努力一阶段提交类似也会有部分可见问题严格讲一段时间内并不能保证A原子性和C一致性(待故障恢复后recovery机制可以保证最终的A和C)。完备的分布式事务支持并不是一件简单的事情需要可以应对网络以及各种硬件包括网卡、磁盘、CPU、内存、电源等各类异常,通过严格的测试之前跟某友商交流,他们甚至说目前已知的NewSQL在分布式事务支持上都是不完整的他们都有案例跑不过,圈内人士这么笃定也说明了分布式事务的支持完整程度其实是层次不齐嘚。

    但分布式事务又是这些NewSQL数据库的一个非常重要的底层机制跨资源的DML、DDL等都依赖其实现,如果这块的性能、完备性打折扣上层跨分爿SQL执行的正确性会受到很大影响。

    传统关系数据库也支持分布式事务XA但为何很少有高并发场景下用呢? 因为XA的基础两阶段提交协议存在網络开销大阻塞时间长、死锁等问题,这也导致了其实际上很少大规模用在基于传统关系数据库的OLTP系统中

    NewSQL数据库的分布式事务实现也仍然多基于两阶段提交协议,例如google percolator分布式事务模型

    解决分布式事务是否只能用两阶段提交协议?/51588)

    主从模式并不是最优的方式就算是半哃步复制,在极端情况下(半同步转异步)也存在丢数问题目前业界公认更好的方案是基于paxos分布式一致性协议或者其它类paxos如raft方式,Google Spanner、TiDB、cockcoachDB、OB都采用了这种方式基于Paxos协议的多副本存储,遵循过半写原则支持自动选主,解决了数据的高可靠缩短了failover时间,提高了可用性特別是减少了运维的工作量,这种方案技术上已经很成熟也是NewSQL数据库底层的标配。

    当然这种方式其实也可以用在传统关系数据库阿里、微信团队等也有将MySQL存储改造支持paxos多副本的,MySQL也推出了官方版MySQL Group Cluster预计不远的未来主从模式可能就成为历史了。

    分布式一致性算法本身并不难但具体在工程实践时,需要考虑很多异常并做很多优化实现一个生产级可靠成熟的一致性协议并不容易。例如实际使用时必须转化实現为multi-paxos或multi-raft需要通过batch、异步等方式减少网络、磁盘IO等开销。

    需要注意的是很多NewSQL数据库厂商宣传基于paxos或raft协议可以实现【异地多活】这个实际仩是有前提的,那就是异地之间网络延迟不能太高以银行“两地三中心”为例,异地之间多相隔数千里延时达到数十毫秒,如果要多活那便需异地副本也参与数据库日志过半确认,这样高的延时几乎没有OLTP系统可以接受的推荐/

    数据库层面做异地多活是个美好的愿景,泹距离导致的延时目前并没有好的方案之前跟蚂蚁团队交流,蚂蚁异地多活的方案是在应用层通过MQ同步双写交易信息异地DC将交易信息保存在分布式缓存中,一旦发生异地切换数据库同步中间件会告之数据延迟时间,应用从缓存中读取交易信息将这段时间内涉及到的業务对象例如用户、账户进行黑名单管理,等数据同步追上之后再将这些业务对象从黑名单中剔除由于双写的不是所有数据库操作日志洏只是交易信息,数据延迟只影响一段时间内数据这是目前我觉得比较靠谱的异地度多活方案。

    另外有些系统进行了单元化改造这在paxos選主时也要结合考虑进去,这也是目前很多NewSQL数据库欠缺的功能

    Scale横向扩展与分片机制

    paxos算法解决了高可用、高可靠问题,并没有解决Scale横向扩展的问题所以分片是必须支持的。NewSQL数据库都是天生内置分片机制的而且会根据每个分片的数据负载(磁盘使用率、写入速度等)自动识别熱点,然后进行分片的分裂、数据迁移、合并这些过程应用是无感知的,这省去了DBA的很多运维工作量以TiDB为例,它将数据切成region如果region到64M時,数据自动进行迁移

    分库分表模式下需要应用设计之初就要明确各表的拆分键、拆分方式(range、取模、一致性哈希或者自定义路由表)、路由规则、拆分库表数量、扩容方式等。相比NewSQL数据库这种模式给应用带来了很大侵入和复杂度,这对大多数系统来说也是一大挑战

    汾库分表模式也能做到在线扩容,基本思路是通过异步复制先追加数据然后设置只读完成路由切换,最后放开写操作当然这些需要中間件与数据库端配合一起才能完成。

    这里有个问题是NewSQL数据库统一的内置分片策略(例如tidb基于range)可能并不是最高效的因为与领域模型中的劃分要素并不一致,这导致的后果是很多交易会产生分布式事务举个例子,银行核心业务系统是以客户为维度也就是说客户表、该客戶的账户表、流水表在绝大部分场景下是一起写的,但如果按照各表主键range进行分片这个交易并不能在一个分片上完成,这在高频OLTP系统中會带来性能问题

    常见的单分片SQL,这两者都能很好支持NewSQL数据库由于定位与目标是一个通用的数据库,所以支持的SQL会更完整包括跨分片嘚join、聚合等复杂SQL。中间件模式多面向应用需求设计不过大部分也支持带拆分键SQL、库表遍历、单库join、聚合、排序、分页等。但对跨库的join以忣聚合支持就不够了

    NewSQL数据库一般并不支持存储过程、视图、外键等功能,而中间件模式底层就是传统关系数据库这些功能如果只是涉忣单库是比较容易支持的。

    NewSQL数据库往往选择兼容MySQL或者PostgreSQL协议所以SQL支持仅局限于这两种,中间件例如驱动模式往往只需做简单的SQL解析、计算蕗由、SQL重写所以可以支持更多种类的数据库SQL。

    SQL支持的差异主要在于分布式SQL执行计划生成器由于NewSQL数据库具有底层数据的分布、统计信息,因此可以做CBO生成的执行计划效率更高,而中间件模式下没有这些信息往往只能基于规则RBO(Rule-Based-Opimization),这也是为什么中间件模式一般并不支歭跨库join因为实现了效率也往往并不高,还不如交给应用去做

    这里也可以看出中间件+分库分表模式的架构风格体现出的是一种妥协、平衡,它是一个面向应用型的设计;而NewSQL数据库则要求更高、“大包大揽”它是一个通用底层技术软件,因此后者的复杂度、技术门槛也高佷多

    传统关系数据库的存储引擎设计都是面向磁盘的,大多都基于B+树B+树通过降低树的高度减少随机读、进而减少磁盘寻道次数,提高讀的性能但大量的随机写会导致树的分裂,从而带来随机写导致写性能下降。NewSQL的底层存储引擎则多采用LSM相比B+树LSM将对磁盘的随机写变荿顺序写,大大提高了写的性能不过LSM的的读由于需要合并数据性能比B+树差,一般来说LSM更适合应在写大于读的场景当然这只是单纯数据結构角度的对比,在数据库实际实现时还会通过SSD、缓冲、bloom filter等方式优化读写性能所以读性能基本不会下降太多。NewSQL数据由于多副本、分布式倳务等开销相比单机关系数据库SQL的响应时间并不占优,但由于集群的弹性扩展整体QPS提升还是很明显的,这也是NewSQL数据库厂商说分布式数據库更看重的是吞吐而不是单笔SQL响应时间的原因。

    分布式数据库是个新型通用底层软件准确的衡量与评价需要一个多维度的测试模型,需包括发展现状、使用情况、社区生态、监控运维、周边配套工具、功能满足度、DBA人才、SQL兼容性、性能测试、高可用测试、在线扩容、汾布式事务、隔离级别、在线DDL等等虽然NewSQL数据库发展经过了一定时间检验,但多集中在互联网以及传统企业非核心交易系统中目前还处於快速迭代、规模使用不断优化完善的阶段。

    相比而言传统关系数据库则经过了多年的发展,通过完整的评测在成熟度、功能、性能、周边生态、风险把控、相关人才积累等多方面都具有明显优势,同时对已建系统的兼容性也更好

    对于互联网公司,数据量的增长压力鉯及追求新技术的基因会更倾向于尝试NewSQL数据库不用再考虑库表拆分、应用改造、扩容、事务一致性等问题怎么看都是非常吸引人的方案。

    对于传统企业例如银行这种风险意识较高的行业来说NewSQL数据库则可能在未来一段时间内仍处于探索、审慎试点的阶段。基于中间件+分库汾表模式架构简单技术门槛更低,虽然没有NewSQL数据库功能全面但大部分场景最核心的诉求也就是拆分后SQL的正确路由,而此功能中间件模式应对还是绰绰有余的可以说在大多数OLTP场景是够用的。

    限于篇幅其它特性例如在线DDL、数据迁移、运维工具等特性就不在本文展开对比。

    如果看完以上内容您还不知道选哪种模式,那么结合以下几个问题先思考下NewSQL数据库解决的点对于自身是不是真正的痛点:

    • 强一致事務是否必须在数据库层解决?
    • 数据的增长速度是否不可预估的
    • 扩容的频率是否已超出了自身运维能力?
    • 相比响应时间更看重吞吐
    • 是否必须做到对应用完全透明?
    • 是否有熟悉NewSQL数据库的DBA团队

    如果以上有2到3个是肯定的,那么你可以考虑用NewSQL数据库了虽然前期可能需要一定的學习成本,但它是数据库的发展方向未来收益也会更高,尤其是互联网行业随着数据量的突飞猛进,分库分表带来的痛苦会与日俱增当然选择NewSQL数据库你也要做好承担一定风险的准备。

    如果你还未做出抉择不妨再想想下面几个问题:

    • 最终一致性是否可以满足实际场景?
    • 数据未来几年的总量是否可以预估
    • 扩容、DDL等操作是否有系统维护窗口?
    • 对响应时间是否比吞吐更敏感
    • 是否需要兼容已有的关系数据庫系统?
    • 是否已有传统数据库DBA人才的积累
    • 是否可容忍分库分表对应用的侵入?

    如果这些问题有多数是肯定的那还是分库分表吧。在软件领域很少有完美的解决方案NewSQL数据库也不是数据分布式架构的银弹。相比而言分库分表是一个代价更低、风险更小的方案它最大程度複用传统关系数据库生态,通过中间件也可以满足分库分表后的绝大多数功能定制化能力更强。在当前NewSQL数据库还未完全成熟的阶段分庫分表可以说是一个上限低但下限高的方案,尤其传统行业的核心系统如果你仍然打算把数据库当做一个黑盒产品来用,踏踏实实用好汾库分表会被认为是个稳妥的选择

    很多时候软件选型取决于领域特征以及架构师风格,限于笔者知识与所属行业特点所限以上仅为个囚粗浅的一些观点,欢迎讨论

}

我要回帖

更多关于 对数据库中的数据可以进行 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信