1. 程式人生 > >redis-cluster研究和使用(轉)

redis-cluster研究和使用(轉)

最近研究redis-cluster,正好搭建了一個環境,遇到了很多坑,系統的總結下,等到redis3 release出來後,換掉memCache 叢集. 轉載請註明出處哈:http://hot66hot.iteye.com/admin/blogs/2050676

一:關於redis cluster

1:redis cluster的現狀

作者的目標: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 轉向機制.

2:redis cluster 架構

1)redis-cluster架構圖

 

架構細節:

(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.

(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.

(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可

(4)redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value

2) redis-cluster選舉:容錯

 

(1)領著選舉過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超過(cluster-node-timeout),認為當前master節點掛掉.

(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的使用

1:安裝redis cluster

1):安裝redis-cluster依賴:redis-cluster的依賴庫在使用時有相容問題,在reshard時會遇到各種錯誤,請按指定版本安裝.

(1)確保系統安裝zlib,否則gem install會報(no such file to load -- zlib)
Java程式碼  收藏程式碼
  1. #download:zlib-1.2.6.tar  
  2. ./configure  
  3. make  
  4. make install  
 (2)安裝ruby:version(1.9.2)
Java程式碼  收藏程式碼
  1. # ruby1.9.2   
  2. cd /path/ruby  
  3. ./configure -prefix=/usr/local/ruby  
  4. make  
  5. make install  
  6. sudo cp ruby /usr/local/bin  
(3)安裝rubygem:version(1.8.16)
Java程式碼  收藏程式碼
  1. # rubygems-1.8.16.tgz  
  2. cd /path/gem  
  3. sudo ruby setup.rb  
  4. sudo cp bin/gem /usr/local/bin  
(4)安裝gem-redis:version(3.0.0)
Java程式碼  收藏程式碼
  1. gem install redis --version 3.0.0  
  2. #由於源的原因,可能下載失敗,就手動下載下來安裝  
  3. #download地址:http://rubygems.org/gems/redis/versions/3.0.0  
  4. gem install -l /data/soft/redis-3.0.0.gem  
(5)安裝redis-cluster
Java程式碼  收藏程式碼
  1. cd /path/redis  
  2. make  
  3. sudo cp /opt/redis/src/redis-server /usr/local/bin  
  4. sudo cp /opt/redis/src/redis-cli /usr/local/bin  
  5. sudo cp /opt/redis/src/redis-trib.rb /usr/local/bin  

2:配置redis cluster

1)redis配置檔案結構:


 使用包含(include)把通用配置和特殊配置分離,方便維護.

2)redis通用配置.

Java程式碼  收藏程式碼
  1. #GENERAL  
  2. daemonize no  
  3. tcp-backlog 511  
  4. timeout 0  
  5. tcp-keepalive 0  
  6. loglevel notice  
  7. databases 16  
  8. dir /opt/redis/data  
  9. slave-serve-stale-data yes  
  10. #slave只讀  
  11. slave-read-only yes  
  12. #not use default  
  13. repl-disable-tcp-nodelay yes  
  14. slave-priority 100  
  15. #開啟aof持久化  
  16. appendonly yes  
  17. #每秒一次aof寫  
  18. appendfsync everysec  
  19. #關閉在aof rewrite的時候對新的寫操作進行fsync  
  20. no-appendfsync-on-rewrite yes  
  21. auto-aof-rewrite-min-size 64mb  
  22. lua-time-limit 5000  
  23. #開啟redis叢集  
  24. cluster-enabled yes  
  25. #節點互連超時的閥值  
  26. cluster-node-timeout 15000  
  27. cluster-migration-barrier 1  
  28. slowlog-log-slower-than 10000  
  29. slowlog-max-len 128  
  30. notify-keyspace-events ""  
  31. hash-max-ziplist-entries 512  
  32. hash-max-ziplist-value 64  
  33. list-max-ziplist-entries 512  
  34. list-max-ziplist-value 64  
  35. set-max-intset-entries 512  
  36. zset-max-ziplist-entries 128  
  37. zset-max-ziplist-value 64  
  38. activerehashing yes  
  39. client-output-buffer-limit normal 0 0 0  
  40. client-output-buffer-limit slave 256mb 64mb 60  
  41. client-output-buffer-limit pubsub 32mb 8mb 60  
  42. hz 10  
  43. aof-rewrite-incremental-fsync yes  

3)redis特殊配置.

