Redis Sentinel 学习笔记

转载出处: http://blog.csdn.net/lihao21

概述

Redis Sentinel 是用来实现 Redis 高可用的一套解决方案。Redis Sentinel 由两个部分组成:由一个或者多个 Sentinel 实例组成 Sentinel 系统;由一个主 Redis 服务器(master redis)和多个从 Redis 服务器(slave redis)组成主从备份的 Redis 系统。Sentinel 系统本身是一个分布式的系统,它的作用是监视 redis 服务器,在 master redis 下线时,自动将某个 slave redis 上升为新的主服务器。Redis 系统由 master redis 处理客户端的命令请求,slave redis 作为主服务器的备份而存在。Redis Sentinel 的系统架构如图 1 所示。

图1:Redis Sentinel 架构图

假设某个时刻,原来的 master redis 进入下线状态,Sentinel 系统就会监控到这个 master redis 已下线,接下来,Sentinel 系统就会进行故障转移操作:

  • 首先,Sentinel 系统会挑选出原来的其中一个 slave redis,让这个 slave redis 上升为 master redis。
  • 之后,Sentinel 系统会向其他所有的 slave redis 发送新的复制命令,让它们成为新 master redis 的 slave redis。
  • 另外,Sentinel 系统还会继续监控已下线的 redis,当它重新上线时,会将设置为新 master redis 的 slave redis。

需要指出的是,Redis Sentinel 只是一种主从备份的高可用方案,它的目的是支持 Redis 提供高可用的服务,但 Redis Sentinel 系统本身并没有对 Redis 的承载能力进行扩容。理论上说,如果 slave redis 并没有对外提供读写服务,Redis Sentinel 的负载能力与单点 Redis 的负载能力是一样的。有些同学使用了 Redis Sentinel 方案后,可以有效降低 Redis 单机版的负载问题,这种想法是不现实的。这是因为在 Redis Sentinel 系统中,还是只有一个 redis 服务器在提供服务,其负载能力还是受单个 redis 服务器的限制。 
如果需要对 redis 的承载能力进行扩容,可以使用其他的分布式 redis 解决方案,例如 Codis,或者 Twemproxy。

实验

为了进一步了解 Redis Sentinel 系统如何实现系统高可用的原理,我们进行以下实验。

实验环境

为了操作和描述的简单起见,我们搭建的 Redis Sentinel 系统,只包含一个 master redis 和一个 slave redis,以及两个 sentinel 实例。生产环境下,建议 slave redis 至少部署两个,sentinel 实例则至少三个。 
服务器部署环境如图 2 所示。

 
图2:Redis Sentinel 部署环境

  • 操作系统:CentOS 6.6
  • Redis 版本:release 3.2.8

实验过程

1. 搭建 Redis 系统

在 redis 官网(https://redis.io/download)下载 redis后对其解压,然后修改 redis 目录下的配置文件。Master redis 使用的配置 redis.conf 如下(限于篇幅只列出关键的几个配置,其他配置使用默认值即可):

# master redis 绑定的IP地址
bind 192.168.174.137
# 监听的端口,使用默认的 2679
port 6379
# 以后台进程运行
daemonize yes
# 日志输出位置,便查看实验结果
logfile "/home/lihao/redis-stable/logs/redis.log"
 

Slave redis 使用的配置 redis.conf 如下:

# slave redis 绑定的IP地址
bind 192.168.174.143
# 监听的端口,使用默认的 2679
port 6379
# 以后台进程运行
daemonize yes
# 日志输出位置,便查看实验结果
logfile "/home/lihao/redis-stable/logs/redis.log"
# 作为 master redis 的 slave redis
slaveof 192.168.174.137 6379

修改好配置后,先后启动 master redis 和 slave redis:

启动命令:

$ ./src/redis-server redis.conf

这样, 主从备份的 Redis 系统就搭建好了。

2. 搭建 Sentinel 系统

第一个 sentinel 实例的配置 sentinel.conf 配置如下:

# 绑定的IP地址
bind 192.168.174.137
# 监听的端口
port 26379
# 监控的 master redis 信息,其中的数字 2 表示判断
# master redis 客观下线所需要的 sentinel 实例数量
sentinel monitor mymaster 192.168.174.137 6379 2
# 判断 master redis 主观下线的时长
sentinel down-after-milliseconds mymaster 30000

第二个 sentinel 实例的配置如下:

# 绑定的IP地下
bind 192.168.174.143
# 监听的端口
port 26379
# 监控的 master redis 信息,其中的数字 2 表示判断
# master redis 客观下线所需要的 sentinel 实例数量
sentinel monitor mymaster 192.168.174.137 6379 2
# 判断 master redis 主观下线的时长
sentinel down-after-milliseconds mymaster 30000

然后分别在两台机器上执行以下命令启动 sentinel 实例。

./src/redis-sentinel sentinel.conf 

这样,Sentinel 系统也搭建完成了。

3. 测试 Redis 系统主从切换

在机器 192.168.174.137 上执行以下命令,获取其主从角色信息:

$ ./src/redis-cli -h 192.168.174.137 info Replication

得到以下输出信息,表明 192.168.174.137 上的 redis 是 master 角色。

# Replication
role:master
connected_slaves:1
slave0:ip=192.168.174.143,port=6379,state=online,offset=15,lag=1

机器 192.168.174.143 上的 redis 则是 slave 角色:

# Replication
role:slave
master_host:192.168.174.137
master_port:6379

对 192.168.174.137 master redis 执行下线命令操作:

192.168.174.137:6379> shutdown

等待一会儿,可以看到 192.168.174.143 变成了 master 的角色。

# Replication
role:master
connected_slaves:0

192.168.174.137 的 redis 重新上线后,可以看到其已变成新的 master redis 的 slave redis。

# Replication
role:slave
master_host:192.168.174.143
master_port:6379
 

实验小结

从实验过程可以看到,Sentinel 系统会对已下线的 master redis 执行故障转移操作。这个故障操作实际包含三个步骤: 
(1)在已下线 master redis 属下的所有 slave redis 里面,挑选出一个 slave redis ,并将其转换为 master redis 角色。例如,上述实验中,将 192.168.174.143 的 redis 转换为 master 的角色。 
(2)让其他的所有的 slave redis 改为复制新的 master redis。 
(3)将已下线的 master redis 设置为新 master redis 的 slave redis。在上述实验中,192.168.174.137 上下线的 redis 在重新上线后,变成了 192.168.174.143 上 redis 的 slave redis。

总结

Redis Sentinel 系统内部通过执行故障转移操作,保证 Redis 系统在 master redis 下线后,仍然可以继续提供对外服务,从而达到系统高可用的目的。

参考资料

  1. Redis 设计与实现,黄健宏著,机械工业出版社,2015年
  2. https://redis.io/topics/sentinel
  3. http://www.cnblogs.com/LiZhiW/p/4851631.html
  4. https://segmentfault.com/a/1190000002680804
  5. http://blog.csdn.net/moyu_2012/article/details/47856949
  6. http://www.oschina.net/p/codis/
  7. https://github.com/twitter/twemproxy/
时间: 2024-10-12 23:46:25

Redis Sentinel 学习笔记的相关文章

redis数据库学习笔记

redis数据库 工作需要,简单了解一下redis数据库,供后续参考和复习使用. 一.简介 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.它支持字符串.哈希表.列表.集合.有序集合,位图,hyperloglogs等数据类型.内置复制.Lua脚本.LRU收回.事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区 m

memcache redis 缓存学习笔记

0.redis和memcache的区别 a.redis可以存储除了string之外的对象,如list,hash等 b.服务器宕机以后,redis会把内存的数据持久化到磁盘上,而memcache则不会 1.redis安装 a.rz redis.gz.tar b.tar解压 c.make编译 d../redis-server &  服务端启动 e.redis-cli 客户端启动 1)notice:注意默认启动 redis-server redis.conf 会报错 , 原因参考redis有三种启动的

