当前位置: 首页 > news >正文

Flink概念知识讲解之:Restart重启策略配置

Flink概念知识讲解之:Restart重启策略配置

当 Task 发生故障时,Flink 需要重启出错的 Task 以及其他受到影响的 Task ,以使得作业恢复到正常执行状态。

Flink 通过重启策略和故障恢复策略来控制 Task 重启:重启策略决定是否可以重启以及重启的间隔;故障恢复策略决定哪些 Task 需要重启。

重启策略

Flink 作业如果没有定义重启策略,则会遵循集群启动时加载的默认重启策略。 如果提交作业时设置了重启策略,该策略将覆盖掉集群的默认策略。

可以通过 Flink 的配置文件 flink-conf.yaml 来设置默认的重启策略。配置参数restart-strategy 定义了采取何种策略。 如果没有启用 checkpoint,就采用“不重启”策略。如果启用了 checkpoint 且没有配置重启策略,那么就采用固定延时重启策略, 此时最大尝试重启次数由 Integer.MAX_VALUE 参数设置。

restart-strategy从1.17版本开始之后改为restart-strategy.type

每个重启策略都有自己的一组配置参数来控制其行为。 这些参数也在配置文件中设置。 后文的描述中会详细介绍每种重启策略的配置项。

restart-strategy的可选值包括以下:

  • none, off, disable: 不重启策略。
  • fixeddelay, fixed-delay :固定延时重启策略。
  • failurerate, failure-rate: 故障率重启策略。
  • exponentialdelay, exponential-delay: 指数延迟重启策略。

接下来,我们来分别详细描述一下这些重启策略的原理。

fixed-delay 固定延时重启策略

固定延时重启策略按照给定的次数尝试重启作业。 如果尝试超过了给定的最大次数,作业将最终失败。 在连续的两次重启尝试之间,重启策略等待一段固定长度的时间。

通过在 flink-conf.yaml 中设置如下配置参数,默认启用此策略。

restart-strategy: fixed-delay

配置项:

  • estart-strategy.fixed-delay.attempts 默认值 1 ,也就是默认重启1一次。请注意这个和没有配置重启策略的默认值不一样,没有配置策略,默认值为 Integer.MAX_VALUE
  • restart-strategy.fixed-delay.delay 默认值 1 s ,两次连续重新启动尝试之间的延迟时间。如:1 min 、 20 s

举例如下:

restart-strategy: fixed-delay
restart-strategy.fixed-delay.attempts: 3
restart-strategy.fixed-delay.delay: 10 s

在这种配置下,如果任务从 “Restarting” 状态变成了 “Running”,然后再次因为异常变成 “Restarting”,那么重启次数并不会重新计数。 restart-strategy.fixed-delay.attempts 这个参数设置的是在整个任务运行期间最多允许重启的次数,而不是连续失败时的最多重启次数。也就是说,无论任务在运行过程中的任何时间点出现异常,只要累计的重启次数没有超过 5 次,都会尝试进行重启。因此,即使任务在重启后恢复运行,但后续再次失败,重启次数仍会继续累计,而不会重新计数。

failure-rate 故障率重启策略

故障率重启策略在故障发生之后重启作业,但是当故障率(每个时间间隔发生故障的次数)超过设定的限制时,作业会最终失败。 在连续的两次重启尝试之间,重启策略等待一段固定长度的时间。

通过在 flink-conf.yaml 中设置如下配置参数,默认启用此策略。

restart-strategy: failure-rate

配置项:

  • restart-strategy.failure-rate.max-failures-per-interval: 这个设置是在给定的时间间隔内允许的最大失败次数。例如,如果设置为 3,则表示在设定的时间间隔内,如果作业失败了超过3次,Flink将不再尝试重启作业。
  • restart-strategy.failure-rate.failure-rate-interval: 这个设置是用于测量故障率的时间窗口。这个时间间隔与上一个参数一起使用,例如,如果设置为 “1 min”,则 Flink 会在每个 “1 min” 的时间段内跟踪作业失败次数,并与 max-failures-per-interval 的设置进行比较。
  • restart-strategy.failure-rate.delay: 这是连续两次尝试重新启动作业之间的延迟时间。例如,如果作业失败后立即尝试进行重启,然后又失败,此设置将使 Flink 在下一次尝试重新启动之前等待指定的时间。此设置有助于避免作业在出现持续性问题时过于频繁地尝试重启。

