Kong集群向?qū)?/h2>

簡(jiǎn)介

Kong集群允許用戶橫向擴(kuò)展系統(tǒng),添加更多機(jī)器來(lái)處理更多請(qǐng)求,因?yàn)樗鼈冎赶蛲粋€(gè)數(shù)據(jù)庫(kù),所有它們之間共享相同的配置,指向同一個(gè)數(shù)據(jù)倉(cāng)庫(kù)的Kong節(jié)點(diǎn)會(huì)成為同一個(gè)Kong集群的一部分
用戶需要在Kong集群前配置負(fù)載均衡器,以便在節(jié)點(diǎn)之間分配流量

Kong集群可以做什么,不可以做什么

擁有一個(gè)Kong集群并不意味著客戶端的流量會(huì)被自動(dòng)負(fù)載均衡到各個(gè)Kong節(jié)點(diǎn),用戶需要在Kong節(jié)點(diǎn)前配置負(fù)載均衡器分配流量,Kong集群僅意味著這些節(jié)點(diǎn)將共享相同的配置
出于性能原因,Kong在代理請(qǐng)求時(shí)避免數(shù)據(jù)庫(kù)連接,它將數(shù)據(jù)庫(kù)的內(nèi)容緩存在內(nèi)存中,緩存的實(shí)體包括服務(wù)、路由、消費(fèi)者、插件、憑證等等,由于這些值都存在內(nèi)存中,所以通過(guò) Admin API 修改一個(gè)節(jié)點(diǎn)后,需要將修改傳播到其他節(jié)點(diǎn)
這篇文檔描述了這些緩存實(shí)體如何失效,并且如何配置Kong節(jié)點(diǎn),以兼顧性能和一致性

單節(jié)點(diǎn)Kong集群

連接到數(shù)據(jù)庫(kù)(Cassandra 或 PostgreSQL)的單個(gè)Kong節(jié)點(diǎn)是一個(gè)單節(jié)點(diǎn)的Kong集群,通過(guò) Admin API 附加到這個(gè)節(jié)點(diǎn)上的更改都會(huì)立即生效,比如,對(duì)于單節(jié)點(diǎn)Kong集群A,如果用戶刪除一個(gè)已注冊(cè)的服務(wù):

curl -X DELETE http://127.0.0.1:8001/services/test-service

然后任何對(duì)A節(jié)點(diǎn)的后續(xù)請(qǐng)求都會(huì)立即返回 404 Not Found,因?yàn)楣?jié)點(diǎn)已將其從本地緩存中清除:

curl -i http://127.0.0.1:8000/test-service

多節(jié)點(diǎn)Kong集群

在有多個(gè)節(jié)點(diǎn)的Kong集群中,連接到同一數(shù)據(jù)庫(kù)的其他節(jié)點(diǎn)不會(huì)立即被通知A節(jié)點(diǎn)刪除了服務(wù),雖然服務(wù)不再存在于數(shù)據(jù)庫(kù)中(已被節(jié)點(diǎn)A刪除),但它仍然存在于B節(jié)點(diǎn)的內(nèi)存中,所有節(jié)點(diǎn)定期執(zhí)行后臺(tái)任務(wù)同步其他節(jié)點(diǎn)可能觸發(fā)的更改,可以通過(guò)配置這個(gè)參數(shù)修改同步的頻率:

  • db_update_frequency(默認(rèn)5秒)
    當(dāng)過(guò)了指定時(shí)間后,運(yùn)行中的Kong節(jié)點(diǎn)會(huì)輪詢(xún)數(shù)據(jù)庫(kù)的最新數(shù)據(jù),并對(duì)緩存中的數(shù)據(jù)進(jìn)行更新,如果用戶在A節(jié)點(diǎn)刪除了服務(wù),B節(jié)點(diǎn)在進(jìn)行下一次數(shù)據(jù)庫(kù)輪詢(xún)前不會(huì)馬上生效,最終Kong集群會(huì)保持一致

