MySQL 日志篇:Redo 文件和自适应检查点

news2024/11/19 17:26:01

MySQL 的 InnoDB 存储引擎使用 Redo Log 记录事务对数据的更改,以便在系统崩溃恢复时能够重做这些更改,从而保证事务的持久性。对于产生的 Redo Log,InnoDB 存储引擎首先将其写入内存中的 Log Buffer,随后再将 Log Buffer 中的 Redo Log 写入磁盘中的日志文件。本文首先介绍 MySQL 8.0.30 中 Redo Log 对应的日志文件的格式,然后介绍如何在 MySQL 中查看 Redo 文件的信息,最后介绍和 Redo Log 相关的自适应检查点。

如果还不了解 LSN、mini-transaction、Log Buffer 等概念,推荐阅读 “MySQL 日志篇:Redo Log Buffer”。

Redo 文件格式

在 MySQL 8.0.30 之前,Redo Log 的容量由 innodb_log_file_sizeinnodb_log_files_in_group 两个参数控制。前者设置每个 Redo 文件的大小,默认值为 48 MB;后者设置 Redo 文件的数量,默认值为 2。由于 MySQL 不允许在运行时修改这两个参数,因此只有在停止 MySQL 后才能调整 Redo Log 的容量。

从 MySQL 8.0.30 开始,新增了 innodb_redo_log_capacity 参数来设置 Redo Log 的容量,默认值为 100 MB。与上述两个参数不同的是,MySQL 允许在运行时修改 innodb_redo_log_capacity,这意味着能在运行时动态调整 Redo Log 的容量。MySQL 将这种特性称为 “InnoDB Dynamic Redo Log”。除此之外,Redo 文件的数量也从 2 个变为了 32 个,并放在 #innodb_redo 目录下。下图展示了 Redo 文件的格式。

上图中,自底向上依次为:

  • 32 个 Redo 文件,这是磁盘上实际存储 Redo Log 的位置。Redo 文件分为 #ib_redo[0-9]+#ib_redo[0-9]+_tmp 两类。前者是活跃的 Redo 文件,已经写入 Redo Log 并且还未被回收。后者是备用的 Redo 文件,还未写入 Redo Log 或者已经被回收;
  • 一个 Redo 文件由若干个大小为 512 字节的 Block 构成。前四个 Block 是文件头,负责存储元数据;后面的 Block 是数据块,负责存储 Redo Record;
  • 不同类型的 Block 作用不同,格式也不同。上图展示了每种 Block 包含的字段以及每个字段的字节大小,下面逐一介绍每种 Block。

Header Block

Header Block 负责维护 Redo 文件的元数据,其关键字段包括:

  • start lsn:Redo 文件的起始 LSN,加上文件大小得到终止 LSN。通过比较一个 LSN 是否落在一个 Redo 文件的起始 LSN 到终止 LSN 之间,就能确定该 LSN 是否在该 Redo 文件中;
  • log flags:Redo 文件的标志位,标志包括 LOG_HEADER_FLAG_NO_LOGGING (禁用 Redo Log)、LOG_HEADER_FLAG_CRASH_UNSAFE (异常退出)、LOG_HEADER_FLAG_NOT_INITIALIZED (未初始化 Redo 文件)、LOG_HEADER_FLAG_FILE_FULL (Redo 文件已写满)。

创建一个 Redo 文件之后,它的起始 LSN 和终止 LSN 就固定了。除非改变这个 Redo 文件的容量,或者回收这个 Redo 文件后再次使用。

MySQL 在使用一个 Redo 文件之前,会先检查它的标志位。只有通过检查后才会使用这个 Redo 文件。一旦检查没有通过,那么就会报警甚至退出。

Checkpoint Header Block

Checkpoint Header Block 负责维护检查点对应的 LSN,其关键字段包括:

  • checkpoint lsn:检查点对应的 LSN,用于在崩溃恢复时确认恢复的起点。

