负载均衡详解 - 玩转Kong网关

KONG为请求多个后端服务提供了多种负载均衡方案:一种是简单的基于DNS,另一种是更加动态的环形均衡器,他在不需要DNS服务器的情况下也允许服务注册。

基于DNS的负载均衡

当使用基于DNS的负载平衡时,后端服务的注册是在Kong之外完成,而Kong只接收来自DNS服务器的更新。如果请求的API被解析为多个IP地址,则已使用包含主机名(而不是IP地址)的upstream_url定义的每个API将自动使用基于DNS的负载平衡,前提是主机名未被解析为upstream名称或你的localhosts文件中的名称。DNS记录ttl设置(生存时间)确定刷新信息的频率。当设置ttl为0时,每个请求将使用自己的dns查询进行解析。显然这会带来性能损失,但更新/更改的延迟将非常低。

A记录

A记录包含一个或多个IP地址。因此,当主机名解析为A记录时,每个后端服务都必须有自己的IP地址。因为没有 weight 信息,所有条目在负载平衡器中将被视为同样的权重,平衡器将进行直线循环。来自DNS记录的IP地址的初始选择是随机的。这是为了确保即使当ttl为0时,负载也正确分配。

SRV记录

SRV记录包含所有IP地址的权重和端口信息。可以通过唯一的IP端口号的组合来标识后端服务。因此,单个IP地址可以托管不同端口上相同服务的多个实例。因为权重信息可用,每个条目将在负载平衡器中获得自己的权重,并且它将执行加权循环。

类似地,任何给定的端口信息将被来自DNS服务器的端口信息覆盖。如果一个API的 upstream_url=http://myhost.com:1234/path 并且 myhost.com 被解析为 SRV 记录中的 127.0.0.1:5678,此时的API将会被代理到 http://127.0.0.1:5678/path,之前的 1234 端口会被重写为 5678 端口。IP地址+端口组合在初始时是随机选择的,这是为了确保服务能被正确分配,即使ttl设置为0。

tip:每当刷新DNS记录时,都会生成列表以正确处理加权。建议将权重保持为彼此的倍数以保证系统的性能。

DNS的优先级

DNS解析器按顺序开始解析以下记录类型:

1. 最后一个成功的类型优先解析;

2. SRV记录

3. A记录

4. CNAME记录

所以,如果你使用的主机名称中同时含有SRV记录和A记录时,将仅解析SRV实例。如果你想使用A记录,那么你必须得把SRV记录从DNS中删除。如果你只有A记录,则SRV记录查询失败,然后自动指向到A记录,并查询A记录是否存在,依次类推。

环形均衡器

使用环形平衡器时,后台服务的添加和删除将由Kong处理,不需要进行DNS更新。KONG将扮演服务注册的角色。可以通过单个HTTP请求添加/删除节点,并可立即启动/停止接收请求流量。

可以通过配置 upstream 和 target 属性来配置环形均衡器。

  • upstream: 在API中把一个虚拟主机名称配置到upstream属性里。例如:一个weather.service的主机可以接收所有类似于http://weather.service/path/xxx/...的请求。

  • target: 后台服务所在的IP和端口号的组合。例如:192.168.11.48:8080。每一个target都附加有一个weight属性来指示获得的相对负载。

负载均衡算法

默认情况下,一个环平衡器将使用一个加权循环的方案。另一种方法是使用基于散列的算法。散列的输入可以是none, consumer,ip, 或者 header。当设置为none时,将使用加权循环方案,并且将禁用哈希。

有两种选择,一种主要的和一种备用方案,以防主服务器出现故障(例如,如果主服务器被设置为consumer,但是没有经过身份验证)

不同的散列选项:

  • none:不要使用哈希,而是使用加权轮询(默认)。
  • consumer:使用消费者id作为散列输入。如果没有可用的消费者id(如ldap等外部认证),此选项将在凭据id上后退。
  • ip:远程(原始)IP地址将用作输入。在使用此方法时,请检查配置设置,以确定真正的IP。
  • header:使用指定的头(在hash_on_headerhash_fallback_header字段中)作为散列的输入。