Java程式碼  收藏程式碼
  1. #包含通用配置  
  2. include /opt/redis/redis-common.conf  
  3. #監聽tcp埠  
  4. port 6379  
  5. #最大可用記憶體  
  6. maxmemory 100m  
  7. #記憶體耗盡時採用的淘汰策略:  
  8. volatile-lru -> remove the key with an expire set using an LRU algorithm  
  9. # allkeys-lru -> remove any key accordingly to the LRU algorithm  
  10. volatile-random -> remove a random key with an expire set  
  11. # allkeys-random -> remove a random key, any key  
  12. volatile-ttl -> remove the key with the nearest expire time (minor TTL)  
  13. # noeviction -> don't expire at all, just return an error on write operations  
  14. maxmemory-policy allkeys-lru  
  15. #aof儲存檔案  
  16. appendfilename "appendonly-6379.aof"  
  17. #不開啟rdb儲存,只用於新增slave過程  
  18. dbfilename dump-6379.rdb  
  19. #cluster配置檔案(啟動自動生成)  
  20. cluster-config-file nodes-6379.conf  
  21. #部署在同一機器的redis例項,把auto-aof-rewrite搓開,因為cluster環境下記憶體佔用基本一致.  
  22. #防止同意機器下瞬間fork所有redis程序做aof rewrite,佔用大量記憶體(ps:cluster必須開啟aof)  
  23. auto-aof-rewrite-percentage 80-100  

3:cluster 操作

Java程式碼  收藏程式碼
  1. 叢集  
  2. CLUSTER INFO 列印叢集的資訊  
  3. CLUSTER NODES 列出叢集當前已知的所有節點(node),以及這些節點的相關資訊。  
  4. 節點  
  5. CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。  
  6. CLUSTER FORGET <node_id> 從叢集中移除 node_id 指定的節點。  
  7. CLUSTER REPLICATE <node_id> 將當前節點設定為 node_id 指定的節點的從節點。  
  8. CLUSTER SAVECONFIG 將節點的配置檔案儲存到硬盤裡面。  
  9. 槽(slot)  
  10. CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。  
  11. CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。  
  12. CLUSTER FLUSHSLOTS 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。  
  13. CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。  
  14. CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。  
  15. CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中匯入槽 slot 到本節點。  
  16. CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的匯入(import)或者遷移(migrate)。  
  17. 鍵  
  18. CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。  
  19. CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。  
  20. CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。  
 

4:redis cluster 運維操作

1)初始化並構建叢集

(1)啟動叢集相關節點(必須是空節點,beta3後可以是有資料的節點),指定配置檔案和輸出日誌

Java程式碼  收藏程式碼
  1. redis-server /opt/redis/conf/redis-6380.conf > /opt/redis/logs/redis-6380.log 2>&1 &  
  2. redis-server /opt/redis/conf/redis-6381.conf > /opt/redis/logs/redis-6381.log 2>&1 &  
  3. redis-server /opt/redis/conf/redis-6382.conf > /opt/redis/logs/redis-6382.log 2>&1 &  
  4. redis-server /opt/redis/conf/redis-7380.conf > /opt/redis/logs/redis-7380.log 2>&1 &  
  5. redis-server /opt/redis/conf/redis-7381.conf > /opt/redis/logs/redis-7381.log 2>&1 &  
  6. redis-server /opt/redis/conf/redis-7382.conf > /opt/redis/logs/redis-7382.log 2>&1 &  

(2):使用自帶的ruby工具(redis-trib.rb)構建叢集

Java程式碼  收藏程式碼
  1. #redis-trib.rb的create子命令構建  
  2. #--replicas 則指定了為Redis Cluster中的每個Master節點配備幾個Slave節點  
  3. #節點角色由順序決定,先master之後是slave(為方便辨認,slave的埠比master大1000)  
  4. redis-trib.rb create --replicas 1 10.10.34.14:6380 10.10.34.14:6381 10.10.34.14:6382 10.10.34.14:7380 10.10.34.14:7381 10.10.34.14:7382  

(3):檢查叢集狀態

Java程式碼  收藏程式碼
  1. #redis-trib.rb的check子命令構建  
  2. #ip:port可以是叢集的任意節點  
  3. redis-trib.rb check 10.10.34.14:6380  
 最後輸出如下資訊,沒有任何警告或錯誤,表示叢集啟動成功並處於ok狀態 Java程式碼  收藏程式碼
  1. [OK] All nodes agree about slots configuration.  
  2. >>> Check for open slots...  
  3. >>> Check slots coverage...  
  4. [OK] All 16384 slots covered.  

