Kong負載均衡向?qū)?/h1>

簡介

Kong為后臺服務(wù)提供了多種負載均衡策略,一種是簡單的基于 DNS 的方法赡突,還有一種更加動態(tài)的 ring-balancer与帆,無需 DNS 服務(wù)器就可以實現(xiàn)服務(wù)注冊

基于 DNS 的負載均衡

當使用基于 DNS 的負載均衡時,后端服務(wù)的注冊是在Kong之外完成的孩锡,Kong只接收來自 DNS 服務(wù)器的更新署辉,所有 host 屬性里包含 hostname (而不是ip地址)的服務(wù)都會自動使用基于 DNS 的負載均衡策略,前提是 hostname 不能解析為 upstream 名或者 hostname 在 DNS hosts 文件里
DNS記錄中的 ttl 決定了信息的更新頻率,如果 ttl 設(shè)置為0剑辫,每個請求都會發(fā)起DNS查詢,顯然這會造成性能問題渠欺,但是DNS的更新妹蔽、改變延遲會相對非常低

A records

A record 包含一個或多個IP地址,因此當主機名解析為 A record 時,每個后端服務(wù)必須有自己的 IP 地址胳岂,因為沒有附加權(quán)重信息编整,所以此時負載平衡策略就是簡單的輪詢策略

SRV records

SRV record 中包含了所有 IP 地址的權(quán)重和端口信息,單個后端服務(wù)通過IP地址和端口組合標識乳丰,所以一個 IP 地址可以在不同端口上啟動同一個服務(wù)的不同實例掌测,并且由于有權(quán)重信息,用戶可以將負載均衡配置成加權(quán)輪詢策略
同樣产园,端口信息都會被 DNS 服務(wù)器的端口所覆蓋汞斧,如果服務(wù)的屬性為 attributes host=myhost.comport=123myhost.com 解析為 SRV 記錄為 127.0.0.1:456淆两,請求會代理到 http://127.0.0.1:456/somepath断箫,123 端口會被覆蓋成 456 端口

DNS 優(yōu)先級

DNS解析器按順序解析以下記錄類型:

  1. 上一個解析成功的類型
  2. SRV 記錄 - 添加服務(wù)記錄服務(wù)器服務(wù)記錄時會添加此項,SRV記錄了哪臺計算機提供了哪個服務(wù)秋冰,格式為:服務(wù)的名字.協(xié)議的類型(例如:_example-server._tcp)
  3. A記錄 - 將域名指向一個IPv4地址(例如:100.100.100.100)仲义,需要增加A記錄
  4. CNAME 記錄 - 如果將域名指向一個域名,實現(xiàn)與被指向域名相同的訪問效果剑勾,需要增加CNAME記錄
    這個順序可以通過 dns_order 屬性配置

DNS 注意項

  • 每當DNS記錄刷新時埃撵,Kong會生成一份列表正確處理權(quán)重信息,計算方式是將權(quán)重保持為彼此的倍數(shù)虽另,比如17和31的權(quán)重配比會生成527條條目暂刘,16和32(對應(yīng)為1和2)的權(quán)重配比會生成3條條目,即使 ttl 屬性為0捂刺,Kong也會更新這份列表
  • 不是所有的 nameserver 都會返回所有條目(因為UDP包大小的限制谣拣,比如Consul只會最多返回3條),這樣Kong只會使用 nameserver 提供給它的極少量的 upstream service族展,這種情況下森缠,upstream service 可能會加載不一致,因為Kong沒有有效感知到這些服務(wù)存在仪缸,想要避免這種情況可以換一類 nameserver贵涵,或者使用 IP 地址,而不是名稱恰画,或者確保使用足夠多的Kong節(jié)點可以使用所有的 upstream service
  • 當 nameserver 返回 3 name error宾茂,這對于Kong是有效響應(yīng),如果不想收到這個響應(yīng)拴还,先檢查名稱是否正確跨晴,再檢查 nameserver 的配置是否正確
  • 從 DNS 記錄中首次挑選 IP 地址不是隨機的,所以當 ttl 設(shè)置為0時片林,nameserver 會隨機記錄條目

ring-balancer

當使用 ring-balancer 時端盆,Kong會處理服務(wù)的加載和解綁树瞭,就不需要DNS更新了,Kong相當于一個服務(wù)注冊中心爱谁,此時可以在節(jié)點上添加或刪除單個Http請求,以快速接入和斷開流量孝偎,用戶可以通過 upstreamtarget 實體配置 ring-balancer:

  • target:后端服務(wù)所在的 IP 地址或者主機名加上端口號访敌,例如192.168.100.12:80,每個target都有一個額外的 weight 屬性標識它的相對負載衣盾,IP地址支持 IPv4 和 IPv6 兩種格式
  • upstream:虛擬主機名寺旺,例如weather.v2.service

Upstream

