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 以外的任何内容一起使用,则副本将停止。
二进制日志格式向上兼容。这意味着,如果副本与主副本相同或版本更新,则复制应始终有效。