单台Redis系统很难满足高并发的需求,另外为了避免单机故障,redis引入了主从复制模式
- 在主从复制模式的集群里,主节点(master server)一般是一个,从节点(slave server)一般是多个,写入主节点的数据会被复制到从节点上面,这样一旦主节点出现故障,系统就能切换到从节点去读数据,提升系统的可用性
- 主从复制模式默认采用读写分离机制,主节点只允许写入,从节点只允许读数据,大大提高了系统读写性能
- 在主从模式的集群中,主服务器宕机时,需要人工手动切换到从节点服务器上,同时重新设置集群的主从关系,因此 redis 引入了哨兵机制
哨兵机制:
- 哨兵进程监控主从服务器是否可用
- 当主服务器出现故障时,哨兵机制可以实现故障自动恢复
- 为了防止单个哨兵故障,一般在集群中引入多个哨兵
- 哨兵本身也是一个 redis 服务器,只是以哨兵模式启动
本文利用docker镜像配置一主两从三哨兵的redis集群:
1. 通过docker镜像模拟集群
执行命令 -> 创建一个主节点和两个从节点
# 搭建主节点 name:redis-master port: 6379
docker run -itd --name redis-master -p 6379:6379 redis
# 搭建从节点1 name:redis-salve-1 port: 6380
docker run -itd --name redis-slave-1 -p 6380:6380 redis
# 搭建从节点2 name:redis-salve-2 port: 6381
docker run -itd --name redis-slave-2 -p 6381:6381 redis
查看容器内部主节点ip
docker inspect redis-master | grep IPAddress# "IPAddress": "172.17.0.2"
查看容器内部两个从节点ip
docker inspect redis-slave-1 | grep IPAddress
# "IPAddress": "172.17.0.3"docker inspect redis-slave-2 | grep IPAddress
# "IPAddress": "172.17.0.4"
2. 主从复制模式
在从节点的 redis 命令行使用 slaveof 命令
slaveof 172.17.0.2 6379# 指定当前redis-slave为172.17.0.2 6379的从节点
进入主节点查看信息
# 进入主节点redis
docker exec -it redis-master redis-cli
# 查看信息
info replication
此时可以看到主节点上面已经绑定了两个从节点,主从节点绑定之后,从节点不断地更新自己从而追求和主节点服务器数据保持一致---主从复制模式
从节点的slave_read_only:1,默认从节点是只读的,主节点是只写的,然后主节点将写操作同步到从节点
3. 配置三个哨兵节点服务器
哨兵节点本身也是一个 redis 服务器,只是配置文件和启动方式有所不同
启动方式
# 方式一
redis-sentinel /opt/sentinel.conf
# 方式二
redis-server /opt/sentinel.conf --sentinel
哨兵配置文件 vi /etc/redis/sentinel-1.conf
# 指定哨兵工作端口
port 26379
# matser: 给监控服务器起名master 监控服务器的ip和端口
# 2表示至少有两台哨兵节点认可才能确认该主节点服务器失效
sentinel monitor redis-master 172.17.0.2 6379 2
# 指定哨兵节点的日志路径
logfile /var/sentinel.log# master节点宕机后,等待多少时间(毫秒),认定master不可用
# 默认30s,这里为了测试,改成10s
sentinel down-after-milliseconds redis-master 10000
# 当替换主节点后,剩余从节点重新和新master做同步的并行数量,默认为 1
sentinel parallel-syncs redis-master 1
# 主备切换的时间,若在3分钟内没有切换成功,换另一个从节点切换
sentinel failover-timeout redis-master 180000
以 redis-sentinel 方式读取 sentinel-1.conf 配置文件启动哨兵容器
docker run -itd --name sentinel-1 -p 26379:26379 -v /etc/redis:/sentinel redis redis-sentinel /sentinel/sentinel-1.conf
进入哨兵容器查看哨兵状态
docker exec -it sentinel-1 redis-cli -p 26379
127.0.0.1:26379> # 哨兵工作端口 = 26379
查看哨兵状态
info sentinel
可以看到该哨兵监听的主节点服务器 status=ok,address 代表的是主节点的 ip 和端口,slaves=2 代表有两个从节点,sentinel=1 代表当前只有一个哨兵节点
利用同样的步骤创建哨兵2和哨兵3,哨兵2的 port=26380,哨兵3的 port=26381
# 启动哨兵2 配置文件/ect/redis/sentinel-2.conf 端口=26380
docker run -itd --name sentinel-2 -p 26380:26380 -v /etc/redis:/sentinel redis redis-sentinel /sentinel/sentinel-2.conf
# 启动哨兵3 配置文件/ect/redis/sentinel-3.conf 端口=26381
docker run -itd --name sentinel-3 -p 26381:26381 -v /etc/redis:/sentinel redis redis-sentinel /sentinel/sentinel-3.conf
4. 模拟故障恢复主从切换-failover
重启主服务器节点 redis-master
# 停止主节点服务器运行
docker stop redis-master # 10s 后再启动主节点服务器
docker start redis-master
此时可以看到 redis-master 主节点已经变成 slave 从节点了,而 master_host 已经变成之前设置的第二个从节点,这个主从切换过程由哨兵节点自动帮我们完成
缺点分析:哨兵模式基于主从复制模型,同时也继承了主从复制模式的缺点,受限于单机配置,难以在线扩容