基于 TiDB 的 Apache APISIX 高可用配置中心的最佳实践

2023-11-09

项目背景

什么是 Apache APISIX?

API 网关作为微服务架构中的重要组件,是流量的核心出入口,用于统一处理和业务相关的请求,可有效解决海量请求、恶意访问等问题,保障业务安全性与稳定性。

作为开源的云原生 API 网关,Apache APISIX 兼具动态、实时、高性能三大优势,可提供负载均衡、动态上游、灰度发布、服务熔断、鉴权认证、可观测性等丰富的流量管理功能,帮助企业快速、安全地处理 API 和微服务流量,可应用于网关、Kubernetes Ingress 和服务网格等场景。

同时,Apache APISIX 已通过广泛的生态合作建立起丰富的社区生态。Apache APISIX 也支持高度定制化,支持 Wasm,可用 Java、Go、Python 等主流计算机语言编写插件。

Apache APISIX 技术架构

在这里插入图片描述

Apache APISIX 采用了数据平面与控制平面分离的架构方式,通过配置中心接收、下发配置,使得数据平面不会受到控制平面影响。

在此架构中,数据平面负责接收并处理调用方请求,使用 Lua 与 Nginx 动态控制请求流量,可用于管理 API 请求的全生命周期。控制平面则包含了 Manager API 和默认配置中心 etcd,可用于管理 API 网关。管理员在访问并操作控制台时,控制台将调用 Manager API 下发配置到 etcd,借助 etcd watch 机制,配置将在网关中实时生效。

配置中心默认为 etcd,也支持 Consul、Nacos、Eureka 等。etcd 天然支持分布式、高可用,支持集群,并且在 K8s 等领域有大量的应用实践,使得 APISIX 可以轻松支持毫秒级配置更新、支撑数千网关节点,且网关节点无状态,可任意扩缩容。

etcd 的局限性

1. 自身架构问题

首先,etcd 基于 BoltDB,容量具有上限 。etcd 的默认存储上限为 2 GB,如果上限要求超过 2 GB,则可以通过 --quota-backend-bytes 标记配置存储,最大可调整至 8 GB。一个 etcd 集群如果有 8 GB 的存储量,则足以服务一个网关,但如果同时服务 N 个 APISIX 集群,容量可能不够用,有可能会带来一些麻烦。

其次,etcd 本质上是一个 CP 系统,法承载量的客户端连接。因为 etcd 是通过 Raft 来实现分布式共识,所有的读写请求都会经由 Raft 的 Leader 进行处理,大量的客户端连接可能会导致整个集群的负载偏高,有可能会影响到调用者。

2. 场景配合问题

在 Ingress 和 Service Mesh 等场景,使用 etcd 相对来说有点过重,有些户不希望部署除控制和数据以外的组件。比如 NGINX Ingress Controller 只需一个镜像就可以跑起来,但 APISIX Ingress Controller 除了 Ingress Controller 控制面和 APISIX 数据面,还有一个 etcd。对用户来说,这种技术架构的部署成本更高,还要保证 etcd 的运维。

而且本质上,etcd 是一个冗余组件,完全可以去掉。K8s 本身支持存储服务,所有的配置信息、存储在 APISIX 后端的 Endpoints 信息都可以从 K8s 的 API Server 获取。在这种场景使用 etcd 会造成整个选型更加笨重。

服务网格也是同理。在服务网格场景使用 APISIX,如果还要部署 etcd,整个选型就会偏重。而且在服务网格场景,Pod 的数量可能成百上千甚至上万,这种情况很常见。如果上万个 Pod 全部连到 etcd,etcd 会成为整个服务的瓶颈。

3. 成本问题

第一,etcd 的运维成本较高,有些公司没有专门的 etcd 运维工程师。部署 etcd 至少需要 3 个或 5 个实例,etcd 成功运行后,还需要定期做数据备份,创建快照。为了监控 etcd 的运行情况,实时了解 etcd 的健康状况,还需要搭建可观测性系统,提供必要的告警支持。如果一个公司没有专门的 etcd 运维工程师,可能无法做好 etcd 的运维工作。

第二,有些公司或组织有长期使用的中间件或基础设施,切换配置中心会带来一定的成本。对这些公司或组织来说,他们往往更希望复⽤已有的中间件或基础设施作为 APISIX 的配置中⼼,⽐如 TiDB、Consul、Apache ZooKeeper,从而收敛技术栈,避免带来额外的成本。

项目动机

基于以上考虑,我们决定研究新的方案,改变现在过重的技术架构,为 Apache APISIX 的用户提供更灵活的选择,不被 etcd 绑定,缓解现有用户的 etcd 运维压力,降低运维成本,同时期望给到用户更多、更优的选择,突破 etcd 的自身瓶颈。

