面试官:聊聊你对分库分表的理解?

在 MySQL 集群架构中有两种主流的集群实现,一种是读写分离,而另外一种则是数据分片。所谓的数据分片其实就是今天要聊的分库分表技术。

分库分表技术不但是日常工作中用于解决数据库中的数据量会急剧增长,解决单库单表性能瓶颈的一种方案,更是面试中的高频知识点。

阿里巴巴的《Java 开发手册》中规定:当单表的数据超过 500 万,或单表的大小超过 2GB 时,就要考虑分库分表了。那么什么是分库分表呢?

1.分库分表

首先来说,“分库分表”不是一个技术,而是两个技术实现,它分为:

  1. 分库
    1. 垂直分库
    2. 水平分库
  2. 分表
    1. 垂直分表
    2. 水平分表

1.1 垂直分库

垂直分库是按照业务将不同的表拆分到不同的数据库中。例如,在一个电商数据库中的用户表和订单表分别存放到不同的数据库中,如下图所示:

alt

1.2 水平分库

水平分库是将数据按照一定的规则(如用户 ID 取模、哈希等)分布到不同的数据库中。比如,根据用户 ID 对 10 取模,将用户数据分布到 10 个不同的数据库中,每个数据库都保存着完整的数据表结构,如下图所示:

alt

1.3 垂直分表

垂直分表是将一张表按照列的相关性拆分成多张表。例如,将一个包含大量字段的用户表,拆分为用户基本信息表和用户扩展信息表,如下图所示:

alt

1.4 水平分表

水平分表是将一张表的数据按照行进行拆分。例如按照用户 ID 的范围或者哈希值将数据拆分到不同的表中。

alt

如果搞不清楚什么是垂直分表和什么是水平分表?可以参考一下这幅图思考一下:

alt

2.技术实现

分库分表的主流实现技术有以下两种:

  1. MyCat
  2. Apache Sharding Sphere

Sharding Sphere 相比于 MyCat 来说,它的优势是:

  1. 功能更多:除了读写分离和分库分表之外,还提供了数据加密、流量质量、数据迁移等功能。
  2. 社区更活跃度和生态更好:Sharding Sphere 拥有活跃的社区和丰富的文档,生态系统较为完善,有更多的用户和开发者参与。
  3. 灵活性和扩展性:Sharding Sphere 灵活性更高,扩展性也更好,它可以方便地与其他技术集成,这方便 MyCat 支持的比较有限。

3.Sharding Sphere

Sharding Sphere 最早是当当网的内部框架,后面捐献给了 Apache,目前也是分库分表的主流技术实现方案,在 Sharding Sphere 中有两种分库分表的技术实现:

  1. Sharding Sphere JDBC:定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

alt

  1. Sharding Sphere Proxy:定位为透明化的数据库代理端,通过实现数据库二进制协议,对异构语言提供支持。 目前提供 MySQL 和 PostgreSQL 协议,透明化数据库操作,对 DBA 更加友好。

alt

它们的区别如下:

ShardingSphere-JDBCShardingSphere-Proxy
支持数据库 任意 MySQL/PostgreSQL
连接消耗数
支持语言 仅 Java 任意
性能 损耗低 损耗略高
无中心化

课后思考

Sharding Sphere JDBC 和 Sharding Sphere Proxy 使用场景分别是啥?ShardingSphere-JDBC 具体实现步骤有哪些?说说它的实现原理?

#java#
全部评论

相关推荐

11-15 20:44
中北大学 后端
自我介绍现在大三 学校让实习嘛 最早什么时候到岗  1.  讲一讲你的项目 和我们业务相契合的地方算法工程方面的- 讲了之前部署的mutualAI社区的事情 还有在strikingly的业务- ollama3 通译7b 2. 之前处理的数据都是文本数据 有处理过类似pdf这样的文件嘛之前处理的确实是文本数据 后面也用过Python的解析库 但是时间有点长 具体讲不明白了3.  Agent框架   用过魔搭社区的4. Python的后端框架都用过那几个   FastAPI Flask Django都用过5. 用没用过FastAPI的后台管理框架 和权限管理的框架?- 没有了解过 之前都是用的Django的6. 爬虫框架你用过嘛- 没用过框架 感觉他们的东西有点重- 用过requests框架 Aiohttp这样的框架 7. Nginx配置跨域 - 这个好久没做忘了8.  Docker 和 K8s用过嘛- 用过docker 没用k8s9.  MySQL优化 怎么优化Mysql- 应该是加索引  redis缓存 本地缓存 联合索引 MySQL的八股需要看一下10. 会构建 数据表嘛- 这个应该是阿里和三范式那一套 记不清楚了(好久没建表了)11. 对我们有什么疑问嘛 - ​问了具体干一些什么事情 听着好像tmd运维 后端 算法全要干 好黑奴12. 机器学习 深度学习了解多少​会一点逻辑回归 支持向量机 随机森林这样的 ​深度学习会CNN RNN这样的13. CICD了解过吗   没做过工程应用 之前 配置了一下 后面交给另一个人了 用gitlab 没有机会学习
查看13道真题和解析
点赞 评论 收藏
分享
1 14 评论
分享
牛客网
牛客企业服务