原理:
- Redis叢集採用一致性雜湊槽的方式將叢集中每個主節點都分配一定的雜湊槽,對寫入的資料進行雜湊後分配到某個主節點進行儲存。
- 叢集使用公式(CRC16 key)& 16384計算鍵key資料那個槽。
- 16384個slot均勻分佈在各個節點上。
- 叢集中每個主節點將承擔一部分槽點的維護,而槽點中儲存著資料,每個主節點都有至少一個從節點用於高可用。
節點通訊方式:
- 開啟一個埠 設定的埠號+10000,用於叢集之間節點通訊交換資訊。
- 每個節點預設每秒10次選擇隨機5個節點傳送ping訊息,將自身資訊和知道的叢集資訊傳遞,收到ping訊息後返回pong訊息做回覆,最後通過這種隨機的訊息交換,最終每個節點將獲得所有資訊。
- 當某個主節點掛掉,所有節點將會發現主節點掛掉了,作為主節點的從節點,就會接替主節點的工作,然後告訴所有其它節點,他成為了主。這樣其它存活節點,就將它們維護的資訊表更新從節點將接任做主,如果都掛掉叢集將報錯。當從一個節點操作,根據一致性雜湊計算後將儲存在其中一個主節點中,從節點將同步主的資料。
- redis cluster是去中心化的,叢集中的每個節點都是平等的關係,每個節點都儲存各自的資料和整個叢集的狀態。每個節點都和其他所有節點連線,而且這些連線保持活躍。
- 搭建叢集時,會為每一個分片的主節點,對應一個從節點。實現slaveof功能,同時當主節點down,實現sentinel哨兵的自動failover切換功能
Redis分散式叢集(部署):
埠號:7000-7005
本次分散式分片叢集在一臺LInux系統即可,只需要安裝多個例項作為叢集配置。
安裝ruby環境支援:
yum -y install ruby rubygems
yum安裝2.0.0版本,但是gem需要2.2.2版本以上,所以選擇編譯
下載並安裝ruby環境:
wget https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.1.tar.gz
tar xf ruby-2.6.1.tar.gz && cd ruby-2.6.1/
./configure --prefix=/usr/local/ruby
make && make install && echo $?
echo 'export PATH=$PATH:/usr/local/ruby/bin' >> /etc/profile
source /etc/profile
修改gem工具國內源:
# 檢視gem工具源地址
gem sources -l
# 新增一個阿里雲的gem工具源
gem sources -a http://mirrors.aliyun.com/rubygems/
# 刪除gem工具預設國外源
gem sources --remove https://rubygems.org/
# 下載當前最新版本叢集外掛
gem install redis -v 4.1.0
叢集節點準備:
mkdir /data/700{0..5}
配置7000埠例項:
vim /data/7000/redis.conf
port 7000
daemonize yes
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
拷貝其他埠例項:
# 拷貝配置檔案cp /data/7000/redis.conf /data/7001/
cp /data/7000/redis.conf /data/7002/
cp /data/7000/redis.conf /data/7003/
cp /data/7000/redis.conf /data/7004/
cp /data/7000/redis.conf /data/7005/
# 修改配置檔案內容
sed -i 's#7000#7001#g' /data/7001/redis.conf
sed -i 's#7000#7002#g' /data/7002/redis.conf
sed -i 's#7000#7003#g' /data/7003/redis.conf
sed -i 's#7000#7004#g' /data/7004/redis.conf
sed -i 's#7000#7005#g' /data/7005/redis.conf
啟動所有例項:
redis-server /data/7000/redis.conf
redis-server /data/7001/redis.conf
redis-server /data/7002/redis.conf
redis-server /data/7003/redis.conf
redis-server /data/7004/redis.conf
redis-server /data/7005/redis.conf
建立命令軟連結:
(這個命令過期了,現在使用redis-cli命令)(可選執行命令)
ln -s /usr/local/redis-5.0.2/src/redis-trib.rb /usr/sbin/
檢視程式:
ps -ef |grep redis-server
加入所有例項節點到叢集管理:
# --replicas 1",1是代表每一個主有一個從,後面的是所有節點的地址與埠資訊
redis-cli --cluster create --cluster-replicas 1 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.0.0.1:7005
分散式主從規則為,前三個例項節點是主,對應的後面三個例項節點為從節點,如果replicas 2,那就多加3個例項節點
檢視主節點狀態:
redis-cli -p 7000 cluster nodes|grep master
檢視從節點狀態:
redis-cli -p 7000 cluster nodes|grep slave
Redis-分散式叢集(管理)
叢集節點增加準備:
mkdir /data/700{6..7}
拷貝其他埠例項:
# 拷貝配置檔案cp /data/7000/redis.conf /data/7006/
cp /data/7000/redis.conf /data/7007/
# 修改配置檔案內容
sed -i 's#7000#7006#g' /data/7006/redis.conf
sed -i 's#7000#7007#g' /data/7007/redis.conf
啟動新節點例項:
redis-server /data/7006/redis.conf
redis-server /data/7007/redis.conf
檢視程式:
ps -ef |grep redis-server
新增主節點:(7000例項是管理節點)
#'把7006例項新增到7000例項這個主節點所在叢集內(此時已經有了4個主節點)
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
檢視主節點狀態:
redis-cli -p 7000 cluster nodes|grep master
轉移slot(重新分片):
#'操作叢集管理節點從新分配,並在互動介面指定分片大小、選擇接收分片的節點ID
redis-cli --cluster reshard 127.0.0.1:7000
How many slots do you want to move (from 1 to 16384)? 4096
#通過人工手動計算資料分片總大小除以主節點後的數字
What is the receiving node ID? 2129d28f0a86fc89571e49a59a0739812cff7953
#選擇接收資料分片的節點ID,(這是新增節點7006例項的ID號)
Source node #1: all
#選擇從哪些源主節點重新分片給新主節點)(all是所有節點
)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
#確認修改以上的操作
重新檢視主節點狀態:(可以看到叢集資料的重新分片)
redis-cli -p 7000 cluster nodes|grep master
新增從節點:
#'把7007例項節點新增到7006例項主節點內,並指定對應7006例項主節點坐在叢集的管理節點
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 2129d28f0a86fc89571e49a59a0739812cff7953
檢視從節點狀態:
redis-cli -p 7000 cluster nodes|grep slave
叢集節點刪除準備:
移動要刪除節點的資料分片:
#'操作叢集管理節點從新分配,並在互動介面指定分片大小、選擇接收分片的節點ID
redis-cli --cluster reshard 127.0.0.1:7000
#方法是根據要刪除master節點的分片位置,然後一個組分一個節點 , 也可以直接移動所有資料片到一個節點
How many slots do you want to move (from 1 to 16384)? 1365
#通過人工手動檢視資料分片總大小
What is the receiving node ID? e64f9074a3733fff7baa9a4848190e56831d5447
#選擇接收資料分片的節點ID,(這是新增節點7006例項的ID號)
Source node #1: 2129d28f0a86fc89571e49a59a0739812cff7953
#選擇從哪些源主節點重新分片給新主節點(這是要刪除的主節點的ID號)Source node #2:
done
#這是結束命令
Do you want to proceed with the proposed reshard plan (yes/no)? yes
#確認修改以上的操作
重新檢視主節點狀態:(可以看到叢集資料的重新分片)
redis-cli -p 7000 cluster nodes|grep master
繼續移動資料片:
#'操作叢集管理節點從新分配,並在互動介面指定分片大小、選擇接收分片的節點ID
redis-cli --cluster reshard 127.0.0.1:7000
# 方法是根據要刪除master節點的分片位置,然後一個組分一個節點 , 也可以直接移動所有資料片到一個節點
How many slots do you want to move (from 1 to 16384)? 1366
#通過人工手動檢視資料分片總大小
What is the receiving node ID? f6c1aaea3a8c56e0c7dee8ad7ae17e26dd04244c
#選擇接收資料分片的節點ID,(這是新增節點7006例項的ID號)
Source node #1: 2129d28f0a86fc89571e49a59a0739812cff7953
#選擇從哪些源主節點重新分片給新主節點(這是要刪除的主節點的ID號)Source node #2:
done
#這是結束命令
Do you want to proceed with the proposed reshard plan (yes/no)? yes
#確認修改以上的操作
重新檢視主節點狀態:(可以看到叢集資料的重新分片)
redis-cli -p 7000 cluster nodes|grep master
最後一次移動資料片:
#'操作叢集管理節點從新分配,並在互動介面指定分片大小、選擇接收分片的節點ID
redis-cli --cluster reshard 127.0.0.1:7000
#方法是根據要刪除master節點的分片位置,然後一個組分一個節點 , 也可以直接移動所有資料片到一個節點
How many slots do you want to move (from 1 to 16384)? 1365
重新檢視主節點狀態:(可以看到叢集資料的重新分片)
redis-cli -p 7000 cluster nodes|grep master
刪除清空資料片的主節點:
#'刪除已經清空資料的7006例項
redis-cli --cluster del-node 127.0.0.1:7006 2129d28f0a86fc89571e49a59a0739812cff7953
#刪除沒有主庫的7007例項
redis-cli --cluster del-node 127.0.0.1:7007 821bcf78c5e4c0b08aa7a5d514214b657ebec4ab
其他配置管理:
#記憶體資訊檢視
redis-cli -p 6382 -a redhat info memory
#設定最大隻能使用100MB的記憶體
redis-cli -p 6382 -a redhat config set maxmemory 102400000
如有錯誤或其它問題,歡迎小夥伴留言評論、指正。如有幫助,歡迎點贊+轉發分享。
作者:民工哥
連結:https://segmentfault.com/a/11...
來源:SegmentFault 思否
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。