緩存的內(nèi)容

所有的核心如服務(wù)、路由、插件、消費(fèi)者、憑證等都由Kong緩存在內(nèi)存中,并通過(guò)輪詢(xún)機(jī)制進(jìn)行更新,此外,Kong還會(huì)緩存數(shù)據(jù)庫(kù)缺失的信息,這意味著如果用戶配置了一個(gè)沒(méi)有插件的服務(wù),Kong也會(huì)緩存下來(lái):
在A節(jié)點(diǎn)上,我們添加一個(gè)服務(wù)和一個(gè)路由:

# A節(jié)點(diǎn)
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"

可以發(fā)現(xiàn)A、B節(jié)點(diǎn)都緩存了這個(gè)服務(wù),并且都沒(méi)有配置插件的記錄:

# A節(jié)點(diǎn)
curl http://127.0.0.1:8000/example
HTTP 200 OK
# B節(jié)點(diǎn)
curl http://127.0.0.2:8000/example 
HTTP 200 OK

現(xiàn)在,假設(shè)我們通過(guò)A節(jié)點(diǎn)的 Admin API 為此服務(wù)添加一個(gè)插件:

# A節(jié)點(diǎn)
curl -X POST http://127.0.0.1:8001/services/example-service/plugins --data "name=example-plugin"

由于此請(qǐng)求是通過(guò)A節(jié)點(diǎn)的 Admin API 發(fā)出的,所以A節(jié)點(diǎn)本地之前的緩存已經(jīng)失效了,在后續(xù)的請(qǐng)求中,它會(huì)檢測(cè)到此API已經(jīng)配置了插件,但是B節(jié)點(diǎn)尚未進(jìn)行數(shù)據(jù)庫(kù)輪詢(xún),緩存中的API仍然不包含插件
結(jié)論:所有的 CRUD 操作都會(huì)使之前的緩存失效

如何配置數(shù)據(jù)庫(kù)緩存

用戶可以在Kong的配置文件中配置三個(gè)屬性,其中最重要的一個(gè)是 db_update_frequency,它可以權(quán)衡Kong節(jié)點(diǎn)的一致性和性能,Kong提供了一致性的默認(rèn)值,以便用戶在使用集群的時(shí)候不至于感到特別意外,在投入生產(chǎn)后,用戶應(yīng)該考慮調(diào)整這些值以確保性能可靠

1. db_update_frequency(默認(rèn)5秒)

這個(gè)值確定了Kong節(jié)點(diǎn)輪詢(xún)數(shù)據(jù)庫(kù)的頻率,值越小表示輪詢(xún)作業(yè)執(zhí)行得越頻繁,Kong節(jié)點(diǎn)會(huì)盡快更新最新配置;值越大Kong節(jié)點(diǎn)會(huì)花較少的時(shí)間執(zhí)行輪詢(xún)作業(yè),并專(zhuān)注于代理客戶端流量

2. db_update_propagation(默認(rèn)0秒)

如果用戶的數(shù)據(jù)庫(kù)本身最終是需要一致的(即:Cassandra),則必須配置這個(gè)值,這是為了確保變更有時(shí)間在數(shù)據(jù)庫(kù)節(jié)點(diǎn)間傳播,當(dāng)設(shè)置這個(gè)值后,Kong節(jié)點(diǎn)在執(zhí)行輪詢(xún)作業(yè)前,會(huì)延時(shí) db_update_propagation
用戶應(yīng)該將這個(gè)值設(shè)置為數(shù)據(jù)庫(kù)集群同步數(shù)據(jù)所用時(shí)間的預(yù)估值
注意:設(shè)置此值后,更改傳播到整個(gè)集群需要 db_update_frequency + db_update_propagation

3. db_cache_ttl(默認(rèn)0秒)

