高并发系统设计 40 问
唐扬
美图公司技术专家
49013 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
高并发系统设计 40 问
15
15
1.0x
00:00/00:00
登录|注册

11 | NoSQL:在高并发场景下,数据库和NoSQL如何做到互补?

倒排索引
倒排索引
读取数据效率
SSTable
MemTable
负载均衡
Shard
Replica
Elasticsearch
LevelDB
Cassandra
Hbase
负载均衡
Shard
Replica
Elasticsearch
基于LSM树的存储引擎
CouchDB
MongoDB
Cassandra
Hbase
LevelDB
Redis
MongoDB
全文搜索功能
LSM树
随机IO vs 顺序IO
扩展性
全文搜索功能
读写性能
文档型数据库
列式存储数据库
KV存储
扩展性
场景补充
写入性能
优势
类型
与关系型数据库互补
NoSQL数据库
NoSQL数据库与关系型数据库互补

该思维导图由 AI 生成,仅供参考

你好,我是唐扬。
前几节课,我带你了解了在你的垂直电商项目中,如何将传统的关系型数据库改造成分布式存储服务,以抵抗高并发和大流量的冲击。
对于存储服务来说,我们一般会从两个方面对它做改造:
1. 提升它的读写性能,尤其是读性能,因为我们面对的多是一些读多写少的产品。比方说,你离不开的微信朋友圈、微博和淘宝,都是查询 QPS 远远大于写入 QPS。
2. 增强它在存储上的扩展能力,从而应对大数据量的存储需求。
我之前带你学习的读写分离和分库分表就是从这两方面出发,改造传统的关系型数据库的,但仍有一些问题无法解决。
比如,在微博项目中关系的数据量达到了千亿,那么即使分隔成 1024 个库表,每张表的数据量也达到了亿级别,并且关系的数据量还在以极快的速度增加,即使你分隔成再多的库表,数据量也会很快增加到瓶颈。这个问题用传统数据库很难根本解决,因为它在扩展性方面是很弱的,这时,就可以利用 NoSQL,因为它有着天生分布式的能力,能够提供优秀的读写性能,可以很好地补充传统关系型数据库的短板。那么它是如何做到的呢?
这节课,我就还是以你的垂直电商系统为例,带你掌握如何用 NoSQL 数据库和关系型数据库互补,共同承担高并发和大流量的冲击。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

