最近研搭建redis-cluster,正好搭建了一個環境,遇到了很多坑,系統的總結下,
一:關於redis cluster
1:redis cluster的現狀
reids-cluster計劃在redis3.0中推出,
目前的最新版本見: http://www.redis.cn/
目前redis支持的cluster特性(已測試):
1):節點自動發現
2):slave->master 選舉,集羣容錯
3):Hot resharding:在線分片
4):集羣管理:cluster xxx
5):基於配置(nodes-port.conf)的集羣管理
6):ASK 轉向/MOVED 轉向機制.
2:redis cluster 架構
1)redis-cluster架構圖
架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
(2)節點的fail是通過集羣中超過半數的master節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->key
2) redis-cluster選舉:容錯
(1)領着選舉過程是集羣中所有master參與,如果半數以上master節點與故障節點通信超過(cluster-node-timeout),認爲該節點故障,自動觸發故障轉移操作.
(2):什麼時候整個集羣不可用(cluster_state:fail)?
a:如果集羣任意master掛掉,且當前master沒有slave.集羣進入fail狀態,也可以理解成集羣的slot映射[0-16383]不完成時進入fail狀態. ps : redis-3.2.1.rc1加入cluster-require-full-coverage參數,默認關閉,打開集羣兼容部分失敗.
b:如果集羣超過半數以上master掛掉,無論是否有slave集羣進入fail狀態.
ps:當集羣不可用時,所有對集羣的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤
內存中對象是否可以設置失效時間
一般String使用setex()命令進行插入有時效的value;
頻繁添加、修改、刪除對象對Redis性能是否有影響()
作爲NOSQL的代表,redis性能還是很不錯的,
讀寫同時處理10000次/秒不在話下,測試20萬條寫僅用了0.8秒;
針對同一對象併發修改是否有限制
有限制,redis地層時單線程操作,所以用的時候儘量對這種操作進行加鎖處理。
redis 主從複製,把主的數據刪掉,從的怎麼辦
從的數據也會被刪掉,
當主節點fail時,數據持久化在哪
Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啓的時候可以再次加載進行使用(PS:持久化在rdb、aof)
。Redis藉助了fork命令的copy on write機制。在生成快照時,將當前進程fork出一個子進程,然後在子進程中循環所有的數據,
將數據寫成爲RDB文件。 AOF日誌的全稱是append only file,從名字上我們就能看出來,它是一個追加寫入的日誌文件。與一般數據庫的binlog不同的是,
AOF文件是可識別的純文本,它的內容就是一個個 的Redis標準命令。當然,並不是發送發Redis的所有命令都要記錄到AOF日誌裏面,
只有那些會導致數據發生修改的命令纔會追加到AOF文件。那麼每一條修改數據的命令都生成一條日誌。
redis數據庫中的所有數據都儲存在內存中,爲防止程序退出後內存中的數據丟失,redis提供了對持久化的支持,就是把內存中的數據異步寫入到硬盤中,同時不影響繼續提供服務
(也有數據丟失情況,即在剛寫入到內存的數據,還沒來的及持久化到硬盤,就fail,)
不適合儲存不允許丟失的數據
基本上也就是數據已經存到內存還沒有進行持久化。這個持久化需要一定的策略的,比如說100分鐘持久化一次,或者200分鐘
這個是持久化設置在redis.conf進行設置
save 900 1
# 900秒有一個key變化,就做一次保存
save 300 10
# 300秒有十個key變化,就做一次保存
save 60 10000
# 60秒有10000個key變化,就做一次保存
Redis使用的是單線程模型,保證了數據按順序提交
複製
Redis集羣的每個節點都有兩種角色可選:主節點(master node)和從節點(slave node),其中主節點用於存儲數據,而從節點則是某個主節點的複製品;
當用戶需要處理更多的請求時,添加從節點可以擴展系統的讀性能。因爲Redis集羣重用了單機Redis複製特性,所以集羣的複製行爲和單機複製行爲是完全一樣的;
下圖展示了爲每個主節點各添加一個從節點:
節點故障檢測和自動故障轉移
Redis集羣的主節點內置了類似Redis Sentinel的節點故障檢測和自動故障轉移功能,當集羣中的某個主節點下線時,集羣中的其他在線主節點會注意到這一點,並對已下線的主節點進行故障轉移;
集羣進行故障轉移的方法和Redis Sentinel進行故障轉移的方法基本一樣,不同的是,在集羣裏面,故障轉移是由集羣中其他在線的主節點負責進行的,所以集羣不必另外使用Redis Sentinel。
舉個栗子:當7000下線時,7001和7002會覺察到這一點,並對7000進行故障轉移。