redis的高可用
在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和集群,下面分别说明它们的作用,以及解决了什么样的问题。
- 持久化: 持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
- 主从复制: 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份(和同步),以及对于读操作的负载均衡和简单的故障恢复。
- 缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
- 哨兵: 在主从复制的基础上,哨兵实现了自动化的故障恢复。(主挂了,找一个从成为新的主,哨兵节点进行监控)
- 缺陷:写操作无法负载均衡;存储能力受到单机的限制。
- 集群: 通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。(6台起步,成双成对,3主3从)
redis的主从复制
主从复制是redis实现高可用的基础,哨兵模式和集群都是在主从复制的基础之上实现高可用。
主从复制实现数据的多机备份,以及读写分离(主服务器负责写,从服务器只能读)。
缺陷:故障无法自动恢复,需要人工干预,写操作的负载均衡。
主从复制的工作原理:
1.主节点(master) 从节点(slave组成)组成,数据复制是单向的,只能从主节点到从节点。
2.工作机制
redis 一主二从的工作原理
主从 | ip |
master | 20.0.0.170 |
slave1 | 20.0.0.180 |
slave2 | 20.0.0.190 |
实验具体部署
修改master节点的配置文件
systemctl stop firewalld
setenforce 0
修vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,修改监听地址为0.0.0.0(生产环境中,尤其是多网卡最好填写物理网卡的IP)
daemonize yes #137行,开启守护进程,后台启动
logfile /var/log/redis_6379.log #172行,指定日志文件存放目录
dir /var/lib/redis/6379 #264行,指定工作目录
appendonly yes #700行,开启AOF持久化功能
/etc/init.d/redis_6379 restart #重启redis服务
line70 ---所有网段都能通信
line137----开启进程守护
line264----指定工作目录
line700-----开启aof持久化
修改slave节点配置文件
#修改slave1的配置文件
vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,修改监听地址为0.0.0.0(生产环境中需要填写物理网卡的IP)
daemonize yes #137行,开启守护进程,后台启动
logfile /var/log/redis_6379.log #172行,指定日志文件目录
dir /var/lib/redis/6379 #264行,指定工作目录
replicaof 192.168.73.105 6379 #288行,指定要同步的Master节点的IP和端口
appendonly yes #700行,修改为yes,开启AOF持久化功能
#将配置文件传给slave2
scp /etc/redis/6379.conf 20.0.0.190:/etc/redis/
/etc/init.d/redis_6379 restart #重启redis
netstat -natp | grep redis #查看主从服务器是否已建立连接
line288---指定同步的master的IP和端口
line700
分别重启服务后进日志查看
查看策略
redis-cli info replication
读写测试
主服务器创建并查看
从服务器可以查,但是从服务器有只读限制,所以无法写入
哨兵模式
主从切换技术的方法是:当服务器宕机后,需要手动一台从机切换为主机,这需要人工干预,不仅费时费力而且还会造成一段时间内服务不可用。为了解决主从复制的缺点,就有了哨兵机制。
主从复制即基础之上,实现主节点故障的自动切换
哨兵的核心功能:在主从复制的基础上,哨兵引入了主节点的自动故障转移。
哨兵模式原理
哨兵:分布式系统,部署在每一个redis节点,用于在主从结构之间,对每台redis的服务进行监控。
主节点出现故障时,从节点通过投票的方式选择一个新的master。
哨兵模式需要至少三个节点
实验部署
主从 | IP | 哨兵点 |
master | 20.0.0.170 | Sentinel 1 |
slave1 | 20.0.0.180 | Sentinel 2 |
slave2 | 20.0.0.190 | Sentinel 3 |
修改哨兵节点的配置文件
vim /opt/redis-5.0.7/sentinel.conf
......
protected-mode no #17行,取消注释,关闭保护模式
port 26379 #21行,Redis哨兵默认的监听端口
daemonize yes #26行,指定sentinel为后台启动
logfile "/var/log/sentinel.log" #36行,指定日志文件存放路径
dir "/var/lib/redis/6379" #65行,指定数据库存放路径
sentinel monitor mymaster 192.168.73.105 6379 2 #84行,修改
#指定该哨兵节点监控192.168.73.105:6379这个主节点,该主节点的名称是mymaster。
#最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 3000 #113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000 #146行,同一个sentinel对同一个master两次failover之间的间隔时间(180秒)
#传给两外2个哨兵节点
scp /opt/redis-5.0.7/sentinel.conf 20.0.0.180:/opt/redis-5.0.7/
scp /opt/redis-5.0.7/sentinel.conf 20.0.0.190:/opt/redis-5.0.7/
line17
line 21
哨兵模式的默认端口--26379
line 26
哨兵模式是否后台运行------>yes
line 36
日志位置
line 65
工作目录,和redis放一起
line 84
指定初始的主服务器, ip指向初始的主服务器
**2:哨兵模式中至少需要两台服务器,认为主已经下线才会进行主从切换
先启动主,再启动从节点
redis-sentinel sentinel.conf &
//在redis源码包下面启动
redis-cli -p 26379 info sentinel
查看哨兵模式
tail -f /var/log/sentinel.log
故障模拟
ps -elf | grep redis
kill -9 15347
杀死进程和关闭服务都可以(关闭服务要等一分钟左右),然后两个从开启日志等待查看
由此看出,20.0.0.190变成了新主
下面进行读写测试
由此看来
旧主变成从后,会在配置文件自动加入这行配置文件,让旧主无法写入
旧主的配置文件也被自动修改
实验结束