解除 APISIX 和 etcd 的强关联,让用户拥有更多、更灵活的选择,其实也是开源的魅力所在。如果能够解除这一层限制,不限制用户如何用,用户可能会创造出更多惊喜。

项目介绍

方案设计

如何解耦 APISIX 和 etcd?

方案设计之初,我们考虑的第一个问题是如何实现 APISIX 与 etcd 的解耦,因为 APISIX 的核⼼代码、数据结构与 etcd 关系密切。负责操作配置的 Admin API 通常会在返回值里带上 etcd 的元数据,比如 etcd v3 的 Revision、etcd v2 的 createdIndexmodifiedIndex,甚至在 APISIX 的核心逻辑里,某个路由或者某个 Upstream 对象也会带上这些元数据。

如果从根本上改造 APISIX,成本会过⾼。在如此核心的地方进行改造可能也会影响 APISIX 现有的稳定性,因此直接修改 APISIX 可能并不是一个很好的方案。

破局:引入额外的中间层

如果直接改造成本太高且风险太大,那么我们是不是可以考虑引入一层额外的中间层?在计算机界有一句名言——“没有什么问题是加一层解决不了的”。如果要加入一层,这一层具体要负责什么事情?做什么事情?总结下来,这一层需要完成两个比较重要的事情。

第一,这个额外的中间层需提供 etcd v3 API 并⽀持 etcd gRPC Gateway。目前,APISIX 只支持 etcd v3。对 APISIX 来说,这个中间层依然是一个 etcd,它必须提供 etcd v3 的 API。除了提供 v3 的 API,它还要支持 etcd 的 gRPC Gateway,因为 APISIX 现在还是通过 HTTP 协议和 etcd 交互,而 etcd v3 API 是基于 gRPC,我们需要 etcd 的 gRPC Gateway 把 HTTP 的请求转成 gRPC 请求,从而使得整个交互能够顺利进行下去。

第二,这个额外的中间层能对接各种不同的存储方案。我们要想清楚如何支持 TiDB、PostgreSQL,SQLite,甚至是 Consul、Apachce ZooKeeper 这些不同的方案。

只有做到了这两点,这个中间层才能对接不同的存储方案,从而给 APISIX 带来完整的配置中心的功能。

方案实施

在这里插入图片描述

站在巨人的肩膀上集成 TiDB

有了这个中间层后,我们要怎么集成 TiDB 呢?其实我们有一个类似的项目可以参考。虽然 K8s 原生支持使用 etcd 作为存储方案,但 Rancher 的 K3s 项目并没用 etcd,可能是因为如果 K3s 部署在某些嵌入式环境中,etcd 的一些限制使其没有办法很好地运维。于是,Rancher 通过 Kine 这个项目,支持了一些额外的组件,比如 PostgreSQL、MySQL、SQLite、 Dqlite,使得 K3s 的用户可以灵活选择其他存储方案。概括来说,Kine 这个项目有以下几点值得我们借鉴。

第一,TiDB 兼容 MySQL,而 Kine 项目本身又支持 MySQL。我们可以借鉴或者参考 Kine 的一些实现,从而帮助我们这个项目更好地支持和对接 TiDB。

第二, Kine 完整地实现了 etcd 需要支持的 watch 功能。因为 APISIX 是基于推模式来感知配置的变更,配置变更的时延通常在毫秒级别,时延非常低。而 watch 功能正好涉及到配置的推送,所以 watch 机制相当重要。

第三,Kine 还模拟了 etcd 的 MVCC 特性,支持 Compact。每一次的变更、写入、更新或者删除在 Kine 或 TiDB 里就是一行数据。每行数据的主键就是 etcd 的 Revision,也就是计数器,记录最新变更的次数。通过这种方式,Kine 实现了多版本的支持。

通过引入类似架构,Apache APISIX 不用和真正的存储中心进行交互,而是和这个中间层进行交互。如上图,APISIX 和 etcd adapter 中间层会走 etcd 的 KV API 和 Watch API,etcd adapter 会轮询 TiDB,感知配置的写入,完成 watch 操作,从而把数据推给 APISIX。

方案效果

etcd adapter 的诞生

有了这些思考以及 Kine 这个项目的参考,我们站在巨人的肩膀上开发出了 etcd adapter 项目。

首先,这个项目支持了 TiDB、MySQL 以及 In-Memory B-Tree 等多种配置中心,不久后,也会支持 SQLite 和 PostgreSQL。其中,In-Memory B 树和 APISIX Ingress Controller 架构过重有关。如果选择 In-Memory 的 B 树选型,用户可以直接把 etcd adapter 内嵌到目标程序里面。这种方式少了一个组件,可以进一步提升整体的用户体验。

