数据处理:快乐的烦恼,业务太繁忙?分离读写和主从复制

1 读写分离和主从复制

大型应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步 到从数据库,这样当应用服务器读数据的时候,就可以通过从数据库获得数据。

为了便于应用程序访问读写分离后的数据库,通常在应用服务器端使用专门的数据访问模块,使数据库读写分离对应用透明。

2 使用和配置二进制日志

MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录。常见的binlog有如下的常见作用。

sql 复制代码
数据恢复:delete没加where条件? binlog可以帮你恢复数据; 

主从同步:搭建一套一主两从的MySQL集群,binlog帮你完成主从的数据同步。 

审计:通过分析binlog可以排查是否存在SQL注入攻击。

值得注意的是,mysql数据库虽然与MariaDB有很深的渊源,但是binlog处理方式有较大的不同, 影响 mysql 数据库的语句可以与预期不同的方式记录。

如果直接编辑 mysql 数据库,则根据binlog_format按预期执行日志记录。 直接编辑 mysql 数据库的语句包括插入、更新、删除、替换、执行、加载数据文件、选择和截取表。

如果间接编辑 mysql 数据库,则无论设置binlog_format,都会使用语句日志记录。 编辑 mysql 数据库的语句间接包括 GRANT、REVOKE、SET PASSWORD、RENAME USER、ALTER、DROP 和 CREATE(下面描述的情况除外)。

创建表SELECT 可以使用日志记录格式的组合。语句的 CREATE TABLE 部分使用基于语句的日志记录进行记录,而 SELECT 部分根据 binlog_format 的值进行记录。

3 主从复制三个模式

(1)全同步复制

是指主库在执行完一个事务后,会等待所有从库执行完该事务后,才会将结果返回给客户端。这种方式的优点是数据一致性较高,但因为需要等待所有从库执行完事务,所以性能可能会较低。

(2)异步复制

则是主库在执行完客户端提交的事务后,会立即将结果返回给客户端,而不关心从库是否已经接收并处理。这种方式简单且性能较好,但可能会导致主从之间数据不一致的概率较大。

(3)半同步复制

则介于同步复制和异步复制之间,主库在执行完客户端提交的事务后,会等待至少一个从库接收到并写入中继日志后,才会将结果返回给客户端。这种方式牺牲了一定的性能,但提高了数据的安全性。

binlog用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。

binlog是mysql的逻辑日志,并且由Server层进行记录,使用任何存储引擎的mysql数据库都会记录binlog日志。

这三个模式(binlog)如下:

markdown 复制代码
	基于SQL的语句复制
	基于行的复制
	混合复制

binlog的日志复制类型可以分为

第一个基于语句的复制,这是mysql的默认方式,在主服务器执行语句,从服务器执行相同的语句。

​第二个是基于行的复制,把改变的内容复制到从服务器。

​第三是混合类型的复制,一旦发现基于语句无法精确复制,则采用基于行的复制。

4 配置方式

设置日志保存方式需要管理员权限,例如设置全局日志模式的方式如下:

ini 复制代码
SET GLOBAL binlog_format='ROW';

设置当前的会话的日志模式方式如下:

ini 复制代码
SET SESSION binlog_format='ROW';

也可以在数据库配置文件中设置

ini 复制代码
binlog_format=ROW

当服务器是副本并启用了行复制时,请小心动态更改二进制日志格式。 如果动态更改全局值,则不会影响任何当前正在运行的会话设置。

这可能会导致行复制出现问题,因为即使在执行 STOP SLAVE之后, 工作线程仍将保持运行状态。 这可以通过重置slave_parallel_threads系统变量来解决。例如:

ini 复制代码
STOP SLAVE;
SET GLOBAL slave_parallel_threads=0;
SET GLOBAL binlog_format='ROW';
SET GLOBAL slave_parallel_threads=4;
START SLAVE

5 小结 二进制日志格式对副本的影响

虽然数据库可以使用二进制日志得到一些可靠性保证,其副作用包括对其他运行副本的影响。

副本将应用从主数据库获取的任何事件,而不考虑二进制日志格式。 binlog_format系统变量仅适用于正常(未复制)更新。

如果运行的是 MySQL 或早于 10.0.22 的 MariaDB, 如果在 binlog_format=STATEMENT 模式下运行副本,则如果主副本与 binlog_format 设置为 STATEMENT 以外的任何内容一起使用,则副本将停止。

二进制日志格式向上兼容。这意味着,如果副本与主副本相同或版本更新,则复制应始终有效。

相关推荐
前端Hardy4 分钟前
一个时代结束了:npm 终于对 install 脚本下手了
前端·javascript·后端
damaoyou5 分钟前
Cog3DRangeImagePlaneEstimatorTool完全指南
后端
minji...22 分钟前
MySQL数据库 (八) MySQL表的基本查询(下),truncate、group by、聚合函数、分组聚合统计
数据库·mysql·聚合函数·update·分组聚合统计
乐世东方客26 分钟前
备份脚本记录(binlog文件+mysql+mongo)
android·数据库·mysql
暴力求解27 分钟前
MySQL---数据类型
数据库·mysql
Nturmoils28 分钟前
分页别写太顺手,LIMIT 背后还有排序和边界
数据库·后端
小饕29 分钟前
RAG学习之【向量数据库】Milvus 从入门到精通:索引、检索、混合搜索一篇打通(RAG 必备)
数据库·人工智能·学习·milvus
神奇小汤圆32 分钟前
国产版“Codex”初体验,智谱ZCode很强啊!
后端
站大爷IP33 分钟前
Python里的“赋值”到底是什么意思?
后端
鹅城剑仙1 小时前
Spring Boot 微服务架构设计与最佳实践
spring boot·后端·微服务