redis cluster官方集群的搭建筆記
- 2019 年 10 月 5 日
- 筆記
參考文檔:
https://www.zybuluo.com/phper/note/195558
http://www.cnblogs.com/shihaiming/p/5949772.html
http://redis.io/topics/cluster-tutorial
http://xiaorui.cc
系統環境:
CentOS6.7 X86_64
雙機6節點:
node1: 192.168.2.11
node2: 192.168.2.12
node3:192.168.2.13
redis cluster必須用3.X版本的才能支援。我們實驗中使用的是3.0.1版本的redis。
安裝redis
安裝redis的過程略過。
安裝ruby及相關redis依賴組件
#!/bin/bash
# 安裝Ruby2.3.0,安裝到/usr/local/ruby目錄下
# 安裝rubygems、安裝redis-rb組件
# 先安裝相關的devel包
yum install zlib zlib-developenssl openssl-devel -y
wait
# 編譯安裝 ruby2.3.0
tar xf src/ruby-2.3.0.tar.gz -Csrc/
cd src/ruby-2.3.0
./configure –enable-shared–enable-pthread –prefix=/usr/local/ruby
make && make install
wait
echo 'exportPATH=/usr/local/ruby/bin:$PATH' > /etc/profile.d/ruby.sh
source /etc/profile.d/ruby.sh
# 安裝 rubygems
/usr/local/ruby/bin/gem installrubygems-update
update_rubygems
wait
# 安裝redis-rb
/usr/local/ruby/bin/gem installredis
wait
# 一些補充說明:
# client.rb的存放路徑:
#/usr/local/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.1/lib/redis/client.rb
# redis 3.X cluster 如果添加密碼認證的話,需要修改client.rb裡面的password
配置redis cluster的基本操作
node1、node2上都運行3個節點
node1上如下操作:
cd /usr/local/
mkdir redis_cluster
cd redis_cluster
mkdir 7000 7001 7002
cp /usr/local/redis/etc/redis.conf7000/
vim 7000/redis.conf 修改的地方如下:
pidfile /var/run/redis7000.pid
port 7000
logfile "./redis.log"
dir /usr/local/redis_cluster/7000/
appendonly yes
cluster-enabled yes # 注意一定要開啟這個集群功能
同樣的操作,將redis.conf 複製到7001 7002文件夾下,並修改下各自的配置文件
sed -i 's#7000#7001#'/usr/local/redis_cluster/7001/redis.conf
sed -i 's#7000#7002#' /usr/local/redis_cluster/7002/redis.conf
配置文件都修改好後,啟動3個redis實例。
redis-server/usr/local/redis_cluster/7000/redis.conf
redis-server/usr/local/redis_cluster/7001/redis.conf
redis-server/usr/local/redis_cluster/7002/redis.conf
ss -lnt
可以看到redis不僅監聽在7000~7002埠上,還開啟了700X+10000的埠號。
700X是用於客戶端訪問的
1700X是用於集群內部節點之間訪問的
node2上如下操作:
cd /usr/local/
mkdir redis_cluster
cd redis_cluster
mkdir 7003 7004 7005
vim 7003/redis.conf 修改的地方如下:
pidfile /var/run/redis7003.pid
port 7003
logfile "./redis.log"
dir /usr/local/redis_cluster/7003/
appendonly yes
cluster-enabled yes # 注意一定要開啟這個集群功能
同樣的操作,將redis.conf 複製到7004 7005文件夾下,並修改下各自的配置文件
redis-server/usr/local/redis_cluster/7003/redis.conf
redis-server/usr/local/redis_cluster/7004/redis.conf
redis-server /usr/local/redis_cluster/7005/redis.conf
ss -lnt|grep 700
node1和node2都啟動好了之後,我們可以執行下面的操作:
說明:
我編譯安裝的redis,不知為何在/usr/local/redis/下所有文件夾里都沒有redis-trib.rb 這個文件。因此我是從原始的安裝包把src/redis-trib.rb拷貝到/usr/local/redis/bin裡面的。
cp /root/redis-3.0.1/src/redis-trib.rb /usr/local/redis/bin
然後在node1上執行:
redis-trib.rb create –replicas 1192.168.2.11:7000 192.168.2.11:7001 192.168.2.11:7002 192.168.2.12:7003192.168.2.12:7004 192.168.2.12:7005
上面的命令含義:replicas 是給master分配slave個數的參數,我們給的參數是1 ,那每個master就有一個從節點


運行後,還可以運行redis-trib.rb check192.168.2.11:7000 檢查下集群的狀態,如下圖:

