当前位置: 首页 > 科技观察

典型数据库架构设计与实践_0

时间:2023-03-13 18:11:13 科技观察

为了方便读者理解,本文将以“以用户为中心”的数据库为例,讲解数据库架构设计的常用方法。1、用户中心用户中心是一项普通业务,主要提供用户注册、登录、信息查询和修改等服务。它的核心元数据是:User(uid,uname,passwd,sex,age,nickname,...)其中:uid为用户ID,设计了主键uname,passwd,sex,age,nickname,...等用于用户的属性数据库设计。一般来说,在业务初期,单库单表就可以应付这种需求。2.图解为了方便大家理解,在后文中有较多的图解,其中:“灰色”框表示服务,服务“紫色”圆框表示主库,主库“粉色”圆框表示从库,从库3、单体数据库架构最常见的架构设计如上:user-service:以用户为中心的服务,为调用者提供友好的RPC接口user-db:数据存储的库4、分组架构什么是分组?答:分组架构就是最常见的一主多从,主从同步,读写分离数据库架构:user-service:还是以用户为中心的服务user-db-M(master):主库、提供数据库写服务user-db-S(slave):从数据库来说,master和slave组成的提供数据库读服务的数据库集群称为一个“组”。分组有什么特点?答:同组数据库集群:通过binlog实现主从数据同步多实例数据库结构相同多个实例存储的数据也相同,本质上是一种数据复制分组架构,解决什么问题?答:大部分互联网业务读多写少,数据库读往往成为性能瓶颈。如果你想:线性提升数据库读性能通过消除读写锁冲突提升数据库写性能通过冗余从库实现数据的“读高可用”,此时可以使用分组架构。需要注意的是,在分组架构中,数据库的主库仍然是单写点。一句话,分组解决了“数据库高读写高并发”的问题,实现的架构设计。5.分片架构什么是分片?答:sharding架构就是大家常说的水平分片(sharding)数据库架构:user-service:仍然是一个以用户为中心的服务user-db1:水平分成2部分***Auser-db2:水平拆分成之后第二个分片,多个数据库实例也会组成一个数据库集群。横向分片,是分库还是分表?答:强烈建议分库而不是分表,因为:分表仍然共享一个数据库文件,分库仍然存在磁盘IO竞争,可以很容易地将数据迁移到不同的数据库实例,甚至在数据库机器上,具有更好的可扩展性。水平分片。使用什么算法?答:常见的水平分片算法有“范围法”和“哈希法”:范围法如上图所示:以用户为中心,以业务主键uid作为划分依据,将数据水平划分为两个数据库实例:user-db1:存储0到1000万的uid数据user-db2:存储0到2000万的uid数据:同样是根据用户中心的业务主键uid,将数据横向划分为两个数据库实例:user-db1:存放uid取模1的uid数据user-db2:存放uid取模0的uid数据互联网上都使用这两种数据方式,其中hashing用的比较多。分片有什么特点?答:同一个分片的数据库集群:多个实例之间没有直接关联,不像主从之间的binlog来同步多个实例的数据库结构,也完全一样多个实例的存储有数据之间没有交集。全局数据分片架构通过合并所有实例之间的数据来解决什么问题?答:大多数互联网服务的数据量都很大,单个数据库的容量很可能成为瓶颈。此时分片可以:线性提升对于数据库写入性能,需要注意的是,分组架构并不能线性提升数据库写入性能,降低单个数据库的数据容量。总之,分片解决了“数据库数据量大”的问题,以及实现的架构设计。6.分组+分片架构如果业务读写并发度高,数据量也大,通常需要实现分组+分片的数据库架构:通过分片减少单个数据库的数据量,并线性提升数据库的写性能通过分组线性提升数据库的读性能,保证读数据库的高可用。7.垂直切分除了水平切分,垂直切分也是一种常见的数据库架构设计。垂直细分通常与业务紧密结合。还是以用户中心为例,可以这样进行垂直切分:User(uid,uname,passwd,sex,age,…)User_EX(uid,intro,sign,…)垂直切分表,主键为uidloginname,Password,gender,age等属性放在一个竖表(库)里介绍自己,个人签名等属性放在另一个竖表(库)里。如何进行垂直分割?答:按业务垂直切分数据一般要考虑两个因素:属性的“长度”和“访问频率”:长度越短,访问频率高的长度越长,访问频率较低的放在一起。这是因为数据库数会以行为单位加载到内存(缓冲区)中。在内存容量有限的情况下,长度短、访问频率高的属性可以将更多的数据加载到内存中,效率会提高。越高,磁盘IO会减少,数据库的性能会提高。垂直分片有什么特点?答:Verticalsharding和horizo??ntalsharding有相似之处,但不相同:多个实例没有直接关联,即没有binlog来同步多个实例的数据库结构,它们不相同。每个实例存储的数据之间至少存在一列交集,一般来说就是业务主键。将实例间的所有数据组合起来形成全局数据,垂直切分解决什么问题?答:垂直切分可以减少单个数据库的数据量,也可以减少磁盘IO提高吞吐量,但它与业务紧密结合,并不是所有的业务都可以垂直切分。8.总结文章较长,希望至少记住以下几点:业务初期,使用单一数据库读取压力大,读取高可用,使用大量组数据,写入线性扩容,使用短分片属性,访问频率高的属性,垂直拆分在一起【本文为专栏作家“58神剑”原创稿件,转载请联系原作者】点此查看更多此文好文作者