每個 upstream 都有自己的 ring-balancer,每個 upstream 上可以綁定很多 target 條目势决,當請求代理到虛擬主機名后會負載均衡到這些 target 上阻塑,ring-balancer 有預(yù)定數(shù)量的槽,并且基于 target 的權(quán)重果复,這些槽會分配給對應(yīng)的 target
用戶可以調(diào)用 Admin API 請求添加或者刪除 target陈莽,這個操作比較輕量,相對來說更改 upstream 本身操作比較重量級虽抄,因為 ring-balancer 需要重新構(gòu)建
只有當清理歷史 target 記錄時走搁,ring-balancer 會自動構(gòu)建,除此之外就是收到更改請求
每個 target 使用的插槽數(shù)量應(yīng)該至少大于100迈窟,以確保插槽正確分布私植,例如如果預(yù)期最多有8個 target,那么 upstream 至少定義 slots=800车酣,即使最初僅設(shè)置兩個 target曲稼,這里需要權(quán)衡的是,插槽數(shù)越多湖员,隨機分布越好贫悄,但修改(增加、刪除 target)的成本也變高
更多信息參考 Admin API 的 upstream 章節(jié)

Target

因為 upstream 會保留歷史的變化破衔,所以只能添加 target清女,不能修改和刪除,如果想要修改 target晰筛,只要為此 target 增加一個條目嫡丙,并且修改權(quán)重值,系統(tǒng)將會使用最新添加的條目读第,如果想將 target 從 ring-balancer 中刪除曙博,只需要將其權(quán)重設(shè)置為0,有關(guān)添加和操作 target 的詳細信息可以參考 Admin API 的 target 章節(jié)
當非活動條目數(shù)比活動條目數(shù)多10倍時怜瞒,將自動清除 target父泳,清除將涉及重建 ring-balancer般哼,這比新添加一個 target 條目消耗更高
target 可以是主機名而不是 IP 地址,在這種情況下惠窄,Kong會解析主機名蒸眠,并將所有的條目單獨添加到 ring-balancer 中,比如杆融,用戶添加主機名為api.host.com:123的條目楞卡,權(quán)重是100,api.host.com:123主機名可以解析成兩個ip地址脾歇,那么這兩個ip地址對應(yīng)的條目都會添加到 target 中蒋腮,并且每個權(quán)重均為100
如果主機名解析為 SRV 記錄,那么Kong會拾取 DNS 記錄對應(yīng)的端口和權(quán)重藕各,并將其覆蓋成123端口池摧,且權(quán)重為100
ring-balancer 會保留 DNS 記錄的 ttl 設(shè)置,當它過期后會重新請求并更新 ring-balancer激况,例外情況:如果一個 DNS 記錄的 ttl=0作彤,主機名會被作為單獨的 target 配置,當路由到該 target 后乌逐,Kong會重新尋找 nameserver

負載均衡策略

默認情況下宦棺,ring-balancer 使用加權(quán)輪詢策略,同時也支持基于哈希算法路由黔帕,哈希的輸入值可以是 none代咸,consumerip成黄,header 或者 cookie呐芥,當輸入為 none 時,會啟用加權(quán)輪詢策略奋岁,哈希策略將失效
一般一組哈希策略會有兩個屬性值思瘟,主屬性和 fallback 屬性(當主屬性不可用時),不同的哈希策略包括:

  • none:不使用哈希策略闻伶,使用加權(quán)輪詢策略(默認)
  • consumer:使用消費者Id作為哈希輸入滨攻,如果沒有消費者Id,則降級到使用憑證Id(外部驗證比如Idap)
  • ip:遠程 IP 地址作為哈希輸入蓝翰,使用此選項時光绕,需要確認實際 IP 的配置設(shè)置
  • header:使用特定的請求頭作為哈希輸入,一般為 hash_on_headerhash_fallback_header
  • cookie:使用特定路徑下(hash_on_cookie_path屬性畜份,默認是 "/")的特定 cookie 名(hash_on_cookie屬性)作為哈希輸入诞帐,如果請求中不存在 cookie,會在響應(yīng)中設(shè)置爆雹,如果 cookie 作為哈希策略主屬性停蕉,那么 hash_fallback 設(shè)置將不生效
    哈希算法基于散列一致(ketama 原理)愕鼓,當用戶修改 target 時(增加、刪除慧起、使失效或者更改權(quán)重等操作)菇晃,它會確保修改 ring-balancer 本身修改,保證盡量擊中 upstream service蚓挤,更多信息參考 Admin API 的 upstream 章節(jié)

負載均衡注意項

ring-balancer 可用于單節(jié)點谋旦,也適用于集群,使用加權(quán)輪詢算法時兩者沒有太大區(qū)別屈尼,但使用哈希算法時需要確保所有的節(jié)點都使用了完全相同 ring-balancer,為此必須以相同的方式構(gòu)建 ring-balancer

  • 在Kong集群中使用哈希算法時拴孤,target 的條目只能添加 IP 地址脾歧,不能使用 nameserver
  • 在對輸入使用哈希算法時,確保輸入的值足夠多樣以獲得均勻分布的哈希演熟,哈希值可以通過CRC-32算法計算鞭执,比如用戶的系統(tǒng)有成千上萬的用戶,但是僅定義了少量消費者(比如三個消費者:Web芒粹,IOS和Android)兄纺,那么通過消費者定義來計算哈希值是不夠的,選擇遠程 ip 地址作為哈希值會得到更好的效果化漆;同理估脆,如果所有的客戶端都集中在同一個 NAT 網(wǎng)關(guān)下,使用 cookie 會比使用 ip 效果更好