只有当一个检查点的 LSN 位于一个 Redo 文件的起始 LSN 和终止 LSN 之间时,才会使用这个 Redo 文件的 Checkpoint Header Block。每个 Redo 文件都有两个 Checkpoint Header Block,MySQL 会交替使用它们保存检查点的 LSN。除此之外,MySQL 还会在系统表中再记录一次检查点的 LSN。当 MySQL 启动时,会读取每个 Redo 文件的两个 Checkpoint Header Block 以及系统表,以其中最大的检查点的 LSN 作为恢复的起点。

Data Block

Data Block 负责存储 Redo Log 的内容,即 Redo Record。每个 Data Block 除了存储 Redo Record 之外,还有 12 字节的头部和 4 字节的尾部。头部负责记录该 Data Block 的元数据,尾部负责记录该 Data Block 的循环冗余校验码 (CRC)。因此,每个 Data Block 实际最多存储 496 字节的 Redo Record。Data Block 中的关键字段包括:

  • (epoch_no, hdr_no):唯一标识一个 Data Block 的全局位置 (跨 Redo 文件);
  • data_len:Data Block 已写入的字节数。若 Data Block 还没有 Redo Record,则 data_len 为 0。若 Data Block 已经有 Redo Record 但还未写满,则 data_len 为 Redo Record 的总字节数加 12 (头部)。若 Data Block 已经写满,则 data_len 为 512,即 Redo Record 的总字节数加 12 (头部) 再加 4 (尾部);
  • first_rec_group:Data Block 中第一组 Redo Record 在该 Data Block 中的位置。一个 mini-transaction 中的所有 Redo Record 为一组,一组 Redo Record 要么全做要么全不做 (原子性)。

查看 Redo 文件

在 MySQL 中,执行以下 SQL 可以列出全部 Redo 文件:

SELECT * FROM performance_schema.file_instances WHERE file_name LIKE '%#innodb_redo/%' ORDER BY 1;

-- output
+-------------------------------------------+-------------------------------------+------------+
| FILE_NAME                                 | EVENT_NAME                          | OPEN_COUNT |
+-------------------------------------------+-------------------------------------+------------+
| /path/to/data/#innodb_redo/#ib_redo0      | wait/io/file/innodb/innodb_log_file |         20 |
| /path/to/data/#innodb_redo/#ib_redo1_tmp  | wait/io/file/innodb/innodb_log_file |          1 |
| ...                                       |                                     |            |
+-------------------------------------------+-------------------------------------+------------+

如果想要查看 Redo 文件的详细信息,那么可以执行以下 SQL:

SELECT * FROM performance_schema.file_summary_by_instance WHERE file_name LIKE '%#innodb_redo/%' ORDER BY 1 LIMIT 1\G

-- output
*************************** 1. row ***************************
                FILE_NAME: /path/to/data/#innodb_redo/#ib_redo0
               EVENT_NAME: wait/io/file/innodb/innodb_log_file
    OBJECT_INSTANCE_BEGIN: 140737148753472
               COUNT_STAR: 1765
           SUM_TIMER_WAIT: 191423039274
           MIN_TIMER_WAIT: 417852
           AVG_TIMER_WAIT: 108454536
           MAX_TIMER_WAIT: 2712355560
               COUNT_READ: 7
           SUM_TIMER_READ: 322288866
           MIN_TIMER_READ: 550458
           AVG_TIMER_READ: 46040994
           MAX_TIMER_READ: 156974022
 SUM_NUMBER_OF_BYTES_READ: 68608
              COUNT_WRITE: 873
          SUM_TIMER_WRITE: 66319956396
          MIN_TIMER_WRITE: 1057032
          AVG_TIMER_WRITE: 75967497
          MAX_TIMER_WRITE: 2691056556
SUM_NUMBER_OF_BYTES_WRITE: 977920
               COUNT_MISC: 885
           SUM_TIMER_MISC: 124780794012
           MIN_TIMER_MISC: 417852
           AVG_TIMER_MISC: 140994999
           MAX_TIMER_MISC: 2712355560

如果只想查看活跃的 Redo 文件,那么可以执行以下 SQL:

SELECT * FROM performance_schema.innodb_redo_log_files;

