Kong 集群允许您通过添加更多的机器来处理更多的传入请求来横向扩展系统。它们将共享相同的配置,因为它们指向相同的数据库。指向相同数据存储的 Kong 节点将属于相同的 Kong 集群。

您需要在Kong集群前面安装一个负载平衡器,以便在可用节点之间分配流量。

Kong 集群可以做什么,不能做什么

拥有一个 Kong 集群并不意味着你的客户机流量将在您的 Kong 节点之间实现开箱即用的负载平衡。你仍然需要在Kong节点前安装一个负载平衡器来分配流量。相反,Kong集群意味着这些节点将共享相同的配置。

出于性能原因,Kong在代理请求时避免数据库连接,并将数据库的内容缓存到内存中。缓存的实体包括服务、路由、消费者、插件、凭证等……由于这些值都在内存中,因此通过其中一个节点的管理API所做的任何更改都需要传播到其他节点。

本文档描述了如何使这些缓存的实体失效,以及如何为用例配置Kong节点,该用例介于性能和一致性之间。

单节点集群

单个的 Kong 节点连到数据库创建一个单节点的 Kong 集群。通过该节点的管理 API 应用的任何更改都将立即生效。

考虑一个单独的 Kong 节点A。如果我们删除之前注册的服务:

$ curl -X DELETE http://127.0.0.1:8001/services/test-service

然后,任何对节点 A 的后续请求都会立即返回 404 Not Found,因为节点将其从本地缓存中清除。

多节点集群

在一个集群有多个 Kong 节点的情况下,连接到同一数据库的其他节点不会立即被通知服务已被节点 A 删除。 虽然服务不在数据库中(被节点A删除),但它仍然在节点B的内存中。

所有节点执行一个周期性的后台作业,以同步其他节点可能触发的更改。此作业的频率可通过以下方式配置:

db_update_frequency (default: 5 seconds)

每隔 db_update_frequency 秒,所有运行的 Kong 节点都将轮询数据库以获得任何更新,并在必要时从缓存中清除相关实体。

如果我们从节点 A 中删除一个服务,这个更改在节点B中不会有效,直到节点B的下一次数据库轮询,该轮询将在几秒后发生,直到 db_update_frequency (尽管可能更快)。

这使得 Kong 集群最终保持一致。

集群的搭建

Kong 的集群在早期是通过 cluster 命令来创建和维护的,从 0.11 版本开始,变换了集群的搭建方式。参考文档 Kong 0.11 changeLog

从 0.11 版本之后去除了 cluster 管理功能以后,Kong 变成了完全无状态,只要是连接到同一个 Kong 数据库的节点,都认为是同一个 Kong 集群而不需要额外的通信机制,因此也不需要在 kong.conf 文件中配置 cluster 参数。

Kong 集群的搭建就是把所有的 Kong 节点都连同一个 Kong 数据库就可以了,所有结果通过轮询机制去读取数据库来保证数据的一致性。

缓存是什么

所有的核心实体,如服务、路由、插件、消费者、凭证,都由Kong缓存在内存中,并依赖于它们通过要更新的轮询机制的失效。

此外,Kong还缓存数据库 的 misses。这意味着如果您配置一个没有插件的服务,Kong将缓存此信息。例子:

假设我们通过节点A的管理API向该服务添加一个插件:

# node A
$ curl -X POST http://127.0.0.1:8001/services/example-service/plugins \
--data "name=example-plugin"

由于此请求是通过节点 A 的 Admin API 发出的,因此节点 A 将在本地使其缓存无效,并在随后的请求中检测到此 API 配置了插件。

此时,节点 B 还没有运行数据库同步更新缓存任务,并且仍然缓存这个 API 没有插件可以运行的数据。在节点B运行其数据库轮询作业之前,情况将一直如此。

结论:所有CRUD操作都会触发缓存失效。创建(POST、PUT)将使缓存数据库的错误失效,而更新/删除(PATCH、DELETE)将使缓存数据库的错误失效。

如何配置数据库缓存