十五分钟介绍 Redis数据结构--学习笔记

下面是一个对Redis官方文档<A fifteen minute introduction to Redis data types>一文的翻译,如其题目所言,此文目的在于让一个初学者能通过15分钟的简单学习对Redis的数据结构有一个了解. Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景.它起步较晚,发展迅速,目前已被许多大型机构采用,比如Github,看看谁在用它.本文翻译自Redis的一篇官方文档:A fifteen mi

Redis的学习笔记

一.Redis简介 1.关于关系型数据库和nosql数据库 关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据     库是基于特殊的结构,并将数据存储到内存的数据库.从性能上而言,nosql数据库  要优于关系型数据库,从安全性上而 言关系型数据库要优于nosql数据库,所以在实    际开发中一个项目中nosql和关系型数据库会一起使用,达到性能和安全性的双保证. 2.什么是Redis Redis是用C语言开发的一个开源的高性能键位对(key-value)数据库.

Redis服务器学习笔记(一)

一.Redis的安装: wget http://download.redis.io/redis-stable.tar.gz tar xzfredis-stable.tar.gz cd redis-stable make make install 二.Redis的简单介绍: 1. Redis可执行文件说明: 文件名 说明 redis-server redis服务器 redis-cli redis命令行客户端 redis-benchmark redis性能测试工具 redis-check-aof A

Redis入门学习笔记一

Redis 简要描述: 1.  Redis 是啥 ? Redis 英文名称全称为: Remote Dictionary Server ,中译为远程字典服务器. 是一款区分于磁盘数据库如(Mysql)的采用Key-Value键值对的字典结构的缓存数据库. 2. Redis有什么作用? Redis作为一款内存数据库,其最大的有点就是高速,对于那些高频访问的数据,进行加缓存.Redis加载缓存的时候使用的LRU机制,对于热点数据将会持续保留,其他的将会被淘汰. Redis涉及到的LRU简要源码解析算法

Redis深入学习笔记(二)client list 命令详解

Redis的client list 命令可以获取当前连接到redis server端的所有客户端以及相关状态,本篇主要介绍每一个参数的作用. clisnt list 命令输出结果如下: (1)标识:id.addr.fd.name这四个属性属于客户端的标识: id:客户端连接的唯一标识,这个id是随着Redis的连接自增的,重启Redis后会重置为0. addr:客户端连接的ip和端口. fd:socket的文件描述符,与lsof命令结果中的fd是同一个,如果fd=-1代表当前客户端不是外部客户端

Redis深入学习笔记(三)RDB及AOF流程

RDB是Redis持久化数据的一种方式,是执行时间点的Redis内存快照,redis数据还原时加载rdb文件,Redis的主从数据同步也是基于RDB实现的. RDB流程: 1)执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回. 2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒. 3

Redis Essentials 读书笔记 - 第九章: Redis Cluster and Redis Sentinel (Collective Intelligence)

Chapter 9. Redis Cluster and Redis Sentinel (Collective Intelligence) 上一章介绍了复制,一个master可以对应一个或多个slave(replica), 在以下的情况下是够用的: 1. master有足够内存容纳所有key 2. 通过slave可以扩展读,解决网络吞吐量的问题 3. 允许停止master的维护窗口时间 4. 通过slave做数据冗余 但复制解决不了自动failover和自动resharding的问题,在以下的情