举例如下:

restart-strategy: failure-rate
restart-strategy.failure-rate.max-failures-per-interval: 3
restart-strategy.failure-rate.failure-rate-interval: 5 min
restart-strategy.failure-rate.delay: 10 s

exponential-delay 指数延迟重启策略

指数延迟重启策略在两次连续的重新启动尝试之间,重新启动的延迟时间不断呈指数增长,直到达到最大延迟时间。 然后,延迟时间将保持在最大延迟时间。

当作业正确地执行后,指数延迟时间会在一些时间后被重置为初始值,这些阈值可以被配置。

restart-strategy.type: exponential-delay

配置项:

  • restart-strategy.exponential-delay.attempts-before-reset-backoff

    • 默认值 infinite ,如果重新启动策略已设置为指数延迟,则表示Flink 在任务失败前重试执行的次数。一旦 backoff 被重置为其初始值,该数字将被重置。
  • restart-strategy.exponential-delay.backoff-multiplier:

    • 指数延迟重启策略的基本工作原理是,在每一次 任务失败并需要重启时,系统都会等待一段时间,这段时间就被称为 “backoff”。 系统初始的 “backoff” 时间由 restart-strategy.exponential-delay.initial-backoff 这个配置项来设定。

      当任务连续失败时,为了防止过于频繁的重启,可能使得问题更加严重,系统会在每次重启之前将 “backoff” 时间进行延长。这个延长就是按照指数递增的:每一次延长的 “backoff” = 当前的 “backoff” * restart-strategy.exponential-delay.backoff-multiplier

      比如说,如果你的 initial-backoff 是 10s,而 backoff-multiplier 是 2,那么:

      • 第1次重启会等待 10s
      • 第2次重启会等待 10s * 2 = 20s
      • 第3次重启会等待 20s * 2 = 40s
      • 以此类推

      通过这种方式,Flink 可以在遇到持续性的问题时,通过逐渐增加重启间隔,为系统提供恢复的时间,同时也避免了过于频繁的重启导致的系统压力。

  • restart-strategy.exponential-delay.initial-backoff:

    • restart-strategy.exponential-delay.initial-backoff 配置项用于设置每次重新启动任务时的初始暂停(backoff)时间。默认值是 1 秒。这个配置项的影响是,在任务失败后,将等待这个初始暂停时间后才进行第一次重启尝试。
  • restart-strategy.exponential-delay.jitter-factor:

    • restart-strategy.exponential-delay.jitter-factor 默认值是0.1,表示实际重启间隔在计算出的间隔基础上会添加或减去最多10%的时间。 假设按照指数间隔计算出的重启间隔是100秒,那么加入抖动因子后,实际的重启间隔将在90秒到110秒之间。

      例如,假设我们的 backoff 时间是 10s,乘数为 2,抖动因子为 0.1。那么在第一次任务失败后,重启的等待时间将在 9s 到 11s 之间(±10%)。如果任务再次失败,那么下一次的等待时间将在 (2*10s)90% 到 (210s)*110% 之间,即 18s 到 22s。这样就能够在一定程度上避免多个作业同时重启的问题,从而更好地利用资源,提高系统的稳定性和效率。

  • restart-strategy.exponential-delay.max-backoff:

    • restart-strategy.exponential-delay.max-backoff 是 Flink 的指数延时重启策略中的一个配置项,其作用是设置每次尝试重新启动任务之间的最大暂停持续时间。其默认值是 “1 min”,代表最大的等待重启时间是 1 分钟。
    • 在 exponential-delay 类型的重启策略中,每次任务失败后的重启等待时间会按照一个乘数进行增长,这个乘数是由 restart-strategy.exponential-delay.backoff-multiplier 配置项进行控制的。但无论这个乘数设置为多少,实际的等待时间都不会超过 restart-strategy.exponential-delay.max-backoff 所设置的值。
  • restart-strategy.exponential-delay.reset-backoff-threshold:

    • restart-strategy.exponential-delay.reset-backoff-threshold"是 Flink 指数延迟重启策略中的一个配置项,其默认值为 “1h”。 这个参数的作用是,设定一个时间阈值,当作业能够成功运行超过这个阈值的时间之后,下一次如果出现任务失败,计算重启时间间隔也就是backoff会被重置为初始值。换句话说,这是判断系统是否已经从错误恢复,并将失败尝试次数重置的指标。

    • 为什么要这么设计呢?

      在指数延迟重启策略中,每次任务失败后的重启等待时间会按照一个乘数进行增长,这个乘数是由 restart-strategy.exponential-delay.backoff-multiplier 配置项进行控制的。然而,这种策略存在一个问题,也就是如果曾有过一段时间的失败,会导致后续的重启间隔变得非常长。

      因此,restart-strategy.exponential-delay.reset-backoff-threshold 就派上了用场。如果一个任务在一段时间(例如 “1h”)内没有失败,那么我们可以认为,这个任务已经从之前的错误中恢复过来。那么下一次如果再出现任务失败,我们就可以将backoff重置为初始值,而不需要采取以前因为连续错误而逐渐增加的延迟时间。

