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. Salesforce学习之路-developer篇(三)利用Visualforce Page实现页面的动态刷新案例学习

    Visualforce是一个Web开发框架,允许开发人员构建可以在Lightning平台上本地托管的自定义用户界面.其框架包含:前端的界面设计,使用的类似于HTML的标记语言:以及后端的控制器,使用类 ...

  2. Scala 学习笔记之隐式参数和隐式转换并用

    隐式转换条件: 1. 当表达式类型与预期的类型不同时 2.当对象访问一个不存在的成员时 3.当对象调用某个方法,而该方法的参数声明与传入参数不相匹时. 隐式转换搜索范围: 1. 位于源火目标类型伴生对 ...

  3. Springboot + Mysql8实现读写分离

    在实际的生产环境中,为了确保数据库的稳定性,我们一般会给数据库配置双机热备机制,这样在master数据库崩溃后,slave数据库可以立即切换成主数据库,通过主从复制的方式将数据从主库同步至从库,在业务 ...

  4. [ASP.NET Core 3框架揭秘] 依赖注入:控制反转

    ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...

  5. UVA - 11795 Mega Man's Mission

    Mega Man is off to save the world again. His objective is to kill the Robots created by Dr. Wily who ...

  6. C# 动态(不定)类型和不定参数数量,使用param写入CSV文档的最简单方法,提供excel(或记事本)阅读支持格式

    在开发一个项目,使用C#写入CSV文件时,虽并未遇到太多阻碍,但是很多小伙伴估计和我有过同样的想法.简单的写入CSV,固定参数数量就好了很简单写完.但是如果遇到你得到的数据参数数量和参数类型未知或者动 ...

  7. MySQL学习(三)MySQL锁与事务

    本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. 一.MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支 ...

  8. Flask-wtforms类似django中的form组件

    一.安装 pip3 install wtforms 二.简单使用 1.创建flask对象 from flask import Flask, render_template, request, redi ...

  9. ASP.NET Core API ——Dapper的使用

    ASP.NET Core API ——Dapper的使用 简介:Dapper是一个ORM框架,负责数据库和程序语言之间的映射. 使用步骤: l  创建一个IDBConnection的接口对象 l  编 ...

  10. 构造函数语义学——Copy Constructor 篇

    构造函数语义学--Copy Constructor 篇 本文主要介绍<深度探索 C++对象模型>之<构造函数语义学>中的 Copy Constructor 构造函数的调用时机 ...