数据库初探 | 青训营笔记

47 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

今天学习了数据库相关知识以及在高并发场景下相关注意事项

数据库相关总结

存储系统简介

  • 存储系统: 一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统

  • 存储系统特点:

    • 作为后端软件的底座,性能敏感
    • 存储系统软件架构,容易受硬件影响
    • 存储系统代码,既“简单”又“复杂

image-20230212105852314

image-20230212110024411

image-20230212110706567

  • 数据库和存储系统不同,数据库分为关系型数据库和非关系型数据库

  • 关系型数据库和非关系型数据库区别:

    • 关系型数据库特点:结构化数据友好,支持事务 (ACID),支持复杂查询语言
    • 非关系型数据库:半结构化数据友好,可能支持事务 (ACID),可能支持复杂查询语言

主流数据库简介

单机存储产品

  • 单机文件系统

image-20230212111834771

  • 单机key-value存储

image-20230212112136198

分布式存储产品:相比于单机存储实现分布式协议,涉及大量网络交互

  • HDFS

image-20230212115001626

  • Ceph

image-20230212115022716

单机数据库产品

  • 关系型数据库 —— PG、MySQL

image-20230212115110854

  • 非关系型数据库 —— ES、MongoDB、Redis

image-20230212115138402

image-20230212130213880

  • Elasticsearch使用案例

image-20230212130659425

分布式数据库产品

  • 问题与挑战

    • 容量,弹性,性价比问题
  • 解决方案

image-20230212151811471

image-20230212151836813

image-20230212151856492

数据库技术演进

  • 数据库未来的发展

    • 数据库的并发写,从磁盘弹性到内存弹性,分布式事物优化
  • 新技术演进

image-20230212152324544

image-20230212152335936

image-20230212152344959

  • 总结思考题

    • 写入存储系统的粒度太大,会不会导致数据原子性问题?例如一次性写100MB,如果系统突然crash,会不会只有一部分数据持久化了,另一部分丢失了?如果要解决原子性问题,一般会设计什么机制?
    • 在从应用程序到存储介质的链路上,无论读还是写,数据可能要被拷贝好几次,这几次拷贝能不能去掉?如果我们去掉大部分拷贝操作,会有什么副作用,要怎么缓解副作用?
    • 一个关系型数据库大概率是会被并发访问的,如果要保证并发安全,除了在行数据上加悲观锁还有其他方式吗?
    • 在数据库领域,把数据按行存和按列存各有好处,你能从性能优先的角度设计出一种混合存储格式吗?

高并发场景的注意事项

  • 使用静态页面减少并发

    • 只在请求秒杀的时候才获取请求,减少请求量
    • 使用CDN,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
  • 秒杀按钮限制

    • 静态页面中的动态按钮:当秒杀开始的时候系统会生成一个新的js文件,此时标志为true,并且随机参数生成一个新值,然后同步给CDN。由于有了这个随机参数,CDN不会缓存数据,每次都能从CDN中获取最新的js代码。
  • 使用集群部署Redis等高效中间件

    • 秒杀场景读多写少
  • 缓存相关问题

    • 缓存击穿:预热,避免穿透
    • 缓存穿透:使用布隆过滤器来快速得知是否存在数据(更新频率高的数据不适合)
  • 超卖问题

    • 使用Redis+lua实现
  • 分布式锁

    • 使用Redis实现分布式锁
  • 消息队列异步处理

    • 使用消息队列将秒杀过程和付款等流程解耦
  • 限流策略

    • 同一用户,ip限流
    • 提高门槛:验证码,身份认证等