更新时间:2024-10-25 GMT+08:00

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

场景描述

流量控制1.0提供节点级别的流量控制功能,可提供单个节点基于黑白名单的访问限制、HTTP并发连接数限制、HTTP最大连接数限制、基于请求Path的堆内存最大使用量流控能力、基于CPU最大占用率流控能力,一键断流能力,同时也提供节点访问IP统计和URL的采样统计能力。开启流控功能会使请求在入口处直接阻塞,可以缓解节点高并发场景下的集群压力,降低P99时延,减少节点不可用的风险。

表1 流量控制策略

策略

描述

相关文档

HTTP/HTTPS流控

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

开启HTTP/HTTPS节点流控

内存流控

基于节点堆内存使用量限制请求Path,支持设置内存流控白名单、全局内存使用阈值和基于单个Path设置堆内存使用阈值。全局内存流控阈值优先于单个Path内存阈值,白名单配置Path不参与内存流控。

开启内存流控

Path全局免流控白名单

可以根据客户需要,设置Path白名单全局免流控,当用户需要自定义插件时,可适当配置。

添加Path全局免流控白名单

请求采样统计

可以记录客户端IP的访问数量和采样用户的请求Path,用户可以基于统计值识别客户端IP的访问流量和分析哪些请求Path访问量大。

开启请求采样统计

一键断流

可以切断节点的所有访问流量,不包括kibana访问和elasticsearch monitor类接口。

开启一键断流

流量控制

提供单独的流量统计查看接口,记录触发流控的数量,用户可以基于统计值评估流控配置阈值和衡量集群压力。

查看流量控制信息

访问日志

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

开启并查看访问日志

访问日志记录

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

开启访问日志记录到文件

CPU流控

基于节点配置的最大CPU占用率来限制节点访问流量。

开启CPU流控

约束限制

  • 2023年02月及之后创建的Elasticsearch 7.6.2和Elasticsearch 7.10.2集群仅支持流量控制2.0版本,之前创建Elasticsearch 7.6.2和Elasticsearch 7.10.2集群仅支持流量控制1.0版本。
  • 开启流量控制功能会消耗部分节点性能。
  • 开启流量控制会直接拒绝超过阈值的用户请求。
  • 开启内存流控会消耗部分请求性能,开启内存流控会导致Kibana的部分search请求失败。
  • 开启访问日志会影响集群性能。
  • 内存流控和CPU流控都是基于请求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
      }
    }

开启内存流控

