Redis集群
Redis集群
简介
概念
集群就是使用网络将若干台计算机连通起来,并提供统一的管理方式,使其对外呈现单机的服务效果。
作用
- 分散单台服务器的访问压力,实现负载均衡
- 分散单台服务器的存储压力,实现可扩展性
- 降低单台服务器宕机带来的业务灾难
集群结构设计
数据存储设计
- 通过算法设计,计算出key应该保存的位置
- 将所有的存储空间计划切割成16384份,每台主机保存一部分,每份代表一个存储空间,注意不是key的保存空间
- 将key按照计算出的结果放到对应的存储空间
计算过程:将key通过CRC16()函数加密,再取模%16384,最后得到一个值,这个值就是key在redis集群环境中存储的位置
优势
- 增加集群的可扩展性
当集群需要新增或者减少机器的时候,各机器只需要平分存储空间即可。如果增加一台新的机器,redis会通过计算,将其他机器的存储空间挪一部分到新的机器;如果减少一台机器,则将这台机器的存储空间匀给其他机器。
集群内部的通讯设计
- 各个数据库相互通信,保存各个库中槽(存储空间)的编号数据
- 一次命中,直接返回
- 一次未命中,告知具体位置,然后取数据返回
当通过key去redis集群取数据的时候,先通过算法得到key所在的存储空间编号,如果请求的机器正好存在我们需要的数据,则直接返回;如果不存在,所请求的机器会告诉我们:我们需要的数据在哪台机器上(每个库都有各库的槽编号),然后进行一个重定向的操作,最后拿到数据返回;也就是说,在redis集群中获取数据,最多请求两次,我们就可以拿到自己想要的数据。
cluster集群结构搭建
配置
最主要的几个配置
cluster-enabled yes --开启作为cluster的节点
cluster-config-file xxx.conf --cluster配置文件名称
cluster-node-timeout milliseconds --节点超时时间,也就是说超过这个时间无响应,该节点是否下线或切换为从节点
cluster-migration-barrier count -- master连接的slave的最小数量
通过命令redis-trib.rb启动cluster
redis-trib.rb create --replicas num ip:port ...
命令中的num
表示一个master带几个slave;master对应的slave redis会通过添加的顺序去对应。
cluster启动后,master和slave会自动连接并同步数据。
PS:使用这个命令需要有ruby及gem环境
添加、获取数据
- 添加数据
redis-cli -c
set name value
- 获取数据
redis-cli -c -p port
get name
主从切换
- slave宕机后,master会将其的状态标记为failing,并通知给其他master
- 宕机后的slave恢复服务后,master清除failing状态,并通知给其他master,然后做数据同步
- master宕机后,slave会不断尝试连接,超过重试次数后(一秒一次),仍然连不上,slave则变为master提供服务。此时,原master的状态被标记为fail
- 宕机后的master恢复服务后,则作为新master的slave,清除fail状态,然后做数据同步
cluster命令
cluster nodes -- 查看集群节点信息
cluster replicate masterId -- 进入一个从节点,切换其主节点
cluster meet ip:port -- 发现一个新节点,新增主节点
cluster forget id -- 忽略一个没有槽(solt)的节点
cluster failover -- 手动故障转移