十五、分库分表

7 阅读5分钟

在面试中,关于分库分表的问题通常会涉及以下几个方面:

为什么要分库分表

这个问题旨在了解应聘者对分库分表原因的理解。分库分表的主要目的是解决单库或单表数据量过大、查询性能下降、系统扩展性受限等问题,特别是在高并发和大数据量的场景下。

分库分表是为了解决数据库在大数据量、大并发场景下的性能问题,以及数据库管理的难度问题。主要解决如下几个问题:

(1)单表数据量过大,导致单表查询效率低下、删除和更新操作影响整个系统的性能。

(2)单表并发读写请求过多,导致数据库负载过高,影响整个系统的性能。

(3)数据库管理复杂,难以维护和管理。

(4)通过分库分表,将数据分散到多个数据库和多个表中,可以减轻单个数据库和单个表的压力,从而提高数据库的性能和稳定性。

使用过哪些分库分表中间件?

考察应聘者在实际项目中应用过的技术和经验。常见的分库分表中间件包括ShardingSphere、MyCAT、OceanBase等,了解这些工具的优缺点有助于更好地应对实际工作中的挑战。

不同的分库分表中间件都有什么优点和缺点?

这个问题要求应聘者分析不同中间件的优势和不足,以及在特定场景下如何选择合适的工具。例如,某些中间件可能更适合读多写少的场景,而另一些则更适合读写均衡或写操作较多的场景。

如何进行垂直拆分或水平拆分?

垂直拆分是根据列进行拆分,将不同的表按照功能拆分成多个表,每个表只包含部分列。水平拆分则是根据行进行拆分,将数据按照某种规则分配到不同的表中。应聘者需要了解这两种拆分的适用场景和实施方法。

分库分表的规则是什么?

这包括了解如何确定数据的分配规则,如取模算法、范围限定算法等。应聘者需要能够解释这些规则的工作原理以及它们如何影响系统的性能和可扩展性。

什么时候应该进行分库分表?

了解何时是进行分库分表的最佳时机。例如,当单表数据量过大、查询性能下降、系统扩展性受限时,考虑进行分库分表。此外,了解行业最佳实践和公司的具体规定也是必要的。

/

如果要实现从未分库分表动态切换到分库分表的话,可以考虑以下几个步骤

(1)数据迁移:首先需要将未分库分表的数据进行迁移,把数据存储到合适的库和表中。

(2)业务代码改造:接着要修改业务代码,使其能够支持分库分表的场景。这里可以使用数据源动态切换、数据路由、动态 SQL 等技术。

(3)配置文件变更:接下来要修改配置文件,使其能够读取分库分表的信息。

(4)灰度发布:最后进行灰度发布,把新的代码和配置文件逐步推广到生产环境中,并通过监控工具对系统的性能进行监控。

下面是一个通用的设计方案:

(1)数据分片:首先要确定分表的策略,根据业务特点和数据特征进行数据分片,将数据存储到不同的数据库或表中。

(2)增加数据访问层:增加一层数据访问层,将数据读写请求转发给对应的数据库或表,并隐藏了数据分片细节。

(3)数据迁移:如果是从未分库分表到分库分表的过渡,需要将原有的数据进行迁移,将数据按照分片策略分别存储到不同的数据库或表中。

(4)完善数据一致性:在分库分表的情况下,要保证数据的一致性和完整性,可以通过数据同步和数据备份等方式来确保数据的完整性。

如果你要设计一个可以动态扩容缩容的分库分表方案,可以考虑以下几个方面

(1)数据分片:使用哈希算法或者其他算法进行数据分片,把大量的数据分成多个小量的数据。

(2)动态调整:提供一种机制,允许在不影响正常业务的前提下动态调整数据分片的数量,比如通过动态调整数据分片的算法参数,动态调整数据分片的数量。

(3)动态添加删除数据库:提供一种机制,允许在不影响正常业务的前提下动态添加或者删除数据库,比如通过动态添加或者删除数据库服务器,动态调整数据分片的方案。

(4)数据迁移:提供一种机制,允许在不影响正常业务的前提下进行数据迁移,比如通过分布式事务实现数据迁移,保证数据的完整性和一致性。

通常在分库分表后,主键处理方式可能有所改变。这与数据库的具体类型和需求有关,但是通常的方法有两种:

(1)全局唯一主键:在整个数据库集群中使用全局唯一主键,这些主键可以通过分配器(比如snowflake)生成。这种方法可以保证主键在整个数据库集群中是唯一的,并且可以轻松支持分库分表。

(2)局部唯一主键:在每个数据库或者分片中使用局部唯一主键。在这种情况下,主键在单个数据库或者分片内部是唯一的,但是不能保证整个数据库集群中的唯一性。2