最大的Redis集羣:新浪Redis集羣揭祕

http://www.cnblogs.com/happyday56/p/3955634.html

前言

Tape is Dead,Disk is Tape,Flash is Disk,RAM Locality is King.       — Jim Gray

Redis不是比較成熟的Memcache或者Mysql的替代品,是對於大型互聯網類應用在架構上很好的補充。現在有越來越多的應用也在紛紛基於Redis做架構的改造。

可以簡單公佈一下Redis平臺實際情況

2200+億 commands/day   5000億Read/day   500億Write/day

18TB+ Memory

500+ Servers in 6 IDC    2000+instances

應該是國內外比較大的Redis使用平臺,今天主要從應用角度談談Redis服務平臺。

Redis使用場景

1.Counting(計數)

計數的應用在另外一篇文章裏較詳細的描述,計數場景的優化 http://www.xdata.me/?p=262 這裏就不坳述了。

可以預見的是,有很多同學認爲把計數全部存在內存中成本非常高,我在這裏用個圖表來表示下我的觀點:

很多情況大家都會設想純使用內存的方案會很有很高成本,但實際情況往往會有一些不一樣:

1.COST,對於有一定吞吐需求的應用來說,肯定會單獨申請DB、Cache資源,很多擔心DB寫入性能的同學還會主動將DB更新記入異步隊列,而這三塊的資源的利用率一般都不會太高。資源算下來,你驚異的發現:反而純內存的方案會更精簡!

2.KISS原則,這對於開發是非常友好的,我只需要建立一套連接池,不用擔心數據一致性的維護,不用維護異步隊列。

3.Cache穿透風險,如果後端使用DB,肯定不會提供很高的吞吐能力,cache宕機如果沒有妥善處理,那就悲劇了。

4.大多數的起始存儲需求,容量較小。

2.Reverse cache(反向cache)

面對微博常常出現的熱點,如最近出現了較爲火爆的短鏈,短時間有數以萬記的人點擊、跳轉,而這裏會常常涌現一些需求,比如我們向快速在跳轉時判定用戶等級,是否有一些賬號綁定,性別愛好什麼的,已給其展示不同的內容或者信息。

普通採用Memcache+Mysql的解決方案,當調用id合法的情況下,可支撐較大的吞吐。但當調用id不可控,有較多垃圾用戶調用時,由於memcache未有命中,會大量的穿透至Mysql服務器,瞬間造成連接數瘋長,整體吞吐量降低,響應時間變慢。

這裏我們可以用redis記錄全量的用戶判定信息,如string key:uid int:type,做一次反向的cache,當用戶在redis快速獲取自己等級等信息後,再去Mc+Mysql層去獲取全量信息。如圖:

當然這也不是最優化的場景,如用Redis做bloomfilter,可能更加省用內存。

3.Top 10 list

產品運營總會讓你展示最近、最熱、點擊率最高、活躍度最高等等條件的top list。很多更新較頻繁的列表如果使用MC+MySQL維護的話緩存失效的可能性會比較大,鑑於佔用內存較小的情況,使用Redis做存儲也是相當不錯的。

4.Last Index

用戶最近訪問記錄也是redis list的很好應用場景,lpush lpop自動過期老的登陸記錄,對於開發來說還是非常友好的。

5.Relation List/Message Queue

這裏把兩個功能放在最後,因爲這兩個功能在現實問題當中遇到了一些困難,但在一定階段也確實解決了我們很多的問題,故在這裏只做說明。

Pinterest使用Redis存儲社交graph信息:

http://blog.gopivotal.com/case-studies-2/using-redis-at-pinterest-for-billions-of-relationships

Message Queue就是通過list的lpop及lpush接口進行隊列的寫入和消費,由於本身性能較好也能解決大部分問題。

6.Fast transaction with Lua

Redis 的Lua的功能擴展實際給Redis帶來了更多的應用場景,你可以編寫若干command組合作爲一個小型的非阻塞事務或者更新邏輯,如:在收到 message推送時,同時1.給自己的增加一個未讀的對話 2.給自己的私信增加一個未讀消息 3.最後給發送人回執一個完成推送消息,這一層邏輯完全可以在Redis Server端實現。

但是,需要注意的是Redis會將lua script的全部內容記錄在aof和傳送給slave,這也將是對磁盤,網卡一個不小的開銷。

7.Instead of Memcache

很多測試和應用均已證明,

1.在性能方面Redis並沒有落後Memcache多少,而單線程的模型給Redis反而帶來了很強的擴展性。