-- output
+---------+--------------------------+-----------+----------+---------------+---------+----------------+
| FILE_ID | FILE_NAME                | START_LSN | END_LSN  | SIZE_IN_BYTES | IS_FULL | CONSUMER_LEVEL |
+---------+--------------------------+-----------+----------+---------------+---------+----------------+
|       0 | ./#innodb_redo/#ib_redo0 |      8192 | 67115008 |      67108864 |       0 |              0 |
+---------+--------------------------+-----------+----------+---------------+---------+----------------+

SELECT file_id, start_lsn, end_lsn, 
       if(is_full=1,'100%',
          concat(round((((
               select VARIABLE_VALUE 
                 from performance_schema.global_status 
                where VARIABLE_NAME='Innodb_redo_log_current_lsn'
               )-start_lsn)/(end_lsn-start_lsn)*100),2),'%')) full,
          concat(format_bytes(size_in_bytes)," / " ,
          format_bytes(@@innodb_redo_log_capacity) ) file_size, 
      (select VARIABLE_VALUE from performance_schema.global_status 
        where VARIABLE_NAME='Innodb_redo_log_checkpoint_lsn') checkpoint_lsn,
      (select VARIABLE_VALUE from performance_schema.global_status 
        where VARIABLE_NAME='Innodb_redo_log_current_lsn') current_lsn, 
      (select VARIABLE_VALUE from performance_schema.global_status 
        where VARIABLE_NAME='Innodb_redo_log_flushed_to_disk_lsn') flushed_to_disk_lsn,
      (select count from information_schema.INNODB_METRICS 
        where name like 'log_lsn_checkpoint_age') checkpoint_age 
FROM performance_schema.innodb_redo_log_files;

-- output
+---------+-----------+----------+--------+----------------------+----------------+-------------+---------------------+----------------+
| file_id | start_lsn | end_lsn  | full   | file_size            | checkpoint_lsn | current_lsn | flushed_to_disk_lsn | checkpoint_age |
+---------+-----------+----------+--------+----------------------+----------------+-------------+---------------------+----------------+
|       0 |      8192 | 67115008 | 28.81% | 64.00 MiB / 2.00 GiB | 19344554       | 19344554    | 19344554            |              0 |
+---------+-----------+----------+--------+----------------------+----------------+-------------+---------------------+----------------+

自适应检查点

对于 Buffer Pool 中的脏页,InnoDB 会周期性地执行检查点将脏页刷入磁盘。一般情况下,InnoDB 不会一次性把所有脏页刷盘,而是每次只把一批脏页刷盘,这称为 Fuzzy Checkpointing。除此之外,InnoDB 还会根据检查点年龄决定减小或加大刷脏页的力度,这称为 Adaptive Checkpointing。自适应检查点与以下变量挂钩:

  • innodb_redo_log_logical_size:Redo Log 逻辑大小,即还不能回收的 Redo Log 大小。计算公式为:
    c e i l ( w r i t e _ l s n , 512 ) − f l o o r ( o l d e s t _ c o n s u m e d _ l s n , 512 )   1 \mathrm{ceil}(write\_lsn, 512) - \mathrm{floor}(oldest\_consumed\_lsn, 512)\ \textcolor{red}{^1} ceil(write_lsn,512)floor(oldest_consumed_lsn,512) 1
  • log_lsn_checkpoint_age:检查点年龄,小于但接近 Redo Log 逻辑大小。计算公式为:
    c u r r e n t _ l s n − l a s t _ c h e c k p o i n t _ l s n current\_lsn - last\_checkpoint\_lsn current_lsnlast_checkpoint_lsn
  • innodb_redo_log_capacity:Redo Log 容量 (所有活跃的和备用的 Redo 文件的总大小)。默认 100 MB。
  • hard_logical_capacity:Redo Log 永远不会超过此限制。若达到此限制时等待 1 秒后仍未回收空间,则会尽可能多地写 Redo Log 或者使 InnoDB 崩溃。计算公式为:
    ≈ 29.8 32 × i n n o d b _ r e d o _ l o g _ c a p a c i t y \approx \frac{29.8}{32} \times innodb\_redo\_log\_capacity 3229.8×innodb_redo_log_capacity
  • soft_logical_capacity:为避免死锁,InnoDB 禁止用户事务写入的 Redo Log 超过此限制。当超过此限制时,会暂停所有用户线程,并向 Error Log 写入一条日志。计算公式为:
    95 % × h a r d _ l o g i c a l _ c a p a c i t y 95\% \times hard\_logical\_capacity 95%×hard_logical_capacity
  • agressive_checkpoint_min_age:Redo Log 达到该点时,InnoDB 开始全速从Buffer Pool 中清除脏页。为了能更快地回收空间,log checkpointer 线程执行检查点时不会休眠 1 秒。计算公式为:
    31 32 × s o f t _ l o g i c a l _ c a p a c i t y \frac{31}{32} \times soft\_logical\_capacity 3231×soft_logical_capacity
  • adaptive_flush_max_age:Redo Log 达到该点时,log checkpointer 线程将请求并等待 page cleaner 线程清除尽可能多的脏页,以使 checkpoint age 低于此阈值。计算公式为:
    30 32 × s o f t _ l o g i c a l _ c a p a c i t y \frac{30}{32} \times soft\_logical\_capacity 3230×soft_logical_capacity
  • adaptive_flush_min_age:Redo Log 达到该点时,允许继续写入,但加大刷脏页的力度,这将导致性能下降。计算公式为:
    28 32 × s o f t _ l o g i c a l _ c a p a c i t y \frac{28}{32} \times soft\_logical\_capacity 3228×soft_logical_capacity