举例如下:

restart-strategy: exponential-delay
restart-strategy.exponential-delay.initial-backoff: 10 s
restart-strategy.exponential-delay.max-backoff: 2 min
restart-strategy.exponential-delay.backoff-multiplier: 1.4
restart-strategy.exponential-delay.reset-backoff-threshold: 10 min
restart-strategy.exponential-delay.jitter-factor: 0.1
restart-strategy.exponential-delay.attempts-before-reset-backoff: 10

默认重启策略

默认情况下,没有开启 checkpoint ,不重启。开启 checkpoint ,默认采用固定延时重启策略。但是默认 1s 重启一次,且会一直尝试重启,没有上限次数。这种频繁无限的默认重启策略是不合理的,可能会导致外部组件雪崩,也会一直占用计算资源。

所以在 1.19版本,默认策略改为指数延迟重启策略。我们强烈推荐 Flink 用户使用指数延迟重启策略,因为使用这个策略时, 作业偶尔异常可以快速重试,作业频繁异常可以避免外部组件发生雪崩。原因如下所示:

  • 所有的重启策略在重启作业时都会延迟一定的时间来避免频繁重试对外部组件的产生较大压力。
  • 除了指数延迟重启策略以外的所有重启策略延迟时间都是固定的。
  • 如果延迟时间设置的过短,当作业短时间内频繁异常时,会频繁重启访问外部组件的主节点,可能导致外部组件发生雪崩。例如:大量的 Flink 作业都在消费 Kafka,当 Kafka 集群出现故障时大量的 Flink 作业都在同一时间频繁重试,很可能导致雪崩。
  • 如果延迟时间设置的过长,当作业偶尔失败时需要等待很久才会重试,从而导致作业可用率降低。
  • 指数延迟重启策略每次重试的延迟时间会指数递增,直到达到最大延迟时间。
  • 延迟时间的初始值较短,所以当作业偶尔失败时,可以快速重试,提升作业可用率。
  • 当作业短时间内频繁失败时,指数延迟重启策略会降低重试的频率,从而避免外部组件雪崩。
  • 除此以外,指数延迟重启策略的延迟时间支持抖动因子 (jitter-factor) 的配置项。
  • 抖动因子会为每次的延迟时间加减一个随机值。
  • 即使多个作业使用指数延迟重启策略且所有的配置参数完全相同,抖动因子也会让这些作业分散在不同的时间重启。

相关文章:

Flink概念知识讲解之:Restart重启策略配置

Flink概念知识讲解之:Restart重启策略配置 当 Task 发生故障时,Flink 需要重启出错的 Task 以及其他受到影响的 Task ,以使得作业恢复到正常执行状态。 Flink 通过重启策略和故障恢复策略来控制 Task 重启:重启策略决定是否可以…...