其次,这个项目支持了 etcd v3 的 API。目前,这个项目只支持了 APISIX 所需的 API 子集,比如 KV API 和 Watch API。至于其他类型的 API,比如 Lease、偏认证类的 API 还没有全部实现。

最后,这个项目**⽀持了 gRPC Gateway。**它会把对应的 gRPC 接口翻译成对应的 Restful 接口,供 APISIX 调用。

虽然我们把 etcd adapter 放在了控制面,但我们也可以把它放在每个 APISIX 边上,作为一个边车存在。两种方案各有好处,大家可以根据自己的实际情况灵活选择。

未来计划

关于这个项目的后续计划和未来方向,我们有以下几点想法分享给大家。

为 Apache APISIX 的⽤户提供更多的配置中⼼选择

我们希望 etcd adapter 项目能让 Apache APISIX 的用户有更多的配置中心选择,不被 etcd 锁定,用户可以根据自己的实际情况选择解决方案。如果公司的运维、开发的技术栈更偏向于 Consul,就可以使用 Consul。Consul KV 也是基于 Raft,可用性很高。除此以外,也可以考虑比较主流的 Apollo 或者和 etcd 对标的 Apache ZooKeeper,还有 PostgreSQL 或者其他备选方案。

为 Apache APISIX Ingress Controller 的架构改良助⼒

我们希望 etcd adapter 项目能为 APISIX Ingress Controller 的架构改良助力。etcd adapter 支持了 In-Memory B-Tree,In-Memory B-Tree 可以把数据嵌入到内存里,而不需要实际地存储。

如此一来,etcd adapter 可以成为 APISIX Ingress Controller 的一部分,Apache Ingress Controller 只需保留 Ingress Controller 控制面和 APISIX 数据面两个组件。因为没有了 etcd,APISIX 甚至可以和 Ingress Controller 直接交互,获取配置变更数据。

除此以外,我们还可以把 Ingress Controller 控制面和 APISIX 数据面放在同一个镜像里,实现控制⾯与数据⾯的⼀体化部署。最终只需要一条命令、一个镜像,就可以在 K8s 目标集群中把 APISIX Ingress Controller 跑起来。如果控制面、数据面放在一起,大家就不用再额外部署一个 etcd 和一个控制面,相当于直接少了两个组件,可以极大地提升用户体验。

捐赠给 Apache 基金会,作为 Apache APISIX 的⼦项⽬进⾏孵化

目前,这个项目的地址是 https://github.com/api7/etcd-adapter,放在 API7.ai 仓库里。未来,我们期望持续打磨这个项目,待项目迭代地比较完善后,会把它捐赠给 Apache 软件基金会,作为 Apache APISIX 的子项目进行孵化,从而吸引到更多社区的有志之士,和我们一起完善这个项目,让 Apache APISIX 的生态更加庞大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 TiDB 的 Apache APISIX 高可用配置中心的最佳实践 的相关文章

