介绍

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

您需要在Kong集群前面有一个负载均衡器,以便跨可用Kong节点分发流量。

一个Kong集群能做什么,不能做什么

拥有一个Kong集群并不意味着您的客户端流量将立即在您的Kong节点之间进行负载均衡。在Kong节点前面仍然需要一个负载均衡器来分配流量。相反,Kong集群意味着这些节点将共享相同的配置。

出于性能原因,Kong在代理请求时避免数据库连接,并在内存中缓存数据库的内容。缓存的实体包括Services, Routes, Consumers, Plugins, Credentials等等……因为这些值在内存中,所以通过其中一个节点的Admin API所做的任何更改都需要传播到其他节点。

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

Single node Kong clusters

连接到数据库的单个Kong节点(Cassandra或PostgreSQL)创建一个节点的Kong集群。通过此节点的Admin API的任何更改都将立即生效。例子:

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

curl -X DELETE http://127.0.0.1:8001/services/test-service
 然后任何后续的对A的请求都会立即返回404 Not Found,因为节点将其从本地缓存中清除:
curl -i http://127.0.0.1:8000/test-service

Multiple nodes Kong clusters 多节点Kong集群

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

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

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

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

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

What is being cached?  缓存的是什么?

所有的核心实体,如Services, Routes, Plugins, Consumers, Credentials等,都被Kong缓存在内存中,并依赖于通过轮询机制更新它们的有效性。

此外,Kong还可能cache database丢失。这意味着如果您配置一个没有插件的服务,Kong将缓存此信息。例子:

在节点A上,我们添加了一个服务和一个路由:

# node A

curl -X POST http://127.0.0.1:8001/services \
--data "name=example-service" \
--data "url=http://example.com"
curl -X POST http://127.0.0.1:8001/services/example-service/routes \
--data "paths[]=/example"

(注意,我们使用/services/example-service/routes作为快捷方式:我们本来可以使用/routes端点,但是我们需要将service_id作为参数传递,使用新服务的UUID)。

对节点A和节点B代理端口的请求将缓存此服务,且没有在其上配置插件:

# node A
curl http://127.0.0.1:8000/example
HTTP 200 OK
...
# node B
curl http://127.0.0.2:8000/example
HTTP 200 OK
...

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

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

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

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

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

How to configure database caching?如何配置数据库缓存?

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

Kong提供了针对一致性进行调优的默认值,以便让您在试验其集群功能的同时避免“意外”。在准备生产设置时,应该考虑对这些值进行调优,以确保性能约束得到尊重。

1. db_update_frequency(默认值:5 s)

此值确定Kong节点轮询数据库以查找无效事件的频率。较低的值意味着轮询作业将更频繁地执行,但是您的Kong节点将跟上您所应用的更改。较高的值将意味着Kong节点运行轮询作业的时间将减少,并将重点放在代理流量上。

注意:意味着对Kong的配置更改在集群中传播的时间最长为db_update_frequency秒。

2. db_update_propagation(默认值:0)

如果数据库本身最终是一致的(即:Cassandra),则必须配置此值。这是为了确保更改有时间在数据库节点之间传播。设置好后,从轮询作业接收无效事件的Kong节点将延迟缓存的清除,以获得db_update_propagation秒。

如果连接到最终一致的数据库的Kong节点没有延迟事件处理,那么它可以清除其缓存,只缓存未更新的值(因为更改还没有在数据库中传播)!

您应该将此值设置为数据库集群传播更改所需时间的估计值。

注意:设置此值时,对Kong的配置更改在集群中传播的时间最长为db_update_frequency + db_update_propagation秒。

3. db_cache_ttl (default: 0s)

Kong缓存数据库实体(命中和未命中)的时间(以秒为单位)。这个Time-To-Live值在Kong节点错过失效事件时起保护作用,以避免它在过期数据上运行太长时间。当到达TTL时,将从其缓存中清除该值,并再次缓存下一个数据库结果。

默认情况下,没有数据基于这个TTL无效(默认值是0),这通常很好:Kong节点依赖于失效事件,这些事件在数据库存储级别(Cassandra/PosgreSQL)进行处理。如果您担心Kong节点可能因为任何原因错过无效事件,您应该设置TTL。否则,节点可能会在缓存中使用过期值运行一段未定义的时间,直到手动清除缓存或重新启动节点。

4. When using Cassandra

如果使用Cassandra作为Kong数据库,则必须将db_update_propagation设置为非零值。由于Cassandra的本质最终是一致的,这将确保Kong节点不会过早地使其缓存失效,而只是再次获取和捕获一个不最新的实体。如果您在使用Cassandra时没有配置此值,Kong将显示一个警告日志。

此外,您可能希望将cassandra_consistency配置为QUORUM或LOCAL_QUORUM这样的值,以确保Kong节点缓存的值是来自数据库的最新值。

Interacting with the cache via the Admin API(通过管理API与缓存进行交互)

如果出于某种原因,您希望研究缓存的值,或者手动使Kong缓存的值无效(缓存命中或未命中),那么可以通过管理API /cache端点来实现。

Inspect a cached value

Endpoint

GET /cache/{cache_key}

Response

If a value with that key is cached:

HTTP 200 OK
...
{
...
}

Else:

HTTP 404 Not Found

