更新时间:2024-10-26 GMT+08:00
分享

配置Elasticsearch集群读写流量控制策略2.0

场景描述

流量控制2.0提供节点级别的流量控制功能,可提供单个节点基于黑白名单的访问限制、HTTPS并发连接数限制、HTTP最大连接数限制,基于节点内存的客户端写入流量反压控制,一键断流能力。同时也提供节点访问IP统计和URL的统计能力。开启客户端写入流量反压控制功能,会在节点堆内存过大时阻止大请求涌入节点占用内存,避免节点崩溃,减少节点不可用的风险。

表1 流量控制策略

策略

描述

相关文档

HTTP/HTTPS流控

  • HTTP/HTTPS黑白名单设置IP和子网控制客户端IP访问,如果节点IP在黑名单中,则该客户端的连接将直接中断,节点不会处理任何请求。白名单规则优先于黑名单规则,如果客户端IP在黑白名单中都出现,客户端请求将不会被拒绝。
  • HTTP/HTTPS并发连接数流控通过限制节点每秒中的HTTP连接总数来限制节点流量。
  • HTTP/HTTPS新建连接数流控通过限制节点新建的连接数来限制节点流量。

开启HTTP/HTTPS节点流控

内存流控

基于节点堆内存使用量限制写入流量,将请求需要读取的内容反压在客户端,暂停请求的接收。同时尽力触发垃圾回收,按堆内存的空闲量继续读取请求。

开启内存流控

请求采样统计

可以记录客户端IP的访问和客户端的请求类型,用户可以基于统计值识别客户端IP的访问流量,分析当前客户端的写入和查询访问量。

开启请求采样统计

一键断流

可以切断节点的所有客户端连接,不包括Kibana访问和CSS后台运维、监控类接口。用于应对突发流量场景下的集群异常,达到快速恢复集群的目的。

开启一键断流

流量控制

提供单独的流量统计接口,记录当前客户端连接数以及客户端反压连接数,用户可以基于统计值评估流控配置阈值和衡量集群压力。

查看流量控制信息

访问日志

可以记录一段时间内节点接收的HTTP/HTTPS请求URL和Body,用户可以基于访问日志信息分析当前的流量压力。

开启并查看访问日志

访问日志记录

客户端访问集群节点,会记录为{集群名_access_log.log}访问日志文件,通过日志备份功能可以在OBS详细查看访问日志。

开启访问日志记录到文件

约束限制

  • 2023年02月及之后创建的Elasticsearch 7.6.2和Elasticsearch 7.10.2集群仅支持流量控制2.0版本,之前创建Elasticsearch 7.6.2和Elasticsearch 7.10.2集群仅支持流量控制1.0版本。
  • 开启流量控制功能会消耗部分节点性能。
  • 开启流量控制会直接拒绝超过阈值的用户请求。
  • 开启内存流控会消耗部分请求性能,开启内存流控会导致Kibana的部分search请求失败。
  • 开启访问日志会影响集群性能。
  • 内存流控是基于请求Path的流控,Path长度和个数不应该配置过多,否则影响集群性能。

开启HTTP/HTTPS节点流控

  1. 执行如下命令,开启HTTP/HTTPS节点流控。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.http.enabled": true,
        "flowcontrol.http.allow": ["192.168.0.1/24", "192.168.2.1/24"],
        "flowcontrol.http.deny": "192.168.1.1/24",
        "flowcontrol.http.concurrent": 1000,
        "flowcontrol.http.newconnect": 1000,
        "flowcontrol.http.warmup_period": 0
      }
    }
    表2 HTTP/HTTPS流控的配置项说明

    配置项

    类型

    说明

    flowcontrol.http.enabled

    Boolean

    HTTP/HTTPS流控开关,默认关闭,开启会影响节点访问性能。

    取值范围:true、false

    默认值:false

    flowcontrol.http.allow

    List<String>

    IP地址访问白名单。

    支持配置多个IP地址和掩码,或者IP地址列表形式,中间用英文逗号隔开。例如“xx.xx.xx.xx/24,xx.xx.xx.xx/24”“xx.xx.xx.xx,xx.xx.xx.xx”形式。

    默认值为空。

    flowcontrol.http.deny

    List<String>

    IP访问黑名单。

    支持配置多个IP和掩码,或者IP列表形式,中间用英文逗号隔开。

    默认值为空。

    flowcontrol.http.concurrent

    Integer

    HTTP/HTTPS请求的并发连接数阈值。

    默认值:节点可用核数x600

    flowcontrol.http.newconnect

    Integer

    HTTP/HTTPS请求的每秒可以创建的新建连接数阈值。

    默认值:节点可用核数x200

    flowcontrol.http.warmup_period

    Integer

    HTTP/HTTPS新建连接数达到最大速率的需要的时间,如果“flowcontrol.http.newconnect”配置为“100”“flowcontrol.http.warmup_period”配置为“5000ms”,表示5s以后系统的新建连接数才可以达到每秒100。

    取值范围:0~10000

    单位:ms

    默认值:0

    当所有参数值设置为“null”时,表示恢复配置默认值。

  2. 执行如下命令,关闭HTTP/HTTPS节点流控。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.http.enabled": false
      }
    }