可以在Kong配置文件中配置3个属性,其中最重要的一个属性是db_update_frequency,它决定了Kong节点在性能与一致性之间的权衡。  

  kong 已经提供了默认的配置,为了让你权衡集群性能和数据一致性两个方面,避免意外的结果。你可以按照下面的配置步骤,改变配置的值,从而确保性能和数据一致性能够被接受。

1.db_update_frequency (default: 5s)

该配置决定 kong 节点从数据库拉取更新缓存的时间间隔,同步任务执行的频率。值越小意味着同步任务将会执行的更频繁,Kong 节点的缓存数据将保持和数据库更强的一致性。值越大的时候,意味着你的 Kong 节点花更少的时间去处理同步任务,从而将更多的资源用来处理请求。

Note:变更将会在 db_update_frequency 秒后在整个集群节点中生效。

2.db_update_propagation (default: 0s)

如果你的数据库也是集群的并且最终一致性的(比如:Cassandra),你必须配置该值。它将确保 db_update_propagation 秒后,数据库节点间的变化在整个数据库集群中所有节点生效。当配置了该值,Kong 节点从同步任务中接收无效事件,清除本地缓存将会延迟 db_update_propagation 秒。

如果一个 Kong 节点连接到最终一致性数据库上,且没有延迟事件需要处理,它可能会清除缓存,然后把没有更新的值再次缓存起来。(因为这个改变还没有传播到数据库集群的每一个节点,注释:数据库一致性还没有在数据库集群中达到一致,此时 Kong 缓存到期了,但是没有更新到变化事件,此时会把没有更新的值再次缓存起来,导致 Kong 也出现不一致,即便 Kong 执行了同步任务。)。

你应该配置该值,通过评估数据库集群发生变更后,最终达到一致性所需要的时间。(确保数据库一致之后,才去执行 Kong 同步任务处理变更事件,从而达到 Kong 数据一致性)

Note:当配置了该配置项,数据变更传播到 Kong 集群的最大时间是 db_update_frequency + db_update_propagation 秒。

3.db_cache_ttl (default: 3600s)

该配置项的时间(单位秒)是 Kong 缓存数据库实体的时间(包括缓存命中或者穿透),该存活时间是一种保护措施,以防 Kong 节点漏掉处理缓存无效事件,避免旧数据长时间没有被清理。当缓存生存时间到了,缓存值将会被清理掉,下一次将会从数据库读取数据并再次缓存起来。

4.当使用 Cassandra 数据库

如果使用 Cassandra 作为 Kong 的数据库,你必须配置 db_update_propagation 为一个非零值。由于 Cassandra 本身是最终一致性数据库,这将确保 Kong 节点不会过早地使本地缓存失效,仅仅当再次获取到一个不是最新值的时候。如果你使用了 Cassandra 但你没有配置该值时,Kong 将会输出一条警告日志。

此外,你可以配置 cassandra_consistency 的值为 QUORUM 或者 LOCAL_QUORUM,确保被 Kong 缓存的值是数据库中最新的。

小结

本文讲解了 Kong 的集群相关的东西,如果由于某些原因,你希望通过 Kong 查看缓存的值,或者手动清理缓存(当缓存被命中或者丢失),你可以通过使用 Admin api 的 /cache 接口进行管理。

