之前另一篇文章也介紹了 Redis Cluster (link,在文章的后半部分)
今天看到這一篇,簡單說一下(http://hot66hot.iteye.com/blog/2050676)
作者的目標:Redis Cluster will support up to ~1000 nodes. 贊...
目前redis支持的cluster特性(已測試):
1):節點自動發現
2):slave->master 選舉,集群容錯
3):Hot resharding:在線分片
4):集群管理:cluster xxx
5):基於配置(nodes-port.conf)的集群管理
6):ASK 轉向/MOVED 轉向機制.
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.0.0.rc1加入cluster-require-full-coverage參數,默認關閉,打開集群兼容部分失敗.
b:如果集群超過半數以上master掛掉,無論是否有slave集群進入fail狀態.
ps:當集群不可用時,所有對集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤
二:redis cluster的使用
忽略。現在基本用單機版Redis,通過master-slave + (Partition 或者 Pre-sharding) 方式來進行。挺好。
redis-cluster客戶端的一些坑.
1)cluster環境下slave默認不接受任何讀寫操作,在slave執行readonly命令后,可執行讀操作
2)client端不支持多key操作(mget,mset等),但當keys集合對應的slot相同時支持mget操作見:hash_tag
3)不支持多數據庫,只有一個db,select 0。
4)JedisCluster 沒有針對byte[]的API,需要自己擴展(附件是我加的基於byte[]的BinaryJedisCluster api)