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