上述变量的关系如下:

c h e c k p o i n t   a g e < = l o g i c a l   s i z e \mathrm{checkpoint\ age} <= \mathrm{logical\ size} checkpoint age<=logical size

a s y n c   f l u s h   p o i n t < s y n c   f l u s h   p o i n t < a g r e s s i v e   c h e c k p o i n t   p o i n t < s o f t   l o g i c a l   c a p a c i t y < h a r d   l o g i c a l   c a p a c i t y < p h y s i c a l   c a p a c i t y \mathrm{async\ flush\ point} < \mathrm{sync\ flush\ point} < \mathrm{agressive\ checkpoint\ point} < \mathrm{soft\ logical\ capacity} < \mathrm{hard\ logical\ capacity} < \mathrm{physical\ capacity} async flush point<sync flush point<agressive checkpoint point<soft logical capacity<hard logical capacity<physical capacity

1 \textcolor{red}{1} 1:Redo Log 除了用户线程作为“生产者”外,还有其他线程作为“消费者”,例如 log checkpointer 线程。每个“消费者”用 c o n s u m e d _ l s n consumed\_lsn consumed_lsn 标识其已消费的 Redo Log 的位置, o l d e s t _ c o n s u m e d _ l s n oldest\_consumed\_lsn oldest_consumed_lsn 即为所有“消费者”中最小的 c o n s u m e d _ l s n consumed\_lsn consumed_lsn

检查点年龄越大,Redo Log 的空闲空间越小。为保证有足够的空闲空间,当检查点年龄达到 adaptive_flush_min_age 时,就会从 Fuzzy Checkpointing 变为 Adaptive Checkpointing,此时刷脏页的力度随着检查点年龄的增大而增大,如下图所示。

在 MySQL 中,执行以下 SQL 可以查看上述变量:

-- checkpoint age
SELECT count log_lsn_checkpoint_age
FROM information_schema.innodb_metrics
WHERE name LIKE 'log_lsn_checkpoint_age';

-- logical size
SELECT CONCAT(variable_value, " (", FORMAT_BYTES(variable_value), ")") innodb_redo_log_logical_size
FROM performance_schema.global_status
WHERE variable_name LIKE 'innodb_redo_log_logical_size';

