--- title: "极限网关案例分享(3):使用极限网关实现多集群写入" date: 2024-12-29 lastmod: 2024-12-29 description: "为解决集群数据日增3T带来的性能问题,方案通过按日期分流数据至多个集群(如es1、es2、es3),并借助极限网关实现流量拆分与转发,确保单集群数据可控,同时支持无缝接入应用。" tags: ["Gateway", "多集群"] summary: "背景 # 集群数据量⽇增 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." --- ## 背景 集群数据量⽇增 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 号数据的写入集群的情况。 ## 极限网关配置 ```yaml 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 更多极限网关配置信息请参考[官网](https://docs.infinilabs.com/gateway/main/zh//)。 ## 关于极限网关(INFINI Gateway) ![](/img/blog/banner/gateway_banner@2x.png) INFINI Gateway 是一个面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway,可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。 Gateway 现已开源(),如有相关问题或建议,欢迎提交 PR 或 Issue,一起参与开源共建!