`

redis 学习问题总结

阅读更多

    

redis 学习问题总结

http://aperise.iteye.com/blog/2310639

ehcache memcached redis 缓存技术总结

http://aperise.iteye.com/blog/2296219

redis-stat 离线安装

http://aperise.iteye.com/blog/2310254

redis  cluster 非ruby方式启动

http://aperise.iteye.com/blog/2310254

redis-sentinel安装部署

http://aperise.iteye.com/blog/2342693

spring-data-redis使用

 http://aperise.iteye.com/blog/2342615

redis客户端redisson实战

http://blog.csdn.net/zilong_zilong/article/details/78252037

redisson-2.10.4源代码分析

http://blog.csdn.net/zilong_zilong/article/details/78609423

tcmalloc jemalloc libc选择

http://blog.csdn.net/u010994304/article/details/49906819


 什么是redis集群
 

  • 官方推荐的2种redis部署方式对比以及使用场景
  • 实现redis集群的方式
  • sentinel的作用,sentinel是实现集群的方式吗
  • 非集群方式如何保证redis高可用
  • redis官网集群方式默认采用ruby脚本redis-trib.rb实现,离开了ruby脚本,我们就玩不转redis官网推荐的redis cluster方式了吗
  • redis学习网址推荐?

1.什么是redis集群

    真正的redis集群,首先要实现redis数据的自由均匀自由分片(sharding),当数据分不到集群中各个节点之后,为保障该sharding节点的高可用性,该节点必须有足够多的从节点不断同步和备份数据,以便在该节点出现问题后,迅速通过某种方式(比如选举制)夺取出问题的主节点的原有角色位置。

    这么理解的话,个人认为,redis集群首先要支持分片sharding,其次分片要高可用(出问题,迅速切换)

 

2.官方推荐的2种redis部署方式对比以及使用场景

    我使用redis时间不长,主要通过官网了解关于redis的一切,大家知道,在官网介绍了关于redis高可用的两种部署方式,一是redis cluster(官网上介绍是通过ruby脚本redis-trib.rb灵活实现redis cluster模式),另一种方式是通过sentinel方式实现redis的高可用。

    先来对比下官网的两种部署方式,列表如下:

官网介绍的redis部署方式 redis cluster redis sentinel
是否支持数据分片 本身支持 本身不支持,需要自己实现
是否高可用 高可用,节点故障后自动切换 高可用,节点故障后自动切换
使用场景

数据量大,数据均匀分布于各个节点;

支持节点的横向扩展;

各个节点高可用。

数据量小,服务器个数有限;

单个节点已经能存储所有数据

避免单节点故障,引入sentinel

最少机器台数

6台(3主3从)

3台(3sentinel与1主2从复用)

    官网介绍了两种redis部署方式,其实有其道理的。

    场景一在数据量超级大的情况下,单台redis服务器无法横向扩展,所以此时首先就要保证数据分布于能横向扩展的各个节点机器之上,这个就是sharding,这之后,为了保证数据有效性,每个sharding分片又必须有足够多的机器来做好备份,以便出问题时候能迅速被顶替上。这么看来,这种方式首先你要很多机器来存放sharding数据,需要很多机器来对sharding进行备份,对于机器资源本来不多的小公司,毕竟是一笔大的开销,最小的redis cluster部署方式下需要6台机器,3台主服务器做sharding,3台从服务器。

    场景二数据量非常小基本单台redis服务器就能存储所有缓存数据,而且戳戳有余。但又怕单节点故障问题,所以引入了sentinel,其实sentinel就是一个哨兵服务了,它已经知道哪台机器是主节点,哪台机器是从节点,主节点不可用时,能迅速从从节点选举新的从节点作为主节点。但毕竟sentinel也存在单节点故障,所以最好sentinel也要大于或等于3台。此部署方式下,最少3台机器,3台sentinel,1台主1台从,最稳定最少机器为3台sentinel1台主2台从,且此方式不属于redis集群范畴,因为不具备sharding功能。

 

3.实现redis集群的方式

    话说到这里,redis集群就只有redis cluster方式吗????????

    不是的,纵观redis的发展历程,redis走到今天,经过社区的不断贡献,目前redis集群方式有3种,列表如下:

redis集群种类 方式一(客户端分片) 方式二(代理分片) 方式三(服务端分片)
分片sharding

sharding在客户端

目前的实现有jedis

sharding不在服务端更不在客户端

sharding由代理完成;

目前有TwemproxyCodis两种

实现方式

sharding在服务端

服务端自带sharding实现

优点

不依赖于第三方分布式中间件;

实现方法和代码都自己掌控;

静态分片技术;

性能比代理式更好(少了一个中间分发环节);

 

程序不用关心后端Redis

实例,运维起来也方便

无中心节点(和代理模式的重要不同之处);故障自动切换

 

缺点

可运维性较差。出现故障,

定位和解决都得研发和运维配

合着解决,故障时间变长。

多了一道环节,相对客户端

分片集群方式性能稍微降低

一种非常“”的方案。

已经不是Redis单实例的“简单、可依赖”

 

4.sentinel的作用,sentinel是实现集群的方式吗

    1)sentinel的作用?

    Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

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

 

    2)sentinel是实现集群的方式吗?

    sentinel不是redis集群方式(这里集群指既支持数据sharding又支持高可用),因为sentinel首先不支持分片

    sentinel的出现是对那些数据量小单台机器已经能存储所有数据环境下,对于单节点故障问题的一种弥补技术,它能使得该场景下原来只有1台redis的机器,在增加一台从节点后, 在出现问题时候实现高可用,实现故障自动切换。

 

5.非集群方式如何保证redis高可用

    非集群方式主要指不同时满足sharding和高可用的部署方式,目前很多小的应用或者不重要应用是采用单节点redis,存在的问题是这个redis节点宕机后,整个依靠redis作为缓存架构的应用会瘫痪无法使用,为了保证高可用(故障自动切换,不需人工干预),有两种部署方式可以满足高可用。

    方式一:2台keepalived+2台redis

                  两台keepalived机器,两台redis节点(一主一从),keepalived通过虚IP方式转发请求给redis主节点,监测redis节点,在主节点宕机后,通过shell脚本触发从redis节点切换为主节点提供服务,当原先的主节点恢复时候,通过脚本首先从当前的主节点同步数据(实现方式是slaveof 当前主节点),等数据同步好后(通过脚本sleep睡眠一定时间控制),切换自己为主节点(slaveof no one实现),同时切换另一节点slaveof自己。

 

    方式二:3台sentinel+3台redis(1主2从)

                  这里强调一点,sentinel节点一定要3台(sentinel发现需要故障切换时候会投票选举一个sentinel进行故障切换,2个sentinel时候,会存在脑裂sentinel节点都互相投票让对方进行故障切换,但1:1的票数永远不能满足投票的总原则票多决定胜者,所以在一定情况下永远不会进行故障切换))

 

6.redis官网集群方式默认采用ruby脚本redis-trib.rb实现,离开了ruby脚本,我们就玩不转redis官网推荐的redis cluster方式了吗?

    redis官网介绍的redis cluster方式是采用ruby脚本ruby-trib.rb实现的,该脚本的好处是,redis作者在自己对于ruby非常熟悉的情况下,已经将很多构建redis cluster集群的客户端脚本通过ruby语言进行了实现,提供的ruby-trib.rb脚本是为了方便使用者快速使用ruby搭建一个高可用redis cluster集群。

     不使用该脚本,也是能够自己搭建redis cluster集群的,现大致介绍下其步骤,参见博客redis  cluster 非ruby方式启动http://aperise.iteye.com/blog/2315810大致步骤如下

  • 最少6台机器,分别安装redis环境,不需要安装ruby
  • 6台机器分别配置端口等信息,单独启动redis
  • 将 ip 和 port 所指定的6个节点添加到集群当中,让它成为集群的一份子,通过CLUSTER MEET实现
  • 确定3台主节点,并将一个或多个槽(slot)指派(assign)给各个节点,通过CLUSTER ADDSLOTS实现
  • 指定另外3台机器分别作为上面3台机器的从节点,通过CLUSTER REPLICATE实现

7.redis学习网址推荐?

    redis英文官网

    redis中文官网

    高效运维最佳实践(03):Redis集群技术及Codis实践

    Redis集群方案应该怎么做?

    Redis集群解决方案比较

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics