目录mysql
主机名称 | IP地址 | redis版本和角色说明 |
---|---|---|
redis-master | 192.168.56.11 | redis 5.0.3(主) |
redis-slave01 | 192.168.56.12 | redis 5.0.3(从) |
redis-slave02 | 192.168.56.13 | redis 5.0.3(从) |
[root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf bind 192.168.56.11 protected-mode yes port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis.log" dir /var/redis/ [root@redis-slave01 ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf bind 192.168.56.12 protected-mode yes port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis.log" dir /var/redis/ replicaof 192.168.56.11 6379 #配置为master的从,若是master上有密码配置,还须要增长下面一项密码配置 masterauth 123456 #配置主的密码 [root@redis-slave02 ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf bind 192.168.56.13 protected-mode yes port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis.log" dir /var/redis/ replicaof 192.168.56.11 6379 #配置为master的从 masterauth 123456 #配置主的密码
这里须要注意的是:redis主从和mysql主从不同,redis主从不用事先同步数据,它会自动同步过去redis
[root@redis-master ~]# systemctl start redis [root@redis-slave01 ~]# systemctl start redis [root@redis-slave02 ~]# systemctl start redis [root@redis-master ~]# netstat -tulnp |grep redis tcp 0 0 192.168.56.11:6379 0.0.0.0:* LISTEN 1295/redis-server 1 [root@redis-slave01 ~]# netstat -tulnp |grep redis tcp 0 0 192.168.56.12:6379 0.0.0.0:* LISTEN 1625/redis-server 1 [root@redis-slave02 ~]# netstat -tulnp |grep redis tcp 0 0 192.168.56.13:6379 0.0.0.0:* LISTEN 1628/redis-server 1
[root@redis-master ~]# redis-cli -h 192.168.56.11 #主上写入数据 192.168.56.11:6379> KEYS * (empty list or set) 192.168.56.11:6379> set k1 123 OK 192.168.56.11:6379> set k2 456 OK [root@redis-slave01 ~]# redis-cli -h 192.168.56.12 #slave01上查看是否数据同步 192.168.56.12:6379> KEYS * 1) "k2" 2) "k1" 192.168.56.12:6379> get k1 "123" 192.168.56.12:6379> get k2 "456" [root@redis-slave02 ~]# redis-cli -h 192.168.56.13 #slave02上查看是否数据同步 192.168.56.13:6379> KEYS * 1) "k2" 2) "k1" 192.168.56.13:6379> get k1 "123" 192.168.56.13:6379> get k2 "456"
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它能够实现对Redis的监控、通知、自动故障转移。sql
Sentinel的主要功能包括主节点存活检测、主从运行状况检测、自动故障转移(failover)、主从切换。Redis的Sentinel最小配置是一主一从。 Redis的Sentinel系统能够用来管理多个Redis服务器,该系统能够执行如下四个任务:缓存
监控bash
Sentinel会不断的检查主服务器和从服务器是否正常运行。服务器
通知架构
当被监控的某个Redis服务器出现问题,Sentinel经过API脚本向管理员或者其余的应用程序发送通知。tcp
自动故障转移工具
当主节点不能正常工做时,Sentinel会开始一次自动的故障转移操做,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点, 而且将其余的从节点指向新的主节点。测试
配置提供者
在Redis Sentinel模式下,客户端应用在初始化时链接的是Sentinel节点集合,从中获取主节点的信息。
Sentinel是Redis的高可用性解决方案:
由一个或多个Sentinel实例组成的Sentinel系统能够监视任意多个主服务器,以及全部从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,而后由新的主服务器代替已下线的主服务器继续处理命令请求 。以下图:
Sentinel负责监控集群中的全部主、从Redis,当发现主故障时,Sentinel会在全部的从中选一个成为新的主。而且会把其他的从变为新主的从。同时那台有问题的旧主也会变为新主的从,也就是说当旧的主即便恢复时,并不会恢复原来的主身份,而是做为新主的一个从。
在Redis高可用架构中,Sentinel每每不是只有一个,而是有3个或者以上。目的是为了让其更加可靠,毕竟主和从切换角色这个过程仍是蛮复杂的。
主观失效
SDOWN(subjectively down),直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.
客观失效
ODOWN(objectively down),直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN能够简单理解为master已经被集群肯定为”不可用”,将会开启failover
主机名称 | IP地址 | redis版本和角色说明 |
---|---|---|
redis-master | 192.168.56.11:6379 | redis 5.0.3(主) |
redis-slave01 | 192.168.56.12:6379 | redis 5.0.3(从) |
redis-slave02 | 192.168.56.13:6379 | redis 5.0.3(从) |
redis-master | 192.168.56.11:26379 | Sentinel01 |
redis-slave01 | 192.168.56.12:26379 | Sentinel02 |
redis-slave02 | 192.168.56.13:26379 | Sentinel03 |
Sentinel.conf配置文件主要参数解析:
# 端口 port 26379 # 是否后台启动 daemonize yes # pid文件路径 pidfile /var/run/redis-sentinel.pid # 日志文件路径 logfile "/var/log/sentinel.log" # 定义工做目录 dir /tmp # 定义Redis主的别名, IP, 端口,这里的2指的是须要至少2个Sentinel认为主Redis挂了才最终会采起下一步行为 sentinel monitor mymaster 127.0.0.1 6379 2 # 若是mymaster 30秒内没有响应,则认为其主观失效 sentinel down-after-milliseconds mymaster 30000 # 若是master从新选出来后,其它slave节点能同时并行重新master同步数据的台数有多少个,显然该值越大,全部slave节点完成同步切换的总体速度越快,但若是此时正好有人在访问这些slave,可能形成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,可是全部slave所有完成缓存更新同步的进程将变慢。 sentinel parallel-syncs mymaster 1 # 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操做,单位毫秒 sentinel failover-timeout mymaster 180000 # 不容许使用SENTINEL SET设置notification-script和client-reconfig-script。 sentinel deny-scripts-reconfig yes
修改三台Sentinel的配置文件,以下
[root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf port 26379 daemonize yes pidfile "/var/run/redis-sentinel.pid" logfile "/var/log/sentinel.log" dir "/tmp" sentinel monitor mymaster 192.168.56.11 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes [root@redis-slave01 ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf port 26379 daemonize yes pidfile "/var/run/redis-sentinel.pid" logfile "/var/log/sentinel.log" dir "/tmp" sentinel monitor mymaster 192.168.56.11 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes [root@redis-slave02 ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf port 26379 daemonize yes pidfile "/var/run/redis-sentinel.pid" logfile "/var/log/sentinel.log" dir "/tmp" sentinel monitor mymaster 192.168.56.11 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes
启动的顺序:主Redis --> 从Redis --> Sentinel1/2/3
[root@redis-master ~]# redis-sentinel /usr/local/redis/sentinel.conf [root@redis-master ~]# ps -ef |grep redis root 1295 1 0 14:03 ? 00:00:06 /usr/local/redis/src/redis-server 192.168.56.11:6379 root 1407 1 1 14:40 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 1412 1200 0 14:40 pts/1 00:00:00 grep --color=auto redis [root@redis-slave01 ~]# redis-sentinel /usr/local/redis/sentinel.conf [root@redis-slave01 ~]# ps -ef |grep redis root 1625 1 0 14:04 ? 00:00:06 /usr/local/redis/src/redis-server 192.168.56.12:6379 root 1715 1 1 14:41 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 1720 1574 0 14:41 pts/0 00:00:00 grep --color=auto redis [root@redis-slave02 ~]# redis-sentinel /usr/local/redis/sentinel.conf [root@redis-slave02 ~]# ps -ef |grep redis root 1628 1 0 14:07 ? 00:00:06 /usr/local/redis/src/redis-server 192.168.56.13:6379 root 1709 1 0 14:42 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 1714 1575 0 14:42 pts/0 00:00:00 grep --color=auto redis
[root@redis-master ~]# redis-cli -p 26379 #哨兵模式查看 127.0.0.1:26379> sentinel master mymaster #输出被监控的主节点的状态信息 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.56.11" 5) "port" 6) "6379" 7) "runid" 8) "bae06cc3bc6dcbff7c2de1510df7faf1a6eb6941" 9) "flags" 10) "master" ...... 127.0.0.1:26379> sentinel slaves mymaster #查看mymaster的从信息,能够看到有2个从节点 1) 1) "name" 2) "192.168.56.12:6379" 3) "ip" 4) "192.168.56.12" 5) "port" 6) "6379" 7) "runid" 8) "c86027e7bdd217cb584b1bd7a6fea4ba79cf6364" 9) "flags" 10) "slave" ...... 2) 1) "name" 2) "192.168.56.13:6379" 3) "ip" 4) "192.168.56.13" 5) "port" 6) "6379" 7) "runid" 8) "61597fdb615ecf8bd7fc18e143112401ed6156ec" 9) "flags" 10) "slave" ...... 127.0.0.1:26379> sentinel sentinels mymaster #查看其它sentinel信息 1) 1) "name" 2) "ba12e2a4023d2e9bcad282395ba6b14030920070" 3) "ip" 4) "192.168.56.12" 5) "port" 6) "26379" 7) "runid" 8) "ba12e2a4023d2e9bcad282395ba6b14030920070" 9) "flags" 10) "sentinel" ...... 2) 1) "name" 2) "14fca3f851e9e1bd3a4a0dc8a9e34bb237648455" 3) "ip" 4) "192.168.56.13" 5) "port" 6) "26379" 7) "runid" 8) "14fca3f851e9e1bd3a4a0dc8a9e34bb237648455" 9) "flags" 10) "sentinel"
模拟中止master上的Redis,查看Redis的主从变化,以下:
[root@redis-master ~]# systemctl stop redis #中止master上的redis [root@redis-slave01 ~]# tail -n 20 /var/log/sentinel.log #查看哨兵日志 ...... 1747:X 19 Apr 2019 14:59:01.747 # +monitor master mymaster 192.168.56.11 6379 quorum 2 1747:X 19 Apr 2019 14:59:44.829 # +sdown sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379 1747:X 19 Apr 2019 14:59:46.950 # -sdown sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379 1747:X 19 Apr 2019 15:00:44.391 # +sdown master mymaster 192.168.56.11 6379 1747:X 19 Apr 2019 15:00:44.525 # +new-epoch 1 1747:X 19 Apr 2019 15:00:44.527 # +vote-for-leader 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 1 1747:X 19 Apr 2019 15:00:45.023 # +config-update-from sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379 1747:X 19 Apr 2019 15:00:45.023 # +switch-master mymaster 192.168.56.11 6379 192.168.56.13 6379 1747:X 19 Apr 2019 15:00:45.024 * +slave slave 192.168.56.12:6379 192.168.56.12 6379 @ mymaster 192.168.56.13 6379 1747:X 19 Apr 2019 15:00:45.024 * +slave slave 192.168.56.11:6379 192.168.56.11 6379 @ mymaster 192.168.56.13 6379 1747:X 19 Apr 2019 15:01:15.050 # +sdown slave 192.168.56.11:6379 192.168.56.11 6379 @ mymaster 192.168.56.13 6379 #从上面的日志能够看到master已经sdown,并切换为192.168.56.13为master节点,下面查看slave01上的配置,会自动的更改replicaof配置项,以下: [root@redis-slave01 ~]# grep "replicaof" /usr/local/redis/redis.conf |grep -vE "#" replicaof 192.168.56.13 6379 [root@redis-master ~]# redis-cli -p 26379 #哨兵模式下查看主从信息,也是能够看到主从的变化 127.0.0.1:26379> sentinel master mymaster 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.56.13" 5) "port" 6) "6379" 7) "runid" 8) "61597fdb615ecf8bd7fc18e143112401ed6156ec" 9) "flags" 10) "master" ...... 127.0.0.1:26379> sentinel slaves mymaster 1) 1) "name" 2) "192.168.56.12:6379" 3) "ip" 4) "192.168.56.12" 5) "port" 6) "6379" 7) "runid" 8) "c86027e7bdd217cb584b1bd7a6fea4ba79cf6364" 9) "flags" 10) "slave" ...... 2) 1) "name" 2) "192.168.56.11:6379" 3) "ip" 4) "192.168.56.11" 5) "port" 6) "6379" 7) "runid" 8) "" 9) "flags" 10) "s_down,slave,disconnected" #提示该节点为从,而且状态为s_down,没法连接的状态 ......