redis5.0部署叢集環境
redis5.0叢集部署
一、叢集介紹
Redis 叢集是一個可以在多個 Redis 節點之間進行資料共享的設施(installation)。
Redis 叢集不支援那些需要同時處理多個鍵的 Redis 命令, 因為執行這些命令需要在多個 Redis 節點之間移動資料, 並且在高負載的情況下, 這些命令將降低 Redis 叢集的效能, 並導致不可預測的行為。
Redis 叢集通過分割槽(partition)來提供一定程度的可用性(availability): 即使叢集中有一部分節點失效或者無法進行通訊, 叢集也可以繼續處理命令請求。
Redis 叢集提供了以下兩個好處:
將資料自動切分(split)到多個節點的能力。
當叢集中的一部分節點失效或者無法進行通訊時, 仍然可以繼續處理命令請求的能力。
二、Redis 叢集資料共享
Redis 叢集使用資料分片(sharding)而非一致性雜湊(consistency hashing)來實現: 一個 Redis 叢集包含 16384 個雜湊槽(hash slot), 資料庫中的每個鍵都屬於這 16384 個雜湊槽的其中一個, 叢集使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽, 其中 CRC16(key) 語句用於計算鍵 key 的 CRC16 校驗和 。
叢集中的每個節點負責處理一部分雜湊槽。 舉個例子, 一個叢集可以有三個雜湊槽, 其中:
- 節點 A 負責處理 0 號至 5500 號雜湊槽。
- 節點 B 負責處理 5501 號至 11000 號雜湊槽。
- 節點 C 負責處理 11001 號至 16384 號雜湊槽。
這種將雜湊槽分佈到不同節點的做法使得使用者可以很容易地向叢集中新增或者刪除節點。 比如說:
如果使用者將新節點 D 新增到叢集中, 那麼叢集只需要將節點 A 、B 、 C 中的某些槽移動到節點 D 就可以了。
與此類似, 如果使用者要從叢集中移除節點 A , 那麼叢集只需要將節點 A 中的所有雜湊槽移動到節點 B 和節點 C , 然後再移除空白(不包含任何雜湊槽)的節點 A 就可以了。
因為將一個雜湊槽從一個節點移動到另一個節點不會造成節點阻塞, 所以無論是新增新節點還是移除已存在節點, 又或者改變某個節點包含的雜湊槽數量, 都不會造成叢集下線。
三、Redis 叢集中的主從複製
為了使得叢集在一部分節點下線或者無法與叢集的大多數(majority)節點進行通訊的情況下, 仍然可以正常運作, Redis 叢集對節點使用了主從複製功能: 叢集中的每個節點都有 1 個至 N 個複製品(replica), 其中一個複製品為主節點(master), 而其餘的 N-1 個複製品為從節點(slave)。
在之前列舉的節點 A 、B 、C 的例子中, 如果節點 B 下線了, 那麼叢集將無法正常執行, 因為叢集找不到節點來處理 5501 號至 11000 號的雜湊槽。
另一方面, 假如在建立叢集的時候(或者至少在節點 B 下線之前), 我們為主節點 B 添加了從節點 B1 , 那麼當主節點 B 下線的時候, 叢集就會將 B1 設定為新的主節點, 並讓它代替下線的主節點 B , 繼續處理 5501 號至 11000 號的雜湊槽, 這樣叢集就不會因為主節點 B 的下線而無法正常運作了。
不過如果節點 B 和 B1 都下線的話, Redis 叢集還是會停止運作。
四、建立並使用 Redis 叢集
必須使用六個節點: 其中三個為主節點, 而其餘三個則是各個主節點的從節點。否則叢集無法正常執行!!
安裝過程
1. 下載並解壓
cd /root/software wget http://download.redis.io/releases/redis-5.0.0.tar.gz tar -zxvf redis-5.0.0.tar.gz
2. 編譯安裝
cd redis-5.0.0 make && make install
3. 將 redis-trib.rb 複製到 /usr/local/bin 目錄下
cd src cp redis-trib.rb /usr/local/bin/
4. 建立 Redis 節點
首先在 10.90.6.157 機器上 /root/software/redis-5.0.0 目錄下建立 redis_cluster 目錄;
mkdir redis_cluster
在 redis_cluster 目錄下,建立名為6379的目錄,並將 redis.conf 拷貝到這個目錄中
mkdir 6379 cp redis.conf redis_cluster/6379
分別修改這三個配置檔案,修改如下內容
port 6379 //埠預設 #bind 127.0.0.1 //註釋掉預設ip為127.0.0.1 需要改為其他節點機器可訪問的ip 否則建立叢集時無法訪問對應的埠,無法建立叢集 daemonize yes //redis後臺執行 pidfile /var/run/redis_6379.pid //pidfile檔案對應6379 cluster-enabled yes //開啟叢集 把註釋#去掉 cluster-config-file nodes_6379.conf //叢集的配置 配置檔案首次啟動自動生成 6379 cluster-node-timeout 15000 //請求超時 預設15秒,可自行設定 appendonly yes //aof日誌開啟 有需要就開啟,它會每次寫操作都記錄一條日誌
叢集的完整配置檔案如下:
protected-mode no port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile "" databases 16 always-show-logo yes save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir ./ replica-serve-stale-data yes replica-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no replica-priority 100 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no appendonly yes appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes lua-time-limit 5000 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 stream-node-max-bytes 4096 stream-node-max-entries 100 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes
Redis 官方提供了 redis-trib.rb 這個工具是用 ruby 實現的,所以需要安裝 ruby。安裝命令如下:
yum -y install ruby ruby-devel rubygems rpm-build gem install redis
其中 gem install redis命令執行時出現了:
redis requires Ruby version >= 2.2.2的報錯,查了資料發現是Centos預設支援ruby到2.0.0,可gem 安裝redis需要最低是2.2.2
解決辦法是 先安裝rvm,再把ruby版本提升至2.3.3
1.安裝curl
sudo yum install curl
2. 安裝RVM
curl -L get.rvm.io | bash -s stable
3.
source /usr/local/rvm/scripts/rvm
4. 檢視rvm庫中已知的ruby版本
rvm list known
5. 安裝一個ruby版本
rvm install 2.3.3
6. 使用一個ruby版本
rvm use 2.3.3
7. 設定預設版本
rvm remove 2.0.0
8. 解除安裝一個已知版本
ruby --version
9. 再安裝redis就可以了
gem install redis
好了,重複以上的安裝步湊把剩下的5個節點部署好!!!
10.建立叢集
在6個節點中執行以下命令啟動redis:
src/redis-server ./redis_cluster/6379/redis.conf &
在1個節點上執行以下建立叢集命令:
src/redis-cli --cluster create 10.90.6.156:6379 10.90.6.157:6379 10.90.6.158:6379 10.90.6.159:6379 10.90.6.160:6379 10.90.6.161:6379 --cluster-replicas 1
[[email protected] redis-5.0.0]# src/redis-cli --cluster create 10.90.6.156:6379 10.90.6.157:6379 10.90.6.158:6379 10.90.6.159:6379 10.90.6.160:6379 10.90.6.161:6379 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 10.90.6.159:6379 to 10.90.6.156:6379 Adding replica 10.90.6.160:6379 to 10.90.6.157:6379 Adding replica 10.90.6.161:6379 to 10.90.6.158:6379 M: ddebff330f23552db26eadb51c4f9926473cb485 10.90.6.156:6379 slots:[0-5460] (5461 slots) master M: 4256ffaa3ad3d1c8ad3174898f97114629922a8e 10.90.6.157:6379 slots:[5461-10922] (5462 slots) master M: 9b7c727852f4bde936b8bb8f6cbda2cf621b7c9b 10.90.6.158:6379 slots:[10923-16383] (5461 slots) master S: e52195f35519ac8c360b008a354415ad39190027 10.90.6.159:6379 replicates ddebff330f23552db26eadb51c4f9926473cb485 S: 06d022e927a8f166cd08e333e8723d4c5b5a1092 10.90.6.160:6379 replicates 4256ffaa3ad3d1c8ad3174898f97114629922a8e S: b57ebc5c247f01e9e35cf798bd6932bdaee04098 10.90.6.161:6379 replicates 9b7c727852f4bde936b8bb8f6cbda2cf621b7c9b Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join .. >>> Performing Cluster Check (using node 10.90.6.156:6379) M: ddebff330f23552db26eadb51c4f9926473cb485 10.90.6.156:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: b57ebc5c247f01e9e35cf798bd6932bdaee04098 10.90.6.161:6379 slots: (0 slots) slave replicates 9b7c727852f4bde936b8bb8f6cbda2cf621b7c9b S: e52195f35519ac8c360b008a354415ad39190027 10.90.6.159:6379 slots: (0 slots) slave replicates ddebff330f23552db26eadb51c4f9926473cb485 S: 06d022e927a8f166cd08e333e8723d4c5b5a1092 10.90.6.160:6379 slots: (0 slots) slave replicates 4256ffaa3ad3d1c8ad3174898f97114629922a8e M: 4256ffaa3ad3d1c8ad3174898f97114629922a8e 10.90.6.157:6379 slots:[5461-10922] (5462 slots) master 1 additional replica(s) M: 9b7c727852f4bde936b8bb8f6cbda2cf621b7c9b 10.90.6.158:6379 slots:[10923-16383] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
如果報錯,請看下面!!
[[email protected] redis-5.0.0]# src/redis-cli --cluster create 10.90.6.156:6379 10.90.6.157:6379 10.90.6.158:6379 10.90.6.159:6379 10.90.6.160:6379 10.90.6.161:6379 --cluster-replicas 1
[ERR] Node 10.90.6.157:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
的問題
解決辦法:
1)將每個節點下aof、rdb、nodes.conf本地備份檔案刪除;
[[email protected]]# rm -fr appendonly.aof dump.rdb nodes-*^C
[[email protected]]# pwd
/fs01/redis-5.0.0
2)10.90.6.157:6379> flushdb #清空當前資料庫
3)之後再執行指令碼,成功執行;
這裡解釋一下dump.rdb檔案:
dump.rdb是由Redis伺服器自動生成的 預設情況下 每隔一段時間redis伺服器程式會自動對資料庫做一次遍歷,把記憶體快照寫在一個叫做“dump.rdb”的檔案裡,這個持久化機制叫做SNAPSHOT。有了SNAPSHOT後,如果伺服器宕機,重新啟動redis伺服器程式時redis會自動載入dump.rdb,將資料庫狀態恢復到上一次做SNAPSHOT時的狀態。
SNAPSHOT即快照
重新連線redis叢集,成功
8. 叢集驗證
在一臺機器上連線方式為 redis-cli -h -c 10.90.6.157 ,加引數 -c 可連線到叢集,因為上面 redis.conf 將 bind 改為了ip地址,所以 -h 引數不可以省略。
[[email protected] src]# ./redis-cli -c -h 10.90.6.157 10.90.6.157:6379> get hello "2" 10.90.6.157:6379>