Kong會(huì)緩存數(shù)據(jù)庫(kù)中的內(nèi)容一段時(shí)間,當(dāng)設(shè)置了TTL時(shí),Kong會(huì)從緩存中清除該值,直到下一次從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)
默認(rèn)情況下,這個(gè)值默認(rèn)值為0,這通常運(yùn)行的很好,Kong節(jié)點(diǎn)依賴(lài)數(shù)據(jù)源的更改(Cassandra/PosgreSQL),如果用戶擔(dān)心Kong節(jié)點(diǎn)會(huì)因其他任何原因錯(cuò)過(guò)更新事件,則應(yīng)設(shè)置TTL,否則節(jié)點(diǎn)可能會(huì)使用過(guò)期值運(yùn)行一段時(shí)間,直到手動(dòng)清除緩存或重新啟動(dòng)節(jié)點(diǎn)

4. 使用Cassandra

如果用戶使用 Cassandra 作為數(shù)據(jù)源,那么必須設(shè)置 db_update_propagation 為正數(shù),因?yàn)?Cassandra 集群各節(jié)點(diǎn)的數(shù)據(jù)最終會(huì)同步,這樣可以保證Kong節(jié)點(diǎn)不會(huì)拿到一個(gè)還未來(lái)得及更新的值,如果用戶沒(méi)有配置這個(gè)值,Kong會(huì)顯示給用戶一個(gè)告警日志
此外,用戶可能希望將 cassandra_consistency 配置為 QUORUMLOCAL_QUORUM,以確保Kong節(jié)點(diǎn)緩存的值是數(shù)據(jù)庫(kù)中的最新值

通過(guò)Admin API與緩存交互

有些情況下,用戶希望查詢(xún)緩存的值,或者手動(dòng)更改緩存值,可以通過(guò) Admin API 的 /cache 端點(diǎn)來(lái)操作

檢查緩存的值

  • 端點(diǎn)
GET /cache/{cache_key}
  • 響應(yīng)
    如果key值對(duì)應(yīng)的值有緩存:
HTTP 200 OK ... { ... }

如果沒(méi)有緩存:

HTTP 404 Not Found

注意:Kong現(xiàn)在尚未提供檢索每個(gè)實(shí)體哪些 cache_key 被緩存的接口,之后的版本會(huì)提供

清除緩存的值

  • 端點(diǎn)
DELETE /cache/{cache_key}
  • 響應(yīng)
HTTP 204 No Content ...

清除節(jié)點(diǎn)的緩存

  • 端點(diǎn)
DELETE /cache
  • 響應(yīng)
HTTP 204 No Content

注意:在已經(jīng)運(yùn)行的生產(chǎn)節(jié)點(diǎn)上慎用這條命令,如果該節(jié)點(diǎn)正在接收大量請(qǐng)求,同時(shí)清除其緩存會(huì)觸發(fā)對(duì)數(shù)據(jù)庫(kù)的大量請(qǐng)求,并可能造成緩存雪崩效應(yīng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 配置加載 Kong的默認(rèn)配置在 /etc/kong/kong.conf.default 。如果你通過(guò)一個(gè)官方的安裝...
    DreamsonMa閱讀 55,838評(píng)論 0 16
  • feisky云計(jì)算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 4,383評(píng)論 0 5
  • 集群允許您水平地?cái)U(kuò)展系統(tǒng),通過(guò)增加更多的機(jī)器來(lái)處理更多的傳入請(qǐng)求。它們將共享相同的配置,因?yàn)樗鼈冎赶蛲粋€(gè)數(shù)據(jù)庫(kù)。...
    DreamsonMa閱讀 8,016評(píng)論 3 4
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 6,023評(píng)論 0 9
  • 經(jīng)得起痛,才享得起福,不努力,你連羨慕的資格都沒(méi)有。
    冰咋吃閱讀 243評(píng)論 0 1

友情鏈接更多精彩內(nèi)容