本文将探讨如何使用 INFINI Gateway 限制仅向 Elasticsearch 集群的协调节点转发请求。此方法同样适用于 Opensearch 和 INFINI Easysearch 。
Elasticsearch 是天然分布式的系统,任何节点都能接收请求并进行处理。一个稍具规模,经过规划的 Elasticsearch 集群,会有不同角色的专属节点,比如专属的 master 节点、data 节点、协调节点等。
为了保障集群稳定,一般建议将查询发送到集群的协调节点,避免将请求发送 master 节点。使用 INFINI Gateway 可轻松做到将所有请求轮询发送到集群的所有协调节点。
Elasticsearch 资源 #
INFINI Gateway 将 Elasticsearch 集群作为一种后端资源,可以定义多个 Elasticsearch 集群,支持不同的集群版本。并且可以通过参数 discovery 开启集群的节点拓扑自动发现和更新。
##elasticsearch servers
elasticsearch:
- name: prod
enabled: true
endpoints:
- $[[env.PROD_ES_ENDPOINT]]
discovery:
enabled: true
refresh:
enabled: true
interval: 30s
basic_auth:
username: $[[env.PROD_ES_USER]]
password: $[[env.PROD_ES_PASS]]
traffic_control.max_bytes_per_node: 1010485760
metadata_cache_enabled: false # Whether to cache the cluster info in memory cache
- name: logging-server
enabled: true
endpoints:
- $[[env.LOGGING_ES_ENDPOINT]]
basic_auth:
username: $[[env.LOGGING_ES_USER]]
password: $[[env.LOGGING_ES_PASS]]
discovery:
enabled: false
上面的例子定义了一个名为 prod 和一个名为 logging-server 的集群。其中 prod 集群开启了拓扑自动发现和更新,这使得虽然我们 endpoints 里只写了一个地址(变量),但 INFINI Gateway 可以发现集群的所有节点,并定时进行节点探活。这个探活信息可以通过 INFINI Gateway 的 API 获取到。
curl localhost:2900/elasticsearch/hosts
如上所示,INFINI Gateway 检测到 prod 集群有三个节点,并且都是可用的。
其中有 node-3 和 node-4 是专属协调节点:
Elasticsearch 过滤器 #
INFINI Gateway 通过 Elasticsearch 过滤器将请求转发给后端 Elasticsearch 集群。使用 Elasticsearch 过滤器之前,需要提前定义一个 Elasticsearch 资源。前面我们不仅定义了一个名为 prod 的 Elasticsearch 资源,还开启了拓扑自动发现和更新。
在使用 Elasticsearch 过滤器时也开启刷新,即可访问后端所有节点,且节点上下线也会自动更新。
- name: default_flow
filter:
- get_cache:
pass_patterns: ["_cat","scroll", "scroll_id","_refresh","_cluster","_ccr","_count","_flush","_ilm","_ingest","_license","_migration","_ml"
,"_rollup","_data_stream","_open", "_close"]
- elasticsearch:
elasticsearch: prod
max_connection_per_node: 1000
refresh:
enabled: true
interval: 30s
为了达到只转发请求到协调节点的效果,我们开启节点角色过滤功能,将请求发送给特定的节点。完整的 Elasticsearch 过滤器配置如下。
- name: default_flow
filter:
- get_cache:
pass_patterns: ["_cat","scroll", "scroll_id","_refresh","_cluster","_ccr","_count","_flush","_ilm","_ingest","_license","_migration","_ml"
,"_rollup","_data_stream","_open", "_close"]
- elasticsearch:
elasticsearch: prod
max_connection_per_node: 1000
refresh:
enabled: true
interval: 20s
filter:
roles:
exclude:
- master
- data
- transform
- remote_cluster_client
- ml
- data_content
- data_hot
- data_warm
- data_cold
- ingest
通过排除所有节点角色,我们就限制了 INFINI Gateway 只能将请求转发到专属协调节点(无任何角色)。此外 INFINI Gateway 还支持按照节点的 IP、标签等来进行过滤,详情参考 官方文档。
测试 #
我们使用 _cat/nodes API 连续访问 INFINI Gateway 几次,看看后端服务的节点是否是专属协调节点。
curl localhost:8000/_cat/nodes
通过 INFINI Console 查看访问记录,可以观察到请求被轮流转发到了后端专属协调节点:节点-3 (192.168.56.102:9202) 、节点-4 (192.168.56.102:9203) 。
有任何问题,欢迎加我微信沟通。