产品概述

概述 #

介绍 #

极限网关INFINI Gateway)是一个面向 Elasticsearch 的高性能应用网关,它包含丰富的特性,使用起来也非常简单。极限网关工作的方式和普通的反向代理一样,我们一般是将网关部署在 Elasticsearch 集群前面, 将以往直接发送给 Elasticsearch 的请求都发送给网关,再由网关转发给请求到后端的 Elasticsearch 集群。因为网关位于在用户端和后端 Elasticsearch 之间,所以网关在中间可以做非常多的事情, 比如可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。

特性 #

极限网关 最懂 Elasticsearch,其在设计的时候就综合考虑了很多和 Elasticsearch 相关的业务场景及特点,基于此打造了很多完美契合 Elasticsearch 的众多非常实用的功能。

轻量级

极限网关使用 Golang 编写,安装包很小,只有 10MB 左右,没有任何外部环境依赖,部署安装都非常简单,只需要下载对应平台的二进制可执行文件,启动网关程序的二进制程序文件执行即可。

极致性能

极限网关在编写每一行代码的时候,都会考虑如何让其运行在最佳状态,经测试,极限网关比同类主流网关类产品速度快 25% 以上,且针对 Elasticsearch 做了非常细致的优化,能成倍提升写入和查询的速度。

跨版本支持

极限网关针对不同的 Elasticsearch 版本做了兼容和针对性处理,能够让业务代码无缝的进行适配,后端 Elasticsearch 集群版本升级能够做到无缝过渡,降低版本升级和数据迁移的复杂度。

可观测性

极限网关可以动态对 Elasticsearch 运行过程中产生的任何请求进行截获和分析,通过指标和日志来了解整个集群的运行情况,用于提升性能和优化业务。还可以用于审计和慢查询分析。

高可用

极限网关内置多种高可用解决方案,前端请求入口支持基于虚拟 IP 的双机热备,后端集群支持集群拓扑的自动感知,节点上下线能自动发现,自动处理后端故障,自动进行请求的重试和迁移。

灵活可扩展

极限网关的每个模块都可以独立扩展,可灵活对每个请求进行干预和路由,支持路由的智能学习,内置丰富的过滤器,通过配置动态修改每个请求的处理逻辑,也支持通过插件来进行扩展。

无缝集成 #

极限网关对外提供的接口完全兼容 Elasticsearch 原生的接口,集成起来非常简单,只需将原本指向 Elasticsearch 的配置修改成网关的地址即可。

为什么需要极限网关? #

嗯,上面的集成交互图基本上看明白了,可我现在 Elasticsearch 用的好好的,我为什么需要在前面加上一个网关呢?

好吧,如果您是一个稍微上了规模的 Elasticsearch 集群,不如试着想想下面的几个场景:

WAF 与安全 #

相信您存储在 Elasticsearch 中的每一份数据都是很宝贵的,随着 Elasticsearch 的流行,它也正日益成为黑客们攻击的主要目标,WAF(Web Application Firewall)的需求应运而生。 不管是跨站脚本攻击还是跨站脚本注入,又或是弱密码、暴力破解,还是程序员不合理的查询参数滥用,极限网关都能对这些来自不同 Web 应用程序客户端的各类请求进行内容检测和验证, 通过执行一系列针对 Elasticsearch 的安全策略来确保其安全性与合法性,对非法的请求予以实时阻断,从而对后端 Elasticsearch 进行有效防护。

集群升级 #

没错,相信您也知道 Elasticsearch 版本迭代的速度是非常快的,可能经常需要处理集群版本升级的事宜,而集群升级势必要考虑到以下几点:

  • 保证最小的停机时间,业务的数据写入和查询不能因为集群的升级而中止,数据要能持续的进行写入,还不能因为后端重启节点而丢失数据
  • 集群流量的切换,新旧集群在什么时候以及如何进行切换,是修改业务代码或者配置文件呢,以及如何回滚恢复呢,是不是需要重新发布一个新的部署包