藍綠發(fā)布

使用 ring-balancer 可以輕松為服務(wù)編排藍綠部署座云,僅需發(fā)送 PATCH 指令修改 host 就能動態(tài)切換 target 疙赠,設(shè)置藍色環(huán)境,啟動服務(wù)版本1:

# 創(chuàng)建upstream
curl -X POST http://kong:8001/upstreams --data "name=address.v1.service"
# 在upstream上創(chuàng)建兩個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"
# 創(chuàng)建一個服務(wù)指向綠色環(huán)境
curl -X POST http://kong:8001/services/ --data "name=address-service" --data "host=address.v1.service" --data "path=/address"
# 最后創(chuàng)建一個路由作為這個服務(wù)的端點
curl -X POST http://kong:8001/services/address-service/routes/ --data "hosts[]=address.mydomain.com"

此時朦拖,主機名為 address.mydomain.com 的請求會代理到定義的 target圃阳,2/3的流量代理到 http://192.168.34.15:80/address(權(quán)重為100),1/3的流量代理到 http://192.168.34.16:80/address(權(quán)重為50)
在發(fā)布服務(wù)版本2前璧帝,先設(shè)置綠色環(huán)境:

# 創(chuàng)建綠色環(huán)境的upstream
curl -X POST http://kong:8001/upstreams --data "name=address.v2.service"
# 在upstream上創(chuàng)建兩個target
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"

用戶可以更新服務(wù)捍岳,激活藍/綠開關(guān):

curl -X PATCH http://kong:8001/services/address-service --data "host=address.v2.service"

現(xiàn)在主機名為 address.mydomain.com 的請求會代理到新的 target,一半的流量代理到 http://192.168.34.17:80/address(權(quán)重為100)睬隶,一半的流量代理到 http://192.168.34.18:80/address(權(quán)重為100)
與往常一樣锣夹,通過Kong Admin API修改權(quán)重變化是動態(tài)的,并會立即生效苏潜,不需要重啟也不需要重新加載晕城,也不會丟棄正在進行中的請求

金絲雀發(fā)布

使用 ring-balancer 可以精準調(diào)節(jié) target 的權(quán)重,從而實現(xiàn)平穩(wěn)窖贤、受控的金絲雀發(fā)布砖顷,這是一個非常簡單的調(diào)控2個 target的示例:

# Target1 權(quán)重為1000
curl -X POST http://kong:8001/upstreams/address.v2.service/targets --data "target=192.168.34.17:80" --data "weight=1000"
# Target2 權(quán)重為0
curl -X POST http://kong:8001/upstreams/address.v2.service/targets --data "target=192.168.34.18:80" --data  "weight=0"

通過重復(fù)這些請求贰锁,但每次改變權(quán)重,流量將慢慢路由到另一個 target滤蝠,此處將其設(shè)置為10%:

# Target1 權(quán)重為900
curl -X POST http://kong:8001/upstreams/address.v2.service/targets --data "target=192.168.34.17:80" --data "weight=900"
# Target2 權(quán)重為100
curl -X POST http://kong:8001/upstreams/address.v2.service/targets --data "target=192.168.34.18:80" --data  "weight=100"

通過Kong Admin API修改權(quán)重變化是動態(tài)的豌熄,并會立即生效,不需要重啟也不需要重新加載物咳,也不會丟棄正在進行中的請求

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末锣险,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子览闰,更是在濱河造成了極大的恐慌芯肤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件压鉴,死亡現(xiàn)場離奇詭異崖咨,居然都是意外死亡,警方通過查閱死者的電腦和手機油吭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門击蹲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人婉宰,你說我怎么就攤上這事歌豺。” “怎么了心包?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵类咧,是天一觀的道長。 經(jīng)常有香客問我蟹腾,道長轮听,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任岭佳,我火速辦了婚禮血巍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘珊随。我一直安慰自己述寡,他們只是感情好,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布叶洞。 她就那樣靜靜地躺著鲫凶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衩辟。 梳的紋絲不亂的頭發(fā)上螟炫,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音艺晴,去河邊找鬼昼钻。 笑死掸屡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的然评。 我是一名探鬼主播仅财,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碗淌!你這毒婦竟也來了盏求?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤亿眠,失蹤者是張志新(化名)和其女友劉穎碎罚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纳像,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡荆烈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爹耗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡谜喊,死狀恐怖潭兽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斗遏,我是刑警寧澤山卦,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站诵次,受9級特大地震影響账蓉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逾一,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一铸本、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遵堵,春花似錦箱玷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壳坪,卻和暖如春舶得,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爽蝴。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工沐批, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纫骑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓珠插,卻偏偏與公主長得像惧磺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捻撑,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容