百度实习笔记——数据库的分库分表,读写分离

原创 2017年01月03日 15:45:30

百度实习笔记——数据库的分库分表,读写分离

从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。

数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。所以我们要分库分表!!!

分库分表有垂直切分和水平切分两种

  • 何谓垂直切分,即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。
  • 何谓水平切分,当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表,和不同的库上。例如,我们的userDB中的用户数据表中,每一个表的数据量都很大,就可以把userDB切分为结构相同的多个userDB:part0DB、part1DB等,再将userDB上的用户数据表userTable,切分为很多userTable:userTable0、userTable1等,然后将这些表按照一定的规则存储到多个userDB上。
  • 应该使用哪一种方式来实施数据库分库分表,这要看数据库中数据量的瓶颈所在,并综合项目的业务类型进行考虑。
    如果数据库是因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、低耦合,那么规则简单明了、容易实施的垂直切分必是首选。

而如果数据库中的表并不多,但单表的数据量很大、或数据热度很高,这种情况之下就应该选择水平切分,水平切分比垂直切分要复杂一些,它将原本逻辑上属于一体的数据进行了物理分割,除了在分割时要对分割的粒度做好评估,考虑数据平均和负载平均,后期也将对项目人员及应用程序产生额外的数据管理负担。
在现实项目中,往往是这两种情况兼而有之,这就需要做出权衡,甚至既需要垂直切分,又需要水平切分。我们的游戏项目便综合使用了垂直与水平切分,我们首先对数据库进行垂直切分,然后,再针对一部分表,通常是用户数据表,进行水平切分。

分库分表存在的问题

  1. 事务问题
    在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。
  2. 跨库跨表的join问题
    在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联操作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。
  3. 额外的数据管理负担和数据运算压力。 额外的数据管理负担,最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算,例如,对于一个记录用户成绩的用户数据表userTable,业务要求查出成绩最好的100位,在进行分表之前,只需一个order by语句就可以搞定,但是在进行分表之后,将需要n个order by语句,分别查出每一个分表的前100名用户数据,然后再对这些数据进行合并计算,才能得出结果。

数据库的读写分离

随着网站业务的不断扩展,数据不断增加,数据库的鸭梨越来越大,单个数据库已经顶不住了。所以机智的程序员们想到了一些方法,比如前面提到的分库分表,比如下面要说的读写分离。读写分离顾名思义就是把读和写操作分配到不同的数据库服务器上,这样可以减轻压力。主库负责进行写操作,从库进行读操作,其实一般情况下压力主要在读上,因为太多人用百度搜东西啦,这时候就会用到前面提到的分库分表把茫茫多的读操作分给多个数据库搞定。
而读写分离,最重要的就是保持数据库的完整性,如果你对主库进行了写操作,那么就一定要同步到从库中去。至于这个主从同步的技术,那就是八仙过海各显神通了,有oracle的流复制,有Quest SharePlex,有MySQL的二进制日志来记录修改过的增量信息,也有在滴滴实习的时候了解过的binlog。

就像是这个分库分表,你以前想得到全年级前100名的学生的成绩,只需要一个order by就好了,美滋滋。现在如果分库分表了,会根据分库分表的不同规则,你想得到全年级前100的学生可就不是简单的order by了,这也是为什么这么多面试官喜欢问一些类似的算法问题。

PS:机智的人们都是用shell脚本来连接数据库的,这样就不用自己算半天“哎我是应该访问哪个IP呢”,也不用写冗长的数据库连接命令“mysql -h xxx.xxx.xxx.xxx -P xxxx -u XXX -p -A -q password:xxxxx”

PPS:在进行数据库的一些修改的时候,一定要周知内外部所有关联模块以及评估相关影响。最好是写个文档清晰的表现出数据上下游之间的关系。

数据库读写分离和垂直分库、水平分表

随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,我们可以采用读写分离的策略来改变现状。读写分离现在被大量应用于很多大型网站,这个技...
  • lzf4712
  • lzf4712
  • 2015年08月19日 14:34
  • 21142

MySQL分表分库&读写分离相关

MySQL架构优化 1.分表 当项目上线后,数据将会几何级的增长,当数据很多的时候,读取性能将会下降,更新表数据的时候也需要更新索引,所以我们需要分表,当数据量再大的时候就需要分库了。 a.水平...
  • wkyworkuno
  • wkyworkuno
  • 2017年02月19日 16:16
  • 1053

数据库分表、分库及读写分离的基本概念

最近因为项目原因一直在研究分表、分库和读写分离。本来打算直接使用一款开源产品,但作者只开源了一部分,无奈只好自己动手丰衣足食了。 分库、分表常用策略: 1.平均进行分配。 2.按照权重进行分配且均...
  • yingfeng2oo8
  • yingfeng2oo8
  • 2016年01月21日 14:52
  • 1154

数据库水平切分的实现原理—分库、分表、读写分离、负载均衡、主从复制

水平切分数据库的目的 其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题  通过一系列的切分规则将数据水平分布到不同的DB或table中,在通过相应的DB路由或者tabl...
  • qq_36414165
  • qq_36414165
  • 2017年09月30日 10:17
  • 127

实战mycat读写分离和分库分表(2)-本地mysql主从配置

接上一篇实战mycat读写分离和分库分表(1)-本地mysql多实例搭建 上一篇已经跑起了4个mysql实例,本篇的目的是配置mysql一主多从同步,mysql-m1为主,mysql-s1、mysql...
  • liwei2633
  • liwei2633
  • 2017年05月21日 23:18
  • 636

Mycat 读写分离+分库分表

上次进过GTID复制的学习记录,已经搭建好了主从复制的服务器,现在利用现有的主从复制环境,加上正在研究的Mycat,实现了主流分布式数据库的测试 Mycat就不用多介绍了,可以实现很...
  • benluobobo
  • benluobobo
  • 2016年04月08日 21:06
  • 20472

有关Mysql分库分表,读写分离数据库水平拆分

web服务器一般都是一个服务器连接一个数据库的架构,可是随着系统的使用,该架构已经不能满足需求了,这里使用的是c3p0的数据库水平扩容。Spring核心配置: ...
  • qqqqq210
  • qqqqq210
  • 2016年05月09日 22:21
  • 2457

百度2016实习生面经(三面)

五一在外面玩的时候收到百度发来的下周六上午10点面试的通知,那是一个兴奋啊。唉,导致了五一玩的那叫一个纠结呀。一边玩一边想着面试的事,真叫痛并快乐着。嘿嘿。终于体会到了心在曹营身在汉的感觉。五一过后,...
  • hacker00011000
  • hacker00011000
  • 2016年06月01日 22:32
  • 3032

mycat+mysql集群:实现读写分离,分库分表

mycat+mysql集群:实现读写分离,分库分表
  • crj_9527
  • crj_9527
  • 2015年12月23日 14:22
  • 4498

为什么数据库读写分离可以提高性能

虽然知道处理大数据量时,数据库要做读写分离,但是为什么读写分离可以提高性能呢? 下面是搜来的一些解释,看看再说! 一 什么是读写分离        MySQL Proxy最强大的一项功能是...
  • samjustin1
  • samjustin1
  • 2016年09月23日 16:55
  • 7517
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:百度实习笔记——数据库的分库分表,读写分离
举报原因:
原因补充:

(最多只允许输入30个字)