redis cluster 是一个redis 集群的架构、它拥有16384个虚拟槽:0~16383,创建节点时时可以平分16384个虚拟槽,每个节点之间通过cluster meet 管理可以知道每个key 分配到那个节点的虚拟槽中。数据存储分配流程:
1、set 一个值到任意一个节点
2、节点计算该key 是否属于该节点的虚拟槽内,是则存储,否则返回指定的节点位置
3、客户端收到重定向位置(move操作)则访问指定节点进行存储
如业务需求,大内存的情况下。现在服务器无法提供更大的内存,则通过cluster 扩展,将数据分布存储到各个节点中去、加上主从模式。这样保证了业务需求也保证了高可用。
将热点流量引导分散到各个节点中去
port 7000
daemonize yes
dir "/data/log/redis/"
dbfilename "dump-7000.rdb"
logfile "port.log"
# cluster 配置
cluster-enabled yes
cluster-node-timeout 15000 #节点超时时间
cluster-config-file nodes-7000.conf
cluster-require-full-coverage yes #是否所有节点都可用才算正常,实际中设置为no
port 7001
daemonize yes
dir "/data/log/redis/"
dbfilename "dump-7001.rdb"
logfile "port.log"
# cluster 配置
cluster-enabled yes
cluster-node-timeout 15000 #节点超时时间
cluster-config-file nodes-7001.conf
cluster-require-full coverage yes #是否所有节点都可用才算正常,实际中设置为no
port 7002
daemonize yes
dir "/data/log/redis/"
dbfilename "dump-7002.rdb"
logfile "port.log"
# cluster 配置
cluster-enabled yes
cluster-node-timeout 15000 #节点超时时间
cluster-config-file nodes-7002.conf
cluster-require-full coverage yes #是否所有节点都可用才算正常,实际中设置为no
port 7003
daemonize yes
dir "/data/log/redis/"
dbfilename "dump-7003.rdb"
logfile "port.log"
# cluster 配置
cluster-enabled yes
cluster-node-timeout 15000 #节点超时时间
cluster-config-file nodes-7003.conf
cluster-require-full coverage yes #是否所有节点都可用才算正常,实际中设置为no
port 7004
daemonize yes
dir "/data/log/redis/"
dbfilename "dump-7004.rdb"
logfile "port.log"
# cluster 配置
cluster-enabled yes
cluster-node-timeout 15000 #节点超时时间
cluster-config-file nodes-7004.conf
cluster-require-full coverage yes #是否所有节点都可用才算正常,实际中设置为no
port 7005
daemonize yes
dir "/data/log/redis/"
dbfilename "dump-7005.rdb"
logfile "port.log"
# cluster 配置
cluster-enabled yes
cluster-node-timeout 15000 #节点超时时间
cluster-config-file nodes-7005.conf
cluster-require-full coverage yes #是否所有节点都可用才算正常,实际中设置为no
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7001
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7002
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7003
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7004
redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7005
redis-cli -h 127.0.0.1 -p 7000 cluster addslots {0~5461}
redis-cli -h 127.0.0.1 -p 7000 cluster addslots {5462~10922}
redis-cli -h 127.0.0.1 -p 7000 cluster addslots {10923~16383}
redis-cli -h 127.0.0.1 -p 7003 cluster replicate ${node-id}
redis-cli -h 127.0.0.1 -p 7004 cluster replicate ${node-id}
redis-cli -h 127.0.0.1 -p 7005 cluster replicate ${node-id}
cat nodes-7000.conf #可以获取node 节点
redis-cli -p 7000 cluster info #可以查看到集群的信息
redis-cli -p 7000 cluster nodes #可以看到meet握手的相关状态,及node id
redis-cli -p 7000 cluster slots #查看槽的分配信息
redis-cli -c -p 7000 #集群版的客户端连接
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
tar -xvf ruby-2.3.1.tar.gz
./configure -prefix=/usr/local/ruby
make
make install
/usr/local/ruby
cp bin/ruby /usr/local/bin
cp bin/gem /usr/local/bin
wget http://rubygems.org/downloas/redis-3.3.0.gem
gem install -l redis-3.3.0.gem
gem list -- check redis gem
1、启动6个redis 节点
2、创建cluster
./redis-trib.rb redis-trib.rb create --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 1 表示每个master 配置一个slave
#复制两个节点
sed s/7000/7006/g redis-7000.conf > redis-7006.conf
sed s/7000/7007/g redis-7000.conf > redis-7007.conf
#启动redis
./redis-cli redis-7006.conf
./redis-cli redis-7006.conf
./redis-cli -p 7000 cluster meet 127.0.0.1 7006
./redis-cli -p 7000 cluster meet 127.0.0.1 7007
#配置主从
./redis-cli -p 7007 cluster replicate {masterId}
#使用任意一个node 节点执行都可以
./redis-trib.rb reshard 127.0.0.1:7000
#执行上述语句后会要求输入需迁移的数量
4096
#迁移到那个节点
{masterNodeId}
#从所有节点中提取
all
#执行上述操作
yes
#查看迁移后的状态
./redis-cli -p 7000 cluster nodes
#可以看到7006节点包含了三份数据
0-1364 5461-6826 10923-12287
./redis-trib.rb reshard --from {masterId:7006} --to {masterId:7000} --slots 1365
#同意上述操作
yes
./redis-trib.rb reshard --from {masterId:7006} --to {masterId:7001} --slots 1365
#同意上述操作
yes
./redis-trib.rb reshard --from {masterId:7006} --to {masterId:7001} --slots 1365
#同意上述操作
yes
#下线从节点,如先下线主节点会触发故障转移
./redis-trib.rb del-node 127.0.0.1:7000 {slaveId:7007}
#下线主节点
./redis-trib.rb del-node 127.0.0.1:7000 {slaveId:7006}
上述过程只是为了对其原理有一定的了解,实际项目中可以使用可视化工具直接部署
项目地址:https://github.com/sohutv/cachecloud