-- physical capacity (#ib_redo[0-9]+ and #ib_redo[0-9]+_tmp)
SELECT CONCAT(@@innodb_redo_log_capacity, " (", FORMAT_BYTES(@@innodb_redo_log_capacity), ")") innodb_redo_log_capacity;

-- physical capacity (#ib_redo[0-9]+ only)
SELECT CONCAT(variable_value, " (", FORMAT_BYTES(variable_value), ")") innodb_redo_log_physical_size
FROM performance_schema.global_status
WHERE variable_name LIKE 'innodb_redo_log_physical_size';

-- hard limit for logical capacity
SELECT CONCAT(ROUND(@@innodb_redo_log_capacity * 29.8 / 32), " (", FORMAT_BYTES(ROUND(@@innodb_redo_log_capacity * 29.8 / 32)), ")") hard_logical_capacity;

-- soft limit for logical capacity
SELECT CONCAT(ROUND(count * 8 / 7), " (", FORMAT_BYTES(ROUND(count * 8 / 7)), ")") soft_logical_capacity
FROM information_schema.innodb_metrics
WHERE name LIKE 'log_max_modified_age_async';

-- aggressive checkpoint point
SELECT CONCAT(ROUND(count * 31 / 28), " (", FORMAT_BYTES(ROUND(count * 31 / 28)), ")") agressive_checkpoint_min_age
FROM information_schema.innodb_metrics
WHERE name LIKE 'log_max_modified_age_async';

-- sync flush point
SELECT CONCAT(count, " (", FORMAT_BYTES(count), ")") adaptive_flush_max_age
FROM information_schema.innodb_metrics
WHERE name LIKE 'log_max_modified_age_sync';

-- async flush point
SELECT CONCAT(count, " (", FORMAT_BYTES(count), ")") adaptive_flush_min_age
FROM information_schema.innodb_metrics
WHERE name LIKE 'log_max_modified_age_async';


欢迎关注微信公众号:fightingZh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣337-打家劫舍 III(Java详细题解)

题目链接&#xff1a;337. 打家劫舍 III - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 本体是打家劫舍的一个变形题&#xff0c;希望大家能先做198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09;&#xff0c;并看一下我上题的讲解力扣198-打家劫舍&…

【刷题】Day 3--错误的集合

hello&#xff01;又见面啦~~~ 一道习题&#xff0c;要长脑子了...... 【. - 力扣&#xff08;LeetCode&#xff09;】 【思路】 /*** Note: The returned array must be malloced, assume caller calls free().*/void Bubble_sort(int arr[], int size) {int temp;for (int i…

多速率信号处理-CIC滤波器

基本原理 级联积分梳状滤波器&#xff08;Cascade Intergrator Comb&#xff09;是多速率信号处理中一种十分高效的数字滤波器。CIC滤波器具有低通滤波器的特性&#xff0c;同时具有以下优势&#xff1a; 滤波器系数全为1&#xff0c;设计时不需要存储滤波器系数&#xff0c;…

拖放WORD文件朗读全文

把WORD拖放到tkinter的窗口&#xff0c;就可以朗读整改word文件的内容。 代码&#xff1a; # -*- coding: utf-8 -*- """ Created on Tue Sep 10 17:09:35 2024author: YBK """ import pyttsx3 import comtypes.client import os import tkint…

按包边(边框)尺寸分类异形创意圆形(饼/盘)LED显示屏有哪些种类

在LED显示屏技术日新月异的今天&#xff0c;异形创意圆形&#xff08;饼/盘&#xff09;LED显示屏凭借其独特的形态设计与广泛的应用场景&#xff0c;成为了商业展示、舞台表演、艺术装置以及户外广告等领域的宠儿。其中&#xff0c;按包边&#xff08;边框&#xff09;尺寸的不…

holynix靶机详解

靶机配置 加一个网络适配器&#xff08;网卡&#xff09; 修改MAC地址 00:0C:29:BC:05:DE 原来的网卡设置为桥接&#xff0c;随机生成MAC地址 重启靶机即可扫到靶机IP 主机探测与端口扫描 arp-scan -l 发现开放80端口 nmap -sV -A -T4 192.168.229.153 访问网站 http://1…

OpenAI O1:人工智能推理能力的新里程碑

引言 北京时间9月13日凌晨&#xff0c;OpenAI在没有任何预告的情况下&#xff0c;正式发布了其首款具有推理能力的模型——OpenAI O1。这一模型的发布&#xff0c;不仅标志着人工智能能力的新水平&#xff0c;也预示着AI技术发展的新范式。本文将详细解析OpenAI O1模型的技术特…

【计网】数据链路层:概述之位置|地位|链路|数据链路|帧

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山岗&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 1. 在OSI体系结构中的位置 1. 位置&#xff1a;数…

每日一练:K个一组翻转链表

25. K 个一组翻转链表 - 力扣&#xff08;LeetCode&#xff09; 一、题目要求 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#x…

时间复杂度计算 递归

我们先拿出 2021 csp-s 程序题中一道看着就头大的程序题&#xff0c;要求分析 solve1 的复杂度。 设 T(n) ⁡ \operatorname{T(n)} T(n) 表示数组长度为 n n n 时的复杂度&#xff08;即 m − h 1 n m-h1n m−h1n&#xff09;。 T ( 1 ) 1 T(1)1 T(1)1&#xff0c;根据…

计算机毕业设计 酷听音乐系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【SQL】百题计划:SQL排序Order by的使用。

简述&#xff1a; 排序函数&#xff1a;Order by&#xff1b;升序 ASC&#xff1b;降序 DESC&#xff1b; 答案&#xff1a; Select distinct author_id as id from Views where author_id viewer_id order by id Asc;

关于华大/小华 HC32F460 在IAR环境中,无法启用FPU 硬件浮点运算单元的解决方案

需求&#xff1a;要使用浮点FFT功能&#xff0c;面开启M4的 FPU功能 问题&#xff1a;无法开启 FPU&#xff0c;如下图所示&#xff1a;此栏为灰色&#xff0c;无法选择 尝试强制增加 __ARMVFP__&#xff1a; 编译出错&#xff0c;无法内链FPU&#xff1a; 解决方案&#xff1…

[000-01-008].第05节:OpenFeign高级特性-日志打印功能

我的后端学习大纲 SpringCloud学习大纲 1、日志打印功能&#xff1a; 1.Feign 提供了日志打印功能&#xff0c;我们可以通过配置来调整日志级别&#xff0c;从而了解 Feign 中 Http 请求的细节&#xff0c;说白了就是对Feign接口的调用情况进行监控和输出 2、日志级别: NONE&…

vue3【实战-组件封装】图文卡片

效果预览 技术要点 图片宽高比固定为 16:9&#xff0c;展示方式为 object-fit: cover通过 v-bind 实现父组件向子组件的批量传参单行文本超长显示省略号 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; title 属性实现鼠标悬浮显示文本完整内容 范例代码 …

HarmonyOS开发之使用Picker(从相册选择图片),并且通过Swiper组件实现图片预览

一&#xff1a;效果图&#xff1a; 二&#xff1a;添加依赖 import picker from ohos.file.picker; 三&#xff1a;创建showDialog showDialog() {AlertDialog.show({message: 从相册选择,alignment: DialogAlignment.Bottom,offset: { dx: 0, dy: -12 },primaryButton: {val…

Java面试、技巧、问题、回复,资源面面观

入门 先了解一下面试流程 复习 Java 基础知识&#xff1a; 温习 Java 编程的核心概念&#xff0c;包括数据类型、变量、循环、数组和面向对象的编程原则。数据结构和算法&#xff1a; 加强您对 Java 编程中使用的基本数据结构和算法的理解。练习编码&#xff1a; 在各种平台上解…

PHP一键约课高效健身智能健身管理系统小程序源码

一键约课&#xff0c;高效健身 —— 智能健身管理系统让健康触手可及 &#x1f3cb;️‍♀️ 告别繁琐&#xff0c;一键开启健身之旅 你还在为每次去健身房前的繁琐预约流程而烦恼吗&#xff1f;现在有了“一键约课高效健身智能健身管理系统”&#xff0c;所有问题都迎刃而解…

YARN----调度策略

Yarn中&#xff0c;负责给应用分配资源的就是Scheduler 在Yarn中有三种调度器可以选择&#xff1a;FIFO Scheduler &#xff0c;Capacity Scheduler&#xff0c;Fair Scheduler FIFO Scheduler 先进先出策略 在进行资源分配的时候&#xff0c;先给队列中最先上的应用进行分配…

springboot从分层到解耦

注释很详细&#xff0c;直接上代码 三层架构 项目结构 源码&#xff1a; HelloController package com.amoorzheyu.controller;import com.amoorzheyu.pojo.User; import com.amoorzheyu.service.HelloService; import com.amoorzheyu.service.impl.HelloServiceA; import o…