一、Redis集群和高可用概念
Redis集群主要内容有主从复制,哨兵模式,cluster(集群)。其中,主从复制是一切的基础。
主从复制最少要三台,一主两从;
哨兵模式最少也要三台,一主两从;
cluster集群最少要6台,生产中一般是三三制,即9台。
1.1 主从复制
Redis的主从复制和mysql的主从复制工作模式类似,主可以写,写入主的数据通过RDB的方式把数据同步到从服务器,从库不能更新到主。
缺点:不能故障自动化恢复;只有主能够写。
1.2 哨兵
主要功能就是实现故障自动化恢复。
主从复制完成之后,从服务器变成只读模式。故障切换时,主故障,变成从服务器,主变成从之后,也会进入只读模式。
缺点:从节点一旦故障,读会受到影响。
1.3 集群
把每两台服务器作为主从模式,形成一个大的主从的集群。
解决了哨兵无法实现的写操作的负载均衡,是一个较为完善的高可用方案。
缺点:为了保证高可用,对数据的完整性要求不高。每个小集群之间是互相独立的。
二、主从复制
2.1 主从复制的原理和流程
主节点和从节点:数据的复制是单向的,由主复制到从。
主从复制的流程
从向主发送同步请求(sync command),主收到请求后,fork一个子进程创建RDB文件,创建完成后,同步RDB文件发送给从。
建立主从复制模式后,从就进入只读模式,只有主可以写入。
2.2 主从复制的简单实现
架构 :部署主从复制
- redis1 :主 :20.0.0.51
- redis2 :从1 :20.0.0.52
- redis3 :从2 :20.0.0.53
对主从同步操作 :
systemctl stop firewalld
setenforce 0
yum -y install ntpdate
ntpdate ntp.aliyun.com
对主配置
vim /etc/redis/6379.conf
#--70行-- 修改或直接注释,注释即默认监听所有
bind 0.0.0.0
#--137行--
daemonize yes
#--700行-- 修改
appendonly yes/etc/init.d/redis_6379 restart
从服务器配置
vim /etc/redis/6379.conf
#--70行--
bind 0.0.0.0
#--287行-- 解注释
replicaof 20.0.0.51 6379
## 格式:replicaof <主的ip> <主的端口>
#--700行--
appendonly yes/etc/init.d/redis_6379 restart
三、哨兵模式
3.1 哨兵模式的原理
哨兵和主从模式的架构基本一致,区别在于主从之间,从从之间都在互相监听,在此基础之上实现故障切换。
主切换之后变成从,会自动变成只读模式。
切换方式:主宕机后,从服务器切换成主不是按照权重、优先级等方式进行切换,而是所有从服务器通过投票,选举出主。
选举算法:Raft算法,选一个离当前时间点更新最近的从变成主。
3.2 哨兵模式简单实现
哨兵配置
主从同步操作
#进入源码包
cd /opt/redis-5.0.7
#编辑哨兵模式的配置文件
vim sentinel.conf
#--22行--
##哨兵模式的默认端口26379
#--17行-- 取消注释
protected-mode no
##关闭保护模式
#--27行--
daemonize yes
##开启后台运行
#--37行--
logfile "/var/log/sentinel.log"
## sentinel 的日志路径
#--66行--
dir "/var/lib/redis/6379"
##数据库的工作目录
#--85行--
sentinel monitor mymaster 20.0.0.51 6379 2
##初始化监听都是监听主的状态 20.0.0.51 6379
## 2 :对应是从服务器的数量以及投票的参与者,参与者要和从服务器的数量一致。
## 两台从服务器投票通过,主才能进行故障转移#--114行--
sentinel down-after-milliiseconds mymaster 30000
##判断主服务器宕机的时间间隔,30 000 ms ,单位ms
#--146行--
sentinel failover-timeout mymaster 180000
##判断故障节点的超时的最大时间 180 000 ms
cd /opt/redis-5.0.7
#先启动主的哨兵,再启动从
redis-sentinel sentinel.conf &
#查看哨兵状态
redis-cli -p 26379 info sentinel
检测哨兵功能:停止主的redis服务,
四、集群
4.1 集群的概念
集群(cluster),是redis3.0之后的分布式存储方案。
集群由多个节点组成,redis数据保存在这些节点,集群中的节点分为主和从。
主节点负责读写以及维护集群的信息;
从节点进行主节点数据的复制,也可以查数据。
4.2 Redis集群的数据分片
在集群概念中,引用的是**hash slots (哈希槽)**的概念。创建了集群,就有16384个hash slots,编号从0-16383。
以三个节点为例:主1,主2,主3
主1的槽位:0-5460
主2的槽位:5461-10922
主3的槽位:10923-16383
一个节点的主和从如果全部失败,整个集群都将不可用。
4.3 集群的简单实现
简单架构示例
主1 :redis1 :20.0.0.51
主2 :redis2 :20.0.0.52
主3 :redis3 :20.0.0.53
从1 :redis4 :20.0.0.54
从2 :redis5 :20.0.0.55
从3 :redis6 :20.0.0.56
实现:
集群所有节点同步操作
首先关闭防火墙,关闭安全机制,并进行时间同步
systemctl stop firewalld
setenforce 0
ntpdate ntp.aliyun.com
修改配置文件
vim /etc/redis/6379.conf#--89行-- 修改
protect-mode no
## 关闭保护模式
#--137行-- 修改
daemonize yes
## 允许后台启动
#--833行-- 取消注释
cluster-enabled yes
## 允许集群模式
#--841行-- 取消注释
cluster-config-file nodes-6379.conf
## 集群配置文件
#--847行-- 取消注释
cluster-node-timeout 15000
## 集群超时时间 , 15 000 ms ,15s
#--700行-- 修改
appendonly yes
##开启AOF持久化设置#重启服务
/etc/init.d/redis_6379 restart
选一台主机分配主从:命令如下
redis-cli -h 20.0.0.51 --cluster create 20.0.0.51:6379 20.0.0.52:6379 20.0.0.53:6379 20.0.0.54:6379 20.0.0.55:6379 20.0.0.56:6379 --cluster-replicas 1
解释:
- -h 20.0.0.51 :集群的主连接节点,在哪台主机上操作就用哪个地址
- –cluster create :创建集群,主从不能指定,集群会自动分配
- –cluster-replicas :每个主有几个从,1就是一主一从,所以前面的6台服务器成为一主一从的三个节点
redis-cli -h 20.0.0.51 -p 6379
#查看hash slots
cluster slots
#查看节点情况
cluster nodes
注意:
- 操作时moved不是报错,是系统提示客户端去指定位置的哈希槽进行读或者写,系统提示啥,就去那操作即可,这个节点是该节点的主
- 集群的功能只是满足了高可用和负载均衡,不能保证数据的完整性
4.4 手动配置主从关系
在集群创建之后,可以使用 Redis 命令将节点重新配置为主节点或从节点。这可以通过 cluster meet
和 cluster replicate
命令完成。
-
将某个节点设置为从节点:
使用
cluster replicate
命令将节点设置为从节点。假设将20.0.0.54:6379
节点设置为20.0.0.51:6379
节点的从节点:redis-cli -h 20.0.0.54 -p 6379 cluster replicate <master-node-id>
在这个命令中,
<master-node-id>
是主节点的 ID,可以通过cluster nodes
命令找到这个 ID。 -
将某个节点设置为主节点:
如果需要将一个从节点提升为主节点,可以先使用
cluster failover
命令进行故障转移(如果主节点发生故障),或者手动更改节点角色。