2):新增新master節點

(1)新增一個master節點:建立一個空節點(empty node),然後將某些slot移動到這個空節點上,這個過程目前需要人工干預

a):根據埠生成配置檔案(ps:establish_config.sh是我自己寫的輸出配置指令碼)

Java程式碼  收藏程式碼
  1. sh establish_config.sh 6386 > conf/redis-6386.conf  
 

b):啟動節點

Java程式碼  收藏程式碼
  1. redis-server /opt/redis/conf/redis-6386.conf > /opt/redis/logs/redis-6386.log 2>&1 &  

c):加入空節點到叢集
add-node  將一個節點新增到叢集裡面, 第一個是新節點ip:port, 第二個是任意一個已存在節點ip:port

Java程式碼  收藏程式碼
  1. redis-trib.rb add-node 10.10.34.14:6386 10.10.34.14:6381  

node:新節點沒有包含任何資料, 因為它沒有包含任何slot。新加入的加點是一個主節點, 當叢集需要將某個從節點升級為新的主節點時, 這個新節點不會被選中

d):為新節點分配slot

Java程式碼  收藏程式碼
  1. redis-trib.rb reshard 10.10.34.14:6386  
  2. #根據提示選擇要遷移的slot數量(ps:這裡選擇500)  
  3. How many slots do you want to move (from 1 to 16384)? 500  
  4. #選擇要接受這些slot的node-id  
  5. What is the receiving node ID? f51e26b5d5ff74f85341f06f28f125b7254e61bf  
  6. #選擇slot來源:  
  7. #all表示從所有的master重新分配,  
  8. #或者資料要提取slot的master節點id,最後用done結束  
  9. Please enter all the source node IDs.  
  10.   Type 'all' to use all the nodes as source nodes for the hash slots.  
  11.   Type 'done' once you entered all the source nodes IDs.  
  12. Source node #1:all  
  13. #列印被移動的slot後,輸入yes開始移動slot以及對應的資料.  
  14. #Do you want to proceed with the proposed reshard plan (yes/no)? yes  
  15. #結束  

3):新增新的slave節點

a):前三步操作同新增master一樣

b)第四步:redis-cli連線上新節點shell,輸入命令:cluster replicate 對應master的node-id

Java程式碼  收藏程式碼
  1. cluster replicate 2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835  
 

note:線上新增slave 時,需要dump整個master程序,並傳遞到slave,再由 slave載入rdb檔案到記憶體,rdb傳輸過程中Master可能無法提供服務,整個過程消耗大量io,小心操作.

例如本次新增slave操作產生的rdb檔案

Java程式碼  

相關推薦

redis-cluster研究使用()

最近研究redis-cluster,正好搭建了一個環境,遇到了很多坑,系統的總結下,等到redis3 release出來後,換掉memCache 叢集. 轉載請註明出處哈:http://hot66hot.iteye.com/admin/blogs/2050676 一:關於redis cluster 1:r

redis-cluster研究使用

最近研究redis-cluster,正好搭建了一個環境,遇到了很多坑,系統的總結下,等到redis3 release出來後,換掉memCache 叢集. 轉載請註明出處哈:http://hot66hot.iteye.com/admin/blogs/2050676 一:關於redis cluster 1:

全面剖析Redis Cluster原理應用

        Redis3以上版本叢集方式,使用Ruby解本命令完成叢集、主從配置。前段時間配置redis主從時在配置哨兵模式時卡死了,主要是用YUM安裝的redis導致sentinel.conf配置失敗。現在使用Redis Cluster可以完美解決問題了,並且支援Jed

redis叢集(Redis Cluster)原理應用

全面剖析Redis Cluster原理和應用 1.Redis Cluster總覽 1.1 設計原則和初衷 在官方文件Cluster Spec中,作者詳細介紹了Redis叢集為什麼要設計成現在的樣子。最核心的目標有三個: 效能:這

redis-cluster安裝配置

redis-cluster是redis官方寫的叢集功能,目前還未加入穩定版,據說會在3.0上線的時候加入,但是開發版已經包含該功能 開發版的下載方式是git clone https://github.com/antirez/redis.git,前提是安裝了git 安裝配置過

redis cluster配置簡單初始化

-------------環境安裝------------ #安裝redis wget http://download.redis.io/releases/redis-3.2.5.tar.gz tar xzf redis-3.2.5.tar.gz cd redis-3.2.

