• 支撑海量数据的数据库分库分表架构指南

  • 价格:免费
  • 状态:全书已完结
  • 在读人数:17
  • 热度:563
创建者
  • LiLanz
  • 9 粉丝 5博客
内容简介
当你的系统数据达到上亿级别时,你的数据库该如何设计?数据表该如何设计?你肯定不可能把上亿的数据都放在一张表吧?本书将介绍设计分库分表框架时应该考虑的设计要点,并给出相应的解决方案。
章节目录
  • 第一章 整体的数据切分方式
  • 1.1 数据切分的概述
  • 简单来说,数据的切分就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表。数据的切分根据其切分规则的类型,可以分为如下两种切分模式。垂直(纵向)切分:把单一的表
  • 1.2 数据的垂直切分
  • 垂直切分 一个数据库由多个表构成,每个表对应不同的业务,垂直切分是指按照业务将表进行分类,将其分布到不同的数据库上,这样就将数据分担到了不同的库上(专库专用)。案例如下: #有如下几张表 --------------+--------------+------------------ 用户信息(User)+ 交易记录(Pay)+ 商品(Commodity)| ---
  • 1.3 数据的水平切分
  • 与垂直切分对比,水平切分不是将表进行分类,而是将其按照某个字段的某种规则分散到多个库中,在每个表中包含一部分数据,所有表加起来就是全量的数据。简单来说,我们可以将对数据的水平切分理解为按照数据行进行切分,就是将表中的某些行切分到一个数据库表中,而将其他行切分到其他数据库表中。这种切分方式根据单表的数据量的规模来切分,保证单表的容量不会太大,从而保证了单表的查询等处理能力,例如将用户的信息表
  • 第二章 水平切分方式的路由过程和分片维度
  • 2.1 水平切分方式的路由过程和分片维度
  • 这里讲解水平切分的路由过程和分片维度。2.1. 水平切分的路由过程我们在设计表时需要确定对表按照什么样的规则进行分库分表。例如,当有新用户时,程序得确定将此用户的信息添加到哪个表中;同理,在登录时我们需要
  • 第三章 分片后的事务处理机制
  • 3.1 分布式事务
  • 由于我们将单表的数据切片后存储在多个数据库甚至多个数据库实例中,所以依靠数据库本身的事务机制不能满足所有场景的需要。但是,我们推荐在一个数据库实例中的操作尽可能使用本地事务来保证一致性,跨数据库实例的一系列更新操作需要根据事务路由在不同的数据源
  • 3.2 事务路由
  • 无论使用上面哪种方法实现分布式事务,都需要对分库分表的多个数据源路由事务,一般通过对Spring环境的配置,为不同的数据源配置不同的事务管理器(TransactionManager)。这样,如果更新操作在一个数据库实例内发生,便可
  • 3.2.1 自动提交事务路由
  • 自动提交事务通过依赖JDBC数据源的自动提交事务特性,对任何数据库进行更新操作后会自动提交事务,不需要开发人员手工操作事务,也不需要配置事务,实现起来很简单,但是只能满足简单的业务逻辑需求。在通常情况下,JDBC在连接创建后默认设置自动提交为true,当然,也可以在获取连接后手工修改这个属性,代码如下:connnection conn = nul
  • 3.2.2 可编程事务路由
  • 我们在应用中通常采用Spring的声明式的事务来管理数据库事务,在分库分表时,事务处理是个问题,在一个需要开启事务的方法中,需要动态地确定开启哪个数据库实例的事务,也就是说在每个开启事务的方法调用前就必须确定开启哪
  • 3.2.3 声明式事务路由
  • 在上一小节实现了可编程事务路由的小框架,这个小框架通过让开发人员在ThreadLocal中指定数据库分片并编程实现。大多数分库分表框架会实现声明式事务路由,也就是在实现的服务方法上直接声明事务的处理注解,注解包含使用哪个数据库分片的事务管理器的信息,这样,开发人员就可以专注于业务逻辑的实现,把事务处理交给框架来实现。下面是笔者在实际的线上项目中实
  • 第四章 读写分离
  • 4.1 读写分离的概述
  • 在实际应用中的绝大多数情况下读操作远大于写操作。MySQL提供了读写分离的机制,所有写操作必须对应到主库(Master),读操作可以在主库(Master)和从库(Slave)机器上进行。主库与从库的结构完全一样,一个主库可以有多个从库,甚至在从库下还可以挂从库,这种一主多从的
  • 第五章 分库分表引起的问题
  • 5.1 扩容与迁移
  • 分库分表按照某种规则将数据的集合拆分成多个子集合,数据的完整性被打破,因此在某种场景下会产生多种问题。扩容与迁移在分库分表后,如果涉及的分片已经达到了承载数据的最大值,就需要对集群进行扩容。扩容是很麻烦的,一般会成倍地扩容。
  • 5.2 分库分表维度导致的查询问题
  • 在分库分表以后,如果查询的标准是分片的主键,则可以通过分片规则再次路由并查询;但是对于其他主键的查询、范围查询、关联查询、查询结果排序等,并不是按照分库分表维度来查询的。例如,用户购买了商品,需要将交易记录保存下来,那么如果按照买家的纬度分表,则每个买
  • 5.3 分库分表引起的其它问题
  • 跨库事务难以实现要避免在一个事务中同时修改数据库db0和数据库db1中的表,因为操作起来很复杂,对效率也会有一定的影响。同组数据跨库问题要尽量把同一组数据放到同一台数据库服务器上,不但在某些场景下可以利用本地事务的强一致性,还可以使这组数据自治。以电商为例,我们的应用有两个数据库db0和db1,分库分表后,按照id维度,将卖家A的交易信息存放到db0中。当数
读者评论
最近这些人在读这本书