主从复制
为了保证Redis服务的高可用,可部署多台Redis服务器,其中只有一个主节点,多个从节点,只有主节点可以执行写入操作。从节点从主节点进行同步,这种方式就叫做主从复制。
info replication – 查看当前服务器的状态主从复制信息
实现方式
- 在从节点的配置文件中添加配置:slaveof 0.0.0.0 8888 – 添加主节点的IP与端口号
- 在从节点中执行命令:slaveof 0.0.0.0 8888 – 添加主节点的IP与端口号
- 在启动从节点时执行命令:./redis-server --slaveof 0.0.0.0 8888
取消主从复制
执行命令:slaveof no one
主从复制原理
从节点在启动时会将主节点的信息保存起来,并每隔1秒监听是否有主节点可以连接。主节点会将RDB文件通过网络连接发送给从节点,在同步文件之间所运行的命令,主节点会缓存起来,后续也会发送给从节点。主、从节点间会保存一个偏移量,如果有一个从节点因为网络故障断开连接,等该节点重新启动后,会根据偏移量定位到上一次同步时断开的位置,进行增量同步。
缺点
- 主节点数据量较大时,同步比较慢
- 主节点出现问题时,需要手工切换主从
Sentinel哨兵
Sentinel哨兵是支持Redis高可用的一个服务,在Redis服务器发生故障时,自动切换主从节点,它有如下功能:
1.监控:定时检查主从服务是否正常运行
2.通知:如果出现问题会发出通知
3.自动故障切换:主节点发生故障则通过选举算法选择正常的从节点作为主节点
配置Sentinel
在Sentinel.conf配置文件中配置如下内容:
daemonize yes -- 后台启动
port 26379 -- 端口
protected-mode no -- 外网访问
dir "/usr/local/soft/redis-5.0.5/sentinel-tmp" -- 工作目录
sentinel monitor redis-master 192.168.0.0 6379 2 -- 主节点的地址
sentinel down-after-milliseconds redis-master 30000 -- 主观下线时间阈值
sentinel failover-timeout redis-master 180000 -- 同一个master两次故障切换的时间间隔
sentinel parallel-syncs redis-master 1
启动sentinel服务
./redis-sentinel …/sentinel.conf
sentinel原理
主观下线与客观下线
主观下线:sentinel每秒会发送ping命令,如果一段时间内没有收到redis节点的回复,则会被标记为主观下线
客观下线:询问其他哨兵,查看该节点是否有下线
如果确定redis节点已经下线,Sentinel就会通过选举(Raft算法)选出一个Leader来进行故障切换操作。
从节点被选举为主节点的条件:
- 断开连接的时长
- 优先级(可配置,replica-priority)
- 通过主从节点的偏移量offset,谁同步的数据越多则机会越大
- 进程ID最小
sentinel缺点
1.主从节点故障切换时,还是会存在数据同步丢失
2.只有一个master服务做写操作,数据量较大时性能低
Redis数据分片
当数据量较大时,可以将数据分别分给不同的Redis服务器,避免因为一个服务器压力太大从而影响性能。
数据分片的方式
1. 客户端分片
Jedis案例:
2. 代理分片
- Twemproxy
- Codis
3. 服务端分片Cluster
Redis Cluster 可以实现在多个节点之间自动分片数据,并且在集群分片后可以提供高可用的功能。