设为首页收藏本站 JeeStudy企业开发官网①

JEE Study|JAVA EE|企业级开发学习网

 找回密码
 立即加入

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2493|回复: 0
打印 上一主题 下一主题

MySQL8.0大师之路:第11章:MySQL服务器管理-11.17 MySQL 二进制日志事务压缩

[复制链接]

219

主题

221

帖子

1418

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1418

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

跳转到指定楼层
楼主
发表于 2020-4-21 23:40:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
二进制日志事务压缩    从MySQL 8.0.20开始,您可以在MySQL服务器实例上启用二进制日志事务压缩。启用二进制日志事务压缩后,将使用zstd算法压缩事务有效负载,然后将其作为单个事件(Transaction_payload_event)写入服务器的二进制日志文件。压缩的事务有效负载在复制流中发送到复制从属设备,其他组复制组成员或客户端(例如mysqlbinlog)时,仍保持压缩状态。它们不会被接收器线程解压缩,并且仍以其压缩状态写入中继日志。因此,二进制日志事务压缩既可以节省事务的始发者,也可以节省接收者(及其备份)的存储空间,并在服务器实例之间发送事务时节省网络带宽。
    当需要检查压缩的事务有效负载中的各个事件时,将其解压缩。例如,事务处理程序线程对Transaction_payload_event进行解压缩,以便将其包含的事件应用于接收者。在恢复过程中,还可以通过重播事务时的mysqlbinlog以及SHOW BINLOG EVENTS和SHOW RELAYLOG EVENTS语句来执行解压缩。
    您可以使用binlog_transaction_compression系统变量(默认为OFF)在MySQL服务器实例上启用二进制日志事务压缩。您还可以使用binlog_transaction_compression_level_zstd系统变量来设置用于压缩的zstd算法的级别。该值确定压缩工作量,从1(最小工作量)到22(最大工作量)。随着压缩级别的增加,压缩率也会增加,这会减少事务有效负载所需的存储空间和网络带宽。但是,数据压缩所需的工作量也增加了,占用了时间以及原始服务器上的CPU和内存资源。压缩力的增加与压缩比的增加没有线性关系。
    以下类型的事件从二进制日志事务压缩中排除,因此始终未压缩地写入二进制日志:
•与事务的GTID有关的事件(包括匿名GTID事件)。
•其他类型的控制事件,例如视图更改事件和心跳事件。
•突发事件以及包含这些事件的所有事务的整体。例如,服务器停止期间的事务不会压缩其有效负载。
•非交易事件以及包含非交易事件的所有交易。例如,涉及非事务存储引擎和事务存储引擎混合的事务将不会压缩其有效负载。
•使用基于语句的二进制日志记录的事件。
二进制日志事务压缩仅适用于基于行的二进制日志记录格式。二进制日志加密可用于包含压缩事务的二进制日志文件。



启用二进制日志事务压缩时的行为
    具有有效负载的事务可以像其他任何事务一样回滚,也可以通过常规过滤选项在从属服务器上将其过滤掉。二进制日志事务压缩可以应用于XA事务。

    启用二进制日志事务压缩后,服务器的max_allowed_pa​​cket和slave_max_allowed_pa​​cket限制仍然适用,并根据Transaction_payload_event的压缩大小以及事件标头使用的字节进行度量。请注意,压缩事务负载是作为单个数据包发送的,而不是在不使用二进制日志事务压缩的情况下,将事务的每个事件都发送到单个数据包中。
    对于多线程工作程序,每个事务(包括其GTID事件和Transaction_payload_event)都分配给工作程序线程。工作线程对事务负载进行解压缩,并逐一应用其中的各个事件。如果在应用Transaction_payload_event中的任何事件时发现错误,则将整个事务报告为失败的事务给协调器。当slave_parallel_type设置为DATABASE时,将在调度事务之前映射受事务影响的所有数据库。与未压缩的事务相比,将二进制日志事务压缩与DATABASE策略一起使用可以减少并行性,未压缩的事务针对每个事件进行映射和调度。
    对于半同步复制,从服务器在收到完整的Transaction_payload_event时将确认该事务。
    启用二进制日志校验和时(这是默认设置),主服务器不会在压缩的事务负载中为单个事件写入校验和。相反,将为完整的Transaction_payload_event写入校验和,并为未压缩的任何事件(例如与GTID相关的事件)写入单个校验和。
    对于SHOW BINLOG EVENTS和SHOW RELAYLOG EVENTS语句,首先将Transaction_payload_event打印为一个单元,然后将其解压缩并打印其中的每个事件。
    对于引用事件结束位置的操作,例如带有UNTIL子句的START SLAVE,MASTER_POS_WAIT()和sql_slave_skip_counter,您必须指定压缩事务负载的结束位置(Transaction_payload_event)。使用sql_slave_skip_counter跳过事件时,压缩的事务有效负载被计为单个计数器值,因此将跳过其中的所有事件作为一个单元。


