redis的主从切换的两种方式

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 的主观下线状态就会被移除。



你可能感兴趣的:(redis)