---
title: 面试题
taxonomy:
    category: docs
---

#### No.27：查询请求增加时，如何做数据库的主从分离？

主从分离是一种常见的数据库复制技术，它可以将主数据库的更新操作同步到一个或多个从数据库，以保持数据的一致性并提升系统总容量。下面是实现主从分离的步骤：

1. 配置主数据库：在主数据库上开启二进制日志（binlog），并配置一个唯一标识符（server-id）。
2. 配置从数据库：在从数据库上配置一个唯一标识符（server-id），并指定主数据库的地址、用户名和密码。
3. 启动主数据库：确保主数据库正在运行，并记录当前的位置信息（binlog position）。
4. 启动从数据库：根据配置连接到主数据库，并开始复制主数据库的 binlog。
5. 初始化从数据库：如果是第一次启动从数据库，可能需要执行初始化操作，如通过全量备份从主数据库恢复数据。
6. 执行增量复制：从数据库会按照主数据库的 binlog 顺序执行增量复制，在主数据库进行修改操作时，从数据库将同步执行相同的操作以保持一致性。增量复制会自动进行，无需手动干预。

需要注意的是，主从分离只是实现了数据的复制，使用主从数据库集群需要对应用进行改造，要么就需要和查询请求的负载均衡配合才能发挥最大的价值。

#### No.28：数据库中间件的基本原理是什么？

数据库中间件通过在应用程序与数据库间添加一层代理，提供多种功能以提高数据库性能、可用性和可扩展性。其基本原理包括：

1. 连接池管理：维护连接池以更高效地管理数据库连接。
2. 负载均衡和路由：根据策略将请求分发到多个数据库实例，实现读写分离。
3. 缓存管理：将热门数据保存在内存中以提高读取速度，降低数据库压力。
4. 数据分片和分区：将大规模数据分片或分区存储于不同节点，提高扩展性和并发处理能力。
5. 高可用和容错：监控数据库状态，自动切换到备用节点以保证系统可用性。

#### No.29：分布式事务如何设计？有哪些关键点？

分布式事务设计需要考虑的关键点：

1. ACID 属性：确保分布式事务的原子性、一致性、隔离性和持久性。
2. 事务协调与管理：需要一个协调者来协调和管理分布式事务中的各个参与者。
3. 分布式锁与并发控制：实现分布式锁以避免对同一资源的冲突操作，保证隔离性。
4. 两阶段提交（2PC）协议：一种经典的分布式事务协议，但需注意其单点故障问题。
5. 异步通信与消息队列：使用异步通信和消息队列可以提高系统的性能和可伸缩性。
6. 容错与恢复：需要考虑容错和异常处理机制，以确保数据的一致性和完整性。

#### No.30：Shared-Nothing、Shared-Memory 和 Shared-Disk 有什么异同？

Shared-Nothing、Shared-Memory 和 Shared-Disk 主要的区别在于数据共享的方式：

1. Shared-Nothing（无共享）：独立拥有计算资源和存储空间，节点间无数据共享，适用于分布式系统和并行计算，具有良好的可伸缩性和容错性。
2. Shared-Memory（共享内存）：所有节点共享物理内存空间，直接读写数据，适用于多线程或多进程应用，但可能面临数据一致性和争用问题。
3. Shared-Disk（共享磁盘）：所有节点连接共享的磁盘或存储设备，直接读写共享存储中的文件或数据，适用于频繁读写共享数据的应用，但可能面临磁盘访问冲突和性能瓶颈。


#### No.31：列存储的原理是什么？适合哪些场景？

在列存储中，数据按照“列”的方式进行组织和存储，而不是传统 B+ 树等模型所采用的以“行”的方式存储数据。其原理主要包括以下几点：

1. 列式压缩：列存储针对每一列的数据进行压缩，因为同一列通常具有高度的数据相似性，所以这种压缩在大部分时候都非常高效。
2. 去耦合（Decoupling）：在列存储中，数据被划分为各个列存储单元，这样可以将查询只聚焦于所需的列，减少了不必要的 I/O 操作和数据传输，提高了查询效率。
3. 向量化处理（Vectorized Processing）：列存储可以对整个列进行向量化处理，即将多个数据元素一次性加载到寄存器进行操作，充分利用现代 CPU 的 SIMD 指令集，从而减少了循环的开销，加快了数据的处理速度。

列存储适合以下这些场景：

1. 分析型查询：面向大规模数据分析的查询通常是聚合、过滤和计算特定列的子集。列存储可以通过仅加载所需的列来加速此类查询，减少 I/O 操作和 CPU 开销。
2. 宽表数据：当一张表包含大量的列时，行存储会导致较大的存储冗余和 I/O 开销。而列存储可以只加载感兴趣的列，减少存储空间和 I/O 负载。
3. 压缩率高：列存储针对每列进行压缩，对于稀疏或重复数据，可以显著减小存储空间占用，并且在数据传输中节约带宽。
4. 数据压缩和索引建立：由于列存储数据的连续性，数据压缩比较高，能够提高数据的压缩率，减少存储成本。同时，列存储也适合于索引的建立，因为索引通常只需要访问特定的列。

#### No.32：计算与存储分离的优势和劣势分别有哪些？

计算与存储分离在云计算时代大放异彩，本质是因为云计算厂商首次实现了高性能又稳定的云存储，这种技术产品离不开硬件和 Kernel 的进步。

计算与存储分离的优势在于：

1. 弹性扩展：单独扩展计算和存储资源，满足不同场景需求，更具弹性。
2. 节约成本：单独优化、采购计算和存储资源，降低成本。
3. 简化管理：专注于数据持久性和可靠性的存储资源和专注于数据处理和计算任务的计算资源，降低系统复杂性。
4. 多租户支持：为不同租户提供独立且安全的存储空间，同时共享计算资源，更好地实现资源隔离和多租户支持。

劣势在于：

1. 网络开销：计算和存储分离导致网络开销增加，可能影响系统延迟和吞吐量。
2. 数据一致性：数据更新时需要确保计算节点和存储节点之间的数据保持同步，实现正确的并发控制机制。
3. 系统复杂性增加：计算和存储分离可能增加系统的复杂性，特别是在跨多个计算节点和存储节点进行数据处理和传输时，需要额外的管理和调度机制来协调计算和存储资源。
