Kong 集群介绍

简介

“Kong cluster”是指多个 Kong 节点指向同一个存储。Kong cluster 允许以添加物理机的方式平行的去扩展系统,来应对大量的并发请求。他们使用同一个数据存储,共享同一份数据。并且Kong 能够自动的监管加入和离开的节点。

  • 允许系统平行扩展以处理大量并发请求;
  • 允许扩展部署在多个数据中心,提供一个分布式对于地理位置低延时的服务;
  • 如果其中一个节点挂掉,集群的其他节点仍然可以提供正常服务;

因为集群所有节点的Kong 都使用同一个数据存储,所以无论是在哪个节点配置的 APIs、Consumers、Plugins 都可以适用所有节点。而且而且所有节点处理用户请求的模式也是一样,所以返回结果也都是一样的。

如何配置 Kong 集群?

每次当一个 Kong 节点启动时,它就会加入其它共同使用一个数据存储的 Kong 集群,这个是根据 Kong 的配置自动完成的 。

可根据配置文件中的以下几项来修改 Kong 集群的配置

为什么需要 Kong 集群?

在理解为什么需要 Kong 集群之前,需要花点时间先了解 Kong 是如何跟数据存储交互的。

每次当有新的 API 请求到 Kong 服务,Kong 从数据存储载入数据来知道用何种方式代理请求,包括载入相关的插件、认证的 Consumer等等。如果每次请求都如是去处理,性能开销势必是非常大的。因为每次请求, Kong 都需要跟数据存储获取数据,而且这个效率是非常低的。

为了避免每次查询数据库,Kong 在第一次请求之行时,尝试在本地的内存里做尽可能多的数据缓存。本地内存中的数据查询当然要比每次去查询数据库要快的多,这样就保证了 Kong 能有非常好的性能。

如果数据库中的数据一直不变化,这种机制是没有问题的。但是如果数据库中的数据发生变化(比如 API 或者 插件被更新),之前在每个 Kong 节点的内存中的缓存就会立即过期。对于 Kong 的节点,它是完全不知道数据库中的数据发生变化了的,除非有什么东西通知每个节点数据发生变化,需要重新创建缓存。

通过 Kong 集群,每个节点能够知道其它节点的存在。并且当一个Kong 节点有对数据更新,该节点有责任通知这个变化给集群里的其他节点,通知其其他节点把本地内存中的缓存无效,重新从数据库中获取更新后的数据。

总的来说,会有更好的性能提升,因为 Kong 节点不会轻易的去跟数据库交互,除非这些节点必须要去更新数据缓存。从另一方面来说,上文我们也大概介绍了 Kong 集群的概念:确保每个 Kong 节点能知道其他节点的存在,并且能够互相通知数据的变化。如果不这样使用这样的策略,就会有节点的数据缓存跟数据库中的数据不一致的问题,带来不可预期的问题。

添加新的节点到集群

一个 Kong 集群至少需要俩个指向同一个数据库的节点组成。

点一个节点启动时,它会注册它的第一个本地的、无回路的、IPv4地址到数据库。当另一个节点启动,它会查询数据库,得到之前注册到该数据库的所有节点,然后通过存储的IP地址加入到这些节点中。如果几点自动监测发现的 IP 地址是错误的,也可以手动设置在 cluster 配置中的 advertise 项,这样这个配置的 IP 地址就能够让其他节点知道需要跟谁来通信。

一个节点只需要加入集群中的一个节点,然后它就能自动的发现集群中的所有节点。

删除集群中的节点

每次停止一个 Kong 节点服务时,该节点都会尝试以优雅的方式从集群中把自己删除。当一个节点从集群中成功移除之后,它的状态从 alive 变成 left。

只需要在命令行执行 kong quit 或者 kong stop 就可以优雅的停止和从集群中移除节点。

无论任何原因,当一个节点不能被访问时,它的状态会变成 failed。Kong 集群会自动的尝试重新加入有故障的节点直到它又能够可用为止。可以通过俩个方法把一个有故障的节点从集群中移除:

  • 使用 kong cluster force-leave 命令
  • 使用 API

查看集群的状态

查看集群、集群中节点和所有节点的状态可以用以下俩个方法:

  • 通过命令 kong cluster members,这个将会输出每个节点的名称,地址和在集群中的状态。状态是 active 表示该节点能被访问到,failed 表示该节点当前不能被访问到,left 表示已经被从集群中移除。
  • 另一个方查看集群状态的方法是请求后台管理的API - 查询集群状态的API

网络环境的假设

搭建不管是单个还是多个数据中心的 Kong 集群时,需要知道 Kong 是在 IP 层工作的(不支持余名,只支持 IP)。在俩个数据中心之间也是需要一个平面网络的拓扑结构的,中间不能有 NAT 网络地址转换的。通常情况下,跨数据中心是通过 VPN 来解决平面网络问题的。或者通过设置 cluster 配置的 advertise 项来指定一个公共地址,从而跳过 NAT。

Kong 将会尝试监测第一个配置的无回路的 IPv4 地址,然后跟其他节点共享这个地址。但是也可以通过设置cluster配置的 advertise 项来覆盖这个地址。

几种边界情况问题

Kong 的集群实现非常复杂,或许会带来一些边界情况的问题。

1.并发启动多个节点会异步地加入集群

当多个Kong 节点同时启动时,其中的一个节点或许不能知道其他节点的存在,因为其他的节点根本没有时间写入它们的数据到数据库中。为了避免这种情况,Kong 实现了一个特性叫做“Asynchronous auto-join”(异步的自动加入)。

在一个Kong节点启动之后,Asynchronous auto-join 将会每3秒钟检查一次数据库,持续60秒。然后会加入任何在这60秒之内出现的节点。这个表示在并发环境下,多个节点同时启动,这些节点会话费60秒的时间去自动加入到集群中。

2.节点加入集群时,自动的数据清洗

每次当一个新节点加入集群,或者一个失败的节点重新加入集群。每个节点的缓存都被清洗,并且所有的数据都被强制重载。这个做是为了避免集群中已经失效的数据和节点中存储的数据发生不一致的问题。

这个同样也意味着,当一个集群加入一个新节点时,性能会变慢,直到所有数据被重新缓存。

3.节点故障

一个集群中的节点会因为很多种原因发生故障,包括网络问题或者节点自己崩溃了。当不正当的使用 kong stop 或 kong quit 结束节点,也会发生节点故障的问题。

当一个节点失效,Kong 将会失去跟它继续通讯的能力,同时集群也会尝试重新跟这个节点建立连接。它的状态显示会是 failed,当使用集群健康检查命令的时候

kong cluster members

使用 kong cluster force-leave 命令移除失效的节点,然后该节点的状态就会变成 left。

节点的数据会在数据库中保留1个小时,以防止其他节点崩溃。当节点的数据从数据库中删除之后,新的节点将停止尝试自动加入这个节点。