Redis学习之:Redis的集群

1.为何须要Redis集群

随着咱们系统业务量的增加,单机Redis已经不能知足需求了。假设咱们的系统要缓存的数据已经远远超出服务器的内存,就须要将这些数据以分片的形式存储到不一样的服务器上。node

2.解决的问题

数据冗余备份、故障自动转移、核心解决了单节点并发压力问题redis

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去进行计算,无论是查询仍是添加都会分配到对应的槽中bash

注意

  • 当某一个主节点宕机后,其对应的从节点会成为主节点
  • 以前的主节点若是从新启动后,则只能成为从节点,不能成为主节点了

向已存在的集群中添加节点

启动一个新的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

这里它会首先提示咱们须要转移多少个槽,咱们输入3000app

而后会提示咱们须要哪一个id接收,咱们输入使用 info 命令看到的7007节点的id 7e37f7ecde1a7bdc434ddc564662e47f3d3875e6分布式

而后提示咱们从哪些节点分配出这些槽,咱们输入allui

而后输入 yes 就能够完成节点槽的从新分配

相关文章
相关标签/搜索