哈希算法是基于“一致性哈希”,它确保当平衡器通过改变目标(添加、移除、失败或改变权重)来修改时,只有最小的散列损失发生。这将最大优化上游缓存的命中。

一堆原理实在不好理解,下面来几个案例研究下:

Blue-Green Deployments

这是一个安全部署应用的方法,它通过提供两个版本的应用同时运行。为了部署一个新版本的应用,你需要将当前版本切换到新版本,然后关闭老版本。Blue-green deployment不会使应用停止服务,在必要的情况下允许你快速回滚应用到blue版本。

设置“蓝色”环境,运行版本1的地址服务:

# 创建一个upstream
$ curl -X POST http://kong:8001/upstreams \
    --data "name=address.v1.service"

# 给upstream添加两个target
$ curl -X POST http://kong:8001/upstreams/address.v1.service/targets \
    --data "target=192.168.34.15:80" \
    --data "weight=100"
$ curl -X POST http://kong:8001/upstreams/address.v1.service/targets \
    --data "target=192.168.34.16:80" \
    --data "weight=50"

# 创建一个把Blue上游作为目标的Service
$ curl -X POST http://kong:8001/services/  \
    --data "name=address-service"  \
    --data "host=address.v1.service" \
    --data "path=/address"

# 最后,为Service添加Route
$ curl -X POST http://kong:8001/services/address-service/routes/ \
    --data "hosts[]=address.mydomain.com"

将主机头设置为address.mydomain.com,就可以让那Kong代理这个请求转发到定义的两个目标;三分之二的请求将发送到http://192.168.34.15:80/address(权重=100),1/3将转到http://192.168.34.16:80/address(权重=50)。

设置“绿色”环境,运行版本2的地址服务:

# 为地址服务v2,创建一个新的Green upstream
$ curl -X POST http://kong:8001/upstreams \
    --data "name=address.v2.service"

# 给upstream添加两个目标
$ curl -X POST http://kong:8001/upstreams/address.v2.service/targets \
    --data "target=192.168.34.17:80"
    --data "weight=100"
$ curl -X POST http://kong:8001/upstreams/address.v2.service/targets \
    --data "target=192.168.34.18:80" \
    --data "weight=100"

# 将服务从Blue环境转换为Green环境, v1 -> v2
$ curl -X PATCH http://kong:8001/services/address-service \
    --data "host=address.v2.service"

将主机头设置为address.mydomain.com,现在已经给Kong设置了一个新的目标;一半的请求将被发送到http://192.168.34.17:80/address(权重=100),另外1/2将转到http://192.168.34.18:80/address(权重=100)。

通常,通过Kong管理API的更改是动态的,并将立即生效。不需要重新加载或重启,在进度请求中不需要删除。

金丝雀版本

使用环型平衡器,目标权重可以精确地调整,允许一个平滑的、可控的金丝雀环境。

使用一个非常简单的2个目标示例:

# 第一个目标权重 1000
$ curl -X POST http://kong:8001/upstreams/address.v2.service/targets \
    --data "target=192.168.34.17:80" \
    --data "weight=1000"

# 第二个目标权重 0
$ curl -X POST http://kong:8001/upstreams/address.v2.service/targets \
    --data "target=192.168.34.18:80" \
    --data "weight=0"

通过重复请求,但是每次改变权重,流量将慢慢地路由到另一个目标。例如,将其设置为10%:

# 第一个目标权重 900
$ curl -X POST http://kong:8001/upstreams/address.v2.service/targets \
    --data "target=192.168.34.17:80" \
    --data "weight=900"

# 第二个目标权重 100
$ curl -X POST http://kong:8001/upstreams/address.v2.service/targets \
    --data "target=192.168.34.18:80" \
    --data "weight=100"

同样,通过Kong管理API的更改是动态的,并将立即生效。不需要重新加载或重启,在进度请求中不需要删除。

穿梭机:开源API网关系统(Kong教程)入门到精通

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容