Redis高可用分布式集群

一,高可用

高可用(High Availability),是当一台服务器中止服务后,对于业务及用户毫无影响。 中止服务的缘由可能因为网卡、路由器、机房、CPU负载太高、内存溢出、天然灾害等不可预期的缘由致使,在不少时候也称单点问题。前端

(1)解决单点问题主要有2种方式:算法

主备方式sql

这种一般是一台主机、一台或多台备机,在正常状况下主机对外提供服务,并把数据同步到备机,当主机宕机后,备机马上开始服务。缓存

Redis HA中使用比较多的是keepalived,它使主机备机对外提供同一个虚拟IP,客户端经过虚拟IP进行数据操做,正常期间主机一直对外提供服务,宕机后VIP自动漂移到备机上。安全

优势是对客户端毫无影响,仍然经过VIP操做。服务器

缺点也很明显,在绝大多数时间内备机是一直没使用,被浪费着的。架构

主从方式

这种采起一主多从的办法,主从之间进行数据同步。 当Master宕机后,经过选举算法(Paxos、Raft)从slave中选举出新Master继续对外提供服务,主机恢复后以slave的身份从新加入。并发

主从另外一个目的是进行读写分离,这是当单机读写压力太高的一种通用型解决方案。 其主机的角色只提供写操做或少许的读,把多余读请求经过负载均衡算法分流到单个或多个slave服务器上。负载均衡

缺点是主机宕机后,Slave虽然被选举成新Master了,但对外提供的IP服务地址却发生变化了,意味着会影响到客户端。 解决这种状况须要一些额外的工做,在当主机地址发生变化后及时通知到客户端,客户端收到新地址后,使用新地址继续发送新请求。异步

(2)数据同步

不管是主备仍是主从都牵扯到数据同步的问题,这也分2种状况:

同步方式:当主机收到客户端写操做后,以同步方式把数据同步到从机上,当从机也成功写入后,主机才返回给客户端成功,也称数据强一致性。 很显然这种方式性能会下降很多,当从机不少时,能够不用每台都同步,主机同步某一台从机后,从机再把数据分发同步到其余从机上,这样提升主机性能分担同步压力。 在Redis中是支持这杨配置的,一台master,一台slave,同时这台salve又做为其余slave的master。

异步方式:主机接收到写操做后,直接返回成功,而后在后台用异步方式把数据同步到从机上。 这种同步性能比较好,但没法保证数据的完整性,好比在异步同步过程当中主机忽然宕机了,也称这种方式为数据弱一致性。

Redis主从同步采用的是异步方式,所以会有少许丢数据的危险。还有种弱一致性的特例叫最终一致性,这块详细内容可参见CAP原理及一致性模型。

(3)方案选择

keepalived方案配置简单、人力成本小,在数据量少、压力小的状况下推荐使用。 若是数据量比较大,不但愿过多浪费机器,还但愿在宕机后,作一些自定义的措施,好比报警、记日志、数据迁移等操做,推荐使用主从方式,由于和主从搭配的通常还有个管理监控中心。

宕机通知这块,能够集成到客户端组件上,也可单独抽离出来。 Redis官方Sentinel支持故障自动转移、通知等,详情见低成本高可用方案设计(四)。

逻辑图:

clipboard.png

2、分布式

分布式(distributed), 是当业务量、数据量增长时,能够经过任意增长减小服务器数量来解决问题。

集群时代

至少部署两台Redis服务器构成一个小的集群,主要有2个目的:

高可用性:在主机挂掉后,自动故障转移,使前端服务对用户无影响。

读写分离:将主机读压力分流到从机上。

可在客户端组件上实现负载均衡,根据不一样服务器的运行状况,分担不一样比例的读请求压力。

逻辑图:

clipboard.png

三,分布式集群时代

当缓存数据量不断增长时,单机内存不够使用,须要把数据切分不一样部分,分布到多台服务器上。

可在客户端对数据进行分片,数据分片算法详见C#一致性Hash详解、C#之虚拟桶分片。

逻辑图:

clipboard.png

大规模分布式集群时代

当数据量持续增长时,应用可根据不一样场景下的业务申请对应的分布式集群。 这块最关键的是缓存治理这块,其中最重要的部分是加入了代理服务。 应用经过代理访问真实的Redis服务器进行读写,这样作的好处是:

避免愈来愈多的客户端直接访问Redis服务器难以管理,而形成风险。

在代理这一层能够作对应的安全措施,好比限流、受权、分片。

避免客户端愈来愈多的逻辑代码,不但臃肿升级还比较麻烦。

代理这层无状态的,可任意扩展节点,对于客户端来讲,访问代理跟访问单机Redis同样。

目前楼主公司使用的是客户端组件和代理两种方案并存,由于经过代理会影响必定的性能。 代理这块对应的方案实现有Twitter的Twemproxy和豌豆荚的codis。

逻辑图:

clipboard.png

四,总结

分布式缓存再向后是云服务缓存,对使用端彻底屏蔽细节,各应用自行申请大小、流量方案便可,如淘宝OCS云服务缓存。

分布式缓存对应须要的实现组件有:

  • 一个缓存监控、迁移、管理中心。
  • 一个自定义的客户端组件,上图中的SmartClient。
  • 一个无状态的代理服务。
  • N台服务器。

本文的重点是你有没有收获与成长,其他的都不重要,但愿读者们能谨记这一点。同时我通过多年的收藏目前也算收集到了一套完整的学习资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货,但愿对想成为架构师的朋友有必定的参考和帮助

须要更详细架构师技能思惟导图和如下资料的能够加一下技术交流分享群:“708 701 457”免费获取




相关文章
相关标签/搜索