06知识点

数据库技术演进之路

  • RDBMS(单机关系型):Oracle、MySQL
  • NoSQL(分布式非关系型):MongoDB、HBase、Hive、ES
  • NewSQL(分布式关系型):Google Spanner/F1、TiDB

NewSQL具备NoSQL扩展性,有具有传统关系型数据库ACID特性的分布式关系型数据库

传统关系型数据库分表实践

分库:用户库、商品库、交易库
分表:uid%1024

MySQL Scale Out

  • 架构升级:
    • 简单主从架构->按DB拆分的架构
    • 无缓存->有缓存
  • 硬件升级:
    • 机械硬盘->SSD(SSD应用接口不用,传输速度也不同,如SAS接口、PCIE接口等)
  • 存在问题:
    • 跨数据库事务(只能通过分布式事务解决)

MySQL读写分离

  • 架构继续升级:
    • 表拆分(分表)
    • 读写分离(应用层)
  • 存在问题:
    • 读写分离应用层实现
    • 非Partition Key读写问题

MySQL Sharding

  • 架构继续升级:
    • 解决写入横向扩展(数据库容量问题)
    • 垂直拆分:分库
    • 垂直拆分:分表
    • Sharding组件:Sharding-JDBC(Sphere)github地址
  • 存在问题:
    • 业务Partition Key选择
    • 业务多维度查询
    • 数据同步(同步异步)
    • Sharding语义如果透明
    • 机器资源使用率低

MySQL DB Proxy

  • Sharding结构升级:
    • 组件->单独进程:百度DbProxy
  • 存在问题:
    • 链路过长
    • 语言限制

Sharding

引发的问题(MySQL Proxy和DB Proxy代价)

  • 应用限制
  • 业务妥协
  • 架构成本
  • 资源成本

使用NewSQL可以解决这些问题

分库

库的共享:大部分场景下读请求量远大于写请求量,但写请求重要性又高于读请求。为了避免读请求对写请求的影响,将读API和写API拆分成两个微服务,但底层共享同一个库
DB进程共享:一个MySQL里面好多库。

分表

MySQL数据量达到何时分表,与每行的数据量有关:

  • sizeof(row)小于100字节,5千万一张表
  • sizeof(row)大于等于100字节,1千万一张表

Partition Key的选择:

  • 每个表内的数据量尽量均匀
  • 业务查询需求字段
  • 数据热度分布(当按照时间月份分表的时候会导致负载不均衡)

如何解决分表好多个字段查询?
比如一个行有两个字段uid和infoid
基因法:当uid是固定的,infoid是动态的,可以将uid和infoid的低4位在生成的时候保证一直,这样就可以都分到同一个表中。
当uid和infoid都是固定的,这样只能先按照uid分表,再建一张按infoid分表的映射表。

分库分表一定要结合业务需求来设计,如果没有业务需求无法设计合理的分库分表
比如有按照时间范围的搜索需求,就不应该用MySQL来解决,应该用搜索引擎比如ES来解决。

常用的数据库中间件组合:
ORM:MyBatis 3
Sharding: Sharding-JDBC/Sphere
Merge:result merge
DataBase Connection Pool:DBCP(apache)

传统关系型数据库高可用方案

平台架构:

  • WEB
  • API
  • 管理数据库
  • 检查与故障切换
  • 数据库集群
  • 运行主机环境

主从切换:
提供虚IP,可以采用nginx、LVS等负载均衡,或者keepalive等工具。

整个高可用方案称作MHA

MySQL高可用架构之MHA

NoSQL数据库应用实践

MongoDB面向文档的NoSQL数据库
特性:

  • 可扩展
  • 高性能
  • 开源
  • C++编写
  • 面向文档
  • 支持全文索引
  • 备份和高可用
  • 自动分片
  • 丰富查询能力
  • Map/Reduce
  • GridFS存储二进制文件

MongoDB副本集(replica Set)

  • 数据多份冗余
  • 跨交换机部署
  • 更快的选举方式(参考raft分布式协议)

支持的分片方案

  • Sharding Range-based
  • Sharding Hash-based

应用场景

  • 基于位置的移动搜索应用(基于自身的地理空间索引)LBS
  • 日志分析平台(MongoDB本身自带的高性能聚合框架)
  • 存储简历、或者投递关系等相对复杂的数据结构,比如简历库
  • 存储用户数据,或者帖子信息,比如用户中心
  • 非交易相关的基本都可以用

文档设计

  • 文档设计经验:尽量不要让数据成为查询条件,统一大小写,字段尽可能小,上层做映射
  • _id选择:根据业务选,默认ID生成规则类似Snowflake,12个字节,存储空加大,有服务端开销
  • _id生成:尽量在客户端生成,减少服务端的压力
  • 减少key的字符大小,代码层可以用宏定义的方式保证可读性

Schema设计

  • 优先考虑内嵌
  • 如果要单独访问一个对象,那么他就不适合内嵌到其他对象中
  • 数组不应该无限制增长
  • 反范式设计时需要谨慎

锁机制

Mongo 2.6之前悲观锁,在内存中对数据结构修改时加锁
Mongo 3.0WT(存储引擎WiredTiger),MVCC机制,乐观锁lock-free并发控制

压缩算法

  • Snappy:原始数据每满32KB就进行压缩然后写到磁盘
  • Zlib:来的原始数据直接压缩,压缩后的数据满32KB则落盘

遇到问题

  • 大量删除数据(类似MySQL大量删除)
  • 大量数据空洞(碎片),大量的空间碎片无法使用,空洞数据也会加载到内存,导致有效负荷低
    • 删除从库,重新同步,切换成主库,具体操作步骤
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,622评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,716评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,746评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,991评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,706评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,036评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,029评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,203评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,725评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,451评论 3 361
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,677评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,161评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,857评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,266评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,606评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,407评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,643评论 2 380

推荐阅读更多精彩内容

  • 最近与同行科技交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与...
    蚊子squirrel阅读 4,224评论 2 21
  • 云计算背后的秘密:NoSQL诞生的原因和优缺点 我本来一直觉得NoSQL其实很容易理解的,我本身也已经对NoSQL...
    ItStar阅读 2,286评论 0 7
  • 为何要使用NoSQL数据库? 1.NoSQL具有灵活的数据模型,可以处理非结构化/半结构化的大数据 2.NoSQL...
    毛子阿卡西阅读 539评论 0 3
  • 欢迎关注笔者的公众号:【阿飞的博客】,首发都在这里!!! 每个优秀的程序员和架构师都应该掌握分库分表,这是我的观点...
    阿飞的博客阅读 7,724评论 9 206
  • 《V先生的超级努力同学会社群》 1、这项作业用简书写,分享链接到群里 2、没有简书账户的,赶紧去注册 3、交作业时...
    大学生充电宝阅读 236评论 0 0