随机推荐

  • 机器学习-算法决策树学习笔记(详解)

    决策树的概念 决策树是一种非参数的监督学习方法 既可以用于分类 也可以用于回归 决策树的目标是创建一个模型 从数据特征中进行学习 进而推断出简单决策规则 用来预测目标变量的值 决策树的决策过程就是从根节点开始 测试待分类项中对应的特征属性
  • 从AOP到分布式链路追踪

    文章目录 1 aop介绍 2 1 spring aop 2 2 jdk动态代理 2 分布式链路追踪 2 1 日志规范 2 2 Spring Log组件 2 3 MDC介绍以及使用 3 接入 3 1 侵入式接入 3 2 aop接入 4 中间件
  • Nginx 可视化管理平台 Nginx-Proxy-Manager 中文入门指南

    今天给大家介绍一款 Nginx 可视化管理界面 非常好用 小白也能立马上手 nginx proxy manager 是一个反向代理管理系统 它基于 NGINX 具有漂亮干净的 Web UI 还可以获得受信任的 SSL 证书 并通过单独的配置
  • QT中的绝对路径和相对路径

    绝对路径 app applicationDirPath 这个获取的就是一个绝对路径 是程序运行时的绝对路径 如果是debug模式 绝对路径定位到debug文件 QDir currentPath 这个获取的是工作目录的绝对路径 在工程中点击运
  • echart旭日图_ECharts 旭日图

    ECharts 旭日图 旭日图 Sunburst 由多层的环形图组成 在数据结构上 内圈是外圈的父节点 因此 它既能像饼图一样表现局部和整体的占比 又能像矩形树图一样表现层级关系 ECharts 创建旭日图很简单 只需要在 series 配
  • 检测到“RuntimeLibrary”的不匹配项

    1 gt libCGAL vc140 mt 4 4 I 900 lib all files obj error LNK2038 检测到 RuntimeLibrary 的不匹配项 值 MT StaticRelease 不匹配值 MD Dyna
  • golang处理execl文件

    1 引入execl依赖包 go get github com xuri excelize v2 2 打开execl文件 并获取句柄 打开文件 获取句柄 f err excelize OpenFile path if err nil fmt
  • elasticsearch全文检索流程

    elasticsearch全文检索流程 elasticsearch全文检索流程 索引过程 创建索引 获得原始文档 创建文档对象 分析文档 创建索引 查询索引 elasticsearch全文检索流程 索引过程 索引过程 对要搜索的原始内容进行
  • java中包装类的作用

    Java中包装类的作用 一 包装类是什么 包装类就是解决java的八种基本数据类型不面向对象的缺陷 而设计出来的一个个与每一个与基本类型相对应的类 这八种基本数据类型对应的类统称包装类 Wrapper Class 包装类均位于java la
  • 升级到spring security5遇到的坑-密码存储格式

    遇到的问题 将spring security oauth2 包括spring security 升级到最新 代码没有改动 运行项目没有报错 但是页面登陆时报错 There is no PasswordEncoder mapped for t
  • 火猴之图片立体翻转效果展示(firemonkey)

    结果 思路 1 使用firemonkey之3d应用 2 layout3d image3d textlayer3d 3 使用floatanimation改变image3d的rotation的角度实现 4 运用floatanimation的fi
  • Python自动化测试框架:Pytest和Unittest的区别

    pytest和unittest是Python中常用的两种测试框架 它们都可以用来编写和执行测试用例 但两者在很多方面都有所不同 本文将从不同的角度来论述这些区别 以帮助大家更好地理解pytest和unittest 1 原理 pytest是基
  • Nginx上线一个项目并简操

    Nginx上线一个项目 上线一个商场项目 第一步 将项目源码和数据库文件上传至html文件中 第二步 解压项目源码和导入数据文件 第三步 修改Nginx配置文件 配置server 虚拟机 第四步 在项目代码文件中配置连接MySQL的用户密码
  • 听说你Pycharm都不会用?这篇快速上手指南你必须拥有!

    0 前言 大家好 欢迎来到今天的基础入门编辑器Pycharm的使用篇 Pycharm 作为一款针对 Python 的编辑器 配置简单 功能强大 使用起来省时省心 对初学者友好 这也是为什么编程教室一直推荐新手使用 Pycharm 的原因 本
  • CTF之逆向之阿里巴巴

    题目地址 http www shiyanbar com ctf 13 题目预览 解题过程 1 下载附件发现是exe文件 2 使用PEid和Detect It Easy查壳 和 开发语言 发现没有加壳 都是用C 开发的 3 C 和Java P
  • 打开方式中选择默认方式无反映_系统小技巧:找回丢失的文件“打开方式”

    无论你在使用最经典的Windows 7 还是最主流的Windows 10 当某种文档可以用多个不同程序打开时 在文件的右键菜单中会出现 打开方式 的菜单项 从中可选择打开文档的程序 但有时我们会发现 明明程序在电脑中并未被卸载 但右键菜单中
  • 腾讯云域名解析

    腾讯云域名解析 外链图片转存失败 img 7ZtbvWq2 1562133684211 http shp qpic cn txdiscuz pic 0 bbs qcloud com common cf 163844rpqz5g6g6p6qf
  • 动态代理步骤

    实现动态代理的步骤 1 创建接口 定义目标类要完成的方法 2 创建目标类实现接口 3 创建InvocationHandler接口的实现了类 在invoke方法中完成代理类的功能 1 调用目标方法 2 增强功能 4 使用Proxy类的静态方法
  • jdk动态代理与CGLib的区别

    昨天被人问及动态代理与CGlib的区别 赶紧回顾一下 什么是代理 静态代理与动态代理 静态代理实例 JDK动态代理实例 CGLib 简介 CGLib 与JDK动态代理的区别 代理模式是Java中常见的一种模式 英文名字叫走Proxy或者Su
  • 基于 TiDB 的 Apache APISIX 高可用配置中心的最佳实践

    项目背景 什么是 Apache APISIX API 网关作为微服务架构中的重要组件 是流量的核心出入口 用于统一处理和业务相关的请求 可有效解决海量请求 恶意访问等问题 保障业务安全性与稳定性 作为开源的云原生 API 网关 Apache