redis的主从复制和sentinel

概念

redis的主从复制逻辑和我之前写的mysql的主从复制逻辑很像,所不同的是redis是没有二进制日志的,redis有两种持久化机制,其中aof的效率并不是特别优秀,所以redis的复制逻辑可以理解为主节点基于内容生成一个快照,然后通过网络发送给从节点,从节点拿到快照后恢复快照就能实现和主节点的数据同步,随后主节点在快照之后发生修改,那么这个时候主节点再利用aof机制来实现复制。

还有一种逻辑是主节点首先将数据快照后存储在磁盘上,然后再将磁盘上的快照文件发送给各节点来实现复制功能。

redis主从复制与mysql相同的一点是主节点可以读写而从节点无法读写。不同的是在redis主从复制集群中若主节点宕机了,那么需要一个第三方来检测各节点的状态并在主节点宕机后提升其中一个从节点为新的主节点,而这个第三方就是sentinel


sentinel,redis哨兵服务概念

sentinel哨兵服务是由redis包所自带但是独立监听某一端口提供服务的程序。

上面也描述过了,sentinel服务主要功能是检测redis主从复制集群中各节点的健康状态并调整主从关系的服务。


实现过程

环境

1,主:CentOS7.3,hostname:redis1,ip:172.16.2.101
2,从:CentOS7.3,hostname:redis2,ip:172.16.2.102
3,从:CentOS7.3,hostname:redis3,ip:172.16.2.103


利用redis-cli命令的实现方法

#安装redis
[root@redis1 ~]# yum install redis -y 
[root@redis2 ~]# yum install redis -y 
[root@redis3 ~]# yum install redis -y 

#更改配置文件
[root@redis1 ~]# vim /etc/redis.conf #更改配置文件中的bind监听地址为0.0.0.0
[root@redis2 ~]# vim /etc/redis.conf
[root@redis3 ~]# vim /etc/redis.conf
bind 0.0.0.0 #在实际运用环境中千万不能这样设置

#启动服务
[root@redis1 ~]# systemctl start redis 
[root@redis2 ~]# systemctl start redis
[root@redis3 ~]# systemctl start redis

#配置从节点
[root@redis2 ~]# redis-cli #利用redis-cli登陆本机redis
127.0.0.1:6379> SLAVEOF 172.16.2.101 6379 #指定主为redis1
#如果此时主节点没有设置密码认证的话这一步就算是完成了从节点配置,但是如果主节点有密码认证配置的话需要加上密码认证“CONFIG SET masterauth password”
127.0.0.1:6379> CONFIG REWRITE #将从节点设置保存至配置文件
OK
127.0.0.1:6379> 

#redis3的配置也是一样的,这里就不演示了

直接更改配置文件的实现方法

#相关配置在配置文件中的REPLICATION配置段
[root@redis2 ~]# vim /etc/redis.conf #打开配置文件
#找到slaveof这一行然后更改为如下
slaveof 172.16.2.101 6379
[root@redis2 ~]# systemctl restart redis #重启服务

测试

既然配置好了,那就测试一下

[root@redis1 ~]# redis-cli #主节点登陆redis
127.0.0.1:6379> set test1 aaa #创建一个键并赋值为aaa
OK
127.0.0.1:6379> get test1
"aaa"

#节点2上
[root@redis2 ~]# redis-cli
127.0.0.1:6379> get test1
"aaa"
127.0.0.1:6379> 

#节点3上
[root@redis3 ~]# redis-cli
127.0.0.1:6379> get test1
"aaa"
127.0.0.1:6379> 

如上所示,两台从节点成功同步了主节点的数据。

与mysql不同的是:从节点的上readonly属性默认都是开启的,可以这样查看:

127.0.0.1:6379> config get slave-read-only
1) "slave-read-only"
2) "yes"
127.0.0.1:6379> 

sentinel的配置方法

上面已经简单实现了redis的主从复制,但是目前还没有配置sentinel,所以现在还不能实现主节点的调整服务,那么下面就开始配置sentinel

[root@redis1 ~]# vim /etc/redis-sentinel.conf #节点1打开sentinel配置文件更改以下内容:

在监听端口下添加bind 0.0.0.0
sentinel monitor mymaster 172.16.2.101 6379 2 #指定一个主节点标识符并且定义ip地址和端口号,最后2的意思是指投票同意数超过2就通过切换主节点请求
sentinel down-after-milliseconds mymaster 3000 #在多长时间内连接不上就认为改机器宕机了(因为我这里是局域网,所以时间我设置得很短)

#这里其他两台机器配置也是一样的可以直接scp复制过去
[root@redis1 ~]# systemctl start redis-sentinel #启动服务
[root@redis2 ~]# systemctl start redis-sentinel
[root@redis3 ~]# systemctl start redis-sentinel

测试

sentinel服务已经配置好了,可以测试一下了

#通过添加IP地址和端口号登陆到sentinel上利用命令直接切换主节点
[root@redis1 ~]# redis-cli -h 172.16.2.101 -p 26379 #登陆
172.16.2.101:26379> sentinel masters #查看当前主节点信息
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "172.16.2.101"
    5) "port"
    6) "6379"

172.16.2.101:26379> SENTINEL failover mymaster #切换主节点
OK
172.16.2.101:26379> sentinel masters #再次查看主节点信息
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "172.16.2.102" #主节点已经从101变成了102
    5) "port"
    6) "6379"

上面通过命令直接切换主节点的方式测试成功了,那么如果直接把主节点的服务关掉还能不能正常切换主节点呢?

#通过上面可以知道当前的主节点地址是172.16.2.102,现在去172.16.2.102上停掉redis服务然后再查看主节点是否切换(这里要注意停掉的是redis服务而不是sentinel服务,简单的逻辑问题,因为监控和切换主节点本来就是sentinel提供的服务)

[root@redis2 ~]# systemctl stop redis #停掉当前主节点的redis服务
172.16.2.101:26379> sentinel masters #查看当前主节点
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "172.16.2.101" #可以发现101又成为了主节点
    5) "port"
    6) "6379"

那么现在redis的主从复制和sentinel都工作正常,整个实验就到此为止了。


完结撒花,转载请注明源地址,谢谢~