同程藝龍王曉波:緩存應(yīng)該這樣治理,高并發(fā)場(chǎng)景才能游刃有余!
原創(chuàng)【51CTO.com原創(chuàng)稿件】2018年5月18-19日,由51CTO主辦的全球軟件與運(yùn)維技術(shù)峰會(huì)在北京召開(kāi)。此次峰會(huì)圍繞人工智能、大數(shù)據(jù)、物聯(lián)網(wǎng)、區(qū)塊鏈等12大核心熱點(diǎn),匯聚海內(nèi)外60位一線專家,是一場(chǎng)高端的技術(shù)盛宴,也是***IT技術(shù)人才學(xué)習(xí)和人脈拓展不容錯(cuò)過(guò)的平臺(tái)。
在19日下午“高并發(fā)與實(shí)時(shí)處理”分會(huì)場(chǎng),同程藝龍機(jī)票事業(yè)群CTO王曉波帶來(lái)了《高并發(fā)場(chǎng)景的緩存治理》的主題演講,針對(duì)如何讓緩存更適合高并發(fā)使用、如何正確使用緩存、如何通過(guò)治理化解緩存問(wèn)題等熱點(diǎn)展開(kāi)了闡述。會(huì)后,51CTO記者根據(jù)王曉波在WOT2018全球軟件與運(yùn)維技術(shù)峰會(huì)的演講內(nèi)容進(jìn)行了整理。
王曉波演講中談到,在高并發(fā)場(chǎng)景下,很多人都把cache(高速緩沖存儲(chǔ)器)當(dāng)做可以“續(xù)命”的靈丹妙藥,哪里高并發(fā)壓力大,哪里就上傳cache來(lái)解決并發(fā)問(wèn)題。但有時(shí)候,即使使用了cache,卻發(fā)現(xiàn)系統(tǒng)依然卡頓宕機(jī),是因?yàn)閏ache技術(shù)不好嗎?非也,其實(shí)這是緩存的治理工作沒(méi)有做好。
看看同程“趟過(guò)的坑”
王曉波比較系統(tǒng)地介紹了同程“趟過(guò)的坑”。
為了緩解高并發(fā)的壓力,同程最初選擇memcache(分布式的高速緩存系統(tǒng))技術(shù),后來(lái)又轉(zhuǎn)到Redis架構(gòu)(數(shù)據(jù)結(jié)構(gòu)服務(wù)器,可用作數(shù)據(jù)庫(kù)高速緩存),部署了接近200臺(tái)服務(wù)器。但情況并沒(méi)有好轉(zhuǎn),系統(tǒng)經(jīng)常性的宕機(jī),應(yīng)用中調(diào)用的腳本亂七八糟,多實(shí)例部署資源不均衡,太脆弱數(shù)據(jù)消失了。
為了實(shí)現(xiàn)對(duì)這些服務(wù)器的管理,同程開(kāi)啟了主從+keepalived(IT第3層、第四層、第五層交換機(jī)制的軟件)模式,并選擇從單機(jī)Redis逐漸升級(jí)到集群Redis。很快他們就發(fā)現(xiàn),當(dāng)集群大量部署的時(shí)候,運(yùn)維端沒(méi)有辦法做運(yùn)維,雖然可以通過(guò)腳本來(lái)統(tǒng)一運(yùn)行,但是集群不可控,而且很多運(yùn)維技術(shù)手段還容易導(dǎo)致高并發(fā)系統(tǒng)停機(jī),直接對(duì)整體業(yè)務(wù)端產(chǎn)生影響。“當(dāng)時(shí)系統(tǒng)隨時(shí)可能會(huì)掛,運(yùn)維團(tuán)隊(duì)快崩潰了。”王曉波回憶道。
所有遭遇的問(wèn)題癥結(jié)在哪里?王曉波總結(jié)到,***的問(wèn)題在于技術(shù)人員對(duì)cache的使用的規(guī)范,人們常常會(huì)忘記它本身的缺點(diǎn),只想到它的好處“快”。他舉了一個(gè)例子,在一次系統(tǒng)故障總結(jié)報(bào)道里,一名技術(shù)人員寫(xiě)到,沒(méi)想到初始狀態(tài)下只有30000行的代碼的Redis,它竟然帶來(lái)如此神奇的功能。這樣的想法以至于讓程序員感覺(jué)手里拿了一個(gè)錘子,看見(jiàn)釘子就想錘。換而言之,讓他們看見(jiàn)任何的需求都想用緩存去解決。在這樣的誤導(dǎo)下,人們開(kāi)始頻繁使用基于緩存的日志搜集器、基于緩存的倒計(jì)時(shí)、基于緩存的計(jì)數(shù)器、基于緩存的訂單系統(tǒng)。這些功能出現(xiàn)之后,人們只沉醉于它的快,卻忽視了如何去保障它的正常運(yùn)行。
緩存真正的故障是什么?王曉波歸納成四點(diǎn):一是過(guò)度依賴,這一點(diǎn)最突出,有時(shí)候明明不需要緩存,可技術(shù)人員卻非得去用緩存。二是數(shù)據(jù)落盤(pán),三是超大容量,四是緩存雪崩。為什么會(huì)出現(xiàn)這些故障呢,王曉波認(rèn)為,使用的者的亂用、濫用、懶用是***的問(wèn)題。此外,運(yùn)維數(shù)千臺(tái)毫無(wú)使用規(guī)則的緩存服務(wù)器,運(yùn)維人員不懂開(kāi)發(fā),開(kāi)發(fā)人員不懂運(yùn)維,導(dǎo)致了緩存在無(wú)設(shè)計(jì)無(wú)控制中被使用,太多的服務(wù)器資源被浪費(fèi)等都是常見(jiàn)的現(xiàn)象。
到底人們需要一個(gè)什么樣的緩存?需要一個(gè)什么樣的緩存治理?王曉波認(rèn)為,其實(shí)從真正的開(kāi)發(fā)哲學(xué)上來(lái)說(shuō),其實(shí)人們想要的是一個(gè)“百變的魔術(shù)箱”,能夠神奇地滿足各種高并發(fā)需求。簡(jiǎn)單來(lái)說(shuō),也就是說(shuō)緩存是大是小、是好是壞,都不需要開(kāi)發(fā)者關(guān)心。因?yàn)殚_(kāi)發(fā)人員對(duì)緩存技術(shù)了解有限,最怕其胡亂使用。值得警惕的是,很多開(kāi)發(fā)人員都忽視了現(xiàn)在緩存中的許多數(shù)據(jù)并不是永遠(yuǎn)的熱數(shù)據(jù),在高并發(fā)到來(lái)前也沒(méi)有做充足的估算,導(dǎo)致在應(yīng)用時(shí)再發(fā)現(xiàn)瓶頸就晚了。
同程“鳳凰涅槃”
為了真正發(fā)揮出緩存的作用,應(yīng)對(duì)高并發(fā),同程技術(shù)團(tuán)隊(duì)最終開(kāi)發(fā)出phoenix方案。最初設(shè)計(jì)時(shí),他們希望這個(gè)架構(gòu)中在應(yīng)用端會(huì)有一個(gè)簡(jiǎn)單的SDK能夠讓開(kāi)發(fā)人員去使用。只要開(kāi)發(fā)人員聲明所做的項(xiàng)目和相關(guān)數(shù)據(jù)場(chǎng)景,就會(huì)得到一個(gè)key,有了這個(gè)key,SDK就會(huì)給開(kāi)發(fā)人員分配一個(gè)新的緩存?zhèn)}庫(kù),可以在上面運(yùn)行Redis,讓整個(gè)調(diào)度平臺(tái)來(lái)調(diào)用它,速度非???。除此之外,phoenix還能從客戶端調(diào)用開(kāi)始全面監(jiān)控,當(dāng)然更重要的是能防止緩存的崩塌,實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容縮容。
后來(lái),phoenix方案又加入了代理層。因?yàn)榭蛻舳硕嗾Z(yǔ)言開(kāi)發(fā)時(shí)間成本太大,而且客戶端在應(yīng)用中的升級(jí)是個(gè)大問(wèn)題,王曉波透露,幾乎所有的嵌入式應(yīng)用的中間件升級(jí)都是一個(gè)***的麻煩,一旦升級(jí),系統(tǒng)要重新測(cè)試,很容易再度掛掉。所以通過(guò)本地緩存控制更好,部分使用頻率不高的可以使用磁盤(pán)做緩存。
***,phoenix方案中又加入了容器。當(dāng)實(shí)現(xiàn)容器化部署后,通過(guò)多個(gè)小集群+單節(jié)點(diǎn)、以場(chǎng)景劃分集群、實(shí)時(shí)平衡調(diào)度數(shù)據(jù),同程的整體監(jiān)控、數(shù)據(jù)遷移、伸縮調(diào)度都變得更靈活更容易操作。以數(shù)據(jù)遷移為例,同程做了整套的遷移系統(tǒng),從流量擴(kuò)容到數(shù)據(jù)的擴(kuò)容,從縱向跟橫向的擴(kuò)容,全部實(shí)現(xiàn)了一個(gè)比較好的全自動(dòng)處理。
以上內(nèi)容是51CTO記者根據(jù)同程藝龍機(jī)票事業(yè)群CTO王曉波在WOT2018全球軟件與運(yùn)維技術(shù)峰會(huì)的采訪內(nèi)容整理,更多關(guān)于WOT的內(nèi)容請(qǐng)關(guān)注51cto.com。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】