极限网关案例分享(3):使用极限网关实现多集群写入
2024-12-29
背景 #
集群数据量⽇增 3 T,为避免单集群过大,造成性能问题,计划将数据写入多个集群。
⽅案 #
可以按照数据产生的时间来划分集群,比如按月来划分集群。从而保证单个集群在可控范围内。
为了让应用尽可能无缝接入数据,可以使用极限网关进行前置流量拆分,通过 context_switch 过滤器对匹配的上下文变量进行条件判断,将流量分拆到不同的集群。
流量拆分方案 #
根据当前数据的写入时间来进行拆分,比如每月 1,4,7,10,13,16,19,22,25,28,31 号的数据写到 es1 集群;每月 2,5,8,11,14,17,20,23,26,29 号的数据写入 es2 集群;每月 3,6,9,12,15,18,21,24,27,30 号的数据写到 es3 集群。
Note:当前方案只是根据比较粗的粒度进行流量切分,不是文档和字段粒度的切分,在两个切分粒度的边界时间可能存在误差的问题,比如 1 号和 2 号的中间,可能存在实际一条日志记录数产生在 1 号底,但是却因为时间索引延迟而保存到 2 号数据的写入集群的情况。
极限网关配置 #
entry:
- name: test_entry
enabled: true
router: default
max_concurrency: 20000
network:
binding: 0.0.0.0:8000
router:
- name: default
default_flow: default_flow
flow:
- name: not_found
filter:
- elasticsearch:
elasticsearch: es1
- name: es1
filter:
- elasticsearch:
elasticsearch: es1
- name: es2
filter:
- elasticsearch:
elasticsearch: es2
- name: es3
filter:
- elasticsearch:
elasticsearch: es3
- name: default_flow
filter:
- context_switch:
context: _sys.day_of_now
default_flow: not_found
skip_error: true
switch:
- case: [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31]
case_value_type: int
action: redirect_flow
flow: es1
- case: [2, 5, 8, 11, 14, 17, 20, 23, 26, 29]
case_value_type: int
action: redirect_flow
flow: es2
- case: [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
case_value_type: int
action: redirect_flow
flow: es3
elasticsearch:
- name: es1
enabled: true
endpoints:
- http://10.247.146.51:32255
basic_auth:
username: infini
password: infiniinfini
- name: es2
enabled: true
endpoints:
- http://10.247.146.51:32188
basic_auth:
username: infini
password: infiniinfini
- name: es3
enabled: true
endpoints:
- http://10.247.146.51:32091
basic_auth:
username: infini
password: infiniinfini
其他可供使用的上下文变量有:
- _sys.month_of_now
- _sys.weekday_of_now
- _sys.day_of_now
- _sys.hour_of_now
- _sys.minute_of_now
- _sys.second_of_now
更多极限网关配置信息请参考 官网。
关于极限网关(INFINI Gateway) #
INFINI Gateway 是一个面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway,可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
Gateway 现已开源(https://github.com/infinilabs/gateway),如有相关问题或建议,欢迎提交 PR 或 Issue,一起参与开源共建!