Redis主从复制和sentinel配置

Redis主从复制和sentinel

之前研究了下redis集群,因为其集群需要只是建3个主节点、3个从节点,而且数据存储是以分片的方式的。但是当前项目使用场景是只需要一主一从节点,并从能failover实现高可用。看了下,Redis的主从复制功能可以实现读写分离,并通过Redis的Sentinel可以实现主从切换:当主服务器挂掉之后,自动将其中一个从服务器升级为主服务器。然后跟着官网尝试搭建,这里记录一下。

1. 主从复制

1.1 主从复制介绍

以下摘录中文网上,mark一下

Redis复制很简单易用,它通过配置允许slave Redis Servers或者Master Servers的复制品。接下来有几个关于redis复制的非常重要特性:
- 一个Master可以有多个Slaves。
- Slaves能过接口其他slave的链接,除了可以接受同一个master下面slaves的链接以外,还可以接受同一个结构图中的其他slaves的链接。
- redis复制是在master段是非阻塞的,这就意味着master在同一个或多个slave端执行同步的时候还可以接受查询。
- 复制在slave端也是非阻塞的,假设你在redis.conf中配置redis这个功能,当slave在执行的新的同步时,它仍可以用旧的数据信息来提供查询,否则,你可以配置当redis slaves去master失去联系是,slave会给发送一个客户端错误。
- 为了有多个slaves可以做只读查询,复制可以重复2次,甚至多次,具有可扩展性(例如:slaves对话与重复的排序操作,有多份数据冗余就相对简单了)。
- 通过复制可以避免master全量写硬盘的消耗:只要配置 master 的配置文件redis.conf来“避免保存”(注释掉所有”save”命令),然后连接一个用来持久化数据的slave即可。但是这样要确保masters 不会自动重启。

1.2 配置主从复制

主节点:172.16.0.196 6379
从节点:172.16.0.196 6380

  1. 当前目录
    /usr/local/redis-3.0.7/master_slaver

  2. 创建主从两个目录,并将redis.conf分别拷贝到目录

mkdir master
mkdir slaver
cp ../redis.conf ./master
cp ../redis.conf ./master
  1. 修改主的redis.conf
daemonize yes
logfile "master.log"
dir ./master
  1. 修改从的redis.conf
port 6380
slaveof 172.16.0.196 6379
logfile "slaver.log"
dir ./slaver
  1. 分别启动主从两个服务
../src/redis-server ./master/redis.conf
../src/redis-server ./slaver/redis.conf

ps -ef | grep redis
# root     15776     1  0 11:29 ?        00:00:00 ../src/redis-server 172.16.0.196:6379 
# root     15778     1  0 11:29 ?        00:00:00 ../src/redis-server 172.16.0.196:6380  
  1. 使用客户端连接主节点,可以查看到有一个从节点信息
../src/redis-cli -p 6379
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.0.196,port=6380,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

2. sentinel

2.1 sentinel介绍

以下摘录中文网上,mark一下

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
- 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 –sentinel 选项来启动 Redis Sentinel 。

2.2 配置sentinel

  1. 拷贝sentinel.conf到当前使用的目录
cp ../sentinel.conf ./
  1. 根据需要修改配置信息
# 哨兵监控这个master,在至少quorum个哨兵实例都认为master down后把master标记为odown
# (objective down客观down;相对应的存在sdown,subjective down,主观down)状态。
# slaves是自动发现,所以你没必要明确指定slaves。
sentinel monitor mymaster 127.0.0.1 6379 2

# master或slave多长时间(默认30秒)不能使用后标记为Objectively Down状态。
sentinel down-after-milliseconds mymaster 60000

# 若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout mymaster 180000

# 指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长
sentinel parallel-syncs mymaster 1
  1. 启动sentinel
../src/redis-sentinel sentinel.conf &

2.3 停掉master,看slaver是否能failover

  1. 查看当前master
./src/redis-cli -p 26379
127.0.0.1:26379> SENTINEL masters

1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "127.0.0.1"
    5) "port"
    6) "6379"
    7) "runid"
    8) "6f6e0c2a5391d2b561e4620bb74662077778a63d"
    9) "flags"
   10) "master"
   11) "pending-commands"
   12) "0"
   13) "last-ping-sent"
   14) "0"
   15) "last-ok-ping-reply"
   16) "642"
   17) "last-ping-reply"
   18) "642"
   19) "down-after-milliseconds"
   20) "30000"
...
  1. 当前redis实例
ps -ef | grep redis
root     16435     1  0 15:20 ?        00:00:00 ../src/redis-server *:6379             
root     16439     1  0 15:20 ?        00:00:00 ../src/redis-server *:6380             
root     16443     1  0 15:20 ?        00:00:00 ../src/redis-sentinel *:26379 [sentinel]
root     16450 15305  0 15:20 pts/0    00:00:00 grep redis
  1. 停掉端口为6379的master节点
kill -9 16435
ps -ef | grep redis

root     16439     1  0 15:20 ?        00:00:00 ../src/redis-server *:6380             
root     16443     1  0 15:20 ?        00:00:00 ../src/redis-sentinel *:26379 [sentinel]
root     16456 15305  0 15:23 pts/0    00:00:00 grep redis
  1. 再次查看当前master,可以发现已经failover成功
./src/redis-cli -p 26379
127.0.0.1:26379> SENTINEL masters

1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "172.16.0.196"
    5) "port"
    6) "6380"
    7) "runid"
    8) "9a550c707548331a0f773c1fad9159872cd1957b"
    9) "flags"
   10) "master"
   11) "pending-commands"
   12) "0"
   13) "last-ping-sent"
   14) "0"
   15) "last-ok-ping-reply"
   16) "652"
   17) "last-ping-reply"
   18) "652"
   19) "down-after-milliseconds"
   20) "30000"
...

你可能感兴趣的:(redis)