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

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 以外的任何内容一起使用,则副本将停止。

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

相关推荐
u0107475462 分钟前
HTML5中SVG描边虚线Stroke-dasharray的配置技巧
jvm·数据库·python
Dontla5 分钟前
JWT认证流程(JSON Web Token)
前端·数据库·json
不光头强5 小时前
spring cloud知识总结
后端·spring·spring cloud
Mike117.5 小时前
GBase 8a 日期边界写法和时间窗口取数偏差
数据库
SPC的存折7 小时前
1、Redis数据库基础
linux·运维·服务器·数据库·redis·缓存
GetcharZp8 小时前
告别 Python 依赖!用 LangChainGo 打造高性能大模型应用,Go 程序员必看!
后端
阿里加多8 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
小小李程序员9 小时前
Langchain4j工具调用获取不到ThreadLocal
java·后端·ai