互联网技术有两大支点,其中之一就是缓存,分布式缓存系统是大规模互联网应用的有力武器。面对不断增长的数据量、不可预测的流量模式和快速响应时间,云计算服务的动态特性是一个关键优势。那么,当云服务融入到分布式缓存系统架构中,会碰撞出什么样的火花呢?大型互联网应用中的缓存首先回顾一下大型互联网应用中缓存的架构(如图1所示)。在网站开发过程中,业务量的增长是喜忧参半,缓存技术是解忧的灵丹妙药。又可以理解为啥缓存为王了。图1缓存在大型网站系统中的应用事实上,此时的系统已经进入了大型网站无级伸缩的阶段。当网站流量增加时,解决方案是不断增加网站服务器、数据库服务器和缓存服务器。如何动态增减服务器,这就是云服务派上用场的地方。云服务的优势对于企业来说,云服务有很多业务优势。首先,企业的前期基础设施投资几乎为零。如果要搭建一个大型系统,可能需要在机房、硬件(机架、服务器、路由器、备用电源)、硬件管理(电源管理、散热)和运维人员等方面进行大量投资。由于前期成本高,该项目通常需要多轮管理层批准和论证才能开始。使用公共云服务,几乎没有固定成本或启动成本。其次,云服务提供了基础设施的即时性。过去,当互联网应用开始大规模扩展时,如果基础设施跟不上规模增长,应用的成功将受到很大影响。但如果前期投入大量资金,应用不普及,基础设施就会成为失败的牺牲品。云服务增加了灵活性,降低了风险和运营成本,并且可以根据用于增长的规模按需付费。最后,云服务可以更有效地使用资源,根据使用情况计算成本,并缩短产品上市时间。云服务的技术优势也很明显,主要特点如下:自动化:基础设施的脚本化可以充分利用API对基础设施进行编程,完成构建和系统部署的可重复性。自动扩展:无需任何人工干预,应用可根据需求进行双向扩展。自动缩放提高了自动化程度,从而提高了效率。主动扩展:基于对需求预期和流量模式的合理规划,实现应用的双向扩展,保持低成本运营。更高效的开发周期:开发和测试环境可以轻松复制到生产系统,不同阶段的环境可以轻松下线到生产系统。改进的可测试性:无需硬件过载测试,注入和自动化测试可以在开发过程的所有阶段继续进行。灾难恢复和业务连续性:云服务为维护一系列应用服务器和数据存储提供低成本选择。使用云服务,可以在几分钟内将一个地方的环境复制到其他地区的云环境中。云服务的选择有很多,比如阿里云、百度云、腾讯云等,但AWS作为云服务的商业鼻祖,有很多独到之处,应用也很广泛。AWS云服务以极低的支持和管理成本,通过高度可靠和可扩展的基础设施提供了Web应用程序部署的解决方案,这比自建基础设施灵活得多,无论这些设施是否部署在企业内部环境中数据中心设施。EVCache:基于云服务的分布式缓存系统云服务不仅为软件系统的开发和部署带来了更多的敏捷性,也为创新提供了更多的可能性。AWS云服务与分布式缓存服务系统的结合产生了一些优秀的技术解决方案。一个典型的案例是Netflix的EVCache。EVCache是??一个开源的、快速的分布式缓存,一个基于Memcached内存存储和Spymemcached客户端实现的解决方案。它主要用于亚马逊弹性计算云服务(AWSEC2)的基础设施上。它针对云计算进行了优化,可以流畅高效地交付数据层服务。EVCache是一个首字母缩写词,包括:短暂的:数据存储是短暂的,有自己的生命周期。Volatile:数据随时可能消失。缓存:内存中的键值存储系统。EVCache实现的主要功能包括分布式键值对存储、AWS的跨区域数据复制、新节点或新服务的注册和自动发现。EVCache的一个典型应用是对上下文一致性要求不高的场景。它的可扩展性已经可以处理非常大的流量,而且它还提供了一个健壮的API。Netflix是微服务架构领域的实践者,在系统中部署了上百个微服务,每个微服务只关注一件事。这使得Netflix提供的软件系统具有高度平衡和松散耦合的特点。由于状态存储在缓存或持久存储中,因此这些微服务中的大多数都是无状态的,并且易于自动扩展。EVCache是Netflix中广泛使用的数据缓存服务。提供的低延迟高可用的缓存方案可以很好的满足Netflix微服务架构的需求,也可以用于通用的数据存储。EVCache使面向最终用户的应用程序、个性化算法和各种微服务具有出色的性能。EVCache具有以下特点:分布式键值对存储,缓存可以跨多个实例数据可以跨亚马逊云服务可用区复制注册Netflix内部命名服务,自动发现新的节点和服务为了存储数据,键为非空字符串,取值可以是非空字节数组、基本类型或序列化对象,且小于1MB。它被各种应用程序用作通用缓存集群,支持可选的缓存名称,并使用命名空间来避免主键冲突。一般缓存失败率在99%以上,可以很好的配合Netflix常驻数据框架。典型的访问顺序是:Memory->EVCache->Cassandra/SimpleDB/S31EVCache。CS架构的EVCache客户端是一个Java客户端。它用于发现EVCache服务器并管理所有CRUD(CRUD)操作,这些操作由客户端处理以添加/删除集群中的服务器。客户端在基于AmazonWebServices可用性区域执行创建、更新和删除操作时复制数据。另一方面,客户端读取操作直接从同一可用性区域中的服务器读取数据。图2展示了EVCache的典型部署结构和单节点客户端实例与服务器的关系。图2EVCache单节点客户端实例与服务器的关系一个EVCache客户端连接多个EVCache服务器集群。在一个区域内,Netflix拥有完整数据集的多个副本,由AmazonWebServices可用性区域分隔。虚线框表示区域内的副本,每个副本都包含数据的完整图像,作为AWS自动扩展组进行管理。有些缓存在一个区域中有两个镜像,有些则有更多。这种高层架构从长远来看是有效的,不会改变。每个客户端连接到其所在区域中所有可用区中的所有服务器。写操作发送到所有实例,读操作优先选择离读请求最近的服务器。2EVCache跨区域复制Netflix的全球云服务分布在AWS的各个服务区域,如北弗吉尼亚、俄勒冈和爱尔兰,为这些区域的会员改善就近服务,但网络流量会因为各种原因发生变化,比如关键基础设施问题故障,或者区域之间的故障恢复练习等,所以Netflix使用无状态应用服务器来服务来自任何区域的会员。如果这个数据是从持久层存储中获取,会非常昂贵(导致频繁访问数据库),Netflix需要将这个数据写入本地缓存,并且必须复制到所有区域的缓存中才能服务于用户请求在每个地区。微服务依赖于缓存,必须快速可靠地访问各种类型的数据,例如会员的观看历史、排名和个性化推荐。这些数据的更新和更改必须复制到世界所有地区,以便这些地区的用户能够快速可靠地访问。图3EVCache跨地域数据复制该图说明复制操作是在SET操作之后实现的。应用程序调用EVCache客户端库的set方法,然后拷贝路径对调用者是透明的:EVCache客户端库发送SET到缓存系统本地的一个实例服务器中的EVCache客户端库会同时将元数据(包括key,但不包括自己要缓存的数据)写入复制消息队列(Kafka),本地的复制中继服务会从读取这个消息队列中的消息中继服务抓取数据匹配本地缓存中的键。中继服务将向另一个区域的复制中继服务发送SET请求。在另一个区域,复制中继服务会接受Request,然后对其本地缓存执行SET操作,完成对接收区域本地应用的复制。GET操作后,更新的数据值将在本地缓存中看到。这是一个简单的描述。需要注意的是,它只对SET操作有效,对于DELETETOUCH或batchmutation等其他操作不会被复制。DELETE和TOUCH非常相似,只有一个区别:它们不从本地缓存中读取现有值。跨地域复制主要通过消息队列进行。一个区域的EVCache客户端不会注意到其他区域的复制情况。它只使用本区域的缓存进行读写,不会与其他区域的缓存耦合。它将通过消息系统解耦。.3EVCache的高可用每个AWS区域一般由多个可用区(AZ)组成,一个AZ一般由多个数据中心组成。AWS引入可用区设计主要是为了提高用户应用的高可用性。因为可用区被设计成相互独立的,也就是说,它们会有独立的供电、独立的网络等,这样如果一个可用区出现问题,不会影响到另一个可用区。在一个区域中,可用性区域通过高速网络连接以确保非常低的延迟。EVCache实例可以通过将AmazonEC2放置在多个可用区中来防止应用程序出现单点故障。在多个可用区上运行独立的应用程序非常重要,无论是在同一个物理区内还是在不同的物理区之间。如果一个可用区发生故障,其他可用区中的应用程序可以继续运行,从而实现高可用性。因为跨越多个亚马逊云服务可用区,所以EVCache集群不会挂掉。当其中一个实例意外挂掉时,缓存的影响会通过一致性哈希在集群中进行分片来最小化。在保持高可用性的同时,运行一个EVCache集群的整体成本很低,因为在缓存不活跃的情况下访问亚马逊云服务的成本很高,比如在EC2上访问SimpleDB、AWSS3、Cassandra等.EVCache集群在高稳定性和线性扩展的情况下,整体成本令人满意。隐藏在需求背后的是数据或状态所需的按请求服务,这些服务必须跨区域可用。高可靠数据库和高性能缓存是支持分布式架构的基础设施。一个典型的场景是在数据库或其他持久存储之前部署缓存。如果没有缓存的全局复制,当一个区域的成员切换到另一个区域时,新区域的缓存中将没有原区域的数据。这种情况称为冷缓存。处理这种缓存数据丢失的唯一方法就是从数据库重新加载,但是这种方法会延长响应时间,对数据库造成巨大的影响。除了跨可用区复制,EVCache还提供跨区域复制。可用性得到了增强。4EVCache典型应用场景Netflix的用户体验非常依赖大容量、低延迟、全局可用的缓存数据层。例如,当用户坐在沙发上看电影或电视节目时,每一次用户交互都有一个缓存,从会话存储到视频历史再到用户状态,都得益于EVCache的稳定性和高容错性。这是一个典型的用例——向用户推荐与他们在历史上看过的电影或电视节目相似的电影或电视节目。图4介绍了推荐相似内容的服务流程以及EVCache在其中的作用。图4.使用EVCache推荐相似内容的典型用例。内容相似度推荐服务提供与观看历史中的节目相似的电影或电视节目的相似度列表。一旦计算出相似度,它就会存储在SimpleDB/S3中,并使用EVCache作为前端。当任何应用程序或算法需要数据时,它可以从EVCache中提取数据并返回结果。具体过程如下:客户端向Web应用程序发送页面请求,处理该请求需要获取电影或电视节目的相似度列表。99.9%如果缓存中没有***,web应用会调用相似度计算服务来计算数据。如果计算出的数据中没有***,相似度计算服务会从SimpleDB中读取数据。如果SimpleDB中没有数据,相似度计算服务会根据给定的电影或电视节目重新计算相似度。相似度计算服务对电影或电视节目的数据进行计算后,将数据写入EVCache***,相似度计算服务生成客户端需要的响应返回给客户端。EVCache是线性可扩展的。通过容量监控,一分钟内完成扩容,几分钟内完成再平衡和数据预热。
