一、前言
现在聊起一些事的时候,都会说起一些好像大厂 使用到到东西,那么我们先搞明白两个问题。

1、什么是分库分表?
不从技术角度说、从字面上理解:

  • 分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。
  • 分表:从单张表拆分成多张表的过程,将数据散落在多张表内。

2、为什么要分库分表
主要问题:提升性能、增加可用性

从性能上来说
以往以前一些市面上的项目都是单表在跑的,等业务增加的时候数据量越来越大、数据库的查询QPS越来越高,相应的,对于数据的读写所需要的时间越来越多。数据库的读写性能可能会成为业务发展的瓶颈。对应的,就需要做数据库性能方面的优化。我们暂时先说数据库层面优化,具体缓存优化手段,下一篇文章在写。
从单表来说超过本来数据库的承受范围,一般都是创建索引优化等纯数据库成面的老方法优化手段。换个思考来解决这问题,从数据库生产源头、数据库处理源头来解决问题,既然数量很大,就开始分表,把数据按照一定的规则拆分成多张表,来解决但表换下无法解决的存取性能问题。

从可用性上看
单个数据库如果不小心被那位猪队友停了,或者删了,那么所有数据就没了。现在好多公司都放在云上其实也是挺危险的。
谈谈几种方案

  • 单库部署情况下,如果数据库宕机,那么故障影响就是100%,而且恢复可能耗时很长。
  • 如果我们拆分成2个库,分别部署在不同的机器上,此时其中1个库宕机,那么故障影响就是50%,还有50%的数据可以继续服务。
  • 如果我们拆分成4个库,分别部署在不同的机器上,此时其中1个库宕机,那么故障影响就是25%,还有75%的数据可以继续服务,恢复耗时也会很短。
    问题来了:不能无限制的拆库,这样牺牲存储资源来提升性能,可用性的方式,毕竟资源总有限的。

如何分库分表
1、分库?分表?还是即分库又分表
切分方案 | 解决的问题
只分库不分表 | 数据库读/写QPS过高,数据库连接数不足
只分表不分库 | 但表数据量过大、存储性能遇到瓶颈
即分库又分表 | 连接数不足 + 数据量过大引起的储存性能瓶颈

拆分方式
水平拆分:每个表结构都一样
垂直拆分:一个多字段的表拆分成多个表

分库分表解决方案
shardingsphere.apache.org
www.mycat.org.cn

spring.shardingsphere.datasource.names=primary-ds,replica-ds-0

spring.shardingsphere.datasource.common.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.common.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.common.username=root
spring.shardingsphere.datasource.common.password=5f555ee

spring.shardingsphere.datasource.primary-ds.jdbc-url=jdbc:mysql://localhost:3307/ds0?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.replica-ds-0.jdbc-url=jdbc:mysql://localhost:3308/ds0?serverTimezone=UTC&useSSL=false


spring.shardingsphere.rules.replica-query.data-sources.ds0.primary-data-source-name=primary-ds
spring.shardingsphere.rules.replica-query.data-sources.ds0.replica-data-source-names=replica-ds-0
spring.shardingsphere.rules.replica-query.data-sources.ds0.load-balancer-name=round-robin

# 负载均衡算法配置
spring.shardingsphere.rules.replica-query.load-balancers.round-robin.type=ROUND_ROBIN
spring.shardingsphere.rules.replica-query.load-balancers.round-robin.props.default=0

spring.shardingsphere.props.sql-show=true

# 配置 t_order 表规则
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=ds0.t_order_$->{0..1}

# 配置分表策略
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-column=order_id
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-algorithm-name=table-inline

# 配置 分片算法
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.type=INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.props.algorithm-expression=t_order_$->{order_id % 2}

# 分布式序列策略配置
spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.column=order_id
spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.key-generator-name=snowflake

# 分布式序列算法配置
spring.shardingsphere.rules.sharding.key-generators.snowflake.type=SNOWFLAKE
spring.shardingsphere.rules.sharding.key-generators.snowflake.props.worker-id=123

pom.xml 文件

     <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
        <version>5.0.0-alpha</version>
    </dependency>

标签: none

添加新评论