利用redis-sentinel+keepalived实现redis高可用
为上层应用提供高可靠、低延迟、低(无限接近0)数据损失的Redis缓存服务
方案概述:采用同一网络内的三台主机(可以是物理主机、虚拟机或docker容器),要求三台主机之间都能相互访问,每一台主机上都安装redis-server、redis-sentinel和keepalived。
redis-server负责提供Redis缓存服务,三台主机间的关系是master-slave-slave
redis-sentinel负责提供Redis高可用,三台主机间的关系与redis-server相同
keepalived负责提供VIP地址供上层应用使用,三台主机的关系是master-backup-backup,VIP始终在redis-server master上,保证对上层应用可写可读。
三台主机的冗余度是1,也就是说当有一台主机宕机时另外两台中至少有一台主机可以提供Redis缓存服务
方案原理:redis-server提供单实例的Redis缓存服务,redis-sentinel能在一台主机挂掉时自动的将某一台可用主机上的redis-server由slave状态切换成master状态。
keepalived通过vrrp_script检测当前主机上的redis-server是否以master状态运行,如果当前主机上的redis-server正在以master状态运行,则将vrrp_instance标记为存活状态,并分配VIP;如果当前主机上的redis-server正在以slave状态运行,则将vrrp_instance标记为错误状态。当某台主机宕机后,其他两台主机上的keepalived会将VIP切换到新的master(当前主机上的redis-server正在以master状态运行)上。
由于keepalived的VIP切换有延迟(大约40ms),因此上层应用不能过分依赖Redis,例如大规模并发性的短时间内向Redis插入大量数据。
如图所示,有三台主机,分别标识为Redis1、Redis2、Redis3,它们的角色和配置等信息如下:
sentinel monitor mymaster 192.168.1.241 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
Redis2和Redis3上的redis-sentinel配置文件与Redis1上的redis-sentinel配置文件内容相同。
(5)Redis1上的redis-server的配置文件
client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
(7)Redis1上的keepalived配置文件(vim /etc/keepalived/keepalived.conf)
关于keepalived的配置文件
keepalived的配置文件默认是没有的,当然sample example文件还是有的,通常在PREFIX/etc/sample目录下。
keepalived master和backup(backups)之间不同的是:
1.优先级的不同,master的优先级priority的数字要高一些
2.global_defs段的router_id都不一样,实际中可以用任意名字区分也可以用主机名区分
3.backup的配置文件中还有一个nopreempt字段,意思是设置为非抢占模式,作用是让master优先获取到VIP,并保证VIP是在原先的master上。
如果keepalived启动后日志如下图显示则表示启动成功。
测试分两块内容,一是测试键值对的set与get,二是测试自增唯一id的是否可用。
(1)测试Redis键值对的set与get
先不模拟故障,先测试一下redis的set、get和复制情况
再测试一下模拟故障出现时redis的set、get和复制情况
停掉Redis1上的redis-server
Redis1上的VIP已经被移除
查看Redis2上的Redis状态和VIP状态
通过上图的***文字可以看出,VIP已经漂移到新的redis-server master了。
注意:VIP的漂移过程是需要时间的,时间大概需要10*4ms左右,如下图所示:
此时再次测试一下Redis的复制情况
由上图可见,Redis复制情况正常,上层应用依然可以使用Redis缓存服务。
(2)测试自增唯一id(autoincrementing unique identifier)
概念参考:http://redis-cookbook.readthedocs.org/en/latest/z.html
自增唯一id最常见的应用就是作为关系型数据库的主键,因为主键必须确保每个数据项都有唯一id。
它也可以在不支持自增唯一id的数据库中(比如MongoDB)用来替代唯一id(uniqueidentifier,通常是一个哈希值)
它也可以为用户提供更好的URL:比如将/topic/4e491e229f328b0cd900010d修改为/topic/10086。
一个自增唯一id对象最重要的是保证值的唯一性,要做到这一点,自增id的自增incr操作必须是一个原子操作,它应该能在一个原子时间内完成以下两件事:
增加id值,返回当前id值,并且它也没有减法decr和清零reset等操作,因为这些操作破坏了唯一性。
get操作一般只用于内部检查,比如观察值是否溢出,但在一般情况下,自增唯一id对象应该只有一个incr操作。
先测试一下主机健康状态下的自增唯一id
发现各个redis-server中的自增唯一id是好用的。再测试一下某台主机故障状态下的自增唯一id。先根据ip addr找到VIP的主机位置,或者通过redis-cli info查看role找到redis-server master的主机,然后kill redis-server pid,再进行测试。
由此发现redis-server中的自增唯一id仍然是好用的。
故障切换的步骤如果一台主机宕机,则主机启动后,先启动redis-server、再启动redis-sentinel、最后自动keepalived。
如果多台主机宕机,则按照一台主机宕机的步骤做同样处理。
如果一台主机的中的某台服务停止,则直接启动该服务即可。
Redis Documention http://redis.io/documentation
Redis High Availability http://redis.io/topics/sentinel
Redis Replication http://redis.io/topics/replication
后续
由于keepalived的应用场景有限,比如它的核心协议VRRP只能工作在局域网内,不能工作在局域网外(网间、广域网),而且在网络不受自己控制时基本不能用,除非设定好的VIP是供局域网使用。因此特别是在云计算环境中,使用云主机(例如阿里云ECS等)就不能用keepalived,因此只能寻找一个可替代keepalived的解决方案来替代它。Consul作为服务注册、服务发现的最佳选择,无疑可以很好的替代keepalived。第二种方案可以参考这篇文章《利用redis-sentinel+consul实现redis高可用》。
tag:Redis集群,Redis高可用,redis-sentinel,keepalived配置,Redis主从复制
--end--
本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1742766
2021年你还不会Shiro?----10.使用redis实现Shiro的缓存 上一篇文章已经总结了使用ehCache来实现Shiro的缓存管理,步骤也很简单,引入依赖后,直接开启Realm的缓存管理器即可。如果使用Redis来实现缓存管理其实也是一样的,我们也是需要引入redis的依赖,然后开启缓存传入自定义的redis的缓存管理器就行。区别是我们需要为自定义的redis缓存管理器提供自定义的缓存管理类。这个缓存管理类中需要使用到redisTemplate模板,这个模板我们也是需要自己定义。
异步结果通知实现——基于Redis实现,我这操作很可以 前段时间,我在内存中实现了一个简单异步通知框架。但由于没有持久化功能,应用重启就会导致数据丢失,且不支持分布式和集群。今天这篇笔记,引入了 Redis 来解决这些问题,以下是几点理由: 数据结构丰富,支持 List、Sorted Set 等 具有持久化功能,消息的可靠性能得到保证 高可用性,支持单机、主从、集群部署 项目中已使用,接入成本更低 基于 Redis 实现延时队列也有几种方法,展开详细讲讲。
相关文章
- 提升Redis安全性:主从设置密码方法(redis主从设置密码)
- 数据库Redis实现数据库配置(redis配置)
- 实现Redis主从配置:快速可靠!(redis主从配置)
- Redis入门必读:实现数据高效存储(redis书籍推荐)
- Redis配置文件细致剖析(redis的配置文件详解)
- 开启Redis服务器:探索redisserver命令(开启redis的命令)
- Redis助力网站优化:实现二级缓存加速(redis 做二级缓存)
- 利用Redis实现数据恢复的完美方案(redis 数据恢复)
- 从缓存到成神,Redis的神奇之路(缓存成神路redis)
- 本地命令快速启动Redis服务(本地命令启动redis)
- 拥抱开源 Sphinx与Redis的新组合(sphinx redis)
- 学习JAVA,必不可少的Redis(学JAVA要学redis)
- 的执行效率提升Redis命令执行效率的几种方法(如何增加redis命令)
- 利用Redis实现高效批量数据读取(从redis批量取数据)
- 基于Redis的SSO实现研究 (基于redis实现sso)
- 灵活运用Redis,聪明获取项目值(在项目中用redis取值)
- 分析Redis默认的删除机制(redis默认删除机制)
- Redis锁的过期机制实现可靠性(redis锁过期机制)
- Redis锁技术超时等待的优化技巧(redis锁超时等待)
- Redis锁用于实现互斥的可靠方案(redis锁描述正确的是)
- Redis助力全新的模糊查询之旅(redis逐渐模糊查询)
- Redis读写达到极限高性能持续增长(redis 读写极限)
- 让Redis让您获得数据飞快访问体验(redis访问速度快)
- 储存Redis实现定期删除数据储存(redis 设置定期删除)
- 的快速存储Redis快速实现亿级数据存储(redis能实现亿级数据)
- 在Redis中实现强大的运行逻辑(redis运行逻辑)
- Redis缓存 让存图片更快捷方便(redis缓存 存图片)