在高并发场景下,数据库和NoSQL如何互补?本文深入探讨了在高并发和大流量情况下,如何充分利用NoSQL数据库与传统关系型数据库相辅相成,共同应对数据存储服务的挑战。首先介绍了NoSQL数据库的多种类型,包括KV存储、列式存储数据库和文档型数据库,并重点阐述了NoSQL数据库如何通过算法提升写入性能。文章还详细说明了NoSQL数据库在某些场景下作为传统关系型数据库的补充,如使用倒排索引实现全文搜索服务。此外,还介绍了NoSQL数据库在性能和扩展性方面的优势,以及其特殊功能特性,包括Replica、Shard和负载均衡等。总的来说,本文全面阐述了NoSQL数据库在高并发场景下与传统数据库的互补作用,为读者提供了宝贵的技术知识。文章提醒读者在选择NoSQL数据库时需要深入了解其实现原理,并具备一定的运维能力,以避免可能出现的故障和问题。最后,鼓励读者分享自己在日常工作中使用NoSQL数据库的经验,以及在选型时的考虑。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统设计 40 问》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(62)

  • 最新
  • 精选
  • Richeir
    置顶
    这一节学到了很多新东西,感谢唐老师的总结!
    2019-10-11
    4
    20
  • 无形
    之前在讲座业务重构中,用es查询数据,其他组的小伙伴维护的es,但是es性能不行,where条件里七八个字段,排序两个字段,查询es基本两千左右QPS,难以支撑支撑十几万人的直播讲座,而且直播人数增长很快,es已经成为了性能瓶颈,查询条件是类标签的,比如几年级,哪个学科,直播类型,还有时间类的,对于这些字段我是可以打标签的,还有开始时间、结束时间,根据类标签的查询特点,我使用了倒排索引+ roaring bitmap 来过滤,使用快速排序对多字段进行排序。使用类延时队列来完成时间的检索。整个检索过程在微秒级,而且对查询的结果做了缓存,查询条件相同的直接从缓存中取,避免了重复检索和排序,查询缓存会在讲座下次修改,更新倒排索引之后清空。重建查询缓存。重构完讲座的检索性能达到了几十倍的性能提升

    作者回复: 👍👍👍

    2019-11-01
    19
    70
  • yaomon
    目前的项目就是 MySql 配合 Elasticsearch 使用。Elasticsearch主要是做搜索用,写还是 MySql,同时发Kafka消息,消费端写ES。ES存在丢数据的问题,所以会定时全量/增量从 MySql 中捞数据,覆写 ES,保证数据的一直性。

    作者回复: 是的 应该是这样

    2019-10-11
    7
    40
  • Y
    老师你好 业务中有个模块写极多读少,这种情况下是不是直接把这个数据拆分出来用单独nosql存储比较好?还是先写到nosql,再慢写到mysql好? 如果慢写到mysql一是可能会出现数据不一致问题,二是写请求会积累很多,内存型nosql支撑不住,可能要用leveldb之类的,磁盘多了一份数据,等要迁移的时候又增加了运维管理成本

    作者回复: 如果是长期都是写多读少,那么可以考虑nosql 如果是瞬时峰值的话,还是用消息队列削峰填谷

    2019-10-30
    12
  • jc9090kkk
    感谢老师分享,对于文中的知识点有一些疑问,希望老师能解答下: 1.采用LSM树的nosql,跟mysql的WAL机制类似,mysql通过redo log和bin log的两阶段提交来保证数据的crash-safe,那么nosql的日志是用来做什么呢?也是为了做数据恢复的吗? 2.像Hbase这样的nosql,涉及的初衷应该是为了做统计而设计的,它支持事务吗?如果支持的话,使用场景是什么?事务的隔离级别都有哪些?因为以我的理解,统计业务,基本都是读请求,很少有写请求,用事务的场景应该极少吧? 3.因为nosql相比传统的关系型数据库来说,拓展性更好,那么就更适合做分布式系统?后期老师有想法讲一讲比如类似redis或者mongoDB这样的系统,分布式系统的一些实际经验或者说踩过什么坑么?很想了解下。。。 思考问题: 公司现在用的nosql包括Redis,ES,Kafka,ClickHouse,采用Redis是用来做cache和秒杀活动,也会有一些异步化的处理,采用Kafka+ES是一是为了采集业务端用户行为,二是ES+Kibana可以提供可视化的数据分析平台供运营部门使用,而且ES在后期的水平拓展的方案上来讲配置和维护比较简单(相比Sphinx而言),为什么采用是因为公司之前接的是第三方的数据统计平台,后期发现统计需要单独定制而且会污染业务代码不好维护,而且有时候会发现数据日志还有丢失的情况导致数据统计异常,所以采用Kafka+ES一起来支撑,从而将业务端的一些耦合较重的埋点逻辑分离出去便于维护,CLickHouse主要是为了生成一些离线的数据报表。

    作者回复: 1. LSM使用WAL也是为了恢复memtable的数据的 2. 是不涉及事务的 3. 好的呀~

    2019-10-11
    2
    9
  • Liush
    老师你好: 其实我对什么时候使用SQL,NOSQL,或者是NEWSQL一直存在很多疑问,就比如微博来说,每天微博增加的博文数量应该是非常大的,如果这部分用关系型数据库来存储是不是分库会很快达到瓶颈?这样会造成重新迁移分布数据,如果手动去迁移分布这部分数据,由于存在大量的历史数据迁移时间是否又是一个问题呢?像微博博文这部分是存储在SQL中还是NOSQL中?如果用nosql的话后续只要简单的将节点加入集群即可,auto sharding的特性会方便很多。如果按照我的理解在电商领域中,订单是核心系统,而且和订单系统关联的商品等数据,这部分使用关系型数据库分库分表的方式去处理,因为这部分系统需要保证事务,但是像商品详情这部分并不需要强事务的数据是否可以存储在NOSQL中?谢谢

    作者回复: 微博的博文是放在MySQL里面的,其实博文的数量没有关系那么夸张,而且热点明显,用户很少会翻之前的微博。 订单的数据可能和博文的数据相当,我觉得放在mysql中应该就够了

    2019-10-14
    2
    5
  • 饭团
    老师,再问个问题!如果一类数据需要在nosql和关系形数据库都存储,需要存2次吗?现实开发中这样的情况多吗?能举个例子吗?

    作者回复: 是的呀 比如你的业务数据放在mysql,索引数据放在es

    2019-10-11
    2
    5
  • 饭团
    老师,是不是这个意思: 首先不管是sql数据库还是nosql数据库,提升写性能都是靠的将随机写转化为顺序写!在这方面mysql使用WAL机制已经做的很好了!但是关系形数据库主要是在扩展性方面有缺陷!相对于除了kv型的nosql数据库,其他类型的和mysql性能都差不多! 感觉mysql主要是在扩展性上有所欠缺!

    作者回复: benchmark结果来看,nosql的写入性能要好一些

    2019-10-11
    2
    5
  • 目前REDIS/ES/MQ基本是标配,具体使用那个确实需要深入了解每个存储系统的特性和优劣势,这样才能扬长避短,深入了解需要时间和精力,不过干IT就需要一直学习。老师讲的本就是科普的,这些存储系统那个深入理解都需要花费许多的时间和精力,也有对应的专栏在。不过听听,总会有所受益的。

    作者回复: 赞👍

    2020-04-14
    4
  • 长期规划
    老师,MongoDB从4.0之后已经支持多文档事务了。之前谈到MySQL与MongoDB,都说当使用事务时,要用MySQL,但现在MySQL对MongoDB的优势已经随着MongoDB的进化而基本没有了,而MongoDB在可用性,可扩展性方面完胜MySQL,我感觉都没有使用MySQL的必要了。不知道这种看法是否正确

    作者回复: 只是如果没有大规模使用和维护mongodb的经验,还是不敢使用的。MySQL毕竟无论是在社区还是在普及度上会更好,从招人上也能看出,熟悉MySQL的DBA比熟悉MongoDB的DBA要多很多

    2019-12-22
    4
    4
收起评论
显示
设置
留言
62
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部