[讀書筆記]大型分布式網站架構設計與實踐.分布式緩存

前言:本書是對分布式系統架構涉及到的相關技術的一本科普書籍。由于很難作為開發參考,只能但求了解。所以通篇淺讀,對分布式系統進行大致的了解。因為寫的非常好,感覺非常有意思,自己也做不出總結。所謂的讀書筆記也就演變成了摘抄。

簡介

一個大型、穩健、成熟的分布式系統的背后,往往會設計眾多的支撐系統,我們將這些支撐系統成為分布式系統的基礎設施。除了前面所介紹的分布式協作及配置管理系統ZooKeeper,我們進行系統架構設計所依賴的基礎設施,還包括分布式緩存系統、持久化存儲、分布式消息系統、搜索引擎、以及CDN系統、負載均衡系統、運維自動化系統等,還有實時計算系統、離線計算系統、分布式文件系統、日志收集系統、監控系統、數據倉庫等。

分布式緩存

在高并發環境下,大量的讀、寫請求涌向數據庫,磁盤的處理速度與內存顯然不在一個量級,從減輕數據庫的壓力和提供系統響應速度兩個角度來考慮,一般都會在數據庫之前加一層緩存。由于單臺機器的內存資源和承載能力有限,并且如果大量使用本地緩存,也會使相同的數據被不同的節點存儲多份,對內存資源造成較大的浪費,因此才催生出了分布式緩存。
接下來將介紹分布式緩存的典型代表memcache,以及分布式緩存的應用場景。最為典型的場景莫過于分布式session。

memcache

memcache是一款開源的高性能的分布式內容對象緩存系統,被許多大型網站所采用,用于在應用中減少對數據庫的訪問,提高應用的訪問速度,并降低數據庫的負載。為了在內存中提供數據的高速查找能力,memcache使用key-value形式存儲和訪問數據,在內存中維護一張巨大的HashTable,使得對數據查詢的時間復雜度降低到O(1),保證了對數據的高性能訪問。內存的空間總是有限的,當內存沒有更多的空間來存儲新的數據時,memcache就會使用LRU(Least Recently Used)算法,將最近不常訪問的數據淘汰掉,以騰出空間來存放新的數據。memcache存儲支持的數據格式也是靈活多樣的,通過對象的序列化機制,可以將更高層的對象轉換成為二進制數據,存儲在緩存服務器中,當前端應用需要時,又可以通過二進制內容反序列化,將數據還原成原有對象。

memcache客戶端與服務端通過構建在TCP協議之上的memcache協議來進行通信,協議支持兩種數據的傳遞,這兩種數據分別為文本行和非結構化數據。文本行主要用來承載客戶端的命令及服務端的響應,而非結構化數據則主要用于客戶端和服務端數據的傳遞。由于非結構化數據采用字節流的形式在客戶端和服務端之間進行傳輸和存儲,因此使用方式非常靈活,緩存數據存儲幾乎沒有任何限制,并且服務端也不需要關心存儲的具體內容及字節序。

memcache的分布式實現

memcache本身并不是一種分布式的緩存系統,它的分布式是由訪問它的客戶端來實現的。一種比較簡單的實現方式是根據緩存的key來進行Hash,當后端有N臺緩存服務器時,訪問的服務器為hash(key)%N,這樣可以將前端的請求均衡地映射到后端的緩存服務器。但這樣也會導致一個問題,一旦后端某臺緩存服務器宕機,或者是由于集群壓力過大,需要新增緩存服務器時,大部分的key將會重新分布。對于高并發系統來說,這可能會演變成一場災難,所有的請求將如洪水般瘋狂地涌向后端的數據庫服務器,而數據庫服務器的不可用,將會導致整個應用的不可用,形成所謂的“雪崩效應”。

consistent Hash算法

使用consistent Hash算法能夠在一定程度上改善上述問題。該算法早在1997年就在論文Consistent hashing and random trees中被提出,它能夠在移除/添加一臺緩存服務器時,盡可能小地改變已存在的key映射關系,避免大量key的重新映射。