Kong06-Kong 的集群怎么用的更多相关文章

  1. 微服务之:从零搭建ocelot网关和consul集群

    介绍 微服务中有关键的几项技术,其中网关和服务服务发现,服务注册相辅相成. 首先解释几个本次教程中需要的术语 网关 Gateway(API GW / API 网关),顾名思义,是企业 IT 在系统边界 ...

  2. Linux Cluster 基础之LVS调度算法与集群类型

    Linux Cluster 基础之LVS调度算法与集群类型 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.LB Cluster 1>.什么是LB LB 集群是 load ...

  3. Elastic Stack之Redis集群使用

    Elastic Stack之Redis集群使用 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客数据流走向:FileBeat ===>Redis  ===>lo ...

  4. apigateway-kong(五)集群搭建部署

    kong 集群将使得系统通过增加更多机器,从而实现水平扩展,承接更多的请求流量.它们将共享同样的配置且使用同一个数据库.kong 集群中的的所有节点都连接同一个数据库. 你需要在 kong 集群的上一 ...

  5. NTP POOL PROJECT:全球最大的免费NTP服务集群

    pool.ntp.org项目是一个提供可靠易用的NTP服务的虚拟集群,它作为一个大的NP服务器可以支撑全球数百万客户端使用.该项目允许那些能提供NTP服务的服务器加入到该集群中,截止2012年8月份, ...

  6. docker 下 mysql 集群的搭建

    下载程序&&创建docker容器 从mysql官网https://dev.mysql.com/downloads/cluster/上下载mysql集群库mysql-cluster-gp ...

  7. 通过livy向CDH集群的spark提交任务

    场景 产品中需要通过前端界面选择执行某种任务(spark任务),然后通过livy 的restful api 提交集群的spark任务 简单介绍下livy,翻译自官网: Livy是基于Apache许可的 ...

  8. Kubernetes 使用 ingress 配置 https 集群(十五)

    目录 一.背景 1.1 需求 1.2 Ingress 1.3 环境介绍 二.安装部署 2.1.创建后端 Pod 应用 2.2 创建后端 Pod Service 2.3.创建 ingress 资源 2. ...

  9. 部署Hadoop-3.0-高性能集群

    一.Hadoop概述: Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.Hadoop的框 ...

随机推荐

  1. jquery复习日记(1)

    jquery封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动画设计和Ajax交互. 核心关键字: 链式.多功能.高效灵活   1 ...

  2. 快学Scala 第十七课 (trait 入门)

    trait 入门: trait类似于java的接口,不过比java接口功能更强大,可以有实体成员,抽象成员,实体方法,抽象方法. 如果需要混入的特质不止一个用with关键字. 带有特质的对象:(特质可 ...

  3. 报错com.neenbedankt.android-apt not found如何解决

    apply plugin: 'com.neenbedankt.android-apt' 在moudle中build.gradle文件内有应用此插件,编译时报错 检查Project中build.grad ...

  4. 【JavaScript】使用纯JS实现多张图片的懒加载(附源码)

    一.效果图如下 上面的效果图,效果需求如下 1.还没加载图片的时候,默认显示加载图片背景图 2.刚开始进入页面,自动加载第一屏幕的图片 3.下拉界面,当一张图片容器完全显露出屏幕,即刻加载图片,替换背 ...

  5. pycharm 激活码 2019/12最新福利(3)

    K6IXATEF43-eyJsaWNlbnNlSWQiOiJLNklYQVRFRjQzIiwibGljZW5zZWVOYW1lIjoi5o6I5p2D5Luj55CG5ZWGOiBodHRwOi8va ...

  6. Spring 源码阅读 一

    终于,有一天我也来看Spring的源码了,看了一阵之后感觉心情那叫一个舒畅,对Spring底层的实现也有了进一步的了解, 最直观的感受就是Spring的命名风格很赞,很长,真的长到使人见名知意, 闲言 ...

  7. .NET Core开发的iNeuOS物联网平台部署树霉派,从网关到云端整体解决方案。助力2019中国.NET峰会。

    2019 中国.NET 开发者峰会正式启动 目       录 1.      概述... 2 2.      树莓派硬件配置... 2 3.      软件信息... 3 4.      Raspb ...

  8. C++11多线程相关

    有关线程的知识,从C++11开始有了一些变化,作为初学者,对其先有个初步认识,后面用到的时候再详细剖析

  9. Spring Cloud Alibaba(二) 配置中心多项目、多配置文件、分目录实现

    介绍 之前Spring Cloud Config基础篇这篇文章介绍了Spring Cloud Config 配置中心基础的实现,今天继续聊下Spring Cloud Config 并结合nacos做服 ...

  10. 第三篇-分析日志和sensor-data中的数据结构

    分析日志和sensor-data数据结构 该文章提供web端思路,ios和android端思路不提供,api也已经下线,本文也不提供任何可执行代码.有更多疑问欢迎查看github代码 协议 授权协议: ...