2.在很多場景下,Redis對同一份數據的內存開銷是小於Memcache的slab分配的。

3.Redis提供的數據同步功能,其實是對cache的一個強有力功能擴展。 

Redis使用的重要點

1.rdb/aof Backup!

我們線上的Redis 95%以上是承擔後端存儲功能的,我們不僅用作cache,而更爲一種k-v存儲,他完全替代了後端的存儲服務(MySQL),故其數據是非常重要的,如 果出現數據污染和丟失,誤操作等情況,將是難以恢復的。所以備份是非常必要的!爲此,我們有共享的hdfs資源作爲我們的備份池,希望能隨時可以還原業務 所需數據。

2.Small item & Small instance!

由於Redis單線程(嚴格意義上不是單線程,但認爲對request的處理是單線程的)的模型,大的數據結構list,sorted set,hash set的批量處理就意爲着其他請求的等待,故使用Redis的複雜數據結構一定要控制其單key-struct的大小。

另外,Redis單實例的內存容量也應該有嚴格的限制。單實例內存容量較大後,直接帶來的問題就是故障恢復或者Rebuild從庫的時候時間較長, 而更糟糕的是,Redis rewrite aof和save rdb時,將會帶來非常大且長的系統壓力,並佔用額外內存,很可能導致系統內存不足等嚴重影響性能的線上故障。我們線上96G/128G內存服務器不建議 單實例容量大於20/30G。

3.Been Available!

業界資料和使用比較多的是Redis sentinel(哨兵)

http://www.huangz.me/en/latest/storage/redis_code_analysis/sentinel.html

http://qiita.com/wellflat/items/8935016fdee25d4866d9

2000行C實現了服務器狀態檢測,自動故障轉移等功能。

但由於自身實際架構往往會複雜,或者考慮的角度比較多,爲此@許琦eryk 和我一同做了hypnos項目。

hypnos是神話中的睡神,字面意思也是希望我們工程師無需在休息時間處理任何故障。:-)

其工作原理示意如下:

Talk is cheap, show me your code! 稍後將單獨寫篇博客細緻講下Hypnos的實現。

4.In Memory or not?

發現一種情況,開發在溝通後端資源設計的時候,常常因爲習慣使用和錯誤瞭解產品定位等原因,而忽視了對真實使用用戶的評估。也許這是一份歷史數據,只有最近一天的數據纔有人進行訪問,而把歷史數據的容量和最近一天請求量都拋給內存類的存儲現實是非常不合理的。

所以當你在究竟使用什麼樣的數據結構存儲的時候,請務必先進行成本衡量,有多少數據是需要存儲在內存中的?有多少數據是對用戶真正有意義的。因爲這其實對後端資源的設計是至關重要的,1G的數據容量和1T的數據容量對於設計思路是完全不一樣的

Plans in future?

1.slave sync改造

全部改造線上master-slave數據同步機制,這一點我們借鑑了MySQL Replication的思路,使用rdb+aof+pos作爲數據同步的依據,這裏簡要說明爲什麼官方提供的psync沒有很好的滿足我們的需求:

假設A有兩個從庫B及C,及 A `— B&C,這時我們發現master A服務器有宕機隱患需要重啓或者A節點直接宕機,需要切換B爲新的主庫,如果A、B、C不共享rdb及aof信息,C在作爲B的從庫時,仍會清除自身數 據,因爲C節點只記錄了和A節點的同步狀況。

故我們需要有一種將A`–B&C 結構切換切換爲A`–B`–C結構的同步機制,psync雖然支持斷點續傳,但仍無法支持master故障的平滑切換。

實際上 我們已經在我們定製的Redis計數服務上使用瞭如上功能的同步,效果非常好,解決了運維負擔,但仍需向所有Redis服務推廣,如果可能我們也會向官方Redis提出相關sync slave的改進。

2.更適合redis的name-system Or proxy

細心的同學發現我們除了使用DNS作爲命名系統,也在zookeeper中有一份記錄,爲什麼不讓用戶直接訪問一個系統,zk或者DNS選擇其一呢?

其實還是很簡單,命名系統是個非常重要的組件,而dns是一套比較完善的命名系統,我們爲此做了很多改進和試錯,zk的實現還是相對複雜,我們還沒有較強的把控粒度。我們也在思考用什麼做命名系統更符合我們需求。

3.後端數據存儲

大內存的使用肯定是一個重要的成本優化方向,flash盤及分佈式的存儲也在我們未來計劃之中。

發佈了29 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章