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. HBase学习与实践

    Photo by bealach verse on Unsplash 参考书籍:<HBase 权威指南> -- Lars George著. 文章为个人从零开始学习记录,如有错误,还请不吝赐 ...

  2. 【产品】PM常用的流程图

    一.流程图分类 UML有很多种,大体可以分类两类:行为型的图和结构型的图.平时工作中的流程图,只要能把事情清晰的表明,用何种流程图表现形式,其实都无所谓. 但是,作为一名产品经理,共有哪些种类的流程图 ...

  3. ShutdownHook- Java 优雅停机解决方案

    想象一下,如果你现在刚好在 word 上写需求文档,电脑突然重启.等待开机完成,你可能会发现写了一个小时文档没有保存,就这么没了... 一个正在运行 Java 应用如果突然将其停止,影响不止数据丢失, ...

  4. 【SQL】sql查询同一字段相同属性列的值合计

    select  type,sum(value) as valueSum from t group by type

  5. 古剑奇谭三已取消该页导航,B站版本无法登陆

    最近登陆古剑三突然出现这个问题 怎么重开也无法登陆 最后发现是Ie设置问题 解决方法 点中间这个圆形图标打开 小娜 搜索“ie” 点击打开ie之后点右上角的小齿轮 选择“internet选项” 连接- ...

  6. PHP array_mulitsort

    1.函数的作用:对多维数组进行排序 2.函数的例子: 例子一: <?php // http://php.net/manual/zh/function.array-multisort.php $m ...

  7. .Net Core3.0 配置Configuration

    准备 .NET core和.NET项目配置上有了很大的改变,支持的也更加丰富了比如命令行,环境变量,内存中.NET对象,设置文件等等..NET项目我们常常把配置信息放到webConfig 或者appC ...

  8. Git & Github 使用教程【1】入门篇

    Github教程 1-1 版本管理工具简介 主要作用:备份文件.记录历史.回到过去.多端共享.独挡一面.团队协作 2-1 版本管理工具发展历史 3-1 Git下载和安装[略] 3-2 linux下安装 ...

  9. Could not initialize class com.fasterxml.jackson.databind.SerializationConfig

    问题 Spring web 与 Spring eureka集成后出现错误: Caused by: java.lang.NoClassDefFoundError: Could not initializ ...

  10. 《如何学习基于ARM嵌入式系统》笔记整理

    author:Peong time:20190603 如何学习基于ARM嵌入式系统 一.嵌入式系统的概念 从硬件上讲,将外围器件,与CPU集成在一起. 从操作系统上讲,定制符合要求的系统内核 从应用上 ...