1. 程式人生 > >redis 3.0的叢集部署

redis 3.0的叢集部署

轉載請註明出處:http://hot66hot.iteye.com/admin/blogs/2050676

最近研究redis-cluster,正好搭建了一個環境,遇到了很多坑,系統的總結下,等到redis3 release出來後,換掉memCache 叢集.

一:關於redis cluster

1:redis cluster的現狀

reids-cluster計劃在redis3.0中推出,可以看作者antirez的宣告:http://antirez.com/news/49 (ps:跳票了好久,今年貌似加快速度了),目前的最新版本是redis3 beta2(2.9.51).

作者的目標: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),當叢集不可用時,所有對叢集的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤

    a:如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成進群的slot對映[0-16383]不完成時進入fail狀態.

    b:如果進群超過半數以上master掛掉,無論是否有slave叢集進入fail狀態.

二: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  
  

 (1)安裝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  
 

(2)安裝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  
 

(3)安裝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  
 

2)安裝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例項,把<span style="font-size: 1em; line-height: 1.5;">auto-aof-rewrite搓開,防止瞬間fork所有redis程序做rewrite,佔用大量記憶體</span>  
  22. 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)#啟動叢集相關節點(必須是空節點),指定配置檔案和輸出日誌

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 1 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. nohup 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程式碼  

相關推薦

如何使用Docker實現Redis 3.0叢集的一鍵部署交付?

作者介紹: 張春源 希雲cSphere合夥人,國內早期的Docker佈道者,對企業應用Docker化有豐富的實踐經驗,擅長利用Docker踐行Devops文化。國內第一套Docker系列實戰視訊課程講師,視訊播放量累計10萬+ 開篇: Redis在3.0之後開始支援sharding叢集。Redis

Redis 3.0叢集搭建測試(一)

Redis3.0 最大的特點就是有了cluster的能力,使用redis-trib.rb工具可以輕鬆構建Redis Cluster。Redis Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。節點之間使用gossip協議傳播資訊以

Redis 3.0叢集搭建測試(二)

四、客戶端叢集命令 叢集 cluster info 列印叢集的資訊 cluster nodes 列出叢集當前已知的所有節點(node),以及這些節點的相關資訊。 節點 cluster meet <ip> <port> 將ip和port所指定的節點

redis 3.0叢集部署

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

Redis 3.0原生集群部署

redis 集群 redis集群 redis3.0集群 redis3.x 下載Redis 3.x:前往下面地址選擇合適的版本下載Redis下載wget http://download.redis.io/releases/redis-3.2.0.tar.gz安裝Redis 3.xtar -x

CentOS7.2 安裝redis 3.0.6叢集

1.環境確認 a.系統版本檢視 [[email protected] ~]$ cat /etc/redhat-release CentOS Li

redis3.0叢集安裝

1. 叢集 即使有了主從複製,每個資料庫都要儲存整個叢集中的所有資料,容易形成木桶效應。 使用Jedis實現了分片叢集,是由客戶端控制哪些key資料儲存到哪個資料庫中,如果在水平擴容時就必須手動進行資料遷移,而且需要將整個叢集停止服務,這樣做非常不好的。 Red

Redis-3.0.7 Sentinel主從切換的叢集管理

D:\Programs\Redis-x64-3.0.501>redis-cli -h 192.168.0.68 info Replication # Replication role:slave master_host:192.168.0.149 master_port:6379 master_lin

Redis3.2.3叢集部署實戰

一、Redis簡介 Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 Redis官網地址:http://redis.io/ Redis中文網地址:http://redis.cn Re

linux redis-3.0.0 偽分散式叢集的搭建

首先需要redis-3.0.0的安裝 安裝步驟如下: 先將編譯環境搭建好:yum install gcc-c++ 將redis原始碼包上傳至linux 解壓縮redis-3.0.0 編譯。進入redis-3.0.0目錄。 make 安裝。make ins

2. Redis 3.0.5 叢集的命令、使用、維護

前言 上一篇中,對redis cluster的有了較為深入的實踐,並且一整套都實踐了,redis cluster 確實挺好用,隨著版本的更新,它會越來越成熟和穩定,一定是未來的方向。 這一篇對後續的一些尾巴來學習下,包括 CLUSTER * 一系列命令,以及

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

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

Redis 3.0中文官方文件翻譯計劃(17) ——叢集(中)

使用redis-rb-cluster寫一個示例應用    在後面介紹如何操作Redis叢集之前,像故障轉移或者重新分片這樣的事情,我們需要建立一個示例應用,或者至少要了解簡單的Redis叢集客戶端的互動語義。     我們採用執行一個示例,同時嘗試使節點失效,或者開始重新分

centos7安裝redis-3.0.4叢集

        建立6個redis節點,其中3個為主節點,3個為從節點。 redis節點的ip和埠對應關係如下: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.

Redis實戰(二)CentOS 7上搭建redis-3.0.2

str 進程 ps 禁用 安裝redis 結果 redis 啟動服務 pro bin 1.安裝redis wget http://download.redis.io/releases/redis-3.0.2.tar.gz tar zxvf redis-3.0.2.tar

linux安裝 redis(redis-3.0.2.tar.gz) 和 mongodb(mongodb-linux-x86_64-rhel62-4.0.0)

壓縮包 data 配置 查看 serve etc all linux sta 1:首先 要下載 這兩個 壓縮包 註意:liunx是否已經安裝過 gcc沒安裝的話 先安裝:yum install gcc-c++ 2:安裝 redis:redis-3.0.2.tar.gz   

redis 3.2+ 叢集實踐

redis叢集實踐 1、建立叢集 [[email protected] 7000]# redis-trib.rb create --replicas 1 10.9.251.104:7000 10.9.251.104:7001 10.9.251.104:70

Hadoop 3.0 安裝部署

最近在虛擬機器上新裝了一個單節點的Hadoop,用於日常測試。 下載二進位制包,解壓。官網 http://hadoop.apache.org 1、 安裝ssh,否則Pseudo-Distributed Operation 模式下啟動hdfs會失敗。 sudo ap

kafka_0.11.0.0叢集部署

1. 簡介 kafka (官網地址:http://kafka.apache.org)是一款分散式訊息釋出和訂閱的系統,具有高效能和高吞吐率。 i. 訊息的釋出(publish)稱作producer,訊息的訂閱(subscribe)稱作consumer,中間的儲存陣列稱作brok

Redis 3.0 中文版

https://redis.io/topics/introduction 此文由powersoft · 更新於 2018-09-30 10:00:44 感覺powersoft的付出和分享,給點個贊先你啊, :)   Redis 3.0.0 正式版終於到來了!最重要