摘要:接下來將介紹分布式緩存的典型代表,以及分布式緩存的應(yīng)用場景。的分布式實(shí)現(xiàn)本身并不是一種分布式的緩存系統(tǒng),它的分布式是由訪問它的客戶端來實(shí)現(xiàn)的。
前言:本書是對分布式系統(tǒng)架構(gòu)涉及到的相關(guān)技術(shù)的一本科普書籍。由于很難作為開發(fā)參考,只能但求了解。所以通篇淺讀,對分布式系統(tǒng)進(jìn)行大致的了解。因?yàn)閷懙姆浅:?,感覺非常有意思,自己也做不出總結(jié)。所謂的讀書筆記也就演變成了摘抄。
簡介一個大型、穩(wěn)健、成熟的分布式系統(tǒng)的背后,往往會設(shè)計眾多的支撐系統(tǒng),我們將這些支撐系統(tǒng)成為分布式系統(tǒng)的基礎(chǔ)設(shè)施。除了前面所介紹的分布式協(xié)作及配置管理系統(tǒng)ZooKeeper,我們進(jìn)行系統(tǒng)架構(gòu)設(shè)計所依賴的基礎(chǔ)設(shè)施,還包括分布式緩存系統(tǒng)、持久化存儲、分布式消息系統(tǒng)、搜索引擎、以及CDN系統(tǒng)、負(fù)載均衡系統(tǒng)、運(yùn)維自動化系統(tǒng)等,還有實(shí)時計算系統(tǒng)、離線計算系統(tǒng)、分布式文件系統(tǒng)、日志收集系統(tǒng)、監(jiān)控系統(tǒng)、數(shù)據(jù)倉庫等。
分布式緩存在高并發(fā)環(huán)境下,大量的讀、寫請求涌向數(shù)據(jù)庫,磁盤的處理速度與內(nèi)存顯然不在一個量級,從減輕數(shù)據(jù)庫的壓力和提供系統(tǒng)響應(yīng)速度兩個角度來考慮,一般都會在數(shù)據(jù)庫之前加一層緩存。由于單臺機(jī)器的內(nèi)存資源和承載能力有限,并且如果大量使用本地緩存,也會使相同的數(shù)據(jù)被不同的節(jié)點(diǎn)存儲多份,對內(nèi)存資源造成較大的浪費(fèi),因此才催生出了分布式緩存。
接下來將介紹分布式緩存的典型代表memcache,以及分布式緩存的應(yīng)用場景。最為典型的場景莫過于分布式session。
memcache是一款開源的高性能的分布式內(nèi)容對象緩存系統(tǒng),被許多大型網(wǎng)站所采用,用于在應(yīng)用中減少對數(shù)據(jù)庫的訪問,提高應(yīng)用的訪問速度,并降低數(shù)據(jù)庫的負(fù)載。為了在內(nèi)存中提供數(shù)據(jù)的高速查找能力,memcache使用key-value形式存儲和訪問數(shù)據(jù),在內(nèi)存中維護(hù)一張巨大的HashTable,使得對數(shù)據(jù)查詢的時間復(fù)雜度降低到O(1),保證了對數(shù)據(jù)的高性能訪問。內(nèi)存的空間總是有限的,當(dāng)內(nèi)存沒有更多的空間來存儲新的數(shù)據(jù)時,memcache就會使用LRU(Least Recently Used)算法,將最近不常訪問的數(shù)據(jù)淘汰掉,以騰出空間來存放新的數(shù)據(jù)。memcache存儲支持的數(shù)據(jù)格式也是靈活多樣的,通過對象的序列化機(jī)制,可以將更高層的對象轉(zhuǎn)換成為二進(jìn)制數(shù)據(jù),存儲在緩存服務(wù)器中,當(dāng)前端應(yīng)用需要時,又可以通過二進(jìn)制內(nèi)容反序列化,將數(shù)據(jù)還原成原有對象。
memcache客戶端與服務(wù)端通過構(gòu)建在TCP協(xié)議之上的memcache協(xié)議來進(jìn)行通信,協(xié)議支持兩種數(shù)據(jù)的傳遞,這兩種數(shù)據(jù)分別為文本行和非結(jié)構(gòu)化數(shù)據(jù)。文本行主要用來承載客戶端的命令及服務(wù)端的響應(yīng),而非結(jié)構(gòu)化數(shù)據(jù)則主要用于客戶端和服務(wù)端數(shù)據(jù)的傳遞。由于非結(jié)構(gòu)化數(shù)據(jù)采用字節(jié)流的形式在客戶端和服務(wù)端之間進(jìn)行傳輸和存儲,因此使用方式非常靈活,緩存數(shù)據(jù)存儲幾乎沒有任何限制,并且服務(wù)端也不需要關(guān)心存儲的具體內(nèi)容及字節(jié)序。
memcache本身并不是一種分布式的緩存系統(tǒng),它的分布式是由訪問它的客戶端來實(shí)現(xiàn)的。一種比較簡單的實(shí)現(xiàn)方式是根據(jù)緩存的key來進(jìn)行Hash,當(dāng)后端有N臺緩存服務(wù)器時,訪問的服務(wù)器為hash(key)%N,這樣可以將前端的請求均衡地映射到后端的緩存服務(wù)器。但這樣也會導(dǎo)致一個問題,一旦后端某臺緩存服務(wù)器宕機(jī),或者是由于集群壓力過大,需要新增緩存服務(wù)器時,大部分的key將會重新分布。對于高并發(fā)系統(tǒng)來說,這可能會演變成一場災(zāi)難,所有的請求將如洪水般瘋狂地涌向后端的數(shù)據(jù)庫服務(wù)器,而數(shù)據(jù)庫服務(wù)器的不可用,將會導(dǎo)致整個應(yīng)用的不可用,形成所謂的“雪崩效應(yīng)”。
使用consistent Hash算法能夠在一定程度上改善上述問題。該算法早在1997年就在論文Consistent hashing and random trees中被提出,它能夠在移除/添加一臺緩存服務(wù)器時,盡可能小地改變已存在的key映射關(guān)系,避免大量key的重新映射。
consistent Hash的原理是這樣的,它將Hash函數(shù)的值域空間組織成一個圓環(huán),假設(shè)Hash函數(shù)的值域空間為0~(2的32次方-1),也就是Hash值是一個32位的無符號整型,整個空間按照順時針的方向進(jìn)行組織,然后對相應(yīng)的服務(wù)器節(jié)點(diǎn)進(jìn)行Hash,將他們映射到Hash環(huán)上,假設(shè)有4臺服務(wù)器分別為node1,node2,node3,node4,它們在環(huán)上的位置如圖所示。
接下來使用相同的Hash函數(shù),計算出對應(yīng)的key的Hash值在環(huán)上對應(yīng)的位置。根據(jù)consistent Hash算法,按照順時針方向,分布在node1與node2之間的key,它們的訪問請求會被定位到node2,而node2與node4之間的key,訪問請求會被定位到node4,以此類推。
假設(shè)有新的節(jié)點(diǎn)node5增加進(jìn)來時,假設(shè)它被Hash到node2與node4之間,那么受影響的只有node2和node5之間的key,它們將被重新映射到node5,而其他key的映射關(guān)系將不會發(fā)生改變,這樣避免了大量key的重新映射。
當(dāng)然上面描繪的知識一種理想的情況,各個節(jié)點(diǎn)在環(huán)上分布得十分均勻。正常情況下,當(dāng)節(jié)點(diǎn)數(shù)據(jù)較少時,節(jié)點(diǎn)的分布可能十分不均勻,從而導(dǎo)致數(shù)據(jù)訪問的傾斜,大量的key被映射到同一臺服務(wù)器上。為了避免這種情況的出現(xiàn),可以引入虛擬節(jié)點(diǎn)的機(jī)制,對每一個服務(wù)器節(jié)點(diǎn)都計算多個Hash值,每一個Hash值都對應(yīng)環(huán)上一個節(jié)點(diǎn)的位置,該節(jié)點(diǎn)稱為虛擬節(jié)點(diǎn),而key的映射方式不變,只是多了一步從虛擬節(jié)點(diǎn)再映射到真實(shí)節(jié)點(diǎn)的過程。這樣,如果虛擬節(jié)點(diǎn)的數(shù)量足夠多,即使只有很少的實(shí)際節(jié)點(diǎn),也能夠使key分布得相對均衡。
對于大型分布式網(wǎng)站來說,支撐其業(yè)務(wù)的遠(yuǎn)遠(yuǎn)不止一臺服務(wù)器,而是一個分布式集群,請求在不同服務(wù)器之間跳轉(zhuǎn)。那么如何保持服務(wù)器之間的session同步呢?傳統(tǒng)網(wǎng)站一般通過將一部分?jǐn)?shù)據(jù)存儲在cookie中,來規(guī)避分布式環(huán)境下session的操作。這樣做的弊端很多,一方面cookie的安全性一直廣為詬病,另一方面cookie存儲數(shù)據(jù)的大小是有限制的。隨著移動互聯(lián)網(wǎng)的發(fā)展,很多情況下還得兼顧移動端的session需求,使得采用cookie來進(jìn)行session同步的方式的弊端更為凸顯。分布式session正是在這種情況下應(yīng)運(yùn)而生的。
對于系統(tǒng)可靠性要求較高的用戶,可以將session持久化到DB中,這樣可以保證宕機(jī)時會話不易丟失,但缺點(diǎn)也是顯而易見的,系統(tǒng)的整體吞吐將受到很大的影響。另一種解決方案便是將session統(tǒng)一存儲到緩存集群上,如memcache,這樣可以保證較高的讀、寫性能,這一點(diǎn)對于并發(fā)量大的系統(tǒng)來說非常重要;并且從安全性考慮,session比較是有有效期的,使用緩存存儲,也便于利用緩存的失效機(jī)制。使用緩存的缺點(diǎn)是,一旦緩存重啟,里面保存的會話也就丟失了,需要重新建立會話。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/61897.html
摘要:另一個用戶請求過來,負(fù)載均衡器指派這個請求到服務(wù)器。這樣就平攤了請求這種方式就叫做輪詢策略還有很多種,就看你想怎么實(shí)現(xiàn)了,反正這個邏輯的代碼放在負(fù)載均衡器上。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 這本書買了一段時間了,之前在杭州沒帶過去,現(xiàn)在讀完第三章,來做做筆記 showI...
摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報率高。馬上就十一國慶假期了,給小伙伴們分享下,從小白程序員到大廠高級技術(shù)專家我看過哪些技術(shù)類書籍。 大家好,我是...
摘要:服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。全方位提升網(wǎng)站打開速度前端后端新的技術(shù)如何在內(nèi)完整打開網(wǎng)站會直接影響用戶的滿意度及留存率,在前端后端數(shù)據(jù)緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項(xiàng)目場景 最近手頭有兩個項(xiàng)目,XX 導(dǎo)航和 XX 產(chǎn)業(yè)平臺,都需要使用 HTTPS 協(xié)議,因此,這次對 HTTPS 協(xié)議做一次整理與分享。 使用緩存應(yīng)該注意哪些問題...
摘要:服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。全方位提升網(wǎng)站打開速度前端后端新的技術(shù)如何在內(nèi)完整打開網(wǎng)站會直接影響用戶的滿意度及留存率,在前端后端數(shù)據(jù)緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項(xiàng)目場景 最近手頭有兩個項(xiàng)目,XX 導(dǎo)航和 XX 產(chǎn)業(yè)平臺,都需要使用 HTTPS 協(xié)議,因此,這次對 HTTPS 協(xié)議做一次整理與分享。 使用緩存應(yīng)該注意哪些問題...
摘要:服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。全方位提升網(wǎng)站打開速度前端后端新的技術(shù)如何在內(nèi)完整打開網(wǎng)站會直接影響用戶的滿意度及留存率,在前端后端數(shù)據(jù)緩存加速等等方面都有諸多可以提升。 HTTPS 原理剖析與項(xiàng)目場景 最近手頭有兩個項(xiàng)目,XX 導(dǎo)航和 XX 產(chǎn)業(yè)平臺,都需要使用 HTTPS 協(xié)議,因此,這次對 HTTPS 協(xié)議做一次整理與分享。 使用緩存應(yīng)該注意哪些問題...
閱讀 954·2021-11-25 09:43
閱讀 2291·2019-08-30 15:55
閱讀 3153·2019-08-30 15:44
閱讀 2053·2019-08-29 16:20
閱讀 1453·2019-08-29 12:12
閱讀 1609·2019-08-26 12:19
閱讀 2283·2019-08-26 11:49
閱讀 1712·2019-08-26 11:42