使用读写分离和主从复制功能应对繁忙业务

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 【6月更文挑战第11天】该文介绍了MySQL的读写分离和主从复制机制,强调了二进制日志在数据恢复、主从同步和审计中的关键作用。作者提醒,binlog_format的改动只影响非复制更新,且应确保版本兼容性,以免影响副本运行。

1 读写分离和主从复制

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

mandala曼德罗符号.png

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

2 使用和配置二进制日志

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

数据恢复: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)如下:

    基于SQL的语句复制
    基于行的复制
    混合复制

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

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

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

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

4 配置方式

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

SET GLOBAL binlog_format='ROW';

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

SET SESSION binlog_format='ROW';

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

binlog_format=ROW

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

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

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

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

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
传感器 监控 安全
|
SQL 关系型数据库 MySQL
Python系列:教你使用PyMySQL操作MySQL数据库
Python系列:教你使用PyMySQL操作MySQL数据库
1044 8
|
存储 测试技术 BI
【Power平台】Power Apps项目规划阶段(1),识别业务问题
【Power平台】Power Apps项目规划阶段(1),识别业务问题
|
JavaScript 前端开发 编译器
了不起的 Webpack Scope Hoisting 学习指南
了不起的 Webpack Scope Hoisting 学习指南
258 0
|
监控 关系型数据库 MySQL
|
安全 Shell Linux
为什么不能在SSH(Secure Shell)登录中设置ulimit值?
关闭这些选项会带来一些安全风险。但那也只是在SSH守护进程的漏洞被发现并且被利用的情况下才会出现。关闭之后就意味着sshd不会创建非特权子进程去处理进站连接。如果漏洞存在而且被利用,则有人可以控制sshd进程,而这个进程是以root身份运行的。
2105 0
|
Web App开发 API 网络架构
|
敏捷开发 程序员
持续改进-《高效程序员的45个习惯》读后感
原书标题为《Practices of An Agile Developer》。中文名为《高效程序员的45个习惯-敏捷开发修炼之道》。敏捷这个词已经烂大街了,关于敏捷的书籍俯拾皆是。很多人是敏捷的狂热粉丝,而另一些人却讨厌敏捷,认为只是个噱头。
1127 0
|
缓存 C# Windows
配置Visual Studio 2008来调试.NET Framework源码的基本步骤
首先,这个功能在Visual Studio 2008 Express版里不支持。 1)安装Visual Studio 2008 QFE。这个QFE只是更新一个Visual Studio调试器的DLL,以便可以获取源代码,更多细节参加下载页面。
855 0
|
14天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
11504 126
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw