『壹』 對於SSD來說緩存很重要嗎為什麼許多SSD都沒有緩存
1、任何ssd都有緩存的,只是有的做到了主控里,有的外置了,有的小有的大而已。
2、不同的主控演算法對緩存大小的需求不同。
無緩存是當前固態硬碟的主流發展方向,這是價格導向決定的。DRAM緩存對於固態硬碟來說並不是必須的,而且固態硬碟的緩存跟機械硬碟的緩存不同,里邊存儲的是FTL快閃記憶體映射表,而非用戶讀寫的數據緩沖,不直接影響到讀寫性能表現。
雖然無緩存的硬碟理論上4K讀取會比有緩存的低一些,但並不絕對。譬如東芝TR200就屬於無緩存的SATA固態硬碟,但是在CPU主頻足夠的情況下,4K QD1隨機讀取可以達到50多MB/s,不比任何有緩存的固態硬碟差。
優勢:
在SSD作為緩存的方案中,緩存控制器——位於陣列前部或在伺服器內部位置——可以監控熱點I/O應用並製作其復本放在SSD上作為緩存,這樣可以較傳統的磁碟實現更快速的訪問速率。這種方式的好處在於任何繁忙的應用程序可以獲得性能上的提升,並且這種環境中的性能通常當緩存加入後可以立即提升。
以上內容參考:網路-SSD緩存
『貳』 如何使用redis做mysql的緩存
應用Redis實現數據的讀寫,同時利用隊列處理器定時將數據寫入MySQL。
同時要注意避免沖突,在redis啟動時去mysql讀取所有表鍵值存入redis中,往redis寫數據時,對redis主鍵自增並進行讀取,若mysql更新失敗,則需要及時清除緩存及同步redis主鍵。
這樣處理,主要是實時讀寫redis,而mysql數據則通過隊列非同步處理,緩解mysql壓力,不過這種方法應用場景主要基於高並發,而且redis的高可用集群架構相對更復雜,一般不是很推薦。
《內存資料庫和mysql的同步機制》
redis如何做到和mysql資料庫的同步
【方案一】http://www.hu.com/question/23401553?sort=created
程序實現mysql更新、添加、刪除就刪除redis數據。
程序查詢redis,不存在就查詢mysql並保存redis
redis和mysql數據的同步,代碼級別大致可以這樣做:
讀: 讀redis->沒有,讀mysql->把mysql數據寫回redis
寫: 寫mysql->成功,寫redis(捕捉所有mysql的修改,寫入和刪除事件,對redis進行操作)
【方案二】http://www.linuxidc.com/Linux/2015-01/380.htm
實時獲取mysql binlog進行解析,然後修改redis
MySQL到Redis數據方案
無論MySQL還是Redis,自身都帶有數據同步的機制,像比較常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog來實現的,這樣的數據其實還是一個非同步過程,只不過當伺服器都在同一內網時,非同步的延遲幾乎可以忽略。
那麼理論上我們也可以用同樣方式,分析MySQL的binlog文件並將數據插入Redis。但是這需要對binlog文件以及MySQL有非常深入的理解,同時由於binlog存在Statement/Row/Mixedlevel多種形式,分析binlog實現同步的工作量是非常大的。
因此這里選擇了一種開發成本更加低廉的方式,借用已經比較成熟的MySQL UDF,將MySQL數據首先放入Gearman中,然後通過一個自己編寫的PHP Gearman Worker,將數據同步到Redis。比分析binlog的方式增加了不少流程,但是實現成本更低,更容易操作。
【方案三】
使用mysql的udf,詳情請看MySQL :: MySQL 5.1 Reference Manual :: 22.3 Adding New Functions to MySQL 然後通過trigger在表update和insert之後進行函數的調用,寫入到redis中去。大致是這個樣子。
【http://www.hu.com/question/27738066】
1.首先明確是不是一定要上緩存,當前架構的瓶頸在哪裡,若瓶頸真是資料庫操作上,再繼續往下看。
2.明確memcached和redis的區別,到底要使用哪個。前者終究是個緩存,不可能永久保存數據(LRU機制),支持分布式,後者除了緩存的同時也支持把數據持久化到磁碟等,redis要自己去實現分布式緩存(貌似最新版本的已集成),自己去實現一致性hash。因為不知道你們的應用場景,不好說一定要用memcache還是redis,說不定用MongoDB會更好,比如在存儲日誌方面。
3.緩存量大但又不常變化的數據,比如評論。
4.你的思路是對的,清晰明了,讀DB前,先讀緩存,如果有直接返回,如果沒有再讀DB,然後寫入緩存層並返回。
5.考慮是否需要主從,讀寫分離,考慮是否分布式部署,考慮是否後續水平伸縮。
6.想要一勞永逸,後續維護和擴展方便,那就將現有的代碼架構優化,按你說的替換資料庫組件需要改動大量代碼,說明當前架構存在問題。可以利用現有的一些框架,比如SpringMVC,將你的應用層和業務層和資料庫層解耦。再上緩存之前把這些做好。
7.把讀取緩存等操作做成服務組件,對業務層提供服務,業務層對應用層提供服務。
8.保留原始資料庫組件,優化成服務組件,方便後續業務層靈活調用緩存或者是資料庫。
9.不建議一次性全量上緩存,最開始不動核心業務,可以將邊緣業務先換成緩存組件,一步步換至核心業務。
10.刷新內存,以memcached為例,新增,修改和刪除操作,一般採用lazy load的策略,即新增時只寫入資料庫,並不會馬上更新Memcached,而是等到再次讀取時才會載入到Memcached中,修改和刪除操作也是更新資料庫,然後將Memcached中的數據標記為失效,等待下次讀取時再載入。
『叄』 Redis 都有哪些應用場景
緩存:這應該是 Redis 最主要的功能了,也是大型網站必備機制,合理地使用緩存不僅可以加 快數據的訪問速度,而且能夠有效地降低後端數據源的壓力。
共享Session:對於一些依賴 session 功能的服務來說,如果需要從單機變成集群的話,可以選擇 redis 來統一管理 session。
消息隊列系統:消息隊列系統可以說是一個大型網站的必備基礎組件,因為其具有業務 解耦、非實時業務削峰等特性。Redis提供了發布訂閱功能和阻塞隊列的功 能,雖然和專業的消息隊列比還不夠足夠強大,但是對於一般的消息隊列功 能基本可以滿足。比如在分布式爬蟲系統中,使用 redis 來統一管理 url隊列。
分布式鎖:在分布式服務中。可以利用Redis的setnx功能來編寫分布式的鎖,雖然這個可能不是太常用。 當然還有諸如排行榜、點贊功能都可以使用 Redis 來實現,但是 Redis 也不是什麼都可以做,比如數據量特別大時,不適合 Redis,我們知道 Redis 是基於內存的,雖然內存很便宜,但是如果你每天的數據量特別大,比如幾億條的用戶行為日誌數據,用 Redis 來存儲的話,成本相當的高。
『肆』 redis一般用來幹嘛
redis是一個單線程的NoSQL資料庫,主要用來做數據緩存,一般大型網站的應用和資料庫之間的那一層就是Redis。比如京東商城的頁面查找功能,用戶接觸到的查詢的第一層就是Redis數據緩存層,緩存中找不到的數據,再進入資料庫查詢。Redis中緩存熱點數據,能夠保護資料庫,提高查詢效率。
NoSQL,泛指非關系型的資料庫。隨著互聯網web2.0網站的興起,傳統的關系資料庫在處理web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經顯得力不從心,出現了很多難以克服的問題,而非關系型的資料庫則由於其本身的特點得到了非常迅速的發展。NoSQL資料庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,特別是大數據應用難題。
『伍』 SpringBoot進階之緩存中間件Redis
大家好,一直以來我都本著 用最通俗的話理解核心的知識點, 我認為所有的難點都離不開 「基礎知識」 的鋪墊
「大佬可以繞過 ~」
本節給大家講講 「Java的SpringBoot框架」 , 之前我們學習的都是java的基礎知識和底層提供的一些能力,我們日常工作都是在寫介面。在我們在產品開發中,一般我們都會選擇比較穩定的框架來幫我們加速開發,不會自己去造輪子,而在java眾多框架中,spring框架表現的非常好,大部分公司都會首選它作為開發框架,而至今,大部分企業都是以 springboot 來構建項目了,一個穩健的系統需要引入穩定的技術~
如果你是一路看過來的,很高興你能夠耐心看完。前幾期都是帶大家學習了 SpringBoot 的基礎使用以及集成 mybatis 開發,這也是我們寫業務的基礎,如果你還不熟悉這些,請先看完它們。接下來的幾期內容將會帶大家進階使用,會先講解基礎 中間件 的使用和一些場景的應用,或許這些技術你聽說過,沒看過也沒關系,我會帶大家一步一步的入門,耐心看完你一定會有 收獲 ,本期將會給大家講解最熱門的緩存中間件技術 Redis ,同樣的,我們集成到 Springboot 中。最近github可能會被牆,所以我把源碼放到了國內gitee上,本節我們依然使用上期的代碼
Redis 是由義大利人Salvatore Sanfilippo(網名:antirez)開發的一款內存高速緩存資料庫。全稱叫 Remote Dictionary Server(遠程數據服務) 是由 C語言 編寫的,Redis是一個 key-value 存儲系統,它支持豐富的數據類型,如: string、list、set、zset(sorted set)、hash 。
它本質上是一種鍵值對資料庫,我們之前學習的 mysql 它是持久層的關系型資料庫,而 redis 它的存儲主要存在 內存 中。我們都知道在 內存 中的數據讀取是非常快的,就好比你把一個變數存到磁碟讀取和直接放到代碼中運行,肯定是在代碼中拿到的速度快,因為運行時期,都是直接存到內存的。
給大家總結一下:
有了基本的概念之後,我們下面進行環境搭建,在學習階段,安裝 redis 很簡單,生產環境一般我們也會選擇雲產品,一切為了服務保障,雖說它只是做緩存用,但也是系統的一把 保護傘
如果你是 mac 用戶,你可以運行如下命令:
安裝完成後會提示你運行命令,運行即可。
win 用戶也很簡單,直接下載 redis 軟體,雙擊運行即可,運行之後它會有一個小方塊的圖案,和 locahost:6379 的log,說明運行成功了。初始階段沒有配置的 redis 默認 host 就是本地, port 就是 6379 , 而且是 沒有密碼 就可以訪問的。
推薦一個客戶端軟體 Redis Desktop Manager ,它是 redis 的客戶端界面軟體,方便麵我們學習的時候 清理緩存 使用,生產慎連。
我們不給大家講它的基本命令使用,它也有語法,可以通過類似命令執行,如果想學習的小夥伴,可以自行搜索。本期重點內容是在 sprinboot 中的使用,我們平時開發不可能是去命令行里敲的,都是代碼里執行,而目前市面上有很多封裝好的庫,我們可以直接調用它的方法,很方便的就可以操作它了,不用記一些繁瑣的命令,下面我們就實際操作一下:
修改 pom.xml
修改 application.yml :
redis 默認是有 16 個庫,不是 15 個啊,從 0 開始算的,我們隨便連一個
通過代碼很好理解, 首先需要引入 StringRedisTemplate ,然後需要設置一個 key ,那麼思考一下,這個 key 允許重復嗎
我們進客戶端看一下,發現 key 還是只有一個,但是值變成了新的值了,所以可以得知 key 是唯一的,我們重新設置的時候相當於刷新了它。
在 redis 中刪除緩存有兩種方式,一種是自我消亡,也就是 過期 銷毀,還有有一種是 主動 銷毀,我們先看一下,過期時間如何設置
我們設置了 10s 後過期,過完10s後發現,這個```key data``消失了。我們在看看如何主動刪除
我們可以利用 Redis 做一個計數器,實現自增功能,你可以用它做網站訪問統計
通常做法,我們會把它封裝一下,後續使用直接引入封裝好的即可,把它直接交給 Springboot容器 管理
其實這個類,你還可以繼續進一步封裝,比如約束 key 的規范,約束過期時間,約束數據類型等等,這一切也都是為了規范和後期維護,防止濫用緩存
緩存的主要場景是用於解決熱點數據問題,因為這些數據是訪問頻率比較高的,當大量的請求進來, mysql 可能壓力很大,這樣一來,數據查詢效率就很慢,用戶肯不高興等了,這樣用戶體驗很不好。所以我們一般做法,都是把這些熱點數據放到緩存里,因為緩存讀取速度很快。當有新數據的時候,我們再及時更新它,一般流程是先查詢緩存,查到了直接返回緩存數據,查不到再走資料庫,然後再刷回緩存。
但是並發足夠大的時候,還是會暴露出很多問題,比如面試常問的一些高頻問題 緩存雪崩、緩存穿透、緩存雪崩 ,這些問題後邊會給大家專門講,和如何去防範。所以總的來說,引入任何一門技術並不是萬事大吉,還需我們不斷的在實踐中積累經驗
本期到這里就結束了,總結一下,我們了解了什麼是 redis ,以及在 springboot 中如何去使用它們,很簡單,沒什麼復雜的東西。但這里想多說一點的是,緩存的設計卻是很復雜的,因為工具是死的,人是活的,我們如何正確設計,需要我們在項目中不斷的積累。
我們之前教大家查詢列表數據,都是所有數據返回,還沒有教大家如何去做分頁,下期將帶大家學習一下 mybatis 分頁插件的使用 ,下期不見不散, 關注我,不迷路~
『陸』 全面的硬碟知識
硬碟,英文「hard-disk」簡稱HD 。是一種儲存量巨大的設備,作用是儲存計算機運行時需要的數據。
體現硬碟好壞的主要參數為傳輸率,其次的為轉速、單片容量、尋道時間、緩存、噪音和S.M.A.R.T.
1956年IBM公司製造出世界上第一塊硬碟350 RAMAC(Random Access Method of Accounting and Control),它的數據為:容量5MB、碟片直徑為24英寸、碟片數為50片、重量上百公斤。碟片上有一層磁性物質,被軸帶著旋轉,有磁頭移動著存儲數據,實現了隨機存取。
1970年磁碟誕生
1973年IBM公司製造出了一台640MB的硬碟、第一次採用「溫徹斯特」技術,是現在硬碟的開端,因為磁頭懸浮在碟片上方,所以鍍磁的碟片在密封的硬碟里可以飛速的旋轉,但有好幾十公斤重。
1975年Soft-adjacent layer(軟接近層)專利的MR磁頭結構產生
1979年IBM發明了薄膜磁頭,這意味著硬碟可以變的很小,速度可以更快,同體積下硬碟可以更大。
1979年IBM 3370誕生,它是第一款採用thin-film感應磁頭及Run-Length-Limited(RLL)編碼配置的硬碟,"2-7"RLL編碼將能減小硬碟錯誤
1986年IBM 9332誕生,它是第一款使用更高效的1-7 run-length-limited(RLL)代碼的硬碟。
1989年第一代MR磁頭出現
1991年IBM磁阻MR(Magneto Resistive)磁頭硬碟出現。帶動了一個G的硬碟也出現。磁阻磁頭對信號變化相當敏感,所以碟片的存儲密度可以得到幾十倍的提高。意味著硬碟的容量可以作的更大。意味著硬碟進入了G級時代。
1993年GMR(巨磁阻磁頭技術)推出,這使硬碟的存儲密度又上了一個台階。
認識硬碟
硬碟是電腦中的重要部件,大家所安裝的操作系統(如:Windows 9x、Windows 2k…)及所有的應用軟體(如:Dreamwaver、Flash、Photoshop…)等都是位於硬碟中,或許你沒感覺到吧!但硬碟確實非常重要,至少目前它還是我們存儲數據的主要場所,那你對硬碟究竟了解多少了?可能你對她一竅不通,不過沒關系,請見下文。
一、硬碟的歷史與發展
從第一塊硬碟RAMAC的產生到現在單碟容量高達15GB多的硬碟,硬碟也經歷了幾代的發展,下面就介紹一下其歷史及發展。
1.1956年9月,IBM的一個工程小組向世界展示了第一台磁碟存儲系統IBM 350 RAMAC(Random Access Method of Accounting and Control),其磁頭可以直接移動到碟片上的任何一塊存儲區域,從而成功地實現了隨機存儲,這套系統的總容量只有5MB,共使用了50個直徑為24英寸的磁碟,這些碟片表面塗有一層磁性物質,它們被疊起來固定在一起,繞著同一個軸旋轉。此款RAMAC在那時主要用於飛機預約、自動銀行、醫學診斷及太空領域內。
2.1968年IBM公司首次提出「溫徹斯特/Winchester」技術,探討對硬碟技術做重大改造的可能性。「溫徹斯特」技術的精隋是:「密封、固定並高速旋轉的鍍磁碟片,磁頭沿碟片徑向移動,磁頭懸浮在高速轉動的碟片上方,而不與碟片直接接觸」,這也是現代絕大多數硬碟的原型。
3.1973年IBM公司製造出第一台採用「溫徹期特」技術的硬碟,從此硬碟技術的發展有了正確的結構基礎。
4.1979年,IBM再次發明了薄膜磁頭,為進一步減小硬碟體積、增大容量、提高讀寫速度提供了可能。
5.80年代末期IBM對硬碟發展的又一項重大貢獻,即發明了MR(Magneto Resistive)磁阻,這種磁頭在讀取數據時對信號變化相當敏感,使得碟片的存儲密度能夠比以往20MB每英寸提高了數十倍。
6.1991年IBM生產的3.5英寸的硬碟使用了MR磁頭,使硬碟的容量首次達到了1GB,從此硬碟容量開始進入了GB數量級。
7.1999年9月7日,Maxtor宣布了首塊單碟容量高達10.2GB的ATA硬碟,從而把硬碟的容量引入了一個新里程碑。
8.2000年2月23日,希捷發布了轉速高達15,000RPM的Cheetah X15系列硬碟,其平均尋道時間只有3.9ms,這可算是目前世界上最快的硬碟了,同時它也是到目前為止轉速最高的硬碟;其性能相當於閱讀一整部Shakespeare只花.15秒。此系列產品的內部數據傳輸率高達48MB/s,數據緩存為4~16MB,支持Ultra160/m SCSI及Fibre Channel(光纖通道) ,這將硬碟外部數據傳輸率提高到了160MB~200MB/s。總得來說,希捷的此款("捷豹")Cheetah X15系列將硬碟的性能提高到了一個新的里程碑。
9.2000年3月16日,硬碟領域又有新突破,第一款「玻璃硬碟」問世,這就是IBM推出的Deskstar 75GXP及Deskstar 40GV,此兩款硬碟均使用玻璃取代傳統的鋁作為碟片材料,這能為硬碟帶來更大的平滑性及更高的堅固性。另外玻璃材料在高轉速時具有更高的穩定性。此外Deskstar 75GXP系列產品的最高容量達75GB,這是目前最大容量的硬碟,而Deskstar 40GV的數據存儲密度則高達14.3 十億數據位/每平方英寸,這再次涮新數據存儲密度世界記錄。
二、硬碟分類
目前的硬碟產品內部碟片有:5.25,3.5,2.5和1.8英寸(後兩種常用於筆記本及部分袖珍精密儀器中,現在台式機中常用3.5英寸的碟片);如果按硬碟與電腦之間的數據介面,可分為兩大類:IDE介面及SCSI介面硬碟兩大陣營。
三、技術規格
目前台式機中硬碟的外形差不了多少,在技術規格上有幾項重要的指標:
1.平均尋道時間(average seek time),指硬碟磁頭移動到數據所在磁軌時所用的時間,單位為毫秒(ms)。注意它與平均訪問時間的差別,平均尋道時間當然是越小越好,現在選購硬碟時應該選擇平均尋道時間低於9ms的產品。
2.平均潛伏期(average latency),指當磁頭移動到數據所在的磁軌後,然後等待所要的數據塊繼續轉動(半圈或多些、少些)到磁頭下的時間,單位為毫秒(ms)。
3.道至道時間(single track seek),指磁頭從一磁軌轉移至另一磁軌的時間,單位為毫秒(ms)。
4.全程訪問時間(max full seek),指磁頭開始移動直到最後找到所需要的數據塊所用的全部時間,單位為毫秒(ms)。
5.平均訪問時間(average access),指磁頭找到指定數據的平均時間,單位為毫秒。通常是平均尋道時間和平均潛伏時間之和。注意:現在不少硬碟廣告之中所說的平均訪問時間大部分都是用平均尋道時間所代替的。
6.最大內部數據傳輸率(internal data transfer rate),也叫持續數據傳輸率(sustained transfer rate),單位Mb/S(注意與MB/S之間的差別)。它指磁頭至硬碟緩存間的最大數據傳輸率,一般取決於硬碟的碟片轉速和碟片數據線密度(指同一磁軌上的數據間隔度)。注意,在這項指標中常常使用Mb/S或Mbps為單位,這是兆位/秒的意思,如果需要轉換成MB/S(兆位元組/秒),就必須將Mbps數據除以8(一位元組8位數)。例如,WD36400硬碟給出的最大內部數據傳輸率為131Mbps,但如果按MB/S計算就只有16.37MB/s(131/8)。
7.外部數據傳輸率:通稱突發數據傳輸率(burst data transfer rate),指從硬碟緩沖區讀取數據的速率,在廣告或硬碟特性表中常以數據介面速率代替,單位為MB/S。目前主流硬碟普通採用的是Ultra ATA/66,它的最大外部數據率即為66.7MB/s,而在SCSI硬碟中,採用最新的Ultra 160/m SCSI介面標准,其數據傳輸率可達160MB/s,採用Fibra Channel(光纖通道),最大外部數據傳輸將可達200MB/s。在廣告中我們有時能看到說雙Ultra 160/m SCSI的介面,這理論上將最大外部數據傳輸率提高到了320MB/s,但目前好像還沒有結合有此介面的產品推出。
8.主軸轉速:是指硬碟內主軸的轉動速度,目前ATA(IDE)硬碟的主軸轉速一般為5400~7200rpm,主流硬碟的轉速為7200RPM,至於SCSI硬碟的主軸轉速可達一般為7200~10,000RPM,而最高轉速的SCSI硬碟轉速高達15,000RPM(即希捷「捷豹X15」系列硬碟)。
9.數據緩存:指在硬碟內部的高速存儲器:目前硬碟的高速緩存一般為512KB~2MB,目前主流ATA硬碟的數據緩存應該為2MB,而在SCSI硬碟中最高的數據緩存現在已經達到了16MB。對於大數據緩存的硬碟在存取零散文件時具有很大的優勢。
10.硬碟表面溫度:它是指硬碟工作時產生的溫度使硬碟密封殼溫度上升情況。這項指標廠家並不提供,一般只能在各種媒體的測試數據中看到。硬碟工作時產生的溫度過高將影響薄膜式磁頭(包括GMR磁頭)的數據讀取靈敏度,因此硬碟工作表面溫度較低的硬碟有更好的數據讀、寫穩定性。如果對於高轉速的SCSI硬碟一般來說應該加一個硬碟冷卻裝置,這樣硬碟的工作穩定性才能得到保障。
11.MTBF(連續無故障時間):它指硬碟從開始運行到出現故障的最長時間,單位是小時。一般硬碟的MTBF至少在30000或40000小時。這項指標在一般的產品廣告或常見的技術特性表中並不提供,需要時可專門上網到具體生產該款硬碟的公司網址中查詢。
四、介面標准
ATA介面,這是目前台式機硬碟中普通採用的介面類型。
ST-506/412介面:
這是希捷開發的一種硬碟介面,首先使用這種介面的硬碟為希捷的ST-506及ST-412。ST-506介面使用起來相當簡便,它不需要任何特殊的電纜及接頭,但是它支持的傳輸速度很低,因此到了1987年左右這種介面就基本上被淘汰了,採用該介面的老硬碟容量多數都低於200MB。早期IBM PC/XT和PC/AT機器使用的硬碟就是ST-506/412硬碟或稱MFM硬碟,MFM(Modified Frequency Molation)是指一種編碼方案 。
ESDI介面:
即(Enhanced Small Drive Interface)介面,它是邁拓公司於1983年開發的。其特點是將編解碼器放在硬碟本身之中,而不是在控制卡上,理論傳輸速度是前面所述的ST-506的2…4倍,一般可達到10Mbps。但其成本較高,與後來產生的IDE介面相比無優勢可言,因此在九十年代後就補淘汰了
IDE及EIDE介面:
IDE(Integrated Drive Electronics)的本意實際上是指把控制器與盤體集成在一起的硬碟驅動器,我們常說的IDE介面,也叫ATA(Advanced Technology Attachment)介面,現在PC機使用的硬碟大多數都是IDE兼容的,只需用一根電纜將它們與主板或介面卡連起來就可以了。 把盤體與控制器集成在一起的做法減少了硬碟介面的電纜數目與長度,數據傳輸的可靠性得到了增強,硬碟製造起來變得更容易,因為廠商不需要再擔心自己的硬碟是否與其它廠商生產的控制器兼容,對用戶而言,硬碟安裝起來也更為方便。
ATA-1(IDE):
ATA是最早的IDE標準的正式名稱,IDE實際上是指連在硬碟介面的硬碟本身。ATA在主板上有一個插口,支持一個主設備和一個從設備,每個設備的最大容量為504MB,ATA最早支持的PIO-0模式(Programmed I/O-0)只有3.3MB/s,而ATA-1一共規定了3種PIO模式和4種DMA模式(沒有得到實際應用),要升級為ATA-2,你需要安裝一個EIDE適配卡。
ATA-2(EIDE Enhanced IDE/Fast ATA):
這是對ATA-1的擴展,它增加了2種PIO和2種DMA模式,把最高傳輸率提高到了16.7MB/s,同時引進了LBA地址轉換方式,突破了老BIOS固有504MB的限制,支持最高可達8.1GB的硬碟。如你的電腦支持ATA-2,則可以在CMOS設置中找到(LBA,LogicalBlock Address)或(CHS,Cylinder,Head,Sector)的設置。其兩個插口分別可以連接一個主設備和一個從設置,從而可以支持四個設備,兩個插口也分為主插口和從插口。通常可將最快的硬碟和CD—ROM放置在主插口上,而將次要一些的設備放在從插口上,這種放置方式對於486及早期的Pentium電腦是必要的,這樣可以使主插口連在快速的PCI匯流排上,而從插口連在較慢的ISA匯流排上。
ATA-3(FastATA-2):
這個版本支持PIO-4,沒有增加更高速度的工作模式(即仍為16.7MB/s),但引入了簡單的密碼保護的安全方案,對電源管理方案進行了修改,引入了S.M.A.R.T(Self-Monitoring,Analysis and Reporting Technology,自監測、分析和報告技術)
ATA-4(UltraATA、UltraDMA、UltraDMA/33、UltraDMA/66):
這個新標准將PIO-4下的最大數據傳輸率提高了一倍,達到33MB/s,或更高的66MB/s。它還在匯流排佔用上引入了新的技術,使用PC的DMA通道減少了CPU的處理負荷。要使用Ultra-ATA,需要一個空閑的PCI擴展槽,如果將UltraATA硬碟卡插在ISA擴展槽上,則該設備不可能達到其最大傳輸率,因為ISA匯流排的最大數據傳輸率只有8MB/s 。其中的Ultra ATA/66(即Ultra DMA/66)是目前主流桌面硬碟採用的介面類型,其支持最大外部數據傳輸率為66.7MB/s。
Serial ATA:
新的Serial ATA(即串列ATA),是英特爾公司在今年IDF(Intel Developer Forum,英特爾開發者論壇) 發布的將於下一代外設產品中採用的介面類型,就如其名所示,它以連續串列的方式傳送資料,在同一時間點內只會有1位數據傳輸,此做法能減小介面的針腳數目,用四個針就完成了所有的工作(第1針發出、2針接收、3針供電、4針地線)。這樣做法能降低電力消耗,減小發熱量。最新的硬碟介面類型ATA-100就是Serial ATA是初始規格,它支持的最大外部數據傳輸率達100MB/s,上面介紹的那兩款IBM Deskstar 75GXP及Deskstar 40GV就是第一次採用此ATA-100介面類型的產品。在2001年第二季度將推出Serial ATA 1x標準的產品,它能提高150MB/s的數據傳輸率。對於Serial ATA介面,一台電腦同時掛接兩個硬碟就沒有主、從盤之分了,各設備對電腦主機來說,都是Master,這樣我們可省了不少跳線功夫。
SCSI介面:
SCSI就是指Small Computer System Interface(小型計算機系統介面),它最早研製於1979,原是為小型機的研製出的一種介面技術,但隨著電腦技術的發展,現在它被完全移植到了普通PC上。現在的SCSI可以劃分為SCSI-1和SCSI-2(SCSI Wide與SCSI Wind Fast),最新的為SCSI-3,不過SCSI-2是目前最流行的SCSI版本。 SCSI廣泛應用於如:硬碟、光碟機、ZIP、MO、掃描儀、磁帶機、JAZ、列印機、光碟刻錄機等設備上。它的優點非常多主要表現為以下幾點:
1、適應面廣; 使用SCSI,你所接的設備就可以超過15個,而所有這些設備只佔用一個IRQ,這就可以避免IDE最大外掛15個外設的限制。
2、多任務;不像IDE,SCSI允許對一個設備傳輸數據的同時,另一個設備對其進行數據查找。這將在多任務操作系統如Linux、Windows NT中獲得更高的性能。
3、寬頻寬;在理論上,最快的SCSI匯流排有160MB/s的帶寬,即Ultra 160/s SCSI;這意味著你的硬碟傳輸率最高將達160MB/s(當然這是理論上的,實際應用中可能會低一點)。
4、少CPU佔用率
從最早的SCSI到現在Ultra 160/m SCSI,SCSI介面具有如下幾個發展階段
1、SCSI-1 —最早SCSI是於1979年由美國的Shugart公司(Seagate希捷公司的前身)制訂的,並於1986年獲得了ANSI(美國標准協會)承認的SASI(Shugart Associates System Interface施加特聯合系統介面) ,這就是我們現在所指的SCSI -1,它的特點是,支持同步和非同步SCSI外圍設備;支持7台8位的外圍設備最大數據傳輸速度為5MB/S;支持WORM外圍設備。
2、SCSI-2 —90年代初(具體是1992年),SCSI發展到了SCSI-2,當時的SCSI-2 產品(通稱為Fast SCSI)是能過提高同步傳輸時的頻率使數據傳輸率提高為10MB/S,原本為8位的並行數據傳輸稱為:Narrow SCSI;後來出現了16位的並行數據傳輸的WideSCSI,將其數據傳輸率提高到了20MB/S 。
3、SCSI-3 —1995年推出了SCSI-3,其俗稱Ultra SCSI,全稱為SCSI-3 Fast-20 Parallel Interface(數據傳輸率為20M/S)它採用了同步傳輸時鍾頻率提高到20MHZ以提高數據傳輸的技術,因此使用了16位傳輸的Wide模式時,數據傳輸即可達到40MB/s。其允許介面電纜的最大長度為1.5米。
4、1997年推出了Ultra 2 SCSI(Fast-40),其採用了LVD(Low Voltage Differential,低電平微分)傳輸模式,16位的Ultra2SCSI(LVD)介面的最高傳輸速率可達80MB/S,允許介面電纜的最長為12米,大大增加了設備的靈活性。
5、1998年9月更高的數據傳輸率的Ultra160/m SCSI(Wide下的Fast-80)規格正式公布,其最高數據傳輸率為160MB/s,這將給電腦系統帶來更高的系統性能。
現有最流行的串列硬碟技術
隨著INTEL的915平台的發布,最新的ICH6-M也進入了我們的視野。而ICH6除了在一些電源管理特性方面有所增強外,也正式引入了SATA(串列ATA,以下簡稱SATA)和PCI-E概念。對於筆記本來說,從它誕生的那天起就一直使用著PATA(並行ATA,以下簡稱PATA)來連接硬碟,SATA的出現無疑是一項硬碟介面的革命。而如今隨著INTEL的積極推動,筆記本也開始邁入SATA的陣營。
關於SATA的優勢,筆者相信諸位也都有了解。確實,比起PATA,SATA有著很多不可比擬的優勢,而筆者將在本文中透過技術細節來多其進行分析。相信您讀完本文後會對SATA有著更深入的了解。另外由於本文主要針對筆記本和台式機,所以諸如RAID等技術不在本文討論范圍之內。
串列通信和並行通信
再進行詳細的介紹之前,我們先了解一下串列通信和並行通信的特點。
一般來說,串列通信一般由二根信號線和一根地線就可完成互相的信息的傳送。如下圖,我們看到設備A和設備B之間的信號交換僅用了兩根信號線和一根地線就完成了。這樣,在一個時鍾內,二個bit的數據就會被傳輸(每個方向一個bit,全雙工),如果能時鍾頻率足夠高,那麼數據的傳輸速度就會足夠快。
如果為了節省成本,我們也可以只用一根信號線和一根地線連接。這樣在一個時鍾內只有一個bit被傳輸(半雙工),我們也同樣可以提高時鍾頻率來提升其速度。
而並行通信在本質上是和串列通信一樣的。唯一的區別是並行通信依靠多條數據線在一個時鍾周期里傳送更多的bit。下圖中,數據線已經不是一條或者是兩條,而是多條。我們很容易知道,如果有8根數據線的話,在同一時鍾周期內傳送的的數據量是8bit。如果我們的數據線足夠多的話,比如PCI匯流排,那一個周期內就可以傳送32bit的數據。
在這里,筆者想提醒各位讀者,對於一款產品來說,用最低的成本來滿足帶寬的需要,那就是成功的設計,而不會在意你是串列通信還是並行通信,也不會管你的傳輸技術是先進還是落後。
PATA介面的速度
我們知道,ATA-33的速度為33MB/S,ATA-100的速度是100MB/S。那這個速度是如何計算出來的呢?
首先,我們需要知道匯流排上的時鍾頻率,比如ATA-100是25MHz,PATA的並行數據線有16根,一次能傳送16bit的數據。而ATA-66以上的規范為了降低匯流排本身的頻率,PATA被設計成在時鍾的上下沿都能傳輸數據(類似DDR的原理),使得在一個時鍾周期內能傳送32bit。
這樣,我們很容易得出ATA-100的速度為:25M*16bit*2=800Mbps=100MByte/s。
PATA的局限性
在相同頻率下,並行匯流排優於串列匯流排。隨著當前硬碟的數據傳輸率越來越高,傳統的並行ATA介面日益逐漸暴露出一些設計上的缺陷,其中最致命的莫過於並行線路的信號干擾問題。
那各信號線之間是如何干擾的呢?
1,首先是信號的反射現象。從南橋發出的PATA信號,通過扁長的信號線到達硬碟(在筆記本上對應的也有從南橋引出PATA介面,一直布線到硬碟的介面)。學過微波通信的讀者肯定知道,信號在到達PATA硬碟後不可避免的會發生反彈,而反彈的信號必將疊加到當前正在被傳輸的信號上,導致傳輸中數據的完整性被破壞,引起接受端誤判。
所以在實際的設計中,都必須要設計相應的電路來保證信號的完整性。
我們看到,從南橋發出的PATA信號一般都需要經過一個排阻才發送到PATA的設備。我們必須加上至少30個電阻(除了16根數據線,還有一些控制信號)才能有效的防止信號的反彈。而在硬碟內部,硬碟廠商會在裡面接上終端電阻以防止引號反彈。這不僅對成本有所上升,也對PCB的布局也造成了困擾。
當然,信號反彈在任何高速電路里都會發生,在SATA里我們也會看到終端電阻,但因為SATA的數據線比PATA少很多,並且採用了差分信號傳輸,所以這個問題並不突出。
2,其次是信號的偏移問題
理論上,並行匯流排的數據線的長度應該是一致的。而在實際上,這點很難得到保證。信號線長度的不一致性會導致某個信號過快/過慢到達接受端,導致邏輯誤判。不僅如此,導致信號延遲的原因還有很多,比如線路板上的分布電容、信號線在高頻時產生的感抗等都會引起信號的延遲。
如圖,在左側南橋端我們發送的數據為[1,1,1,0],在發送到硬碟的過程中,第四個信號由於某種原因出現延遲,在判斷時刻還沒到達接受端。這樣,接受端判斷接受到的信號為[1,1,1,1],出現錯誤。由此也可看出,並行數據線越多,出現錯誤的概率也越大。
下圖是SONY Z1的硬碟轉接線,我們看到,設計師做了不少蛇行走線以滿足PATA數據線的長度一致性要求。
我們可以很容易想像,信號的時鍾越快,被判斷信號判斷的時間就越短,出現誤判的可能性就越大。在較慢的匯流排上(上),允許數據信號和判斷信號的時間誤差為a,而在高速的匯流排上(下),允許誤差為b。速度越快,允許的誤差越小。這也是PATA的匯流排頻率提升的局限性,而匯流排頻率直接影響著硬碟傳輸速度。。。
3,還有是信號線間的干擾(串音干擾)
這種干擾幾乎存在與任何電路。和信號偏移一樣,串音干擾也是並行通信的通病。由於並行通信需要多條信號線並行走線(以滿足長度、分布電容等參數的一致性),而串音干擾就是在這時候導致的。由於信號線在傳輸數據的過程中不停的以0,1間變換,導致其周邊的磁場變化甚快。通過法拉第定律我們知道,磁場變化越快,切割磁力線的導線上的電壓越大。這個電壓將導致信號的變形,信號頻率越高,干擾愈加嚴重,直至完全無法工作。串音干擾可以說這是對並行的PATA線路影響最大的不利因素,並且大大限制了線路的長度。
硬碟的恢復主要是靠備份,還有一些比較專業的恢復技術就是要專業學習的了.不過我不專業,現在最常用的就是GHOST,它可以備份任何一個盤付,並生成一個備份文件必要的時候可以用來恢復數據
現在市場上的主要幾款硬碟就是邁托,西部數據(WD),希捷(ST),三星,東之,松下,還有最新的那個易拓保密硬碟
『柒』 網站緩存功能什麼意思
1.減少 HTTP 請求數:一個頁面中包含的圖片,JS,CSS等每一個資源都會生成一個 HTTP 下載請求,由瀏覽器發向網站伺服器,如果減少這個請求數,會縮短網路傳輸的時間。
另外圖片盡量採用壓縮格式的,例如 jpg 就屬於一種壓縮圖片格式,bmp屬於無壓縮無失真圖片。這個需要網頁/網站設計人員綜合考慮這個因素。
優點:縮短網路傳輸事件,網路傳輸量小,減少伺服器端負載;
缺點:減少HTTP請求,有時候無法滿足網站發布信息的需求,盜鏈的出現也會增加HTTP請求;
2、採用緩存技術(webcache):這個是目前網站加速最主要的方式。如果利用代理/緩存加速伺服器去實現的話,網站在不需要做任何改動的情況下,就可實現大跨度的實現加速效果。實現的基本方式為:將指定的網站頁面周期性的緩存起來,緩存時間可從幾秒到幾天,在緩存時間內,頁面只需要生成一次,以後有用戶訪問這個頁面的時候,網站伺服器和資料庫就不再需要重新生成相同的頁面了,極大的減少了網站伺服器和資料庫負荷。我們做個簡單的對比,假設一個新聞熱點頁面,在一個小時可被訪問1萬次,如果這個新聞頁面每次被訪問的時候,都會通過讀取資料庫後再一遍一遍的編譯生成,在一個小時內將會重復性的生成1萬次;如果這個頁面被周期性的緩存10分鍾,也就是每間隔10分鍾才會被生成一次,一個小時內只會被生成6次,如果兩種方式一對比,效果就超級明顯,兩種比較下伺服器負荷的壓力比差別1000倍以上,緩存技術將使得網站負載在高峰期游刃有餘。Fikker網站加速軟體實際上是一款代理伺服器軟體,通過Fikker網站加速伺服器提供的頁面緩存(webcache)功能,將需要緩存的網站URL配置到頁面緩存中(支持正則表達式,通配符和精確地址匹配),並設定一定的緩存時間(幾秒到幾天),不需要重啟Fikker立即生效,如果有重要頁面變動,可通過清理緩存將指定的緩存頁面清理出去。
優點:網站不需要做任何改動,大幅減少伺服器和資料庫的負荷。
3、使用gzip壓縮:頁面壓縮主要是降低傳輸尺寸,提高傳輸效率。常用的 html,asp,php,jsp,txt,css,js等文本頁面,通過gzip壓縮可降低75%左右尺寸,也就是原來需要傳輸 100KB 的頁面,gzip壓縮後只需要 25KB 的傳輸數據了,加速的效果是非常明顯的。Fikker內置了gzip模塊,自動對壓縮的文件壓面進行壓縮傳輸。
4、使用非阻塞網路技術(non-block):提高網路響應速度,Linux 從 2.6 內核開始,專門引入 epoll 事件機制,相對於傳統的 select 事件機制,效率大大的增強,尤其在高並發情況下越發的明顯,幾個線程即可並發支持上萬並發連接,使用盡量少的線程除了減少內存開支還可減少頻繁的線程切換的開銷。Fikker軟體的Linux版本全面支持epoll事件機制,支持從連接建立到連接結束,從域名解析開始到結束的全非阻塞網路設計。
5、提高帶寬,加速頁面傳輸:利用帶寬加速方式常用是CDN,通過CDN運營商的網路將頁面分發出去,用戶訪問時可就從最近的節點獲取,達到加速目的。但這裡面有一個前提,就是需要頁面是靜態的,或動態頁面首先需要被生成出來,然後才能利用 CDN 的高速網路傳輸出去,從這個角度理解,CDN 與 緩存加速具有很強的互補性,即利用緩存技術加快頁面生成,利用CDN加快傳輸,缺一不可。
希望對你有事幫助。
『捌』 京東面試官:Redis 這些我必問
緩存好處:高性能 + 高並發
資料庫查詢耗費了800ms,其他用戶對同一個數據再次查詢 ,假設該數據在10分鍾以內沒有變化過,並且 10 分鍾之內有 1000 個用戶 都查詢了同一數據,10 分鍾之內,那 1000 每個用戶,每個人查詢這個數據都感覺很慢 800ms
比如 :某個商品信息,在 一天之內都不會改變,但是這個商品每次查詢一次都要耗費2s,一天之內被瀏覽 100W次
mysql 單機也就 2000qps,緩存單機輕松幾萬幾十萬qps,單機 承載並發量是 mysql 單機的幾十倍。
在中午高峰期,有 100W 個用戶訪問系統 A,每秒有 4000 個請求去查詢資料庫,資料庫承載每秒 4000 個請求會宕機,加上緩存後,可以 3000 個請求走緩存 ,1000 個請求走資料庫。
緩存是走內存的,內存天然可以支撐4w/s的請求,資料庫(基於磁碟)一般建議並發請求不要超過 2000/s
redis 單線程 ,memcached 多線程
redis 是單線程 nio 非同步線程模型
一個線程+一個隊列
redis 基於 reactor 模式開發了網路事件處理器,這個處理器叫做文件事件處理器,file event handler,這個文件事件處理器是單線程的,所以redis 是單線程的模型,採用 io多路復用機制同時監聽多個 socket,根據socket上的事件來選擇對應的事件處理器來處理這個事件。
文件事件處理器包含:多個 socket,io多路復用程序,文件事件分派器,事件處理器(命令請求處理器、命令恢復處理器、連接應答處理器)
文件事件處理器是單線程的,通過 io 多路復用機制監聽多個 socket,實現高性能和線程模型簡單性
被監聽的 socket 准備好執行 accept,read,write,close等操作的時候,會產生對應的文件事件,調用之前關聯好的時間處理器處理
多個 socket並發操作,產生不同的文件事件,i/o多路復用會監聽多個socket,將這些 socket放入一個隊列中排隊。事件分派器從隊列中取出socket給對應事件處理器。
一個socket時間處理完後,事件分派器才能從隊列中拿到下一個socket,給對應事件處理器來處理。
文件事件:
AE_READABLE 對應 socket變得可讀(客戶端對redis執行 write操作)
AE_WRITABLE 對應 socket 變得可寫(客戶端對 redis執行 read操作)
I/O 多路復用可以同時監聽AE_REABLE和 AE_WRITABLE ,如果同時達到則優先處理 AE_REABLE 時間
文件事件處理器:
連接應答處理器 對應 客戶端要連接 redis
命令請求處理器 對應 客戶端寫數據到 redis
命令回復處理器 對應 客戶端從 redis 讀數據
流程:
一秒鍾可以處理幾萬個請求
普通的 set,get kv緩存
類型 map結構,比如一個對象(沒有嵌套對象)緩存到 redis裡面,然後讀寫緩存的時候,可以直接操作hash的欄位(比如把 age 改成 21,其他的不變)
key=150
value = {
}
有序列表 ,元素可以重復
可以通過 list 存儲一些列表型數據結構,類似粉絲列表,文章評論列表。
例如:微信大 V的粉絲,可以以 list 的格式放在 redis 里去緩存
key=某大 V value=[zhangsan,lisi,wangwu]
比如 lrange 可以從某個元素開始讀取多少個元素,可以基於 list 實現分頁查詢功能,基於 redis實現高性能分頁,類似微博下來不斷分頁東西。
可以搞個簡單的消息隊列,從 list頭懟進去(lpush),list尾巴出來 (brpop)
無序集合,自動去重
需要對一些數據快速全局去重,(當然也可以基於 HashSet,但是單機)
基於 set 玩差集、並集、交集的操作。比如:2 個人的粉絲列表整一個交集,看看 2 個人的共同好友是誰?
把 2 個大 V 的粉絲都放在 2 個 set中,對 2 個 set做交集(sinter)
排序的 set,去重但是可以排序,寫進去的時候給一個分數,自動根據分數排序
排行榜:
zadd board score username
例如:
zadd board 85 zhangsan
zadd board 72 wangwu
zadd board 96 lis
zadd board 62 zhaoliu
自動排序為:
96 lisi
85 zhangsan
72 wangwu
62 zhaoliu
獲取排名前 3 的用戶 : zrevrange board 0 3
96 lisi
85 zhangsan
72 wangwu
查看zhaoliu的排行 :zrank board zhaoliu 返回 4
內存是寶貴的,磁碟是廉價的
給key設置過期時間後,redis對這批key是定期刪除+惰性刪除
定期刪除:
redis 默認每隔 100ms隨機抽取一些設置了過期時間的 key,檢查其是否過期了,如果過期就刪除。
注意:redis是每隔100ms隨機抽取一些 key來檢查和刪除,而不是遍歷所有的設置過期時間的key(否則CPU 負載會很高,消耗在檢查過期 key 上)
惰性刪除:
獲取某個key的時候, redis 會檢查一下,這個key如果設置了過期時間那麼是否過期,如果過期了則刪除。
如果定期刪除漏掉了許多過期key,然後你也沒及時去查,也沒走惰性刪除,如果大量過期的key堆積在內存里,導致 redis 內存塊耗盡,則走內存淘汰機制。
內存淘汰策略:
LRU 演算法:
緩存架構(多級緩存架構、熱點緩存)
redis 高並發瓶頸在單機,讀寫分離,一般是支撐讀高並發,寫請求少,也就 一秒一兩千,大量請求讀,一秒鍾二十萬次。
一主多從,主負責寫,將數據同步復制到其他 slave節點,從節點負責讀,所有讀的請求全部走從節點。主要是解決讀高並發。、
主從架構->讀寫分離->支撐10W+讀QPS架構
master->slave 復制,是非同步的
核心機制:
master持久化對主從架構的意義:
如果開啟了主從架構,一定要開啟 master node的持久化,不然 master宕機重啟數據是空的,一經復制,slave的數據也丟了
主從復制原理:
第一次啟動或者斷開重連情況:
正常情況下:
master 來一條數據,就非同步給 slave
全年 99.99%的時間,都是出於可用的狀態,那麼就可以稱為高可用性
redis 高可用架構叫故障轉移,failover,也可以叫做主備切換,切換的時間不可用,但是整體高可用。
sentinal node(哨兵)
作用:
quorum = 1 (代表哨兵最低個數可以嘗試故障轉移,選舉執行的哨兵)
master 宕機,只有 S2 存活,因為 quorum =1 可以嘗試故障轉移,但是沒達到 majority =2 (最低允許執行故障轉移的哨兵存活數)的標准,無法執行故障轉移
如果 M1 宕機了,S2,S3 認為 master宕機,選舉一個執行故障轉移,因為 3 個哨兵的 majority = 2,所以可以執行故障轉移
丟數據:
解決方案:
sdown 主觀宕機,哨兵覺得一個 master 宕機(ping 超過了 is-master-down-after-milliseconds毫秒數)
odown 客觀宕機,quorum數量的哨兵都覺得 master宕機
哨兵互相感知通過 redis的 pub/sub系統,每隔 2 秒往同一個 channel里發消息(自己的 host,ip,runid),其他哨兵可以消費這個消息
以及同步交換master的監控信息。
哨兵確保其他slave修改master信息為新選舉的master
當一個 master被認為 odown && marjority哨兵都同意,那麼某個哨兵會執行主備切換,選舉一個slave成為master(考慮 1. 跟master斷開連接的時長 2. slave 優先順序 3.復制 offset 4. runid)
選舉演算法:
quorum 數量哨兵認為odown->選舉一個哨兵切換->獲得 majority哨兵的授權(quorum majority 需要 majority個哨兵授權,quorum >= majority 需要 quorum 哨兵授權)
第一個選舉出來的哨兵切換失敗了,其他哨兵等待 failover-time之後,重新拿confiuration epoch做為新的version 切換,保證拿到最新配置,用於 configuration傳播(通過 pu/sub消息機制,其他哨兵對比 version 新舊更新 master配置)
高並發:主從架構
高容量:Redis集群,支持每秒幾十萬的讀寫並發
高可用:主從+哨兵
持久化的意義在於故障恢復數據備份(到其他伺服器)+故障恢復(遇到災難,機房斷電,電纜被切)
AOF 只有一個,Redis 中的數據是有一定限量的,內存大小是一定的,AOF 是存放寫命令的,當大到一定的時候,AOF 做 rewrite 操作,就會基於當時 redis 內存中的數據,來重新構造一個更小的 AOF 文件,然後將舊的膨脹很大的文件給刪掉,AOF 文件一直會被限制在和Redis內存中一樣的數據。AOF同步間隔比 RDB 小,數據更完整
優點:
缺點:
AOF 存放的指令日誌,數據恢復的時候,需要回放執行所有指令日誌,RDB 就是一份數據文件,直接載入到內存中。
優點:
缺點:
AOF 來保證數據不丟失,RDB 做不同時間的冷備
支持 N 個 Redis master node,每個 master node掛載多個 slave node
多master + 讀寫分離 + 高可用
數據量很少,高並發 -> replication + sentinal 集群
海量數據 + 高並發 + 高可用 -> redis cluster
hash演算法->一致性 hash 演算法-> redis cluster->hash slot演算法
redis cluster :自動對數據進行分片,每個 master 上放一部分數據,提供內置的高可用支持,部分master不可用時,還是可以繼續工作
cluster bus 通過 16379進行通信,故障檢測,配置更新,故障轉移授權,另外一種二進制協議,主要用於節點間進行高效數據交換,佔用更少的網路帶寬和處理時間
key進行hash,然後對節點數量取模,最大問題只有任意一個 master 宕機,大量數據就要根據新的節點數取模,會導致大量緩存失效。
key進行hash,對應圓環上一個點,順時針尋找距離最近的一個點。保證任何一個 master 宕機,只受 master 宕機那台影響,其他節點不受影響,此時會瞬間去查資料庫。
緩存熱點問題:
可能集中在某個 hash區間內的值特別多,那麼會導致大量的數據都湧入同一個 master 內,造成 master的熱點問題,性能出現瓶頸。
解決方法:
給每個 master 都做了均勻分布的虛擬節點,這樣每個區間內大量數據都會均勻的分布到不同節點內,而不是順時針全部湧入到同一個節點中。
redis cluster 有固定 16384 個 hash slot,對每個key計算 CRC16 值,然後對16384取模,可以獲取 key對應的 hash slot
redis cluster 中每個 master 都會持有部分 slot ,當一台 master 宕機時候,會最快速度遷移 hash slot到可用的機器上(只會短暫的訪問不到)
走同一個 hash slot 通過 hash tag實現
集群元數據:包括 hashslot->node之間的映射表關系,master->slave之間的關系,故障的信息
集群元數據集中式存儲(storm),底層基於zookeeper(分布式協調中間件)集群所有元數據的維護。好處:元數據的更新和讀取,時效性好,一旦變更,其他節點立刻可以感知。缺點:所有元數據的更新壓力全部集中在一個地方,可能會導致元數據的存儲有壓力。
goosip: 好處:元數據的更新比較分散,有一定的延時,降低了壓力。缺點:更新有延時,集群的一些操作會滯後。(reshared操作時configuration error)
自己提供服務的埠號+ 10000 ,每隔一段時間就會往另外幾個節點發送ping消息,同時其他幾點接收到ping之後返回pong
故障信息,節點的增加和移除, hash slot 信息
meet:某個節點發送 meet給新加入的節點,讓新節點加入集群中,然後新節點就會開始於其他節點進行通信
ping:每個節點都會頻繁給其他節點發送ping,其中包含自己的狀態還有自己維護的集群元數據,互相通過ping交換元數據
ping:返回ping和meet,包含自己的狀態和其他信息
fail:某個節點判斷另一個節點fail之後,就發送 fail 給其他節點,通知其他節點,指定的節點宕機了
ping 很頻繁,且攜帶元數據,會加重網路負擔
每個節點每秒會執行 10 次 ping,每次選擇 5 個最久沒有通信的其他節點
當如果發現某個節點通信延遲達到了 cluster_node_timeout /2 ,那麼立即發送 ping, 避免數據交換延遲過長,落後時間太長(2 個節點之間 10 分鍾沒有交換數據,整個集群處於嚴重的元數據不一致的情況)。
每次ping,一個是帶上自己的節點信息,還有就是帶上1/10其他節點的信息,發送出去,進行數據交換
至少包含 3 個其他節點信息,最多包含總節點-2 個其他節點的信息
客戶端發送到任意一個redis實例發送命令,每個redis實例接受到命令後,都會計算key對應的hash slot,如果在本地就本地處理,否則返回moved給客戶端,讓客戶端進行重定向 (redis-cli -c)
通過tag指定key對應的slot,同一個 tag 下的 key,都會在一個 hash slot中,比如 set key1:{100} 和 set key2:{100}
本地維護一份hashslot->node的映射表。
JedisCluster 初始化的時候,隨機選擇一個 node,初始化 hashslot->node 映射表,同時為每個節點創建一個JedisPool連接池,每次基於JedisCluster執行操作,首先JedisCluster都會在本地計算key的hashslot,然後再本地映射表中找到對應的節點,如果發現對應的節點返回moved,那麼利用該節點的元數據,更新 hashslot->node映射表(重試超過 5 次報錯)
hash slot正在遷移,那麼會返回ask 重定向給jedis,jedis 接受到ask重定向之後,,會重定向到目標節點去執行
判斷節點宕機:
如果一個節點認為另外一個節點宕機了, 就是pfail,主觀宕機
如果多個節點都認為另外一個節點宕機了,那麼就是fail,客觀宕機(跟哨兵原理一樣)
在cluster-node-timeout內,某個節點一直沒有返回 pong,那麼就被認為是 pfail
如果一個節點認為某個節點pfail了,那麼會在gossip消息中,ping給其他節點,如果超過半數的節點認為pfail了,那麼就會變成fail。
從節點過濾:
對宕機的 mster node ,從其所有的 slave node中,選擇一個切換成 master node
檢查每個 slave node與master node斷開連接的時間,如果超過了cluster-node-timeout * cluster-slave-validity-factor,那麼就沒資格切換成 master(和哨兵一致)
從節點選舉:
每個從節點,根據自己對 master 復制數據的 offset,設置一個選舉時間,offset越大(復制數據越多)的從節點,選舉時間越靠前,所有的 master node 開始投票,給要進行選舉的 slave進行投票,如果大部分 master node(N/2 +1) 都投票給某個從節點,那麼選舉通過,從節點執行主備切換,從節點切換成主節點
總結:和哨兵很像,直接集成了 replication 和 sentinal
方案:
事前:保證 redis 集群高可用性 (主從+哨兵或 redis cluster),避免全盤崩潰
事中:本地 ehcache 緩存 + hystrix 限流(保護資料庫) & 降級,避免 MySQL被打死
事後: redis持久化,快速恢復緩存數據,繼續分流高並發請求
限制組件每秒就 2000 個請求通過限流組件進入資料庫,剩餘的 3000 個請求走降級,返回一些默認 的值,或者友情提示
好處 :
4000 個請求黑客攻擊請求資料庫里沒有的數據
解決方案:把黑客查資料庫中不存在的數據的值,寫到緩存中,比如: set -999 UNKNOWN
讀的時候,先讀緩存,緩存沒有,就讀資料庫,然後取出數據後放入緩存,同時返回響應
更新的時候,刪除緩存,更新資料庫
為什麼不更新緩存:
更新緩存代價太高(更新 20 次,只讀 1 次),lazy思想,需要的時候再計算,不需要的時候不計算
方案:先刪除緩存,再修改資料庫
方案:寫,讀路由到相同的一個內存隊列(唯一標識,hash,取模)里,更新和讀操作進行串列化(後台線程非同步執行隊列串列化操作),(隊列里只放一個更新查詢操作即可,多餘的過濾掉,內存隊列里沒有該數據更新操作,直接返回 )有該數據更新操作則輪詢取緩存值,超時取不到緩存值,直接取一次資料庫的舊值
TP 99 意思是99%的請求可以在200ms內返回
注意點:多個商品的更新操作都積壓在一個隊列裡面(太多操作積壓只能增加機器),導致讀請求發生大量的超時,導致大量的讀請求走資料庫
一秒 500 寫操作,每200ms,100 個寫操作,20 個內存隊列,每個隊列積壓 5 個寫操作,一般在20ms完成
方案:分布式鎖 + 時間戳比較
10台機器,5 主 5 從,每個節點QPS 5W ,一共 25W QPS(Redis cluster 32G + 8 核 ,Redis 進程不超過 10G)總內存 50g,每條數據10kb,10W 條數據1g,200W 條數據 20G,佔用總內存不到50%,目前高峰期 3500 QPS
作者: mousycoder