1.为什么需要Redis集群
随着我们系统业务量的增长,单机Redis已经不能满足需求了。假设我们的系统要缓存的数据已经远远超出服务器的内存,就需要将这些数据以分片的形式存储到不同的服务器上。
2.解决的问题
数据冗余备份、故障自动转移、核心解决了单节点并发压力问题
3.Redis集群的原理
- redis-cluster会均分16384个slot(从0-16383),每个节点负责一部分槽
- 客户端可以连接任意一个redis-cluster服务器
- 每次set或get都会通过crc16算法计算出对应的slot
- 对同一个key,多次进行crc16计算时结果一致样的
- 同一个key在经过crc16计算时,结果一定会出现相同的情况
- 各个节点之间相互通讯
4.Redis集群搭建
- Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群
- 要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006),当然实际生产环境的Redis集群搭建和这里是一样的
每个配置文件做如下配置
port ${port} #端口
cluster-enabled yes #开启集群模式
cluster-config-file nodes-${port}.conf #修改集群配置文件
cluster-node-timeout 15000 #设置节点超时时间
appendonly yes #设置持久化为aof模式
appendfilename appendonly-${port}.aof #设置每个持久化文件名
dbfilename dump-${port}.rdb #快照文件名
pidfile /var/run/redis_${port}.pid #进程文件名
cluster-require-full-coverage yes #
bind 0.0.0.0
启动每个redis服务
.redis-server ./redis-${port}.conf
- 6个节点启动完成后,我们开始创建集群
redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1 #参数1表示1主1从
# 7001为7004的主节点
# 7002为7005的主节点
# 7003为7006的主节点
输入yes后,成功完成集群配置
查看集群状态
redis-cli --cluster info 192.168.3.200:7001 # 这里连接任意一个节点都可以
操作集群
连接任意一个节点都可以操作
此时我们发现,Redis会根据key去进行计算,不管是查询还是添加都会分配到对应的槽中
注意
- 当某一个主节点宕机后,其对应的从节点会成为主节点
- 之前的主节点如果重新启动后,则只能成为从节点,不能成为主节点了
向已存在的集群中添加节点
启动一个新的Redis实例 7007
redis-server ./redis-7007.conf
将7007节点加入集群中
redis-cli --cluster add-node 127.0.0.7:7007 127.0.0.1:7001 # 前面的参数表示新增的节点ip:port 后面的参数表示已经存在的集群节点的ip:port
此时我们查看节点信息
虽然7007节点已经加入了集群,但是没有分配任何的数据槽
给集群节点重新分片
redis-cli --cluster reshard 192.168.3.200:7001
这里它会首先提示我们需要转移多少个槽,我们输入3000
然后会提示我们需要哪个id接收,我们输入使用 info 命令看到的7007节点的id 7e37f7ecde1a7bdc434ddc564662e47f3d3875e6
然后提示我们从哪些节点分配出这些槽,我们输入all
然后输入 yes 就可以完成节点槽的重新分配