Elasticsearch 5.5.1版本的集群开启内存流控会导致“_mget”请求被拦截,Kibana访问异常,可以通过把“_mget”请求加入请求白名单规避。

  1. 开启内存流控。
    • 执行如下命令,开启内存流控。
      PUT /_cluster/settings
      {
        "persistent": {
          "flowcontrol.memory.enabled": true,
          "flowcontrol.memory.allow_path": "/index/_search",
          "flowcontrol.memory.heap_limit": "85%"
        }
      }
    • 执行如下命令,开启单个请求Path的内存流控。

      当基于单个索引和请求Path设置堆内存使用阈值时,可以基于此规则做优先级调度。

      PUT /_cluster/settings
      {
        "persistent": {
          "flowcontrol.memory.enabled": true,
          "flowcontrol.memory": {
            "flowcontrol_search": {
              "filter_path": "index1/_search",
              "heap_limit": "50%"
            },
            "flowcontrol_bulk": {
              "filter_path": "index*/_bulk",
              "heap_limit": "50%"
            }
          }
        }
      }
    表3 内存流控的配置项说明

    配置项

    类型

    说明

    flowcontrol.memory.enabled

    Boolean

    内存流控开关,默认关闭,开启内存流控对节点性能有些许影响。

    取值范围:true、false

    默认值:false

    flowcontrol.memory.allow_path

    List<String>

    内存流控白名单Path。

    配置的路径不参与内存流控,可以支持通配符配置。集群控制的查询类接口默认放通,不参与内存流控,避免内存达到阈值,不能查询集群信息。

    例如:

    • "flowcontrol.memory.allow_path": "/index/_search",
    • "flowcontrol.memory.allow_path": "/index*/_search",
    • "flowcontrol.memory.allow_path": ["/index/_search", "/index1/_bulk"],

    支持最大配置10个Path,每个Path最大长度限制小于32。

    默认值为空。

    flowcontrol.memory.heap_limit

    String

    限制节点全局堆内存的最大使用率。不能低于堆内存的10%。

    取值范围:10%-100%

    默认值:90%

    flowcontrol.memory.*.filter_path

    String

    配置需要进行内存流控的访问Path,控制单个请求Path的堆内存使用阈值。

    默认值 "**", 表示匹配所有的路径。如果只配置了单路径“flowcontrol.memory.heap_limit”,没有配置“flowcontrol.memory.*.filter_path”,表示除去白名单外的所有path都影响。白名单规则优先于单路径规则,如果一个路径同时配置了“flowcontrol.memory.allow_path”和“flowcontrol.memory.*.filter_path”, 此请求路径会被允许。

    例如同时配置了“flowcontrol.memory.allow_path”和“flowcontrol.memory.*.filter_path”,其中flowcontrol.memory.*.filter_path="abc/_search"且flowcontrol.memory.allow_path="abc/_search",此种情况abc/_search将不被流控。

    最大长度:32

    flowcontrol.memory.*.heap_limit

    String

    配置请求Path的堆内存阈值,堆内存超过阈值触发流控。

    取值范围:0%-100%

    默认值:90%

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

  2. 执行如下命令,关闭集群内存流控。
    • 执行如下命令,删除单个请求Path的内存流控。

      关闭内存流控时,要先删除单个请求Path的内存流控。

      PUT /_cluster/settings
      {
        "persistent": {
          "flowcontrol.memory.enabled": true,
          "flowcontrol.memory": {
            "flowcontrol_search": {
              "filter_path": null,
              "heap_limit": null
            }
          }
        }
      }
    • 执行如下命令,关闭内存流控。
      PUT /_cluster/settings
      {
        "persistent": {
          "flowcontrol.memory.enabled": false
        }
      }

添加Path全局免流控白名单

执行如下命令,添加Path全局免流控白名单。
PUT _cluster/settings
{
  "persistent": {
    "flowcontrol.path.white_list": "xxxx"
  }
}
表4 Path全局免流控白名单的配置项说明

配置项

类型

说明

flowcontrol.path.white_list

List<String>

Path全局免流控白名单,配置的路径不参与内存、CPU流控和一键断流,IP流控除外。

支持最大配置10个Path,每个Path最大长度限制小于32。

默认值为空。

说明:

一般不建议配置此值,仅在自定义插件时根据业务需求配置。

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

开启请求采样统计

  1. 执行如下命令,开启请求采样统计。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.statics.enabled": true,
        "flowcontrol.statics.threshold": 100,
        "flowcontrol.statics.sample_frequency": 50
      }
    }
    表5 请求采样统计的配置项说明

    配置项

    类型

    说明

    flowcontrol.statics.enabled

    Boolean

    请求采样统计开关。开启请求采样统计对节点性能会有影响。

    取值范围:true、false

    默认值:false

    flowcontrol.statics.threshold

    Integer

    统计最近时间访问的请求数量。配置为100,表示会统计出最近访问最多的100个IP地址和基于采样统计的访问最多的100个URL。

    最小值:10

    最大值:1000

    默认值:100

    说明:
    • IP统计和URL采样统计基于访问时间缓存策略,节点会记录最近访问的IP和请求URL,如果缓存空间达到设置的阈值(即“flowcontrol.statics.threshold”配置值),访问时间距离现在最久的记录将被清除掉。
    • URL采样统计当前基于URL hash值确认访问Path的一致性。

    flowcontrol.statics.sample_frequency

    Integer

    Path采样频率。配置为100,表示每100个请求采样统计一次。

    最小值:50

    默认值:100

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

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

开启一键断流

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

查看流量控制信息

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

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

响应示例:

返回值以Node级别分开,http记录并发和新建连接数据统计,memory记录内存流控统计,ip_address记录最近最多访问的客户端IP,url_sample记录采样的最近最多请求URL。cpu记录CPU流控统计。

