主从复制
通过持久化功能,Redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,
但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,也会导致数据丢失。
为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,
即使有一台服务器出现故障其他服务器依然可以继续提供服务。
这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,这时候就用到了Redis的主从复制。
Redis提供了复制(replication)功能来自动实现多台redis服务器的数据同步,
我们可以通过部署多台redis,并在配置文件中指定这几台redis之间的主从关系,主负责写入数据,同时把写入的数据实时同步到从机器,
这种模式叫做主从复制,即master(主服务器)/slave(从服务器),并且redis默认master用于写,slave用于读,向slave写数据会导致错误。
Redis的主从复制的配置
第一种方式: 修改配置文件
启动时,服务器读取配置文件,并自动成为指定服务器的从服务器,从而构成主从复制的关系.
# slaveof <masterip> <masterport> slaveof 127.0.0.1 6379
第二种方式: 在启动redis服务器时(cmd中)
使用 redis-server.exe redis-server --slaveof <master-ip> <master-port>, 在启动的时候,指定当前redis服务器成为某个主redis服务器的从服务器.
redis-server.exe redis.windows.conf --slaveof 127.0.0.1 6379
启动成功
登录到redis, 使用info replication可以查看主从复制的服务器的信息
//cmd中 info replication
容灾处理
当Master服务出现故障,需手动将slave中的一个提升为master, 剩下的slave挂至新的master上(冷处理:机器挂掉了,再处理)
命令(cmd):
slaveof no one,将一台slave服务器提升为Master (提升某slave为master) slaveof 主服务器ip 主服务器端口号(将slave挂至新的master上)
哨兵机制
前面我们使用主从复制,解决了单点故障问题,从而提高了redis服务器的稳定性, 但是当redis主服务器出现故障了, 我们采用的是手动来进行故障的迁移,也就是前面说的,手动把某个从服务器提升为主服务器,再把其他从服务器重新作为新主服务器的从机,但是这种手动不够智能, 需要工作人员每时每分盯着,哨兵机制自动处理服务器故障.
Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
- 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
- 提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。
sdown(主观认为宕机 Subjective Down):每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂。
odown(客观上的真正宕机 Objective Down):若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master"彻底死亡
它们会选举出一个 Sentinel 节点来完成自动故障转移的工作(通过一定的vote算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置),同时会将这个变化实时通知给 Redis 应用方。整个过程完全是自动的,不需要人工来介入,所以这套方案很有效地解决了 Redis 的高可用问题。
虽然哨兵(sentinel) 释出为一个单独的可执行文件 redis-sentinel ,但实际上它只是一个运行在特殊模式下的 Redis 服务器,你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动哨兵(sentinel)。
本机配置redis集群,模拟主从复制,哨兵机制
1、创建三个redis服务器(因为本机ip只有一个,只能通过改端口,或者通过局域网来实现案例)
2、在每一个redis中更改配置文件redis.windows.conf改为(redis6379.conf、redis6380.conf、redis6381.conf)方便区分
将6379设置为主服务器,6380、6381为从服务器
1、主服务器中的配置不做改变 2、从服务器(6380、6381)添加如下配置 # slaveof <masterip> <masterport> slaveof 127.0.0.1 6379
3、创建服务器快捷启动方式(cmd命名:方便快速启动)--start.bat
//title为窗口名 //三台redis配置文件名填对应的 title redis6379 redis-server.exe redis6379.conf
4、创建客户端快捷启动方式(cmd命名:方便快速启动)--startClient.bat
//窗口文件名 title redisCilent6379 //客户端配置文件名 -h ip -p 端口 redis-cli.exe -h 127.0.0.1 -p 6379
以上配置就完成了主从复制
哨兵机制
5、在redis6379文件夹中创建三个哨兵配置文件(任意redis服务器都可以,或者创建一/三个新的redis)
//文件名 startsentinel-10001.bat port 10001 sentinel monitor mymaster 127.0.0.1 6379 1 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 15000
sentinel monitor mymaster 127.0.0.1 6379 1 最后的1表示有几个哨兵服务器监控sdown,
如果放在一个redis服务器中设置为1,如果放在三个redis,设置为2
//文件名 startsentinel-10002.bat port 10002 sentinel monitor mymaster 127.0.0.1 6380 1 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 15000 //文件名 startsentinel-10003.bat port 10003 sentinel monitor mymaster 127.0.0.1 6381 1 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 15000
6、哨兵的快捷启动方式(.bat文件)
//文件名:startsentinel-10001.bat title sentinel1001 redis-server sentinel-10001.conf --sentinel //文件名:startsentinel-10002.bat title sentinel1002 redis-server sentinel-10002.conf --sentinel //文件名:startsentinel-10003.bat title sentinel1003 redis-server sentinel-10003.conf --sentinel
7、最后开启服务器
分别点击三个redis服务器的start文件
8、分别开启哨兵
验证哨兵自动处理容灾(关闭主服务器)
当原来的主服务器修好,重启,默认当成从服务器
此时redis中的配置文件,此时的主服务器中(原来的从服务器)的
# slaveof <masterip> <masterport> 配置文件被删除
从服务器被修改为此时主服务器的端口,原来的主服务器(现在的从服务器)被默认加上主服务器的slaveof
哨兵的配置文件说明:
1. port :当前Sentinel服务运行的端口
2.sentinel monitor mymaster 127.0.0.1 6379 2: Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
3.sentinel down-after-milliseconds mymaster 5000:指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
4.sentinel parallel-syncs mymaster 1:指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
5.sentinel failover-timeout mymaster 15000:如果在该时间(ms)内未能完成failover操作,则认为该failover失败