借助极限网关,您的业务代码完全不用关心后端 Elasticsearch 集群是什么状况,只需要访问网关固定的地址即可,剩下的交给网关就都搞定了。

索引重建 #

修改了 Mapping 需要重建索引,修改了分词词典需要重建索引,重建过程中还不能停止数据的写入,重建完成之后还要确保数据是一致的,有新增的数据和修改的数据也必须一一处理,自己处理起来貌似还挺麻烦。 而极限网关,可以做到一键索引重建,重建过程中的任何文档修改操作都会被自动记录,新旧索引在重建完成之后会自动无缝的进行切换,对于前端应用来说完全无感知。

限流限速 #

有没有遇到过突发流量把集群打爆的情况,有没有遇到过个别大索引特别热闹把整个集群都连累的窘迫,其实您需要对异常的流量进行管理,这样才能保护整个 Elasticsearch 集群不会被异常的流量影响甚至是被恶意的攻击。 极限网关可以做到灵活的流量控制,可以做到索引级别的限速规则设置,一千个索引就有一千个哈姆雷特,完全没问题。

查询太慢 #

极限网关内置缓存功能,能够将最常见的查询进行缓存,还可指定周期性的查询计划来预热特定的查询,保证前端的业务每次都能命中查询,从而提升查询速度,改进业务查询用户体验;

索引太慢 #

极限网关可以将来自不同客户端的众多小批量的 Elasticsearch 索引请求合并成一个大的批次请求,通过精准的分片级别的路由,将索引请求合并封装直接投递到指定分片的指定节点上, 避免后端 Elasticsearch 再次进行请求转发,节省 Elasticsearch 资源和带宽,从而提升整体集群的吞吐和性能。

请求干预 #

代码上线之后才发现查询语句写错了?有了极限网关,完全不用担心,可以在线对指定业务的指定查询进行改写,将查询语句动态修复,无需重新发布应用,方便灵活。或者您对 Elasticsearch 查询返回的 JSON 结果不满意, 也没关系,借助极限网关,您能够动态的替换查询结果为新的内容,甚至可以聚合来自其他数据源的数据,如 Hbase、MySQL 等等,融合成您需要的 JSON 数据再返回给客户端。

请求分析 #

只知道有人抱怨 Elasticsearch 很慢,可您知道是 Elasticsearch 里面的哪些索引慢么?又是哪些查询造成的呢? 又是哪些用户造成的呢?极限网关帮您全程跟踪,从集群到索引,从索引到查询,从应用到用户,让您对于 Elasticsearch 集群内的那点事情一清二楚。

所以,用上极限网关之后您再用 Elasticsearch 将会变成是一件很爽的事情。

架构 #

极限网关的核心模块见下面的架构图:

负载外部请求代理的模块由四个主要部分组成,即:Entry、Router、Flow 和 Filter。一个 Entry 需要配置一个 Router,一个 Router 可以路由到多个 Flow,一个 Flow 由多个 Filter 组成。

Entry #

Entry 模块主要定义网关的请求入口,极限网关支持 HTTP 和 HTTPS 两种模式,HTTPS 可以自动生成证书。

Router #

Router 模块主要定义请求的路由规则,根据 Method 和请求地址来进行路由到指定的 Flow 处理流程里面去。

Flow #

Flow 模块主要定义数据的处理逻辑,每个请求会经过一系列的 Filter 操作,Flow 用来将这些 Filter 组织起来。

Filter #

Filter 模块由若干个不同的 Filter 组件构成,每个 Filter 在设计的时候只处理一件事情,通过多个 Filter 组成变成一个 Flow。

此外,INFINI Gateway 使用的框架底层还有一些公共的模块,如:API 用来提供对外的编程入口,Elastic 模块用于处理不同版本的 Elasticsearch API 封装等等。

接下来 #