現在,我們加入一台主機node3,node3上跑了1個redis,埠是7006。redis.conf的配置文件和上面的基本相同。
在node3上啟動7006埠的redis:
redis-server/usr/local/redis_cluster/7006/redis.conf
然後,我們到node1上,添加一個節點node3的7006埠,在node1上操作如下:
redis-trib.rb add-node 192.168.2.13:7006192.168.2.11:7000
格式:redis-trib.rb add-node 你想要的增加的ip:port 現在已經存在的IP:port
如果這一步添加失敗了,原因可能如下:[摘錄自xiaorui.cc]
[ERR]Node xx.xx.xx.xx:7006 is not empty. Either the node already knows other nodes(check with CLUSTER NODES) or contains some key in database 0.
上面的問題比較常見,尤其大家在測試的環境下,需要刪除你redis.conf裡面cluster-config-file 所在的文件。如果是你線上的環境一般很難遇到這樣的問題,如果是小範圍測試的時候,不注意把redis.conf都複製成一樣,或者埠不一樣,cluster的配置文件是一樣… 所以redis啟動不了,但勢必會造成這個問題…. 如果刪除文件不好用,那麼就直接redis-cli -p port進去,然後刪掉所有的數據…… 這兩件事情都做OK了後,就可以正常啟動了,不會提示你 not empty了。
添加成功後,再檢查下,如下圖:
redis-trib.rb check 192.168.2.11:7000

上圖中可以看出:master有4個,slave有3個。
然後我們可以嘗試使用redis-cli來連接redis實例。
# redis-cli -p 7003 -h 192.168.2.12 -c
# 注意這個-c參數,不加-c則客戶端不自動切換。而加上-c如果set存數據發現不在本機上則會自動切換到7001客戶端保存。
然後可以隨意set寫入些內容,如下圖。

可以看到我們set 第一條數據的時候,直接給我們轉到了192.168.2.12 7005埠的redis上去。
然後再次set數據的時候,又跳到了192.168.2.12 7003埠的redis了。
補充說明:這些key是經過CRC16('my_name')%16384計算後,自動分配存放到其他的master上了
集群中一個master宕機
6台(3主3從)試驗中,可以看到當某一個master宕機後,其對應的slave會自動提升為master提供服務,對集群不會造成影響。
但是如果之後這個slave也掛了,則整個集群都會受到影響。
集群中再加入一個節點(分為主節點、從節點)
當前環境3master、3slave
如果我們在加入一台redis的話,默認是添加成為master節點的。
> cluster nodes 可以看到集群中有哪些節點,下圖可以看到新加入的節點還是myself狀態。

redis-trib.rb check 192.168.2.13:7006

可以看到新加入的這個節點沒有分配數據,因此我們需要遷移下數據。見下面的數據的reshard操作:
數據的reshard
我們可以在線進行reshard,目的是讓slot重新按照我們的規則分配,這樣能一定程度。的解決數據分配不均勻的情況。如果你先增加了一個節點,也可以用reshard的方式讓一定數目的slot遷移過去…. 這樣解決了新節點的slot分配….
遷移的方法:redis-trib.rb reshard 192.168.2.12:7005
說明:redis-trib.rb reshard 要遷移的集群中的任意節點IP:PORT
輸入上面的命令後,自動出現「How many slots do you want tomove (from 1 to 16384)」 這個是問我們要遷移多少個slot到7006這個新節點。
可以算一下,16384/4=4096,也就是說,為了平衡分配起見,我們需要移動4096個槽點到7006上。
輸入4096後,系統自動提示我們輸入要接收這些slot數據的主機的ID是多少? id就是我們check時候看到的那個一長串字元串。
接著, redis-trib 會向你詢問重新分片的源節點(source node),也即是,要從哪個節點中取出4096個哈希槽,並將這些槽移動到7006節點上面。
如果我們不打算從特定的節點上取出指定數量的哈希槽,那麼可以向redis-trib輸入all,這樣的話,集群中的所有主節點都會成為源節點,redis-trib將從各個源節點中各取出一部分哈希槽,湊夠 4096個,然後移動到7006節點上:
Source node #1:all
接下來就開始遷移了,並且會詢問你是否確認:
輸入 yes 並使用按下回車之後, redis-trib 就會正式開始執行重新分片操作,將指定的哈希槽從源節點一個個地移動到7006節點上面。
遷移完成後,可以執行redis-trib.rb check192.168.2.12:7005 查看下7006的slot數量是多少。
從reids cluster中刪除一個redis節點….
root@ubuntu:~/redis-3.0.1/src#./redis-trib.rb del-node 127.0.0.1:7007
給指定的redis master節點添加從節點…
默認add-node是添加主master節點…..
./redis-trib.rb add-node –slave–master-id 』ee05942ee38a56421a07eea01bc6072fe5e23bfd』 127.0.0.1:7008 127.0.0.1:7000