在"redis的主从配置"这篇文章最后,我这样写道“4.如果主挂掉了,我们知道6380,6381的会以slave的身份静默待命,如果此时我在6380上执行slaveof no one,可以把80变为主,在6381上执行slaveof 192.168.23.112 6380,那么以6381为端口的redis就“改换门庭”了,变成了6380的从,6379再启动的话也只是个独立的redis服务。有点反客为主的意思。”。本篇文章说的是redis的哨兵,哨兵的英文单词是sentinel,那么redis的哨兵机制是什么呢?说白了,就是上面说的“反客为主”的自动化,哨兵帮你做的就是在主挂掉之后,自己选择一台从变为master,唯一不同的是6379再启动后就变为新master的slave了,而不是手动设置时再启动6379是一个独立的redis服务。
先看一下三个redis服务的状态,可以看到以6379为端口的redis是master,6380和6381是slave:
127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.23.112,port=6380,state=online,offset=4187,lag=1 slave1:ip=192.168.23.112,port=6381,state=online,offset=4187,lag=1 master_repl_offset:4187 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:4186
我们来配置redis的哨兵:1.在配置文件所在目录建一个 sentinel.conf(名字不能错),里面的内容是:
#node112是master主redis所在机器的hostname,对应ip为192.168.23.112 #主master redis使用的端口是6379,1的意思是剩下的slave谁的票数大于等于1就被推举为master sentinel monitor node112 192.168.23.112 6379 1
2.启动哨兵:
./redis-sentinel sentinel.conf
如下:
哨兵的验证:
在master上执行shutdown关闭服务:
127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.23.112,port=6380,state=online,offset=27284,lag=0 slave1:ip=192.168.23.112,port=6381,state=online,offset=27284,lag=0 master_repl_offset:27284 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:27283 127.0.0.1:6379> shutdown not connected> exit [root@node112 /usr/local/redis/bin]#
2.观察哨兵的日志变化,可以看到已经切换成功:
3.在6380的redis和6381的redis客户端分别查看主从状态,可以看到6380由原来是6379的从变成了master,而6381由原来的是6379的从变成了现在是6380的从,这些都是哨兵帮你做的:
6380上的主从状态:
127.0.0.1:6380> info replication # Replication role:master connected_slaves:1 slave0:ip=192.168.23.112,port=6381,state=online,offset=56836,lag=1 master_repl_offset:56978 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:56977 127.0.0.1:6380>
6381上的主从状态:
127.0.0.1:6381> info replication # Replication role:slave master_host:192.168.23.112 master_port:6380 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:57844 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6381>
4.启动原来的master(以6379为端口的redis),并查看其状态,可以看到自动变成了新master6380的slave:
[root@node112 /usr/local/redis/bin]#./redis-server redis.conf [root@node112 /usr/local/redis/bin]#./redis-cli -p 6379 127.0.0.1:6379> info replication # Replication role:slave master_host:192.168.23.112 master_port:6380 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_repl_offset:1 master_link_down_since_seconds:1515056870 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6379>
上边我启动哨兵之后,redis的哨兵是默认前台启动的,如下:
就像默认的redis服务启动的时候一样,这样的话,我不得不再打开一个ssh客户端来进行操作,我怎么让哨兵在后台启动呢?先看一下我们的哨兵配置文件sentinel.conf的内容,只有一句话:
sentinel monitor node112 192.168.23.112 6379 1
只要再加上下面这两句就可以后台启动redis的哨兵了:
daemonize yes logfile "/var/log/sentinel_log.log"
启动哨兵,可以看到现在已经是正常的后台启动了,在/var/log/目录下也能找到sentinel_log.log日志文件,通过查看该文件内容可知现在哨兵是正常启动的: