内容简介:典型数据库架构设计与实践 | 架构师之路
本文,将介绍数据库架构设计中的一些 基本概念 , 常见问题 以及对应 解决方案 ,为了便于读者理解,将以“用户中心”数据库为例,讲解数据库架构设计的常见玩法。
一、用户中心
用户中心 是一个常见业务,主要提供用户注册、登录、信息查询与修改的服务,其核心元数据为:
User(uid, uname, passwd, sex, age,nickname, …)
其中:
-
uid 为用户 ID ,主键
-
uname, passwd, sex, age, nickname, … 等为用户的属性
数据库设计上,一般来说在业务初期,单库单表就能够搞定这个需求。
二、图示说明
为了方便大家理解,后文图片说明较多,其中:
-
“灰色”方框,表示 service ,服务
-
“紫色”圆框,标识 master ,主库
-
“粉色”圆框,表示 slave ,从库
三、单库架构
最常见的架构设计如上:
-
user-service :用户中心服务,对调用者提供友好的 RPC 接口
-
user-db :一个库进行数据存储
四、分组架构
什么是分组?
答 :分组架构是最常见的 一主多从,主从同步,读写分离 数据库架构:
-
user-service :依旧是用户中心服务
-
user-db-M(master) :主库,提供数据库写服务
-
user-db-S(slave) :从库,提供数据库读服务
主和从构成的数据库集群称为“组” 。
分组有什么特点?
答 :同一个组里的数据库集群:
-
主从之间通过 binlog 进行数据同步
-
多个实例数据库结构完全相同
-
多个实例存储的数据也完全相同,本质上是将数据进行复制
分组架构究竟解决什么问题?
答 : 大部分互联网业务读多写少 , 数据库的读往往最先成为性能瓶颈 ,如果希望:
-
线性提升数据库读性能
-
通过消除读写锁冲突提升数据库写性能
-
通过冗余从库实现数据的“读高可用”
此时可以使用分组架构,需要注意的是, 分组架构中,数据库的主库依然是写单点 。
一句话总结, 分组解决的是“数据库读写高并发量高”问题 ,所实施的架构设计。
五、分片架构
什么是分片?
答 :分片架构是大伙常说的 水平切分 (sharding) 数据库架构:
-
user-service :依旧是用户中心服务
-
user-db1 :水平切分成 2 份中的第一份
-
user-db2 :水平切分成 2 份中的第二份
分片后,多个数据库实例也会构成一个数据库集群。
水平切分,到底是分库还是分表?
答 : 强烈建议分库 ,而不是分表,因为:
-
分表依然公用一个数据库文件,仍然有磁盘 IO 的竞争
-
分库能够很容易的将数据迁移到不同数据库实例,甚至数据库机器上,扩展性更好
水平切分,用什么算法?
答 :常见的水平切分算法有 “范围法”和“哈希法” :
范围法 如上图:以用户中心的业务主键 uid 为划分依据,将数据水平切分到两个数据库实例上去:
-
user-db1 :存储 0 到 1 千万的 uid 数据
-
user-db2 :存储 0 到 2 千万的 uid 数据
哈希法 如上图:也是以用户中心的业务主键 uid 为划分依据,将数据水平切分到两个数据库实例上去:
-
user-db1 :存储 uid 取模得 1 的 uid 数据
-
user-db2 :存储 uid 取模得 0 的 uid 数据
这两种方法在互联网都有使用,其中 哈希法使用较为广泛 。
分片有什么特点?
答 :同一个分片里的数据库集群:
-
多个实例之间本身不直接产生联系,不像主从间有 binlog 同步
-
多个实例数据库结构,也完全相同
-
多个实例存储的数据之间没有交集,所有实例间数据并集构成全局数据
分片架构究竟解决什么问题?
答 :大部分互联网业务数据量很大, 单库容量容易成为瓶颈 ,此时通过分片可以:
-
线性提升数据库写性能,需要注意的是,分组架构是不能线性提升数据库写性能的
-
降低单库数据容量
一句话总结, 分片解决的是“数据库数据量大”问题 ,所实施的架构设计。
六、分组 + 分片架构
如果业务 读写并发量很高,数据量也很大 ,通常需要实施 分组 + 分片 的数据库架构:
-
通过分片来降低单库的数据量,线性提升数据库的写性能
-
通过分组来线性提升数据库的读性能,保证读库的高可用
七、垂直切分
除了水平切分,垂直切分也是一类常见的数据库架构设计, 垂直切分一般和业务结合比较紧密 。
还是以用户中心为例,可以这么进行垂直切分:
User(uid, uname, passwd, sex, age, …)
User_EX(uid, intro, sign, …)
-
垂直切分开的表,主键都是 uid
-
登录名,密码,性别,年龄等属性放在一个垂直表(库)里
-
自我介绍,个人签名等属性放在另一个垂直表(库)里
如何进行垂直切分?
答 :根据业务对数据进行垂直切分时,一般要考虑属性的 “长度”和“访问频度” 两个因素:
-
长度较短,访问频率较高的放在一起
-
长度较长,访问频度较低的放在一起
这是因为,数据库会以行 (row) 为单位,将数 load 到内存 (buffer) 里,在内存容量有限的情况下,长度短且访问频度高的属性,内存能够 load 更多的数据,命中率会更高,磁盘 IO 会减少,数据库的性能会提升。
垂直切分有什么特点?
答 :垂直切分和水平切有相似的地方,又不太相同:
-
多个实例之间也不直接产生联系,即没有 binlog 同步
-
多个实例数据库结构,都不一样
-
多个实例存储的数据之间至少有一列交集,一般来说是业务主键,所有实例间数据并集构成全局数据
垂直切分解决什么问题?
答 :垂直切分即可以 降低单库的数据量 ,还可以 降低磁盘 IO 从而提升吞吐量 ,但它与业务结合比较紧密,并不是所有业务都能够进行垂直切分的。
八、总结
文章较长,希望至少记住这么几点:
-
业务初期用 单库
-
读压力大,读高可用,用 分组
-
数据量大,写线性扩容,用 分片
-
属性短,访问频度高的属性, 垂直拆分 到一起
希望大伙有收获。
==
以上所述就是小编给大家介绍的《典型数据库架构设计与实践 | 架构师之路》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- zookeeper典型应用场景解析
- 单例模式及典型应用
- Java XXE 漏洞典型场景浅析
- 利用jstack定位典型性能问题实例
- [译] Elasticsearch Top 5 典型应用场景
- 设计模式 | 享元模式及典型应用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python the Hard Way
Zed Shaw / Example Product Manufacturer / 2011
This is a very beginner book for people who want to learn to code. If you can already code then the book will probably drive you insane. It's intended for people who have no coding chops to build up t......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!