[java基础-集合篇]LinkedList源码粗析

LinkedList 的数据结构 实现List、Deque 接口,基于 双向链表实现的列表。与基于数组的 ArrayList 不同,基于链表的LinkedList 允许在列表的任何位置快速地插入和删除元素。 Java中LinkedList实现了Deque,它提供了 add, offer, remove, poll, …...

面试:C++类成员初始化顺序

1、非静态数据成员:按它们在类定义的声明顺序初始化,不会按它们在初始化列表的顺序。 2、静态数据成员:在main函数启动之前,并且只初始化一次 3、基类构造函数:如果类从一个或多个基类继承而来,基类的构造…...

【Python】Python与C的区别

文章目录 语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数数据输出print()函数 语句结束符 C 语言 C 语言中每条语句必须以分号;结束。例如,int a 10;、printf("Hello, World!");。分号是语句的一部分,用于…...

[开源]自动化定位建图系统(视频)

系统状态机: 效果展示: 1、 机器人建图定位系统-基础重定位,定位功能演示 2、 机器人建图定位系统-增量地图构建,手动回环检测演示 3、… 开源链接: https://gitee.com/li-wenhao-lwh/lifelong-backend Qt人机交互…...

ISP流程--去马赛克详解

前言 本期我们将深入讨论ISP流程中的去马赛克处理。我们熟知,彩色图像由一个个像元组成,每个像元又由红、绿、蓝(RGB)三通道构成。而相机传感器只能感知光的强度,无法直接感知光谱信息,即只有亮暗而没有颜色…...

Objective-C语言的软件工程

Objective-C语言的软件工程探讨 引言 在软件工程的领域中,编程语言的选择是至关重要的。Objective-C,作为一种为苹果公司的macOS和iOS操作系统而开发的编程语言,凭借其灵活性和强大的功能被广泛应用于应用开发。然而,随着Swift等…...

Objective-C语言的语法糖

Objective-C语言的语法糖探秘 在编程语言的发展历程中,语法糖(Syntactic Sugar)是一个颇具趣味性和重要性的概念。它让编程的表达更加简洁直观,同时提高了代码的可读性和可维护性。Objective-C 作为一种面向对象的编程语言&#…...

设计模式中的代理模式

在Java中,代理模式(Proxy Pattern)可以通过静态代理和动态代理两种主要方式实现。 一、静态代理模式 在编译时就已经确定了代理类和被代理类的关系。 代理类和目标对象通常实现相同的接口或继承相同父类。 缺点是对于每个需要代理的目标对象…...

15个学习Python 的编程游戏网站

从小很多人都会在想,那些枯燥的教学课程要是全部变成游戏就好了,这样的话那期末成绩不得立即起飞了嘛?那对于编程很多人也有这样的想法,边玩边学就好了 这不已经有很多程序员开发了多款边玩边学的编程游戏供大家使用,…...

微信小程序实现拖拽盒子效果

要实现一个当前盒子高度由里面的盒子进行支配高度拖拽的效果 // wxml<view class"exmation-item" wx:elif"{{type4}}"> <view class"exmation-item-drag-box" id"drag-box"> <!-- 内容 --><view class"exm…...

Linux-蓝牙协议

SPP (Serial Port Profile): 串口协议&#xff08;SPP&#xff09;是一个蓝牙配置文件&#xff0c;允许设备通过蓝牙模拟传统的串行端口通信。它通常用于无线串口连接&#xff0c;允许设备如计算机和外设&#xff08;例如打印机或条形码扫描器&#xff09;之间进行数据传输。A…...

moviepy 将mp4视频文件提取音频mp3 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…...

imageio 图片转mp4 保存mp4

目录 安装&#xff1a; imageio 图片转mp4 numpy 保存mp4 安装&#xff1a; FFMPEG: pip install imageio[ffmpeg] pyav: pip install imageio[pyav] imageio 图片转mp4 import glob import osimport cv2 import imageio from natsort import natsortedfrom PIL import …...

