Redis高可用性
- 如果所有用户都从同一台Redis服务器上读写数据,那么如果这台Redis服务器宕机了,用户就不能进行读写了
- 如果我们有多台Redis服务器,并且每台服务器中存储的内容都相同,那么即使有一台服务器宕机了,用户还可以继续使用其它的Redis服务器
- 以上这种特点,我们就称之为
高可用性
Redis数据安全性
- 如果所有数据都保存在同一台Redis服务器上,那么如果这台Redis服务器坏了,那么很有可能会导致数据丢失
- 如果我们有多台Redis服务器,并且每台服务器中存储的内容都相同,那么即使有一台服务器坏了,也不会导致数据丢失,因为我们还有其它保存了相同内容的Redis服务器
- 以上这种特点,我们就称之为
数据的安全性
Redis数据分流
- 如果所有用户都从同一台Redis服务器上读写数据,那么由于服务器的性能限制和网络传输速度的限制,如果同一时刻用户量较多时,服务器负荷增大,数据处理速度变慢的问题
- 如果我们有多台Redis服务器,如果我们把请求分流到不同的服务器,那么就可以降低了服务器压力,加快数据处理速度,并且如果我们将多台服务器安装到不同的区域,还可以采用就近原则访问,还可以进一步提升用户的访问速度
- 以上这种特点,我们就称之为
数据分流
Redis主从复制
- 主从复制就是使用多台保存了相同内容的Redis服务器来组成一个数据库集群
- 这个数据库集群中的每一台Redis服务我们称之为一个
节点
????Redis主从复制特点
- 主从复制中必须有一个
主节点
- 主节点主要负责写入数据和读取
- 主从复制中除了主节点以外的节点我们称之为
从节点
- 副节点默认情况下只能读取数据,不能写入数据
- 副节点主要负责从主节点不断复制数据
和MongoDB不同的是,Redis中的主从复制,主节点挂掉后不会自动选举,如果需要自动选举需要借助Redis Sentinel
来实现
搭建Redis主从复制
我这里是以Windows10系统演示如果安装在服务器都差不多,就是需要修改bind的配置
- 下载Redis.Zip安装包,拷贝多份Redis安装包
- 修改主节点配置
bind 127.0.0.1 #绑定ip地址
port 6380 #绑定端口号
- 修改从节点1配置
port 6381 #绑定端口号
slaveof 127.0.0.1 6380 #主节点地址和端口
- 修改从节点2配置
port 6382 #绑定端口号
slaveof 127.0.0.1 6380 #主节点地址和端口
5 注册Redis服务启动Redis服务
命令行进入安装包路径下,执行如下指令
- redis-server.exe --service-install redis.windows-service.conf --service-name Redis6380
- redis-server.exe --service-install redis.windows-service.conf --service-name Redis6381
- redis-server.exe --service-install redis.windows-service.conf --service-name Redis6382
进入任务管理器服务列表找到Redis服务分别启动刚刚注册的Redis服务
- 查看主从状态
redis-cli -h 127.0.0.1 -p 6380
info replication
????测试主从复制
- 往主Redis设置一个String类型的数据你这时去从Redis获取一下如果存在的话就说明成功了,我这里就不在贴图了
Redis主从复制原理
????初始化同步
- 只要在任意一台Redis服务器上配置了或者执行了slaveof指令,那么就可以建立主从关系
- 主要建立关系,那么从节点就会自动给主节点发送全量复制请求
- 主节点收到从节点全量复制请求,会自动调用
bgsave
,生成RDB文件 - 主节点在生成RDB文件的过程中,如果接收到了其他指令,那么会先放在缓存区中
- 主节点生成好RDB文件之后,就会将RDB文件发送给从节点
- 主节点发送玩RDB文件之后,还会将缓存区中的指令也发送给从节点
- 从节点接受到RDB文件和缓存区指令之后,会先格式化自己,也就是清空自身原有的数据
- 加载RDB文件恢复数据,加载完RDB文件恢复完数据之后再执行缓存区中的指令
????后续同步
- 主节点每执行一个写命令就会向从节点发送相同的写命令
- 从节点接收到主节点发送过来的命令, 就执行对应的命令,以实现和主节点同步
主从复制存在的问题
- 主从复制有效的解决了Redis
数据安全性
和数据分流的问题
,但是Redis主从复制并没有解决高可用性
的问题 - 在标准的主从复制中只有主节点可以读写数据,从节点只能读取数据,所以一旦主节点宕机了,那么用户就不能继续写入数据了
- 也就是说在Redis的主从复制中,主节点宕机了,系统是不会自动重新选举一个主节点出来的
Redis-Sentinel
- Redis-Sentinel是一个用来监控主从结构中每个节点的状态
- 我们可以给Redis-Sentinel添加多个Sentinel节点,让这些节点来监控主从结构的状态
- 一旦发现主节点挂掉了,再让这些Sentinel节点帮我们重新从从节点中选举出一个主节点
????Redis-Sentinel是如何做到高可用的
- Redis-Sentinel有三个定时任务
- 一个用于获取主从关系,发现新节点
- 一个用于交换信息,投票选出新主服务器
- 一个用于监听节点是否可用
- 每10秒每个sentinel节点对master节点和slave节点执行info操作
- 确定主从关系
- 发现子节点
- 每2秒每个sentinel节点通过master节点的channel(sentinel:hello)交换信息
- 目的就是为故障判断,信息交互提供通道
- 每1秒每个sentintel节点对master节点和slave节点以及其余的sentinel节点执行ping操作
- 心跳检测节点是否发生故障
Redis-Sentinel选举规则
- 第一个发现主节点挂掉的Sentinel会发起选举,这个Sentinel我们称之为
候选Sentinel
- 候选Sentinel会给其它Sentinel节点发送消息,其它Sentinel默认都会投出同意票
- 只有其它Sentinel已经投过票才会投出反对票
- 当同意的票数过半时,候选Sentinel就变成了
领导者
- 领导Sentinel节点会依次给所有子节点发送slaveof no one指令,让所有子节点脱离原来的主节点
- 所有子节点脱离关系后
- 领导Sentinel会优先选择优先级高的节点作为主节点(slave-priority配置)
- 如果没有节点设置优先级,那么会自动选择数据最完整的节点作为主节点
- 如果节点保存的数据都一样,那么会自动选择进程ID最小的节点作为主节点
- 重新设置完主节点后,再让剩余节点与这个节点建立关系
主观下线和客观下线
- 主观下线:一个Sentinel节点认为主节点下线
- 客观下线:多个Sentinel节点认为主节点下线
Redis-Sentinel搭建
- 首先搭建一个主从结构,搭建方式参考上方即可
- 然后搭建一个奇数个Sentinel节点的Sentinel
- 修改Sentinel配置文件(sentinel.conf)这个是需要自己创建配置的
port 26380 # 当前Sentinel服务运行的端口
sentinel monitor mymaster 127.0.0.1 6380 2 # 主服务器名称 主服务器地址 主服务器端口,客观下线票数
sentinel down-after-milliseconds mymaster 10000 # 主观下线时间
sentinel parallel-syncs mymaster 1 # 故障转移之后,从节点是串行还是并行同步数据
sentinel failover-timeout mymaster 20000 # 故障转移超时时间
daemonize yes #以守护进程方式运行
上面一份配置是为了更好了理解该配置,以下配置可以用以实际当中,坑少,每个Sentinel都差不多修改一下端口号即可,最好不要用有注释的。
port 26380
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 20000
daemonize yes
- 注册sentinel服务,需要进去到Redis的安装目录中执行
redis-server.exe --service-install sentinel.conf --sentinel --service-name Sentinel26380
redis-server.exe --service-install sentinel.conf --sentinel --service-name Sentinel26381
redis-server.exe --service-install sentinel.conf --sentinel --service-name Sentinel26382
删除服务,管理员身份运行
sc delete 服务名称
- 测试Redis-Sentinel
把主节点服务停止
可以发现,6380Redis服务器已经访问不了,Redis-Sentinel已经为我们选举出了新的主节点,并且建立了主从关系,搭建完毕