Redis叢集研究實踐(基於redis 3.0.5)

前言 redis 是我們目前大規模使用的快取中介軟體,由於它強大高效而又便捷的功能,得到了廣泛的使用。現在的2.x的穩定版本是2.8.19,也是我們專案中普遍用到的版本。 redis在年初發布了3.0.0,官方支援了redis cluster,也就是叢集。至此結束了redi

虛擬機搭建redis單機版及redis-cluster,使用redis desktop managerjava(eclipse)連接redis過程遇到問題匯總

init clu centos 一律 有用 tex 保護模式 bin service 如果你看到這裏,我默認你已經安裝好了redis,並且已經成功的在虛擬機的Linux系統中ping通。 介紹一下我的環境:VMware虛擬機安裝centos 6.5版的Linux系統,red

predis連接redis sentinelredis cluster

predis的使用 predis連redis cluster predis連redis sentinel 開發之前都是用phpredis連接redis服務的,後來隨著sentinel和redis cluster的成熟,redis主從都結合sentinel做了高可用,部分數據和並發大的業務使

Redis Cluster集群搭建後,客戶端的連接研究(Spring/Jedis)(待實踐)

turn ron 記錄 redis div println 刪除 clu name 說明:無論是否已經搭建好集群,還是使用什麽樣的客戶端去連接,都是必須把全部IP列表集成進去,然後隨機往其中一個IP寫。 這樣做的好處: 1、隨機IP寫入之後,Redis Cluster代

Linux下Redis的安裝部署()

分享圖片 rpo service bare moni res linux文件 情況下 遠程管理 一、Redis介紹 Redis是當前比較熱門的NOSQL系統之一,它是一個key-value存儲系統。和Memcache類似,但很大程度補償了Memcache的不足,它支

redis cluster + sentinel詳細過程錯誤處理三主三備三哨兵

fig 統一 redis diff sch hash 設置密碼 sync var redis cluster + sentinel詳細過程和錯誤處理三主三備三哨兵1、基本架構192.168.70.215 7001 Master + sentinel 27001192.168

【docker】【redis】2.docker上設置redis集群---Redis Cluster部署、管理測試【集群服務】

測試 details cluster red 集群 tail .net 設置 com 參考地址:https://www.cnblogs.com/zhoujinyi/p/6477133.html https://www.cnblogs.com/cxbhakim/p/91517

Redis Cluster高可用叢集線上遷移操作記錄【

之前介紹了redis cluster的結構及高可用叢集部署過程,今天這裡簡單說下redis叢集的遷移。由於之前的redis cluster叢集環境部署的伺服器效能有限,需要遷移到高配置的伺服器上。考慮到是線上生產環境,決定線上遷移,遷移過程,不中斷服務。操作過程如下: 一、機器環境

redis-cluster安裝配置

create source make edi onf 存儲 置配 down 配置文件 需要三臺虛擬機(生產環境是3個物理機),分配靜態IP。cluster中共6個節點。3主3從。本文中每個虛擬機上的redis端口:6379 6380。 需要註意的兩點: 3個主節點分別位於3

另外一種獲取redis cluster主從關係slot分佈的方法

  條條大路通羅馬,通過最近學習redis cluster 觀察其輸出,發現了另外一種獲取master-slave關係的方法。   [[email protected] ~]$ cat get_master_slave2.sh redis-cli -h $1 -p

redis的哨兵cluster在java程式碼中的配置

1.哨兵: applicationContext.xml: <!-- redis sentinel 配置 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig

Redis叢集的兩種實現方式之Redis ShardingRedis Cluster

  在當前網際網路的背景下,企業的業務需求越來越大,所以一般的業務+資料庫已經不能滿足需求了,所以大批的記憶體式資料庫應運而生,Redis是一個應用比較廣泛的資料庫。用它來實現分散式的操作得心應手。目前有兩種實現分散式的方式,基於Redisx2的Redis Sharding,

redis-cluster的配置學習

概述操作在/opt/clusters中分別建立6379 6380 6381 6382 6383 6384目錄,用於存放對應的資料檔案將redis.conf配置檔案複製到建立好的目錄中,並進行修改6379修改一下引數:bind 192.168.1.200 port 6379 d

redis cluster配置檔案叢集狀態詳解

redis cluster命令 叢集(cluster)   cluster info       列印叢集的資訊 cluster nodes   列出叢集當前已知的所有節點(node),以及這些節點的相關資訊   節點(node)   cluster meet <ip