Postman接口测试04|批量运行测试用例、参数化、Mock Server、Cookie鉴权、Newman生成测试报告

目录 十一、Postman批量运行测试用例 十二、实现数据驱动&#xff08;也称参数化&#xff09; 1、csv文件 1️⃣编辑csv文件 2️⃣更新参数的值 3️⃣修改测试脚本和断言 5️⃣批量运行测试用例 2、Json文件 1️⃣编辑Json文件 2️⃣其他操作和处理csv文件相同 十三、…...

学技术学英语:http状态码 401 Unauthorized vs 403 Forbidden

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a;先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 unauthorized未授权的/ˌʌnˈɔːθəraɪzd/authentication认证/…...

@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…...

React(二)——Admin主页/Orders页面/Category页面

文章目录 项目地址一、侧边栏1.1 具体实现 二、Header2.1 实现 三、Orders页面3.1 分页和搜索3.2 点击箭头显示商家所有订单3.3 页码按钮以及分页 四、Category页面4.1 左侧商品添加栏目4.2 右侧商品上传栏 五、Sellers页面六、Payment Request 页面&#xff08;百万数据加载&a…...

移动端屏幕分辨率rem,less

谷歌模拟器&#xff1a;能直接看到移动端效果 屏幕分辨率 右键电脑桌面 &#xff0c;点击显示设置 PC端是逻辑分辨率&#xff0c;移动端代码也是参考逻辑分辨率 网页端宽度和逻辑分辨率尺寸相同 手机屏幕尺寸不同&#xff0c;网页宽度均为 100% 所以就需要添加视口标签&#x…...

Docker Desktop 构建java8基础镜像jdk安装配置失效解决

Docker Desktop 构建java8基础镜像jdk安装配置失效解决 文章目录 1.问题2.解决方法3.总结 1.问题 之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像&#xff0c;前几天我使用Docker Desktop环境重新构建了一个…...

数据结构:栈(Stack)和队列(Queue)—面试题(一)

目录 1、括号匹配 2、逆波兰表达式求值 3、栈的压入、弹出序列 4、最小栈 1、括号匹配 习题链接https://leetcode.cn/problems/valid-parentheses/description/ 描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] …...

AR 眼镜之-拍照/录像动效切换-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 拍照/录像动效切换 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;第一阶段动效 2&#xff09;第二阶段动效 2. &#x1f4a0; 默认代码配置 2.1 XML 初始布局 2.2 监听滑动对 View 改变 3. ⚛️…...

2025年中科院分区大类划分公布!新增8155本

2025年中科院分区表变更情况 扩大收录范围 2025年的期刊分区表在原有的自然科学&#xff08;SCIE&#xff09;、社会科学&#xff08;SSCI&#xff09;和人文科学&#xff08;AHCI&#xff09;的基础上&#xff0c;增加了ESCI期刊的收录&#xff0c;并根据这些期刊的数据进行…...

S变换matlab实现

S变换函数 function [st,t,f] st(timeseries,minfreq,maxfreq,samplingrate,freqsamplingrate) % S变换 % Code by huasir Beijing 2025.1.10 % Reference is "Localization of the Complex Spectrum: The S Transform" % from IEEE Transactions on Signal Proc…...

Springboot——钉钉(站内)实现登录第三方应用

文章目录 前言准备1、创建钉钉应用&#xff0c;并开放网页应用2、配置网页应用各项参数发布版本 前端改造后端逻辑1、获取应用免登录 Access_token2、通过免登录 Access_token 和 Auth_Code 获取对应登录人信息 注意事项 前言 PC端的钉钉中工作台&#xff0c;增加第三方应用&a…...

基于深度学习算法的AI图像视觉检测

基于人工智能和深度学习方法的现代计算机视觉技术在过去10年里取得了显著进展。如今&#xff0c;它被广泛用于图像分类、人脸识别、图像中物体的识别等。那么什么是深度学习&#xff1f;深度学习是如何应用在视觉检测上的呢&#xff1f; 什么是深度学习&#xff1f; 深度学习是…...

cJson——序列化格式json和protobuf对比

