应付不断增长的数据这个快乐的烦恼

举报
码乐 发表于 2024/05/02 08:26:45 2024/05/02
【摘要】 1 读写分离和主从复制大型应用服务器在写数据的时候,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样当应用服务器读数据的时候,就可以通过从数据库获得数据,他们如何实现的?为了便于应用程序访问读写分离后的数据库,通常在应用服务器端使用专门的数据访问模块,使数据库读写分离对应用透明。 2 使用和配置二进制日志MySQL的二进制日志binlog可以说是MySQL最重要的日志...

1 读写分离和主从复制

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

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。