{
  "_nodes" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "cluster_name" : "css-flowcontroller",
  "nodes" : {
    "ElBRNCMbTj6L1C-Wke-Dnw" : {
      "name" : "css-flowcontroller-ess-esn-1-1",
      "host" : "10.0.0.133",
      "timestamp" : 1613979513747,
      "flow_control" : {
        "transport" : {
          "concurrent_req" : 0,
          "rejected_concurrent" : 0,
          "rejected_new" : 0,
          "rejected_deny" : 0
        },
        "http" : {
          "concurrent_req" : 0,
          "rejected_concurrent" : 0,
          "rejected_new" : 0,
          "rejected_deny" : 0
        },
        "memory" : {
          "memory_allow" : 41,
          "memory_rejected" : 0
        },
        "cpu": {
          "rejected_cpu" : 0
        }
        "ip_address" : [
          {
            "ip" : "/10.0.0.198",
            "count" : 453
          },
          {
            "ip" : "/198.19.49.1",
            "count" : 42
          }
        ],
        "url_sample" : [
          {
            "url" : "/*/_search?pretty=true",
            "method" : "GET",
            "remote_address" : "/10.0.0.198:16763",
            "count" : 1
          }
        ]
      }
  }
}
表6 响应参数说明

参数名

说明

concurrent_req

节点实际的TCP连接数据信息, 没有开启流控这个配置也会记录,参考GET /_nodes/stats/http接口current_open值, 但是会比这个值小,这里忽略了白名单IP和内部节点IP。

rejected_concurrent

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

rejected_new

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

rejected_deny

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

memory_allow

内存流控开启生效,关闭后不清零,内存流控允许的请求数,触发内存流控后允许的请求数量,allow_path白名单中通过请求不会被记录,如果allow_path配置为“**”,所有请求都不会被记录。

memory_rejected

内存流控开启生效,关闭后不清零,内存流控拒绝的请求数,触发内存流控后拒绝的请求数量,allow_path白名单中通过请求不会被记录,如果allow_path配置为“**”,所有请求都不会被记录。

rejected_cpu

CPU流控开启生效,关闭后不清零,超过CPU流控阈值拒绝的请求数。

ip_address

IP地址统计,基于配置值统计节点访问的IP地址和请求数量。参数说明请参见表7表7

url_sample

请求Path采样统计,基于配置时间和采样间隔统计相同请求URL数量。参数说明请参见表8

表7 ip_address

参数名

说明

ip

访问节点的源IP地址。

method

对应IP地址的访问次数统计。

表8 url_sample

参数名

说明

url

请求的采样统计,记录访问节点的请求URL。

method

对应请求Path的方法。

remote_address

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

count

对应请求Path的采样统计次数。

开启并查看访问日志

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

      “{nodeId}”为节点ID。

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

    配置项

    类型

    说明

    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" : ""
            }
          ]
        }
      }
    }
    表10 响应参数说明

    参数名

    说明

    name

    节点名称。

    host

    节点对应的IP地址。

    count

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

    access

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

    表11 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
      }
    }
    表12 访问日志记录到文件的配置项说明

    参数

    类型

    说明

    flowcontrol.log.file.enabled

    Boolean

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

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

开启CPU流控

  1. 执行如下命令,开启CPU流控。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.cpu.enabled": true,
        "flowcontrol.cpu.percent_limit": 80,
        "flowcontrol.cpu.allow_path": ["index/_search"]
      }
    }
    表13 访问日志的配置项说明

    配置项

    类型

    说明

    flowcontrol.cpu.enabled

    Boolean

    是否开启CPU流控。

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

    flowcontrol.cpu.percent_limit

    Integer

    流控的阈值,在CPU使用率超过此阈值时触发流控。

    默认值:90

    flowcontrol.cpu.allow_path

    List<String>

    CPU流控白名单Path。

    配置的路径不参与CPU流控,支持通配符配置。集群控制的查询类接口默认放通,不参与CPU流控,避免CPU达到阈值导致不能查询集群信息。

    例如:

    • "flowcontrol.memory.allow_path": "/index/_search",
    • "flowcontrol.memory.allow_path": "/index*/_search",
    • "flowcontrol.memory.allow_path": ["/index/_search", "/index1/_bulk"],

    支持最大配置10个Path,每个Path最大长度限制小于32。

    默认值为空。

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

  2. 执行如下命令,关闭CPU流控。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.cpu.enabled": false
      }
    }