mysql 主从复制定义
mysql 主从复制是一种数据同步的技术,它可以让一个或多个从数据库(slave)复制主数据库(master)的数据变化。这样可以提高数据库的可用性、性能和扩展性,也可以实现读写分离和数据备份。
mysql 主从复制有哪些应用场景?
MySQL 主从复制有以下几种应用场景:
- 数据备份:主从复制可以实现数据的热备份,即从节点可以实时地同步主节点的数据变化,提高数据的可靠性和安全性。但是,主从复制不能防止人为的误操作,如删除或修改数据,因此还需要定期的全量备份或者使用延迟复制等策略。
- 读写分离:主从复制可以实现读写分离,即主节点负责写操作,从节点负责读操作,分担服务器的负载压力。读写分离可以提高数据库的并发能力和响应速度,尤其是在读多写少的场景下。读写分离可以通过程序或者代理软件来实现。
- 业务拆分:主从复制可以实现业务拆分,即根据不同的业务需求,将不同的从节点分配给不同的用户或者服务。例如,有些从节点可以提供外部用户的查询服务,有些从节点可以用于内部数据分析或者开发测试,有些从节点可以用于数据备份或者故障恢复等。这样的拆分可以使数据库对不同用户或者服务互不影响,提高数据库的可用性和灵活性。
mysql 主从复制原理
mysql 主从复制的原理是基于二进制日志(binlog)的,主数据库在执行数据更新的操作时,会把操作记录到 binlog 文件中,并通过 binlog dump 线程发送给从数据库。从数据库有两个线程负责接收和执行主数据库的操作,分别是 I/O 线程和 SQL 线程。I/O 线程负责连接主数据库,请求并接收 binlog 事件,并保存到本地的中继日志(relay log)中。SQL 线程负责读取中继日志中的事件,并在从数据库中重放,从而实现数据的同步。
mysql 主从复制有不同的同步策略,主要有以下几种:
- 同步策略:主数据库会等待所有的从数据库都回应后才会提交事务,这样可以保证强一致性,但是会严重影响性能和可用性。
- 半同步策略:主数据库至少会等待一个从数据库回应后才会提交事务,这样可以保证至少一个从数据库和主数据库是一致的,但是仍然有可能出现数据丢失或不一致的情况。
- 异步策略:主数据库不用等待从数据库的回应就可以提交事务,这样可以提高性能和可用性,但是会牺牲一致性,可能出现数据延迟或丢失的情况。
- 延迟策略:从数据库可以设置一个延迟时间,让自己落后于主数据库一定的时间,这样可以避免一些误操作或攻击对数据造成的影响,也可以用于备份或审计的目的。
主从复制一般会有以下几种问题:
- 主从延迟:由于主从复制是异步的,从节点可能会落后于主节点,导致数据不一致的情况。主从延迟的原因可能有网络延迟、从节点负载过高、主节点写入过快等。主从延迟的解决办法可能有优化网络配置、增加从节点数量、使用并行复制或半同步复制等。
- 主键冲突:如果主从复制中存在双主或者多主的情况,可能会出现主键冲突的问题,即两个或多个主节点同时插入相同的主键值,导致数据不一致或者复制失败。主键冲突的解决办法可能有使用自增列或者UUID作为主键、使用分区表或者分片等。
- 数据不一致:除了上述两种情况外,还有一些其他的原因可能导致数据不一致的问题,例如非确定性函数的使用、隐式类型转换、字符集编码不匹配、binlog格式不兼容等。数据不一致的解决办法可能有使用行级binlog格式、避免使用非确定性函数、保持字符集编码一致、定期检查数据完整性等。
如何检查主从复制是否正常工作?
- 通过执行
show slave status
命令,查看从节点的复制状态,主要关注以下几个字段:Slave_IO_Running
和Slave_SQL_Running
是否都为Yes
,表示复制线程是否正常运行。Last_IO_Error
和Last_SQL_Error
是否为空,表示复制过程中是否出现错误。Seconds_Behind_Master
表示从节点落后于主节点的时间,越小越好,如果为NULL
表示复制出现问题。
- 通过执行
show master status
命令,查看主节点的二进制日志信息,主要关注以下几个字段:File
和Position
表示当前二进制日志的文件名和位置,与从节点的Relay_Master_Log_File
和Exec_Master_Log_Pos
对比,可以判断从节点是否追上了主节点。Binlog_Do_DB
和Binlog_Ignore_DB
表示主节点设置的需要复制或忽略的数据库,与从节点的Replicate_Do_DB
和Replicate_Ignore_DB
对比,可以判断主从节点是否一致。
- 通过执行
select @@server_id
命令,查看主从节点的服务器ID,确保不同的节点有不同的ID,否则会导致复制失败或循环复制。 - 通过执行
select @@read_only
命令,查看从节点的只读状态,确保从节点设置了read_only=1
,防止从节点被误写入数据。 - 通过使用第三方工具,如 Maatkit 工具包中的 mk-table-checksum 工具,对比主从节点的表数据的校验和(checksum),检查数据是否一致。