Note: retrieving the cache_key for each entity being cached by Kong is currently an undocumented process. Future versions of the Admin API will make this process easier.

Purge a cached value

Endpoint

DELETE /cache/{cache_key}

Response

HTTP 204 No Content
...

Note: retrieving the cache_key for each entity being cached by Kong is currently an undocumented process. Future versions of the Admin API will make this process easier.

Purge a node’s cache

Endpoint

DELETE /cache

Response

HTTP 204 No Content

Note: be wary of using this endpoint on a warm, production running node. If the node is receiving a lot of traffic, purging its cache at the same time will trigger many requests to your database, and could cause a dog-pile effect.

Kong(V1.0.2) Clustering Reference的更多相关文章

  1. Kong(v1.0.2)代理参考

    介绍 在本文中,我们将通过详细解释Kong的路由功能和内部工作原理来介绍它的代理功能. Kong公开了几个接口,可以通过两个配置属性进行调整: proxy_listen,它定义了一个地址/端口列表,K ...

  2. Kong(V1.0.2) Health Checks and Circuit Breakers Reference

    介绍 您可以让Kong代理的API使用ring-balancer,通过添加包含一个或多个目标实体的 upstream 实体进行配置,每个 target指向不同的IP地址(或主机名)和端口.ring-b ...

  3. Kong(V1.0.2)loadbalancing

    介绍 Kong为多个后端服务提供了多种负载平衡请求的方法:一种简单的基于DNS-based的方法,以及一种更动态的环形负载均衡器ring-balancer,它还允许在不需要DNS服务器的情况下使用se ...

  4. Kong(v1.0.2)认证

    介绍 上游服务(api或微服务)的流量通常由各种Kong的authentication plugins的应用程序和配置控制.由于Kong的服务实体表示您自己的上游服务的一对一映射,所以最简单的场景是在 ...

  5. kubernetes系列:(一)、kubeadm搭建kubernetes(v1.13.1)单节点集群

    kubeadm是Kubernetes官方提供的用于快速部署Kubernetes集群的工具,本篇文章使用kubeadm搭建一个单master节点的k8s集群. 节点部署信息 节点主机名 节点IP 节点角 ...

  6. SharePoint Claim base authentication EnsureUser 不带claim(i:0#.w|)user Failed

    环境信息: 带有Form base authentication(FBA).Active Directory Federation Services(ADFS).以及windows Authentic ...

  7. POJ 3286 How many 0's?(几多0?)

    POJ 3286 How many 0's?(几多0?) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] A Benedi ...

  8. Win7 下用 VS2015 编译最新 openssl(1.0.2j)包含32、64位debug和release版本的dll、lib(8个版本)

    Win7 64位系统下通过VS2015编译好的最新的OpenSSL(1.0.2j)所有八个版本的链接库, 包含以下八个版本: 1.32位.debug版LIB: 2.32位.release版LIB: 3 ...

  9. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7)

    http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3 ...

随机推荐

  1. Linux 下SVN报错No repository found in 'svn://210.16.191.230/huandong_project'

    [root@xxxxxx~]# netstat -apn|grep 3690tcp        0      0 0.0.0.0:3690                0.0.0.0:*     ...

  2. html css样式子元素相对父级元素定位

    废话不多说. 父级元素 样式设置: position:relative; 子元素样式: position: absolute; 这样就可以达到子元素相对父级元素定位了.

  3. HslCommunication组件库使用说明 (转载)

    一个由个人开发的组件库,携带了一些众多的功能,包含了数据网络通信,文件上传下载,日志组件,PLC访问类,还有一些其他的基础类库. nuget地址:https://www.nuget.org/packa ...

  4. C#字符串的CompareTo比较,让我疑惑的地方

    在学习选择排序算法的时候,用到CopareTo方法.由于比较的数字,是自己随意输入的. 当我输入字符串“8”,它和字符串“16”比较时候. string str1 = "8"; s ...

  5. pycharm介绍

      PyCharm是一种Python IDE(集成开发软件),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具. 1.1 PyCharm主界面 PyCharm包含4个主要区分,分别为 ...

  6. CSS3扁平化Loading动画特效

    效果预览:http://hovertree.com/texiao/css3/42/ 代码如下: <!doctype html> <html> <head> < ...

  7. Mesh内存分配器的mmap小技巧

    最近看了一篇内存分配器的论文,原理很简单,但是里面的数学论证还没看懂,这次先简单写一下原理和用到的API. 内存分配器是用于封装操作系统提供的底层API,给应用程序提供动态内存的.内存不断申请释放后, ...

  8. JavaScript 浏览器中的事件

    1.事件的基本概念 事件是指在文档或者浏览器中发生的一些特定交互瞬间,比如打开某一个网页,浏览器加载完成后会触发 load 事件,当鼠标悬浮于某一个元素上时会触发 hover 事件,当鼠标点击某一个元 ...

  9. 简易实践的vue自定义tab入门

    本文基于vue官方文档,分别为:动态组件 & 异步组件.插槽.进入/离开 & 列表过渡 章节链接描述 要想实现tab动画,首先要了解vue中哪些元素/那些组件适合在那些条件下实现动画效 ...

  10. 加载xib文件,如果想在初始化的时候就添加点东西就重载-(id)initWithCoder:(NSCoder *)aDecoder

    - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { self.cl ...