Alt_Shift

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
为什么要分库分表?
MySql是存在瓶颈的,数据量就是他最大的瓶颈,如果一张表或者一个数据库里面的数据量过大都会导致一些意料之外的问题,譬如查询过慢,难以维护等问题,这时候就要想出一个完美的解决办法。
 
1.垂直分库:垂直分库就是将一个系统里面的多个表取出放到多个数据库里面达到分库操作。
 
垂直分库的原则:保证分出来的两张表之间不能存在关联查询,因为在多个数据库里面的关联查询时不成立的。主要根据的是业务来进行划分的,如果你的业务之间耦合太大是没办法进行分库的,只有火车票订票系统和卖猪肉系统才能进行划分。
 
2.水平分表:水平分表就是按照表中的字段进行区分,譬如常见的就是用ID和创建时间进行区分。
水平将表按照ID的区间进行区分。或者时间区间进行区分。拆分的结果是多张具有相同结构的表。
  • ID分区
  • 分片枚举:定义一个地区信息表,根据地区ID和地区信息进行分表,使用hash分区
  • 范围约定:约定一个范围进行分片,使用range
  • 时间分区:根据创建时间等进行时间划分。
 
水平分表的原则:需要考虑分表后的数据库压力问题,譬如分开后一个数据库的压力很大另外一个数据库毫无压力。
 
分表后的关联查询:存在关联查询的表中根据关联的外键创建一个子表,同时定义明确外键,在分表的时候同时对子表进行分表。
 
全局表:全局表的特点就是数据量小,跟所有的表都可以进行join操作,同时必不可少。一些数据库中间件可以创建全局表类型,然后在每个节点中创建一个全局表。
 
分表后的数据迁移:一般有两种方式
  • 停机维护:不对外提供服务然后复制,这种复制不会出现数据不一致的问题,因为在数据复制期间不会出现数据更改
  • 双写操作:依然对外提供服务,所有update、insert、delete操作都对两个数据库进行操作,然后所有的select操作都是按照老库进行读取。然后新起一个事务遍历老库中的数据并且进行复制,在复制过程中需要一个时间戳来进行判断老库中的数据是否新于新库中的数据,保证不会出现旧的数据覆盖新的数据这种情况。
 
在分表之后要保证全局唯一的序列:
  • 使用数据库来存储序列:每次在数据库中取出1-100个序列然后交给数据库中间件进行派发,如果派发完成就继续去数据库里面取,如果当前数据库中间件挂掉了,备用数据库中间件上岗就会重新去数据库中就行取序列。虽然前一个中间件的序列可能没有完全分发,但是以就可以保证序列的唯一性。
  • twitter的雪花算法:雪花算法采用标志位 + 时间戳 + 机器号 + 序列号
ID总长64位,第一位标志位不可用,41位的时间戳,10位的生成机器的ID,12位序列号。
 
 
 
 
 
 
 
 
 
 
 
 
 
 

posted on 2020-10-04 10:07  Alt_Shift  阅读(165)  评论(0编辑  收藏  举报