Redis的主从(master-slave)就是为了数据冗余备份、保证数据的安全、提高性能,在这里主要讲解一下其主从切换的两种方式,有不对之处,还请各位指教。
首先搭建一个简单的master-slave,在Linux下安装编译redis,分别复制两份redis-master、redis-slave,修改redis.conf文件daemonize yes,让其在后台运行,另外修改redis-slave下的redis.conf中port 6378 (修改端口)、slaveof 127.0.0.1 6379,指定其master。
1. 启动主redis: ./redis-master/src/redis-server /redis-matser/redis.conf
启动客户端: ./redis-master/src/redis.cli -p 6379
127.0.0.1:6379> set gender male
OK
127.0.0.1:6379> get gender
"male"
127.0.0.1:6379>
2. 启动从redis:./redis-slave/src/redis-server /redis-slave/redis.conf
启动客户端: ./redis-slave/src/redis-cli -p 6378
127.0.0.1:6378> get gender
"male"
127.0.0.1:6378> set gender
(error) ERR wrong number of arguments for 'set' command //默认情况下,slave只允许读
到现在表示主从redis搭建完成
一、手动方式
我们现在将主redis杀掉: ps -ef|grep redis
hollysp 6860 1 0 10:31 ? 00:00:02 ./redis-server *:6379
hollysp 6983 6331 0 10:33 pts/1 00:00:00 ./redis-cli -p 6378
hollysp 8329 1 1 10:57 ? 00:00:00 ./src/redis-server *:6378
hollysp 8334 1921 0 10:57 pts/0 00:00:00 grep redis
然后:kill -9 6860
此时:./redis-cli -p 6379
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> 表明主master已经结束
而127.0.0.1:6378> set age 20
(error) READONLY You can't write against a read only slave. 仍然只允许读取数据
使用命令:127.0.0.1:6378> slaveof NO ONE
OK slave变为master
127.0.0.1:6378> set age 20
OK 已经可以插入数据了
此时切换已经完成,但是我们还需要启动之前的主redis,但是这个时候我们已经进行过插入、删除等操作,以前的主redis并没有记录这些,那么就需要将之前从redis的dump.rdb替换之前redis 的dump.rdb文件。
首先进入redis-master 启动 ./src/redis-server redis.conf
然后127.0.0.1:6378> slaveof 127.0.0.1 6379
OK
表示又回到之前的状态
二: sentinel自动方式
sentinel就是监听master,通过监听其状态,来完成主从之间的切换, 我们直接使用sentinel的默认配置,使用./src/redis-sentinel sentinel.conf --sentinel启动sentinel, 可以看到日志信息
[9866] 04 Feb 11:23:35.753 * +slave slave 127.0.0.1:6378 127.0.0.1 6378 @ mymaster 127.0.0.1 6379
现在我们kill掉主redis,观察sentinel日志信息:
[10697] 04 Feb 11:38:15.400 # +failover-end master mymaster 127.0.0.1 6379
[10697] 04 Feb 11:38:15.400 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6378
[10697] 04 Feb 11:38:15.401 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6378
[10697] 04 Feb 11:38:45.452 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6378
从redis已经自动切换成为主redis了,之前的主切换到从,此时
127.0.0.1:6378> get age
"20"
127.0.0.1:6378> set hobby sleeping
OK
启动之前的主redis,使用127.0.0.1:6379> set m m
(error) READONLY You can't write against a read only slave.
到此全部完成。
一、Sentinel作用:
1):Master状态检测
2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave
3):Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
二、Sentinel工作方式:
1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令
6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。