redis系列(三)-Redis集羣

前言

Redis 是我們目前大規模使用的緩存中間件,由於它強大高效而又便捷的功能,得到了廣泛的使用。單節點的Redis已經就達到了很高的性能,爲了提高可用性我們可以使用Redis集羣。本文參考了Rdis的官方文檔和使用Redis官方提供的Redis Cluster工具搭建Rdis集羣。

注意 :Redis的版本要在3.0以上,本文使用4.0.2。

Redis安裝

網上安裝教程很多,大致步驟是下載、解壓、編譯、安裝、配置後端啓動。請網上找資料,例如:《瞭解一下 Redis 並在 CentOS 下進行安裝配置》
##Redis集羣的概念
Redis 集羣是一個可以在多個 Redis 節點之間進行數據共享的設施(installation)。

數據分片

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 號哈希槽。
    這種將哈希槽分佈到不同節點的做法使得用戶可以很容易地向集羣中添加或者刪除節點。 比如說:
    我現在想設置一個key,叫my_name:

set my_name value1

按照Redis Cluster的哈希槽算法,CRC16(‘my_name’)%16384 = 2412 那麼這個key就被分配到了節點A上
同樣的,當我連接(A,B,C)的任意一個節點想獲取my_name這個key,都會轉到節點A上
再比如
如果用戶將新節點 D 添加到集羣中, 那麼集羣只需要將節點 A 、B 、 C 中的某些槽移動到節點 D 就可以了。
增加一個D節點的結果可能如下:

  • 節點A覆蓋1365-5460
  • 節點B覆蓋6827-10922
  • 節點C覆蓋12288-16383
  • 節點D覆蓋0-1364,5461-6826,10923-1228
    與此類似, 如果用戶要從集羣中移除節點 A , 那麼集羣只需要將節點 A 中的所有哈希槽移動到節點 B 和節點 C , 然後再移除空白(不包含任何哈希槽)的節點 A 就可以了。
    因爲將一個哈希槽從一個節點移動到另一個節點不會造成節點阻塞, 所以無論是添加新節點還是移除已存在節點, 又或者改變某個節點包含的哈希槽數量, 都不會造成集羣下線。
    所以,Redis Cluster的模型大概是這樣的形狀
    這裏寫圖片描述

搭建集羣

1.創建文件夾
redis-cluster統一存放文件夾,並在文件夾內新建6個文件夾用於存放6個實例(注:redis集羣使用主從複製模型,也就是一個主節點有1-N個從節點);其中3個爲主節點,3個爲從節點。
使用命令

mkdir /usr/local/redis-cluster
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data

這裏寫圖片描述
2.複製執行腳本
在 /usr/local/redis-cluster 下創建 bin 文件夾,用來存放集羣運行腳本,並把安裝好的 Redis 的 src 路徑下的運行腳本拷貝過來。
使用命令:

mkdir redis-cluster/bin
cd /usr/local/redis/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin


3.創建新的redis實例
複製新的redis實例到9001,然後對實例進行修改:
使用命令:

cp /usr/local/redis/* /usr/local/redis-cluster/9001

修改redis.conf,具體如下:

port 9001(每個節點的端口號)
daemonize yes
bind 127.0.0.1(綁定當前機器 IP)
dir /usr/local/redis-cluster/9001/data/(數據文件存放位置)
pidfile /var/run/redis_9001.pid(pid 9001和port要對應)
cluster-enabled yes(啓動集羣模式)
cluster-config-file nodes9001.conf(9001和port要對應)
cluster-node-timeout 15000
appendonly yes

複製當前實例到其他5個文件夾中,並修改相應的配置
使用命令:
\cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9002 \cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9003 \cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9004 \cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9005 \cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9006

這裏寫圖片描述
##啓動服務,查看效果
1.啓動9001-9006六個節點,看看服務是否已經配置完成
使用命令:

/usr/local/bin/redis-server /usr/local/redis-cluster/9001/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9002/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9003/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9004/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9005/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9006/redis.conf

這裏寫圖片描述
使用901節點進行測試,
使用命令:

/usr/local/redis-cluster/bin/redis-cli -h 192.168.119.131 -p 9001

set name mafly

服務報錯,節點沒有槽點可以提供服務。
這裏我們只是開啓了6個redis進程而已,它們都還只是獨立的狀態,還麼有組成集羣這裏我們使用官方提供的工具redis-trib,不過這個工具是用ruby寫的,要先安裝ruby的環境。
這裏寫圖片描述
這裏寫圖片描述

安裝ruby環境:

安裝命令:

yum install ruby
yum install rubygems
gem install redis 

安裝報錯:redis requires ruby version》=2.2.2.。
CentOS7 yum庫中ruby的版本支持到 2.0.0,可gem 安裝redis需要最低是2.2.2,自己編譯的ruby源碼,再執行還是報錯
解決方法:redis requires Ruby version >= 2.2.2
這裏寫圖片描述
##成功安裝Ruby環境
這裏寫圖片描述
##啓動redis集羣服務
###1.創建集羣
使用命令

/usr/local/redis-cluster/bin/redis-trib create --replicas 1 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 127.0.0.1:9004 127.0.0.1:9005 127.0.0.1:9006

簡單解釋一下這個命令:調用 ruby 命令來進行創建集羣,–replicas 1 表示主從複製比例爲 1:1,即一個主節點對應一個從節點;然後,默認給我們分配好了每個主節點和對應從節點服務,以及 solt 的大小,因爲在 Redis 集羣中有且僅有 16383 個 solt ,默認情況會給我們平均分配,當然你可以指定,後續的增減節點也可以重新分配。

這裏寫圖片描述

測試集羣

使用如下命令查看集羣狀態

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.131 -p 9001
cluster info
cluster nodes

進行測試:
這裏寫圖片描述

參考博文

1.Redis集羣的原理和搭建
2.Redis 集羣搭建詳細指南
3.redis集羣搭建(同機器、不同機器搭建)
4.redis requires Ruby version >= 2.2.2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章