之前我们讲了主从复制,可以有效的提高Redis 的性能,Slave 节点可以备份 Master 节点的数据,可以对请求进行分流,读写分离,减轻主节点的压力。
主从复制是否真的高可用了?
主从复制都是建立在主节点的,万一 Master 挂掉了,那么从节点就不能实时更新数据了。因此当我们主节点挂掉了,我们会怎么处理了:
- 需要把其中的一个Slave节点,升级为 Master。
- 需要把 Slave 挂载到 新的 Master 的IP 上。
- 需要把新的Master 节点 和 Slave 的节点IP ,通知给客户端。
- 客户端链接新的 更改好的对应的 主从节点。
从而得出结论主从复制也不是很靠谱,因此 Redis 推出的 Sentinel 架构。
Redis Sentinel 架构
- 主从复制的架构还是 一个 Master,2个 Slave。
- Sentinel 并不是一个,而是多个,他们每个都会去监听每个Redis 的健康状态。
- 客户端将不再和Redis直接链接,而是通过Sentinel 来获取信息了。
Redis Sentinel 故障转移流程
- 多个Sentinel 发现并确认 Master 有问题。
- 选举一个Sentinel 为领导。
- 选举一个Slave 为新的 Master。执行 slave no one。
- 通知其他的slave ,成为新的Master 的 slave。
- 通知链接的客户端主从的变化。
- 等待老的Master 复活,成为新的Master 的 Slave。
Redis Sentinel 安装
- 配置节点的Config,redis_7000.conf redis_7001.conf redis_7002.conf,这里的3个配置用的都是极简的配置
root@iZ28x8osxzxZ:/opt/redis/ect# cat redis_7000.conf
port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
logfile "/home/redisRdbLog/7000.log"
dir /home/redisRdbLog/
root@iZ28x8osxzxZ:/opt/redis/ect# cat redis_7001.conf
port 7001
daemonize yes
pidfile /var/run/redis_7001.pid
logfile "/home/redisRdbLog/7001.log"
dir /home/redisRdbLog
replicaof 127.0.0.1 7000
root@iZ28x8osxzxZ:/opt/redis/ect# cat redis_7002.conf
port 7002
daemonize yes
pidfile /var/run/redis_7002.pid
logfile "/home/redisRdbLog/7002.log"
dir /home/redisRdbLog
replicaof 127.0.0.1 7000
- Sentinel 的配置,Redis 文件目录下有个 sentinel.conf
//查看 sentinel 的配置文件,忽略注释和空格
root@iZ28x8osxzxZ:/opt/redis# cp sentinel.conf /opt/redis/ect/
root@iZ28x8osxzxZ:/opt/redis/ect# cat sentinel.conf | grep -v "#" | grep -v "^$"
port 26379 // 启动sentinel 端口号
daemonize no //是否以守护进程的方式启动
pidfile /var/run/redis-sentinel.pid //启动的PID
dir /tmp //保存的工作目录
logfile "" //日志文件
sentinel monitor mymaster 127.0.0.1 6379 2 //sentinel 监控主节点的名字mymaster,ip 127.0.0.1 端口6379,2的意思是 当有几个 sentinel 觉得这个master 有问题,就进行故障转移,
sentinel down-after-milliseconds mymaster 30000 // ping mymaster 30000 毫秒后,还ping不同,这个就确定有问题
sentinel parallel-syncs mymaster 1 //当有新的master,老的slave会对新的进行复制,1相当于每次只能复制1个
sentinel failover-timeout mymaster 180000 //故障转移的时间
sentinel deny-scripts-reconfig yes //不允许使用SENTINEL SET设置notification-script和client-reconfig-script
配置Sentinel config 文件
root@iZ28x8osxzxZ:/opt/redis/ect# cat sentinel.conf | grep -v "#" | grep -v "^$" > redis-sentinel-26379.conf
root@iZ28x8osxzxZ:/opt/redis/ect# vim redis-sentinel-26379.conf
root@iZ28x8osxzxZ:/opt/redis/ect# cat redis-sentinel-26379.conf
port 26379
daemonize yes
dir /home/redisRdbLog/
pidfile /var/run/redis-sentinel-26379.pid
logfile "redis-sentinel-26379.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
配置另外2个 redis-sentinel,使用sed 命令 sed “s/替换值/替换后的值”
root@iZ28x8osxzxZ:/opt/redis/ect# sed "s/26379/26380/g" redis-sentinel-26379.conf > redis-sentinel-26380.conf
root@iZ28x8osxzxZ:/opt/redis/ect# sed "s/26379/26381/g" redis-sentinel-26379.conf > redis-sentinel-26381.conf
依次检查 26380,26381 的文件配置
root@iZ28x8osxzxZ:/opt/redis/ect# cat redis-sentinel-26380.conf
port 26380
daemonize yes
dir /home/redisRdbLog/
pidfile /var/run/redis-sentinel-26380.pid
logfile "redis-sentinel-26380.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
root@iZ28x8osxzxZ:/opt/redis/ect# cat redis-sentinel-26381.conf
port 26381
daemonize yes
dir /home/redisRdbLog/
pidfile /var/run/redis-sentinel-26381.pid
logfile "redis-sentinel-26381.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
启动 redis-server: 端口为7000 ,7001 ,7002,执行 info replication 看出主从节点的信息
root@iZ28x8osxzxZ:/opt/redis/ect# redis-server redis_7000.conf
root@iZ28x8osxzxZ:/opt/redis/ect# redis-server redis_7001.conf
root@iZ28x8osxzxZ:/opt/redis/ect# redis-server redis_7002.conf
root@iZ28x8osxzxZ:/opt/redis/ect# redis-cli -p 7000 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=7001,state=online,offset=28,lag=1
slave1:ip=127.0.0.1,port=7002,state=online,offset=28,lag=0
master_replid:a448e9c6b7786ece06c3f49e5f0b1d35691a8be2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
启动redis-sentinel,端口为 26379,26380,26381
root@iZ28x8osxzxZ:/opt/redis/ect# redis-sentinel redis-sentinel-26379.conf
root@iZ28x8osxzxZ:/opt/redis/ect# redis-sentinel redis-sentinel-26380.conf
root@iZ28x8osxzxZ:/opt/redis/ect# redis-sentinel redis-sentinel-26381.conf
root@iZ28x8osxzxZ:/opt/redis/ect# cat redis-sentinel-26379.conf
port 26379
daemonize yes
dir "/home/redisRdbLog"
pidfile "/var/run/redis-sentinel-26379.pid"
logfile "redis-sentinel-26379.log"
sentinel myid b933b102f5d7dc472a14e60b9b72931a262c73fb
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
protected-mode no
sentinel known-replica mymaster 127.0.0.1 7001
sentinel known-replica mymaster 127.0.0.1 7002
sentinel known-sentinel mymaster 127.0.0.1 26381 76cd0f4664dc063c307070322f554433725dabff
sentinel known-sentinel mymaster 127.0.0.1 26380 bc6d19b66b8633fa7b9663be8358841cad689da8
sentinel current-epoch 0
我们依次启动了3个sentinel ,我们查看sentinel 端口为26379,发现和我们配置的不一样,还是加入了从节点的信息,这个是因为redis帮我们去掉了一些配置,执行了 info replication 获取了从节点的信息,帮我们加入了。
通过 info sentinel 信息查看是否成功
root@iZ28x8osxzxZ:/opt/redis/ect# redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:7000,slaves=2,sentinels=3
可以看到 name 为 mymaster, 主节点master : 127.0.0.1:7000,slave 有2个,sentinel 有3个,说明配置成功了。