合并压缩和未压缩的事务负载
MySQL服务器发行版支持二进制日志事务压缩,可以处理压缩和未压缩的事务负载。
•与二进制日志事务压缩相关的系统变量不需要在所有“组复制”组成员上都设置为相同,也不需要在复制拓扑中从主服务器复制到从服务器。您可以确定二进制日志事务压缩是否适用于每个具有二进制日志的MySQL Server实例。
•如果在服务器上启用了事务压缩然后又禁用了事务压缩,则不会将压缩应用于该服务器上发起的将来事务,但是仍可以处理和显示已压缩的事务有效负载。
•如果通过设置binlog_transaction_compression的会话值为各个会话指定了事务压缩,则二进制日志可以包含压缩和未压缩的事务有效负载的混合。当复制拓扑中的主服务器及其从属服务器都启用了二进制日志事务压缩时,从属服务器将接收压缩的事务负载,并将其压缩后写入其中继日志。它解压缩事务负载以应用事务,然后在申请写入其二进制日志后再次压缩它们。任何下游从站都将接收压缩的事务负载。



    当复制拓扑中的主服务器启用二进制日志事务压缩但其从服务器未启用二进制日志事务压缩时,该从服务器接收压缩的事务有效负载并将其压缩后写入其中继日志。它解压缩事务负载以应用事务,然后将未压缩的事务负载写入其自己的二进制日志(如果有的话)。任何下游从站都将接收未压缩的事务有效负载。
    当复制拓扑中的主服务器未启用二进制日志事务压缩但其从属服务器却启用了二进制日志事务压缩时,如果从属服务器具有二进制日志,则它将在应用负载后压缩事务负载,并将压缩后的事务负载写入其二进制日志。任何下游从站都将接收压缩的事务负载。
    当MySQL服务器实例没有二进制日志时(如果它是MySQL 8.0.20的发行版),则无论binlog_transaction_compression的值如何,它都可以接收,处理和显示压缩的事务有效负载。这样的服务器实例接收到的压缩的事务有效负载以其压缩状态写入中继日志,因此它们间接受益于复制拓扑中其他服务器执行的压缩。
    MySQL 8.0.20之前的版本中的从属服务器无法从启用了二进制日志事务压缩的主服务器复制。 MySQL 8.0.20或更高版本的从属服务器可以在不支持二进制日志事务压缩的早期版本中从主服务器进行复制,并且在将从该主服务器接收的事务写入自己的二进制日志时可以对其进行压缩。



监视二进制日志事务压缩
您可以使用性能架构表binary_log_transaction_compression_stats监视二进制日志事务压缩的效果。统计信息包括监视期间的数据压缩率,您还可以查看压缩对服务器上最后一个事务的影响。您可以通过截断表格来重置统计信息。二进制日志和中继日志的统计信息被拆分,因此您可以查看压缩对每种日志类型的影响。 MySQL服务器实例必须具有二进制日志才能生成这些统计信息。
    性能模式表events_stages_current显示事务何时处于其事务有效负载的解压缩或压缩阶段,并显示该阶段的进度。压缩是在处理事务之前,由处理事务的工作线程执行的,前提是最终的捕获缓存中没有将事务从二进制日志事务压缩中排除的事件(例如,事件)。当需要减压时,一次对有效载荷中的一个事件进行减压。
    带有--verbose选项的mysqlbinlog包括说明压缩的事务有效负载的压缩大小和未压缩大小的注释,以及所使用的压缩算法。
    您可以使用CHANGE MASTER TO语句的MASTER_COMPRESSION_ALGORITHMS和MASTER_ZSTD_COMPRESSION_LEVEL选项(或不建议使用的slave_compressed_protocol系统变量)在协议级别为复制连接启用连接压缩。如果在还启用了连接压缩的系统中启用了二进制日志事务压缩,则连接压缩的影响会减小,因为可能几乎没有机会进一步压缩压缩的事务有效负载。但是,连接压缩仍可以对未压缩的事件和消息头进行操作。如果需要节省存储空间和网络带宽,可以结合使用二进制日志事务压缩和连接压缩。
    对于组复制,默认情况下对超过group_replication_compression_threshold系统变量设置的阈值的邮件启用压缩。您还可以使用group_replication_recovery_compression_algorithm和group_replication_recovery_zstd_compression_level系统变量,通过捐赠者二进制日志中的状态转移方法,为发送给分布式恢复的消息配置压缩。

    如果在配置了二进制日志事务压缩的系统中启用了二进制日志事务压缩,则组复制的消息压缩仍可以对未压缩的事件和消息头进行操作,但其影响减小了。





















知识改变命运!

JAVA EE 学习     JAVA EE 资料
JEE Study:企业级开发学习网!
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

QQ|Archiver|手机版|小黑屋|JEE Study ( 京ICP备16036936   JeeStudy企业开发官网①

GMT+8, 2024-12-2 15:50 , Processed in 0.216059 second(s), 24 queries .

Powered by JeeStudy!

© 2008-2020 JEE Study 企业级开发学习网

快速回复 返回顶部 返回列表