MySQL 主从同步

配置文件

电台项目中消费 binlog 的服务需要对 MySQL 的配置文件进行修改,修改参数如下

1
2
3
4
5
6
[mysqld]
log-bin=mysql-bin # 日志记录到指定位置
binlog-format=ROW # 只要记录发生修改,就写到 binlog 中
binlog_row_image=full
log_slave_updates=1
server-id=1

log_slave_updates=1 是因为 redis 同步服务实际消费的是从节点的 binlog,而从节点是通过消费主节点的 binlog 来实现主从同步。log_slave_updates=1 所代表的就是从服务器将在主服务器收到的更新记录记录到从服务器自己的 binlog 中,由此 redis 同步服务才能消费到对应 MySQL 服务器的 binlog
如果没有该配置,会造成的情况是,主节点的数据变更后,从节点能够正常同步主节点的信息,但是 redis 同步服务却无法获取到更新信息,因为从节点没有记录 binlog
binlog_row_image=full 记录的信息最为全面
数据库中有前镜像和后镜像的概念:

  • 前镜像(before image): 记录修改前的内容
  • 后镜像(after image): 记录修改后的内容
    对 insert 来说,只有后镜像没有前镜像;
    对 update 来说,有前镜像和后镜像;
    对 delete 来说,只有前镜像没有后镜像
    binlog_row_image=full 可以覆盖到所有修改信息

Binlog 日志模式

ROW Level
详细记录每一行数据被修改的细节。优点是数据准确,缺点是产生的 binlog 数据量巨大,尤其是发生批量修改时
Statement Level
记录的是修改记录的那条 SQL 语句。优点是数据量小,缺点是对函数和存储过程这类特殊功能的复制不友好
Mixed
会根据每一条 SQL 记录来选择适合的日志格式