consistent Hash的原理是這樣的,它將Hash函數的值域空間組織成一個圓環,假設Hash函數的值域空間為0~(2的32次方-1),也就是Hash值是一個32位的無符號整型,整個空間按照順時針的方向進行組織,然后對相應的服務器節點進行Hash,將他們映射到Hash環上,假設有4臺服務器分別為node1,node2,node3,node4,它們在環上的位置如圖所示。
image
接下來使用相同的Hash函數,計算出對應的key的Hash值在環上對應的位置。根據consistent Hash算法,按照順時針方向,分布在node1與node2之間的key,它們的訪問請求會被定位到node2,而node2與node4之間的key,訪問請求會被定位到node4,以此類推。
假設有新的節點node5增加進來時,假設它被Hash到node2與node4之間,那么受影響的只有node2和node5之間的key,它們將被重新映射到node5,而其他key的映射關系將不會發生改變,這樣避免了大量key的重新映射。
當然上面描繪的知識一種理想的情況,各個節點在環上分布得十分均勻。正常情況下,當節點數據較少時,節點的分布可能十分不均勻,從而導致數據訪問的傾斜,大量的key被映射到同一臺服務器上。為了避免這種情況的出現,可以引入虛擬節點的機制,對每一個服務器節點都計算多個Hash值,每一個Hash值都對應環上一個節點的位置,該節點稱為虛擬節點,而key的映射方式不變,只是多了一步從虛擬節點再映射到真實節點的過程。這樣,如果虛擬節點的數量足夠多,即使只有很少的實際節點,也能夠使key分布得相對均衡。

分布式session

對于大型分布式網站來說,支撐其業務的遠遠不止一臺服務器,而是一個分布式集群,請求在不同服務器之間跳轉。那么如何保持服務器之間的session同步呢?傳統網站一般通過將一部分數據存儲在cookie中,來規避分布式環境下session的操作。這樣做的弊端很多,一方面cookie的安全性一直廣為詬病,另一方面cookie存儲數據的大小是有限制的。隨著移動互聯網的發展,很多情況下還得兼顧移動端的session需求,使得采用cookie來進行session同步的方式的弊端更為凸顯。分布式session正是在這種情況下應運而生的。
對于系統可靠性要求較高的用戶,可以將session持久化到DB中,這樣可以保證宕機時會話不易丟失,但缺點也是顯而易見的,系統的整體吞吐將受到很大的影響。另一種解決方案便是將session統一存儲到緩存集群上,如memcache,這樣可以保證較高的讀、寫性能,這一點對于并發量大的系統來說非常重要;并且從安全性考慮,session比較是有有效期的,使用緩存存儲,也便于利用緩存的失效機制。使用緩存的缺點是,一旦緩存重啟,里面保存的會話也就丟失了,需要重新建立會話。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280169.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

寧波保哥后院_如何拋出終極后院電影之夜

寧波保哥后院Most people have the basics of throwing a movie night down: you get a movie, you get snacks, you get comfortable, and boom, you’re done. When it comes to throwing a movie party in the backyard, however, things get a little trickier. Read on as…

大廠前端高頻面試問題與答案精選

近日,GitHub上一位名為木易楊(yygmind)的開發者,在 GitHub 中建了一個名為Advanced-Frontend/Daily-Interview-Question項目,該項目每天會更新一道前端大廠面試題,并邀請開發者在issue區中作答,…

Maven打包小技巧--持續更新

NO.1 跳過測試,打包指定環境 mvn clean install -Dmaven.test.skiptrue -P dev 其中:clean將target目錄中的文件移除; install根據配置文件,將本地工程打包成jar/war包; -Dmaven.test.skiptrue,打包時路過測…

OpenLayers學習筆記5——使用jQuery UI實現查詢并標注(UI篇)