开启内存流控

  1. 执行如下命令,开启内存流控。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.memory.enabled": true,
        "flowcontrol.memory.heap_limit": "80%"
      }
    }
    表3 内存流控的配置项说明

    配置项

    类型

    说明

    flowcontrol.memory.enabled

    Boolean

    内存流控开关,开启后持续监控内存使用情况。

    取值范围:
    • true
    • false(默认值)

    flowcontrol.memory.heap_limit

    String

    节点堆内存的阈值,限制节点全局堆内存的使用率,超过此值将进行流量反压。

    取值范围:10%-100%

    默认值:90%

    说明:
    • 默认值90%是一个比较保守的阈值,即堆内存大于90%使用量时会停止读取客户端超过64KB的大请求,直至堆内存下降。如堆内存下降到85%,会开始允许最多一次读取“5%×堆内存最大值”的客户端数据量。如果堆内存持续超过90%,则无法放开客户端连接的请求读取,此时会尝试触发GC算法进行垃圾回收,直到堆内存低于所设定的阈值。
    • 日常使用时可以将“flowcontrol.memory.heap_limit”阈值设置为80%或以下,保证节点有一定的堆内存余量,供写入内存以外的行为使用,比如:Elasticsearch查询、Segment merge等。

    flowcontrol.holding.in_flight_factor

    Float

    反压释放因子,原理类似于熔断器“network.breaker.inflight_requests.overhead”参数。内存达到限制值时,该值越大反压越强,写入流量将受限。

    取值范围:≥0.5

    默认值:1.0

    flowcontrol.holding.max

    TimeValue

    每个请求最长的延迟时间,当延迟超过此值时可以设置断开该请求反压或断开请求链路。详见“flowcontrol.holding.max_strategy”配置。

    取值范围:≥15s

    默认值:60s

    flowcontrol.holding.max_strategy

    String

    超过最大延迟时间后的运行策略。

    取值范围:
    • keep(默认值):如果堆内存仍在高位,选择继续反压 - 何时执行请求仍由服务器根据实时内存自主决定。
    • soft:如果堆内存仍在高位,也必须执行该请求。执行/拒绝权力交给inFlight熔断器。
    • hard:如果堆内存仍在高位,丢弃该请求,同时断开该请求的客户端连接。

    flowcontrol.memory.once_free_max

    String

    被暂停的请求队列一次性最大重新打开的内存,防止强压场景下短暂的低内存现象一次性冲挂集群。

    取值范围:1%-50%

    默认值:10%

    flowcontrol.memory.nudges_gc

    Boolean

    写入压力过大时(1s检查一次反压连接池,所有现有连接均被阻塞无法放开新的写入请求),是否尽力触发垃圾回收,保证写入稳定性。取值:

    • true(默认值)
    • false

    当所有参数值设置为“null”时,表示恢复配置默认值。

  2. 执行如下命令,关闭集群内存流控。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.memory.enabled": false
      }
    }

开启请求采样统计

  1. 执行如下命令,开启请求采样统计。
    PUT _cluster/settings
    {
      "transient": {
        "flowcontrol.log.access.enabled": true
      }
    }
    表4 请求采样统计的配置项说明

    配置项

    类型

    说明

    flowcontrol.log.access.enabled

    Boolean

    请求采样统计开关,统计最近访问Elasticsearch集群的客户端IP地址及其请求数量,会统计bulk写入和search、msearch查询请求的个数。

    取值范围:
    • true
    • false(默认值)

    flowcontrol.log.access.count

    Integer

    统计最近IP地址访问集群的客户端来源个数。IP统计分为请求类型统计和日志记录开关。

    取值范围:0-100

    默认值:10

    当所有参数值设置为“null”时,表示恢复配置默认值。

  2. 执行如下命令,关闭请求采样统计。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.log.access.enabled": false
      }
    }

开启一键断流

  1. 执行如下命令,开启一键断流。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.break.enabled": true
      }
    }
  2. 执行如下命令,关闭一键断流。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.break.enabled": false
      }
    }

查看流量控制信息

  • 查看所有节点的流量控制情况
    GET /_nodes/stats/filter/v2
  • 查看所有节点的流量控制详细情况
    GET /_nodes/stats/filter/v2?detail
  • 查看某个具体节点的流量控制情况
    GET /_nodes/{nodeId}/stats/filter/v2

    “{nodeId}”为需要查看流量控制的节点ID。