cJson——序列化格式json和protobuf对比 1. 更小的消息体积2. 更快的序列化与反序列化速度3. 类型安全4. 向后和向前兼容性5. 更低的带宽消耗6. 高效的编码方式7. 易于跨语言支持8. 支持复杂的数据结构9. 更好的支持大型数据交换总结 Protocol Buffers (Protobuf) 和 JSON 都是…...

搭建一个fastapi的项目,调用ollama服务

1. 项目结构 my_project/ │ ├── app/ │ ├── main.py # FastAPI应用的入口 │ ├── services/ # 包含服务逻辑 │ │ └── ollama_service.py │ ├── models/ # 定义数据模型 │ │ └── response.py │ ├─…...

Wireshark编译手册(Windows)

以下是对 Wireshark 官方文档中“Windows 平台的设置和构建说明”部分的翻译和总结&#xff1a; 2.2. Windows 平台 本节提供了在 Windows 上进行 Wireshark 开发的快速设置指南&#xff0c;包含推荐的配置。 2.2.1. 使用 Microsoft Visual Studio 注意&#xff1a;除非您非…...

在高德地图上加载3DTilesLayer图层模型/天地瓦片

1. 引入必要的库 Three.js&#xff1a;一个用于创建和显示3D图形的JavaScript库。vuemap/three-layer&#xff1a;一个Vue插件&#xff0c;它允许你在高德地图中添加Three.js图层。vuemap/layer-3dtiles&#xff1a;一个用于处理3D Tiles格式数据的Vue插件&#xff0c;可以用来…...

设计做网站/展示型网站有哪些

如需转载请标明出处&#xff1a;http://blog.csdn.net/itas109 QQ技术交流群&#xff1a;129518033 下载了网易公开课的视频之后&#xff0c;发现它的中文和英文字母是分开的&#xff0c;用其他播放器打开的时候只能载入一个字幕&#xff0c;于是就想合并2个文件 思路&#xf…...

西昌市做网站的公司/平台推广引流怎么做

1.构建本地拓展的ActionScript库时候要注意SWF文件的版本兼容性&#xff1a; 参考&#xff1a;http://help.adobe.com/zh_CN/air/extensions/WS99209310cacd98cc2d13931c1300f2c84c7-8000.html 2.使用Flash Builder导出用于发行的APk包&#xff1a; 参考&#xff1a;http://hel…...

佛山正规网站建设哪家好/北大青鸟培训机构官网

IC卡解密工具 PN532工具XP 爆破版 By:lookyour 传送门 //2017/4/25 IC卡解密从零开始学1 (也许会有2) 解密工具V2 V3大放送http://www.52pojie.cn/thread-602693-1-1.htmlIC卡解密从零开始学2 解密工具PN532-mfoc-mfcuk-GUIhttp://www.52pojie.cn/thread-604402-1-1.html//当了…...

做网站推广和头条推广/app网络推广方案

最近在做项目中&#xff0c;用Maven管理项目间的依赖关系&#xff0c;遇到一个问题&#xff0c;快折腾死了&#xff0c;不过初步试出来一种解决方案。在此把问题及解决方案描述一下&#xff0c;以资共享。 问题描述&#xff1a;有两个项目A和B&#xff0c;Dynamic Web Projec…...

centos。wordpress/网络营销形式

mac自带python和pip等工具&#xff0c;但是在使用安装scrapy时&#xff0c;报了一些错&#xff0c;因为对操作系统一些核心目录&#xff08;比如/Library&#xff09;没有可操作权限&#xff0c;mac有自己的一些权限控制程序&#xff08;非sudo chmod能改变&#xff09;&#x…...

下载软件网站/百度网站首页提交入口

十天瘦TM十斤如何在短时间内减轻体重什么样的人适合减肥减肥前的调整减肥的原理减肥7分靠吃 3分靠练如何在短时间内减轻体重 首先&#xff0c;体重的迅速变化&#xff0c;突然胖了或者突然瘦了&#xff0c;都是不正常、不健康的。因此下面介绍一种在合理范围内的减肥方法 什么…...