環境介紹:
開發環境:
spring3+tomcat7+maven3+redis-3.0.7
運行環境:
Linux
前言:
項目中引入redis背景:
項目中最初將科目、打印、利潤表、資產負債表、現金流量表中以及需要重復使用的相關數據都放入session中,
如果並發訪問的用戶過多很可能會使服務器面臨宕機的危險,另外也與session的根本作用不相符(在服務端存
儲用戶和服務器會話的一些信息),所以就考慮到了將相關信息放到redis中。
一、什么是redis
redis是一個開源(BSD許可)的內存存儲的數據結構服務器.
二、redis優缺點
優點:
1 讀寫性能優異(讀的速度是110000次/s,寫的速度是81000次/s)
2 支持數據持久化,支持AOF和RDB兩種持久化方式
3 支持主從復制,主機會自動將數據同步到從機,可以進行讀寫分離。
4 數據結構豐富:除了支持string類型的value外還支持string、hash、set、sortedset、list等數據結構。
缺點:
1 Redis具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切換前端的IP才能恢復。
2 主機宕機,宕機前有部分數據未能及時同步到從機,切換IP后還會引入數據不一致的問題,降低了系統的可用性。
3 Redis的主從復制采用全量復制,復制過程中主機會fork出一個子進程對內存做一份快照,並將子進程的內存快照保存為文件發送給從機,這一過程需要確保主機有足夠多的空余內存。若快照文件較大,對集群的服務能力會產生較大的影響,而且復制過程是在從機新加入集群或者從機和主機網絡斷開重連時都會進行,也就是網絡波動都會造成主機和從機間的一次全量的數據復制,這對實際的系統運營造成了不小的麻煩。
4 Redis較難支持在線擴容,在集群容量達到上限時在線擴容會變得很復雜。為避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源造成了很大的浪費。
三、redis的應用場景
1.Counting(計數)
2.Reverse cache(反向cache)
3.Top 10 list
4.Last Index
5.Relation List/Message Queue
6.Fast transaction with Lua
7.Instead of Memcache
四、如何用redis
五、頭腦風暴
1、主庫與從庫的數據時如何傳輸的
從庫初始化的時候(剛啟動)加載主庫發的快照文件(RDB文件),在向主庫發送set相關命令的時候同時
也向從庫發送相關命令,從而實現數據實時同步。
2、redis自動重寫機制
也就是說經常說的redis重寫其實是對AOF重寫緩存的重寫,而不是對現有AOF文件的重寫。
小結
l AOF重寫的目的是用更小的體積(即根據LRU原則以及去除沒有用的命令,比如多次set 同一個key或者get同一個
key等)來保存數據庫狀態,整個重寫過程基本上不影響Redis主進程處理命令請求;
l AOF重寫其實是一個有歧義的名字,實際上重寫工作是針對數據庫的當前值來進行的,重寫過程中不會讀寫、也不適用原來的AOF文件;
l AOF可以由用戶手動觸發,也可以由服務器自動觸發。
3、redis存儲機制
Redis存儲機制分成兩種Snapshot和AOF。無論是那種機制,Redis都是將數據存儲在內存中。
Snapshot工作原理:
是將數據先存儲在內存,然后當數據累計達到某些設定的伐值的時候,就會觸發一次DUMP操作,將變化的數據一次性寫入數據文件(RDB文件),即放入磁盤。
AOF 工作原理: 是將數據也是先存在內存(參照頭腦風暴2)
4、redis初始化內存
默認下,redis的配置maxmemory是沒有設置的。
# The default is:
# maxmemory-policy noeviction
如果設定了maxmemory,使用redis的時候,redis的內存使用量不能超過設定的值,一旦redis的內存使用量達到了最大值,redis將會嘗試按照選擇的eviction policy(回收策略)移除相應的keys;
如果redis不能根據回收策略移除keys,或者回收策略設置成noeviction,那么redis將對需要寫操作的命令返回錯誤信息,如SET,LPUSH操作,對GET這樣的只讀操作會繼續響應。
5、如何確認redis占用多大內存了;是否要設置redis內存限制
Redis的INFO – Redis命令可以查看當前內存使用情況。是需要配置maxmemory的,通常來講實際內存達到最大內存的3/4時就要考慮加大內存或者拆分數據了。
6、master如何知道自己有多少個slave,slave如何知道哪些其他的slave是和自己同屬於一個集群的
redis.conf中有一個默認設置:repl-ping-slave-period 10,即從庫會按照一個時間間隔向主庫發送
PINGs.可以通過repl-ping-slave-period設置這個時間間隔,默認是10秒
7、redis如何設置內存
1 # redis實例最大占用內存,不要用比設置的上限更多的內存。一旦內存使用達到上限,Redis會根據選定的回收策略(參見: 2 # maxmemmory-policy)刪除key 3 maxmemory 3gb 4 5 # 最大內存策略:如果達到內存限制了,Redis如何選擇刪除key。你可以在下面五個行為里選: 6 # volatile-lru -> 根據LRU算法刪除帶有過期時間的key。 7 # allkeys-lru -> 根據LRU算法刪除任何key。 8 # volatile-random -> 根據過期設置來隨機刪除key, 具備過期時間的key。 9 # allkeys->random -> 無差別隨機刪, 任何一個key。 10 # volatile-ttl -> 根據最近過期時間來刪除(輔以TTL), 這是對於有過期時間的key 11 # noeviction -> 誰也不刪,直接在寫操作時返回錯誤。 12 maxmemory-policy volatile-lru
8、redis的master宕掉后的選舉策略
- S_DOWN :subjectively down,直接翻譯的為"主觀"失效,即當前sentinel實例認為某個redis服務為"不可用"狀態.
- O_DOWN :objectively down,直接翻譯為"客觀"失效,即多個sentinel實例都認為master處於"SDOWN"狀態,那么此時master將處於ODOWN,ODOWN可以簡單理解為master已經被集群確定為"不可用",將會開啟failover.
首先是要下面的條件過濾掉一些節點
一、使用如下條件篩選備選node:
1、slave節點狀態處於S_DOWN,O_DOWN,DISCONNECTED的除外
2、最近一次ping應答時間不超過5倍ping的間隔(假如ping的間隔為1秒,則最近一次應答延遲不應超過5秒,redis sentinel默認為1秒)
3、info_refresh應答不超過3倍info_refresh的間隔(原理同2,redis sentinel默認為10秒)
4、slave節點與master節點失去聯系的時間不能超過( (now - master->s_down_since_time) + (master->down_after_period * 10))。總體意思是說,slave節點與master同步太不及時的(比如新啟動的節點),不應該參與被選舉。
5、Slave priority不等於0(這個是在配置文件中指定,默認配置為100)。
1 # slave的優先級是一個整數展示在Redis的Info輸出中。如果master不再正常工作了,哨兵將用它來 2 # 選擇一個slave提升=升為master。 3 # 優先級數字小的salve會優先考慮提升為master,所以例如有三個slave優先級分別為10,100,25, 4 # 哨兵將挑選優先級最小數字為10的slave。 5 # 0作為一個特殊的優先級,標識這個slave不能作為master,所以一個優先級為0的slave永遠不會被 6 # 哨兵挑選提升為master 7 slave-priority 100
二、從備選node中,按照如下順序選擇新的master
1、較低的slave_priority(這個是在配置文件中指定,默認配置為100)
2、較大的replication offset(每個slave在與master同步后offset自動增加)
3、較小的runid(每個redis實例,都會有一個runid,通常是一個40位的隨機字符串,在redis啟動時設置,重復概率非常小)
4、如果以上條件都不足以區別出唯一的節點,則會看哪個slave節點處理之前master發送的command多,就選誰。
9、redis的哨兵是如何知道master或者slave宕機的以及知道和它一起監控master的哨兵和相關的從庫的信息的
分別是通過心跳機制和INFO命令
10、哨兵(sentinel)只設置一個來監控所有的redis服務器可以嗎
可以,設置一個或多個都是可以的