近期事情非常多,老板給的壓力也非常大。經常出差,另外項目和個人研究還都要跟上,本月要交論文,還要寫專利,僅僅能抽時間來學習其它的東西了。 關于OpenLayers的在博客中不會寫太多詳細的實現(網上有非常多o…

C++ 排序函數 sort(),qsort()的用法

想起來自己天天排序排序,冒泡啊,二分查找啊,結果在STL中就自帶了排序函數sort,qsort,總算把自己解脫了~ 所以自己總結了一下,首先看sort函數見下表: 函數名功能描述sort對給定區間所有元素進行排序stable_s…

.net core 實現默認圖片

web 上 如果圖片不存在 一般是打xx 這時候 一般都是會設置默認的圖片 代替 現在用中間件的方式實現統一設置 一次設置 全部作用 .net core 實現默認圖片 Startup 文件 app.UseDefaultImage(defaultImagePath: Configuration.GetSection("defaultImagePath").Va…

spring cloud config將配置存儲在數據庫中

轉載請標明出處: https://blog.csdn.net/forezp/...本文出自方志朋的博客 Spring Cloud Config Server最常見是將配置文件放在本地或者遠程Git倉庫,放在本地是將將所有的配置文件統一寫在Config Server工程目錄下,如果需要修改配置&#xff0…

VMware虛擬機VMware Authorization Service不能啟動問題

出現VMware Authorization Service不能啟動問題,注意要在安裝VMware Player時使用管理員權限轉載于:https://www.cnblogs.com/mingzhang/p/9152873.html

PHP替換回車換行的三種方法

一個小小的換行,其實在不同的平臺有著不同的實現,為什么要這樣,世界是多樣的!本來在Unix世界換行用/n來代替換行,Windows為了體現不同,就用/r/n,更有意思的是,Mac中又用了/r。所以&a…

全球的weex資源都在這里

WeeX FAQ QQ: Weex大前端 516682889Weexbox: 943913583WeeX相關資源 weex官方資源 weex官網 Weex Market 已掛 : 一個提供 Weex 第三方組件的網站,您可以在這里找到你需要的 Weex 組件。 Playground : Playground在線,直接在線編寫代碼并預覽…

初步解決博客園代碼高亮的一個方案

今天我要推薦的是一個免費而且支持markdown語法的軟件——Typora 它有很多優點,支持多種類型代碼的高亮風格,方便的排版處理,支持Latex等,最重要的一點是真正做到了所見即所得ヽ(゚?゚)メ(&#x…

git工作原理

工作區:就是你在電腦里能看到的目錄。暫存區:英文叫stage, 或index。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。版本庫&#xf…

【前端基礎進階】JS-Object 功能詳解

Object.assign(target,source1,source2,...)該方法主要用于對象的合并,將源對象source的所有可枚舉屬性合并到目標對象target上,此方法只拷貝源對象的自身屬性,不拷貝繼承的屬性。Object.assign方法實行的是淺拷貝,而不是深拷貝。也就是說&am…

解決“無法從套接字讀取更多數據”

重啟下Oralce服務即可。轉載于:https://www.cnblogs.com/fkeyta/p/9153297.html

網頁下載Google Play 的App

網頁下載Google Play 的App 文章目錄[點擊展開](?)[] 前言 當你想在google play上下載某個應用,而無奈手機的系統并沒有安裝google servicess,此刻是否有些捉急? 本文分享的是一個網站,它可以無需手機而直接通過網頁下載Google P…

“硬核”代碼重構

在學習編程的路上,相信大家這幾個詞一定不少聽,什么 面相對象、封裝繼承多態、內功心法21種設計模式 等等 。但是卻很少用到,或者說用到的都是被動使用。大牛們在寫代碼前早就構思好了,接口,基類等等。自己寫代碼的時候…

上傳jar包到nexus私服

進入maven管理頁面&#xff0c;登錄管理員賬號 完成后可以進入對應目錄下查看pom依賴 通過maven的方式depoly 在maven的conf/setting.xml 配置nexus私服的管理賬號 在servers標簽下添加server <server><id>nexus-snapshots</id><username>repouser<…

手把手教你寫高質量Android技術博客,畫圖工具,錄像工具,Markdown寫法

前言 作為程序員&#xff0c;寫博客是一件很有意義的事情&#xff0c;可以加深自己對技術的理解&#xff0c;可以結交更多的朋友&#xff0c;記錄自己的技術軌跡&#xff0c;而且分享可以讓更多的人從中受益&#xff0c;獨樂樂不如眾樂樂嘛。 但是要寫好博客也不是件容易的事&a…

【Android】RxJava的使用(四)線程控制 —— Scheduler

前言 經過前幾篇的介紹&#xff0c;對RxJava對模式有了一定的理解&#xff1a;由Observable發起事件&#xff0c;經過中間的處理后由Observer消費。&#xff08;對RxJava還不了解的可以出門左拐&#xff09;之前的代碼中&#xff0c;事件的發起和消費都是在同一個線程中執行&am…

sed: -e expression #1, unknown option to `s'解決辦法

報錯如下&#xff1a; sed: -e expression #1, char 13: unknown option to s 需要替換的行為&#xff1a; monitor.urlhttp://192.168.25.100:8443/rest 查詢資料得知&#xff0c;報錯是因為替換的字符串包含有分隔符/ 所以這行改一下分隔符就可以解決問題了 改成感嘆號!或者|…