从零学习redis(5)--- 多机部署之哨兵模式

redis 刘宇帅 5年前 阅读量: 1970

Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式:

  1. 主从复制模式
  2. 哨兵模式
  3. 集群模式

哨兵模式

主从复制模式解决了数据备份和单机可能存在的性能问题,但是也引入了新的问题,一主多从,在使用过程中,如果主服务器挂掉那么整个 Redis 服务的写就挂掉了,如果一个从服务器挂掉那么调用方就无法正确的读数据了,只能通过修改调用方配置和 Redis 各个服务器的配置重新分配主从服务器。而哨兵模式的出现就是为了解决这个问题,哨兵模式会在除了主从模式需要的服务之外另外起N个 sentinel 节点,节点的作用就是监控各个 Redis 的服务是否正常,如果主服务器挂掉那么 sentinel 就会在从服务器中重新选举主服务器,等主服务恢复工作那么他将会变成从服务。

部署哨兵模式

部署主从节点

哨兵模式的主从节点配置和主从复制模式的一样,我们这里依旧使用docker配置一个最简单的哨兵系统,1个主节点myredis、2个从节点myredis1 myredis2。

$ docker run --name myredis -d -p 6379:6379 -v /Users/liushuai/Documents/dockerProject/redis/redis.conf:/etc/redis/redis.conf redis /etc/redis/redis.conf
$ docker run --name myredis1 -d -p 6380:6379 -v /Users/liushuai/Documents/dockerProject/redis/redis.conf:/etc/redis/redis.conf redis /etc/redis/redis.conf
$ docker run --name myredis2 -d -p 6381:6379 -v /Users/liushuai/Documents/dockerProject/redis/redis.conf:/etc/redis/redis.conf redis /etc/redis/redis.conf

使用docker inspect container查看3个redis的IP

  • myredis 172.17.0.2
  • myredis1 172.17.0.3
  • myredis2 172.17.0.4

然后使用命令slaveof 172.17.0.2 6379配置myredis1 myredis2为myredis的从节点。 在myredis上查看从节点信息

127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.3,port=6379,state=online,offset=15105,lag=1
slave1:ip=172.17.0.4,port=6379,state=online,offset=15105,lag=1
master_replid:b9fae659260b39c9c3ad8ec56fd3f6f7c34fde2a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:15105
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:15105

可以看到主节点有两个从节点,配置完毕

配置哨兵

配置三个哨兵分别为:mysentinel-16379、mysentinel-16380、mysentinel-16381。并为他们添加3个配置文件 sentinel-16379.conf、sentinel-16380.conf、sentinel-16381.conf,内容统一为

dir "/data"
logfile "./sentinel-01.log"
sentinel monitor master 172.17.0.2 6379 2

启动三个哨兵

$ docker run --name mysentinel-16379 -d -p 16379:6379 -v /Users/liushuai/Documents/dockerProject/redis/sentinel-16379.conf:/etc/redis/sentinel.conf redis /etc/redis/sentinel.conf --sentinel
$ docker run --name mysentinel-16380 -d -p 16380:6379 -v /Users/liushuai/Documents/dockerProject/redis/sentinel-16380.conf:/etc/redis/sentinel.conf redis /etc/redis/sentinel.conf --sentinel
$ docker run --name mysentinel-16381 -d -p 16381:6379 -v /Users/liushuai/Documents/dockerProject/redis/sentinel-16381.conf:/etc/redis/sentinel.conf redis /etc/redis/sentinel.conf --sentinel

我们可以查看下mysentinel-16379的配置变化

$ cat sentinel-16379.conf
dir "/data"
logfile "./sentinel-01.log"
sentinel myid a9c2f61c55f0297948c3e390f042ad747c2da90d
# Generated by CONFIG REWRITE
port 26379
sentinel deny-scripts-reconfig yes
sentinel monitor master 172.17.0.2 6379 2
sentinel config-epoch master 0
sentinel leader-epoch master 0
sentinel known-slave master 172.17.0.3 6379
sentinel known-slave master 172.17.0.4 6379
sentinel known-sentinel master 172.17.0.7 26379 5e750af533eff5fd1eed0391af37773ba6134345
sentinel known-sentinel master 172.17.0.6 26379 f1de98d5af0653f53c6bb77c37ab015304ba2c99
sentinel current-epoch 0

可以看到哨兵已经拿到了3台redis服务器相关信息。

故障转移演示

我们先停掉myredis,等待1分钟再启动myredis(哨兵进行故障转移需要一定时间,所以这里需要等待一会)

$ docker stop myredis // 执行完等待一分钟
$ docker start myredis

再次查看mysentinel-16379的配置

$ cat sentinel-16379.conf
dir "/data"
logfile "./sentinel-01.log"
sentinel myid a9c2f61c55f0297948c3e390f042ad747c2da90d
# Generated by CONFIG REWRITE
port 26379
sentinel deny-scripts-reconfig yes
sentinel monitor master 172.17.0.4 6379 2
sentinel config-epoch master 1
sentinel leader-epoch master 1
sentinel known-slave master 172.17.0.3 6379
sentinel known-slave master 172.17.0.2 6379
sentinel known-sentinel master 172.17.0.7 26379 5e750af533eff5fd1eed0391af37773ba6134345
sentinel known-sentinel master 172.17.0.6 26379 f1de98d5af0653f53c6bb77c37ab015304ba2c99
sentinel current-epoch 1

我们可以看到当前的主节点是172.17.0.4(即myredis2),而原来的主节点myredis则变成了从节点。

提示

功能待开通!


暂无评论~