响应示例:
{
  "_nodes" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "cluster_name" : "css-xxxx",
  "nodes" : {
    "d3qnVIpPTtSoadkV0LQEkA" : {
      "name" : "css-xxxx-ess-esn-1-1",
      "host" : "192.168.x.x",
      "timestamp" : 1672236425112,
      "flow_control" : {
        "http" : {
          "current_connect" : 52,
          "rejected_concurrent" : 0,
          "rejected_rate" : 0,
          "rejected_black" : 0,
          "rejected_breaker" : 0
        },
        "access_items" : [
          {
            "remote_address" : "10.0.0.x",
            "search_count" : 0,
            "bulk_count" : 0,
            "other_count" : 4
          }
        ],
        "holding_requests" : 0
      }
    }
  }
}
表5 响应参数说明

参数名

说明

current_connect

节点实际的HTTP连接数据信息, 没有开启流控这个配置也会记录,等同于GET /_nodes/stats/http接口current_open值, 可以看到节点当前的客户端连接数。

rejected_concurrent

HTTP流控开启生效,关闭后不清零,开启流控期间拒绝的并发连接数。

rejected_rate

HTTP流控开启生效,关闭后不清零,开启流控期间拒绝的新建连接数。

rejected_black

HTTP流控开启生效,关闭后不清零,配置黑名单拒绝的请求数。

rejected_breaker

一键断流开启,拒绝的新建连接数。

remote_address

IP地址统计,基于配置值统计节点访问的IP地址和请求数量。

search_count

该客户端以_search、_msearch访问的次数。

bulk_count

该客户端以_bulk访问的次数。

other_count

该客户端其他请求的访问次数。

开启并查看访问日志

  1. 执行如下命令,开启访问日志。
    • 开启集群所有节点的访问日志
      PUT /_access_log?duration_limit=30s&capacity_limit=1mb
    • 开启集群中某一节点的访问日志
      PUT /_access_log/{nodeId}?duration_limit=30s&capacity_limit=1mb

      “{nodeId}”为节点ID。

    表6 访问日志的配置项说明

    配置项

    类型

    说明

    duration_limit

    String

    访问日志记录时间。

    取值范围:10~120

    单位:s

    默认值:30

    capacity_limit

    String

    访问日志记录大小。统计开启访问日志后记录的请求大小,当统计的大小大于该配置值,访问日志记录终止。

    取值范围:1~5

    单位:MB

    默认值:1

    • “duration_limit”“capacity_limit”只要有一个参数达到阈值,访问日志记录就会停止。
    • 当所有参数值设置为“null”时,表示恢复配置默认值。
  2. 执行如下命令,查看访问日志。
    • 查看集群所有节点的访问日志API
      GET /_access_log
    • 查看集群中某一节点的访问日志API
      GET /_access_log/{nodeId}

      “{nodeId}”为节点ID。

    响应示例:
    {
      "_nodes" : {
        "total" : 1,
        "successful" : 1,
        "failed" : 0
      },
      "cluster_name" : "css-flowcontroller",
      "nodes" : {
        "8x-ZHu-wTemBQwpcGivFKg" : {
          "name" : "css-flowcontroller-ess-esn-1-1",
          "host" : "10.0.0.98",
          "count" : 2,
          "access" : [
            {
              "time" : "2021-02-23 02:09:50",
              "remote_address" : "/10.0.0.98:28191",
              "url" : "/_access/security/log?pretty",
              "method" : "GET",
              "content" : ""
            },
            {
              "time" : "2021-02-23 02:09:52",
              "remote_address" : "/10.0.0.98:28193",
              "url" : "/_access/security/log?pretty",
              "method" : "GET",
              "content" : ""
            }
          ]
        }
      }
    }
    表7 响应参数说明

    参数名

    说明

    name

    节点名称。

    host

    节点对应的IP地址。

    count

    统计周期内,访问节点的请求数量。

    access

    统计周期内,访问节点的请求详情。参数说明请参见表8

    表8 access

    参数名

    说明

    time

    记录请求时间。

    remote_address

    请求对应的源IP地址和端口。

    url

    请求的原始URL

    method

    对应请求Path的方法。

    content

    对应请求的内容。

  3. 执行命令删除访问日志。
    • 删除集群所有节点的访问日志API
      DELETE /_access_log
    • 删除集群中某一节点的访问日志API
      DELETE /_access_log/{nodeId}

      “{nodeId}”为节点ID。

开启访问日志记录到文件

  • 开启访问日志记录到文件后,客户端访问集群节点,会记录为{集群名_access_log.log}文件,通过日志备份功能可以在OBS详细查看访问日志。
  • 该功能一般用于定位问题,问题解决后,建议关闭此开关。
  1. 执行如下命令,开启访问日志记录到文件。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.log.file.enabled": true
      }
    }
    表9 访问日志记录到文件的配置项说明

    参数

    类型

    说明

    flowcontrol.log.file.enabled

    Boolean

    是否将每个请求的日志详情记录到后台日志文件。

    取值范围:
    • true
    • false(默认值)
  2. 执行如下命令,关闭访问日志记录到文件。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.log.file.enabled": false
      }
    }

相关文档