【从 0 开始学架构】学习笔记 Day1数据库集群分库分表

一、分库分表

任何数据库终究多会有存储空间的限制,对于常用的 MySql ,当数据量达到千万甚至上亿,整个数据库的性能就要面临很大的压力了

解决存储压力的方法为分库分表,这样既分散访问压力,又分散存储压力

二、业务分库

1)定义

业务分库指的是按照业务模块将数据分散到不同的数据库服务器

2)问题

(1)join 操作问题

业务分库后,原本在同一个数据库中的表分散到不同数据库中,导致无法使用 SQL 的 join 查询

(2)事务问题

原本在同一个数据库中不同的表可以在同一个事务中修改,业务分库后,表分散到不同的数据库中,无法通过事务统一修改

(3)成本问题

为了实现分库,就需要多台服务器,这样成本就上去了

3)总结

基于以上出现的问题,一旦进行业务分库,这个时候,最为适合的就是采用微服务,通过远程访问

分库也需要讲求时机,是需要业务量上涨一定规模之后,才应该去做的

一般来说,单台数据库服务器能够支撑 10 万用户量量级的业务,初创业务从 0 发展到 10 万级用户

将不同业务数据分散存储到不同的数据库服务器,能够支撑百万甚至千万用户规模的业务

三、分表

1)定义

当单表的数量达到了单台服务器的数量时,就需要进行分表处理

单表数据拆分有两种方式:垂直分表和水平分表

单表进行切分后,是否要将切分后的多个表分散在不同的数据库服务器中,可以根据实际的切分效果来确定,并不强制要求单表切分为多表后一定要分散到不同数据库中

可以这里理解,现实世界的各种业务其实都是一张表之后分拆出去的,比如订单、用户、物流

2)垂直分表

垂直分表,即切分后表记录数相同但包含不同的列

垂直分表适合将表中某些不常用且占了大量空间的列拆分出去

垂直分表引入的复杂性主要体现在表操作的数量要增加

3)水平分表

水平分表,即表的列相同但包含不同的行数据

水平分表适合表行数特别大的表,当看到表的数据量达到千万级别时,可能性能瓶颈就出现了

4)复杂度

(1)路由

水平分表后,某条数据具体属于哪个切分后的子表,需要增加路由算法进行计算,这个算法会引入一定的复杂性

这很像哈希表

(2)join 操作

水平分表后,需要与其他表进行 join 操作,就得在业务代码或者中间件进行多次 join 查询

(3)count() 操作

统计总数,这是必不可少的操作,尤其是用于分页查询之中

常用处理方法:

  • count() 相加
  • 记录数表

(4)order by 操作

水平分表后,数据分散到多个子表中,排序操作无法在数据库中完成,只能由业务代码或者数据库中间件分别查询每个子表中的数据,然后汇总进行排序

四、实现方式

读写分离与分库分表,都是通过“程序代码封装”和“中间件封装”实现

读写分离实现时只要识别 SQL 操作是读操作还是写操作,通过简单的判断 SELECT、UPDATE、INSERT、DELETE 几个关键字就可以做到

分库分表的实现除了要判断操作类型外,还要判断 SQL 中具体需要操作的表、操作函数(例如 count 函数)、order by、group by 操作等,然后再根据不同的操作进行不同的处理

五、路由算法

1)范围路由

选取有序的数据列(例如,整形、时间戳等)作为路由的条件,不同分段分散到不同的数据库表中

范围路由设计的复杂点主要体现在分段大小的选取上,一般建议分段大小在 100 万至 2000 万之间,具体需要根据业务选取合适的分段大小

范围路由的一个比较隐含的缺点是分布不均匀

2)哈希路由

选取某个列(或者某几个列组合也可以)的值进行 Hash 运算,然后根据 Hash 结果分散到不同的数据库表中

Hash 路由设计的复杂点主要体现在初始表数量的选取上,用了 Hash 路由后,增加子表数量是非常麻烦的,所有数据都要重分布

Hash 路由的优缺点和范围路由基本相反,Hash 路由的优点是表分布比较均匀,缺点是扩充新的表很麻烦,所有数据都要重分布

这就是一致性哈希算法的应用

3)配置路由

配置路由就是路由表,用一张独立的表来记录路由信息

配置路由的缺点就是必须多查询一次,会影响整体性能,同时,如果路由表数据很大,也会影响性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值