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程式碼- #download:zlib-1.2.6.tar
- ./configure
- make
- make install
(1)安裝ruby:version(1.9.2)
Java程式碼- # ruby1.9.2
- cd /path/ruby
- ./configure -prefix=/usr/local/ruby
- make
- make install
- sudo cp ruby /usr/local/bin
(2)安裝rubygem:version(1.8.16)
Java程式碼- # rubygems-1.8.16.tgz
- cd /path/gem
- sudo ruby setup.rb
- sudo cp bin/gem /usr/local/bin
(3)安裝gem-redis:version(3.0.0)
Java程式碼- gem install redis --version 3.0.0
- #由於源的原因,可能下載失敗,就手動下載下來安裝
- #download地址:http://rubygems.org/gems/redis/versions/3.0.0
- gem install -l /data/soft/redis-3.0.0.gem
2)安裝redis-cluster
Java程式碼- cd /path/redis
- make
- sudo cp /opt/redis/src/redis-server /usr/local/bin
- sudo cp /opt/redis/src/redis-cli /usr/local/bin
- sudo cp /opt/redis/src/redis-trib.rb /usr/local/bin
2:配置redis cluster
1)redis配置檔案結構:
使用包含(include)把通用配置和特殊配置分離,方便維護.
2)redis通用配置.
Java程式碼- #GENERAL
- daemonize no
- tcp-backlog 511
- timeout 0
- tcp-keepalive 0
- loglevel notice
- databases 16
- dir /opt/redis/data
- slave-serve-stale-data yes
- #slave只讀
- slave-read-only yes
- #not use default
- repl-disable-tcp-nodelay yes
- slave-priority 100
- #開啟aof持久化
- appendonly yes
- #每秒一次aof寫
- appendfsync everysec
- #關閉在aof rewrite的時候對新的寫操作進行fsync
- no-appendfsync-on-rewrite yes
- auto-aof-rewrite-min-size 64mb
- lua-time-limit 5000
- #開啟redis叢集
- cluster-enabled yes
- #節點互連超時的閥值
- cluster-node-timeout 15000
- cluster-migration-barrier 1
- slowlog-log-slower-than 10000
- slowlog-max-len 128
- notify-keyspace-events ""
- hash-max-ziplist-entries 512
- hash-max-ziplist-value 64
- list-max-ziplist-entries 512
- list-max-ziplist-value 64
- set-max-intset-entries 512
- zset-max-ziplist-entries 128
- zset-max-ziplist-value 64
- activerehashing yes
- client-output-buffer-limit normal 0 0 0
- client-output-buffer-limit slave 256mb 64mb 60
- client-output-buffer-limit pubsub 32mb 8mb 60
- hz 10
- aof-rewrite-incremental-fsync yes
3)redis特殊配置.
Java程式碼- #包含通用配置
- include /opt/redis/redis-common.conf
- #監聽tcp埠
- port 6379
- #最大可用記憶體
- maxmemory 100m
- #記憶體耗盡時採用的淘汰策略:
- # volatile-lru -> remove the key with an expire set using an LRU algorithm
- # allkeys-lru -> remove any key accordingly to the LRU algorithm
- # volatile-random -> remove a random key with an expire set
- # allkeys-random -> remove a random key, any key
- # volatile-ttl -> remove the key with the nearest expire time (minor TTL)
- # noeviction -> don't expire at all, just return an error on write operations
- maxmemory-policy allkeys-lru
- #aof儲存檔案
- appendfilename "appendonly-6379.aof"
- #rdb檔案,只用於動態新增slave過程
- dbfilename dump-6379.rdb
- #cluster配置檔案(啟動自動生成)
- cluster-config-file nodes-6379.conf
- #部署在同一機器的redis例項,把<span style="font-size: 1em; line-height: 1.5;">auto-aof-rewrite搓開,防止瞬間fork所有redis程序做rewrite,佔用大量記憶體</span>
- auto-aof-rewrite-percentage 80-100
3:cluster 操作
Java程式碼- 叢集
- CLUSTER INFO 列印叢集的資訊
- CLUSTER NODES 列出叢集當前已知的所有節點(node),以及這些節點的相關資訊。
- 節點
- CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。
- CLUSTER FORGET <node_id> 從叢集中移除 node_id 指定的節點。
- CLUSTER REPLICATE <node_id> 將當前節點設定為 node_id 指定的節點的從節點。
- CLUSTER SAVECONFIG 將節點的配置檔案儲存到硬盤裡面。
- 槽(slot)
- CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。
- CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。
- CLUSTER FLUSHSLOTS 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。
- CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。
- CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。
- CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中匯入槽 slot 到本節點。
- CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的匯入(import)或者遷移(migrate)。
- 鍵
- CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。
- CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。
- CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。
4:redis cluster 運維操作
1)初始化並構建叢集
(1)#啟動叢集相關節點(必須是空節點),指定配置檔案和輸出日誌
Java程式碼- redis-server /opt/redis/conf/redis-6380.conf > /opt/redis/logs/redis-6380.log 2>&1 &
- redis-server /opt/redis/conf/redis-6381.conf > /opt/redis/logs/redis-6381.log 2>&1 &
- redis-server /opt/redis/conf/redis-6382.conf > /opt/redis/logs/redis-6382.log 2>&1 &
- redis-server /opt/redis/conf/redis-7380.conf > /opt/redis/logs/redis-7380.log 2>&1 &
- redis-server /opt/redis/conf/redis-7381.conf > /opt/redis/logs/redis-7381.log 2>&1 &
- redis-server /opt/redis/conf/redis-7382.conf > /opt/redis/logs/redis-7382.log 2>&1 &
(2):使用自帶的ruby工具(redis-trib.rb)構建叢集
Java程式碼- #redis-trib.rb的create子命令構建
- #--replicas 則指定了為Redis Cluster中的每個Master節點配備幾個Slave節點
- #節點角色由順序決定,先master之後是slave(為方便辨認,slave的埠比master大1000)
- 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程式碼- #redis-trib.rb的check子命令構建
- #ip:port可以是叢集的任意節點
- redis-trib.rb check 1 10.10.34.14:6380
- [OK] All nodes agree about slots configuration.
- >>> Check for open slots...
- >>> Check slots coverage...
- [OK] All 16384 slots covered.
2):新增新master節點
(1)新增一個master節點:建立一個空節點(empty node),然後將某些slot移動到這個空節點上,這個過程目前需要人工干預
a):根據埠生成配置檔案(ps:establish_config.sh是我自己寫的輸出配置指令碼)
Java程式碼- sh establish_config.sh 6386 > conf/redis-6386.conf
b):啟動節點
Java程式碼- nohup redis-server /opt/redis/conf/redis-6386.conf > /opt/redis/logs/redis-6386.log 2>&1 &
c):加入空節點到叢集
add-node 將一個節點新增到叢集裡面, 第一個是新節點ip:port, 第二個是任意一個已存在節點ip:port
- redis-trib.rb add-node 10.10.34.14:6386 10.10.34.14:6381
node:新節點沒有包含任何資料, 因為它沒有包含任何slot。新加入的加點是一個主節點, 當叢集需要將某個從節點升級為新的主節點時, 這個新節點不會被選中
d):為新節點分配slot
Java程式碼- redis-trib.rb reshard 10.10.34.14:6386
- #根據提示選擇要遷移的slot數量(ps:這裡選擇500)
- How many slots do you want to move (from 1 to 16384)? 500
- #選擇要接受這些slot的node-id
- What is the receiving node ID? f51e26b5d5ff74f85341f06f28f125b7254e61bf
- #選擇slot來源:
- #all表示從所有的master重新分配,
- #或者資料要提取slot的master節點id,最後用done結束
- Please enter all the source node IDs.
- Type 'all' to use all the nodes as source nodes for the hash slots.
- Type 'done' once you entered all the source nodes IDs.
- Source node #1:all
- #列印被移動的slot後,輸入yes開始移動slot以及對應的資料.
- #Do you want to proceed with the proposed reshard plan (yes/no)? yes
- #結束
3):新增新的slave節點
a):前三步操作同新增master一樣
b)第四步:redis-cli連線上新節點shell,輸入命令:cluster replicate 對應master的node-id
Java程式碼- 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
redis之 3.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
Redis(3.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 正式版終於到來了!最重要