什么是redis cluster?
redis cluster 是一个redis 集群的架构、它拥有16384个虚拟槽:0~16383,创建节点时时可以平分16384个虚拟槽,每个节点之间通过cluster meet 管理可以知道每个key 分配到那个节点的虚拟槽中。数据存储分配流程:

1、set 一个值到任意一个节点

2、节点计算该key 是否属于该节点的虚拟槽内,是则存储,否则返回指定的节点位置

3、客户端收到重定向位置(move操作)则访问指定节点进行存储

redis cluster 能解决什么问题?
1、对内存扩容
如业务需求,大内存的情况下。现在服务器无法提供更大的内存,则通过cluster 扩展,将数据分布存储到各个节点中去、加上主从模式。这样保证了业务需求也保证了高可用。

2、性能扩展
将热点流量引导分散到各个节点中去

如何安装redis cluster

redis cluster 安装一、原生安装
redis 配置33从
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

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

meet

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 #集群版的客户端连接

redis cluster 安装二、工具安装

安装ruby

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

安装ruby-redis 客端

wget http://rubygems.org/downloas/redis-3.3.0.gem
gem install -l redis-3.3.0.gem
gem list – check redis gem

创建cluster 三主三从

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

redis cluster 扩容

1、创建节点并启动

#复制两个节点
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

2、加入cluster 集群

./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}

3、数据迁移

#使用任意一个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 cluster 缩容
数据迁移

./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}

可视化工具:cacheCloud
上述过程只是为了对其原理有一定的了解,实际项目中可以使用可视化工具直接部署

项目地址:https://github.com/sohutv/cachecloud

文档更新时间: 2019-10-08 10:01   作者:月影鹏鹏