极限网关案例分享(3):使用极限网关实现多集群写入
Gateway
多集群
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,一起参与开源共建!

标签
Easysearch x
Gateway x
Console x