面试题答案
一键面试1. 基于日志的复制技术
- 二进制日志(Binlog):主库将所有修改数据的语句记录到Binlog中,从库通过读取主库的Binlog并应用这些日志来保持与主库的数据一致。在数据迁移等变更操作时,主库产生的Binlog记录会同步到从库,从而保证数据一致性。例如,主库执行
INSERT INTO users (name, age) VALUES ('John', 25)
语句,该语句会被记录到Binlog,从库读取并执行同样语句。 - 中继日志(Relay Log):从库接收主库发送的Binlog并存储在中继日志中,然后按照顺序执行中继日志中的事件,确保数据与主库一致。
2. 事务处理
- ACID特性:在数据迁移等操作时,通过确保事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)来保证数据一致性。例如,在进行数据迁移时,将一系列相关的插入、更新操作放在一个事务中,如果其中任何一个操作失败,整个事务回滚,不会造成部分数据迁移成功而部分失败的不一致情况。
- 隔离级别:合理设置事务的隔离级别,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)。可重复读是MySQL默认隔离级别,能避免脏读、不可重复读问题,在一定程度上保证数据一致性。例如,在数据迁移事务中,设置为可重复读隔离级别,能保证在事务执行期间读取的数据状态稳定,不受其他并发事务影响。
3. 数据校验和对比
- 使用工具进行数据校验:在数据迁移前后,可以使用专门的数据校验工具,如pt-table-checksum(Percona Toolkit中的工具)。它会在主从库上分别计算表数据的校验和,通过对比校验和来判断数据是否一致。如果校验和不一致,说明可能存在数据不一致问题,需要进一步排查。
- 手动对比关键数据:对于一些关键业务数据,在迁移完成后,手动选取部分关键记录,在主库和目标库(如从库或迁移后的新库)中进行对比,检查数据是否完全相同,以确保数据一致性。
4. 主从切换与双活/多活架构
- 主从切换:在进行主库变更操作前,可以先将从库提升为主库,将原主库变为从库,然后在新主库上进行变更操作。在变更完成且确认数据一致性后,再根据需要进行进一步的主从调整。这样可以避免在变更主库过程中可能出现的数据不一致问题,因为从库在提升为主库前已经与原主库保持数据同步。
- 双活/多活架构:采用双活或多活架构,多个数据库节点同时提供服务且数据保持一致。在进行数据迁移等操作时,可以通过特定的同步机制,如分布式事务处理、多活数据同步协议等,确保各个节点的数据一致性。例如,在双活架构中,两个数据库节点同时接收写请求,通过同步机制保证两边数据的实时一致性。