可靠的分布式计算系统和应用程序已成为杰出业务的基石,尤其是在自动化和管理关键任务业务流程以及向客户提供服务方面。作为这些系统和应用程序的开发人员和系统管理员,您应该提供各种信息技术(IT)解决方案,以确保您拥有最有效的系统。
这包括诸如为系统/应用程序性能,可靠性,可用性和可伸缩性设计,测试和实施策略的任务,以为最终用户提供令人满意的服务水平。缓存是您可以依赖的许多非常基本但有效的应用程序交付技术之一。在进一步介绍之前,让我们简单地看一下什么是缓存,在哪里和/或如何应用缓存以及它的好处?
什么是缓存或内容缓存?
缓存(或称为内容缓存)是一种广泛使用的技术,它将数据的副本存储在临时存储位置(也称为缓存)中,因此与从原始存储中检索数据相比,可以轻松,快速地访问数据。根据缓存的类型和目的,存储在缓存中的数据可能包括文件或文件片段(例如HTML文件,脚本,图像,文档等),数据库操作或记录,API调用,DNS记录等。
缓存可以采用硬件或软件的形式。基于软件的缓存(这是本文的重点)可以在应用程序堆栈的不同层上实现。
缓存可以在客户端侧被施加(或在应用程序展现层)中,例如,浏览器高速缓存或高速缓存的应用程序(或离线模式)。大多数(如果不是全部)现代浏览器都附带有HTTP缓存的实现。当您访问Web应用程序以使您能够查看网站或应用程序上的最新数据或内容,而不是浏览器使用本地存储的内容的旧副本时,您可能已经听说过流行的短语“ 清除缓存 ”。
客户端缓存的另一个示例是DNS缓存,它发生在操作系统(OS)级别。它是有关操作系统或Web浏览器先前DNS查找的信息的临时存储。
也可以通过代理在LAN或WAN中的网络级别上实现缓存。这种缓存的一个常见示例是CDN(内容分发网络),它是Web代理服务器的全局分布式网络。
第三,您还可以在源服务器或后端服务器上实现缓存。服务器级缓存有多种形式,包括:
- Web服务器缓存(用于缓存图像,文档,脚本等)。
- 应用程序缓存或记忆(用于从磁盘读取文件,从其他服务或进程读取数据或从API请求数据等)。
- 数据库缓存(提供对常用数据(例如请求的数据库行,查询结果和其他操作)的内存访问)。
- 请注意,缓存数据可以存储在任何存储系统中,包括数据库,文件,系统内存等,但是应该是比主要源更快的介质。在这方面,内存缓存是最有效和最常用的缓存形式。
为什么要使用缓存?
缓存具有许多优点,包括:
- 在数据库级别,它将缓存数据的读取性能提高到微秒。您还可以使用回写式高速缓存来提高写入性能,在这种情况下,数据以指定的间隔写入内存,然后再写入磁盘或主存储器。但是它的数据完整性方面可能会带来灾难性的影响。例如,当系统在即将数据提交到主存储之前崩溃时。
- 在应用程序级别,缓存可以在应用程序进程本身中存储频繁读取的数据,从而将数据查找时间从几秒钟减少到几微秒,尤其是在网络上。
- 考虑到整个应用程序和服务器的性能,缓存有助于减少服务器的负载,延迟和网络带宽,因为缓存的数据被提供给客户端,从而提高了响应时间和向客户端的交付速度。
- 缓存还允许内容可用性(尤其是通过CDN),以及许多其他好处。
在本文中,我们将回顾一些用于在Linux中实现服务器端缓存的顶级开源工具(应用程序/数据库缓存和代理服务器缓存)。
1. Redis
Redis(完整的REmote DIctionary Server)是一种免费,开源,快速,高性能,灵活的分布式内存计算系统,可以从大多数(即使不是全部)编程语言中使用。
它是一个内存数据结构存储,可充当缓存引擎,内存持久磁盘上数据库和消息代理。尽管Redis在Linux(推荐的部署平台)和OS X上进行了开发和测试,但Redis还可在其他POSIX系统(例如* BSD)中运行,而没有任何外部依赖性。
Redis支持许多数据结构,例如字符串,哈希,列表,集合,排序集合,位图,流等。这使程序员可以使用特定的数据结构来解决特定的问题。它支持对其数据结构的自动操作,例如追加到字符串,将元素推送到列表,增加哈希值,计算集合交集等。
它的主要功能包括Redis主从复制(默认情况下是异步的),使用Redis Sentinel提供的高可用性和自动故障转移,Redis集群(您可以通过添加更多集群节点来水平扩展)和数据分区(在多个Redis实例之间分配数据) )。它还具有对事务,Lua脚本,一系列持久性选项以及客户端-服务器通信加密的支持。
作为一个内存中但持久的磁盘数据库,Redis在与内存中数据集配合使用时表现最佳。但是,您可以将其与磁盘数据库一起使用,例如MySQL,PostgreSQL等。例如,您可以在Redis中获取大量写操作的小数据,并将其他数据块保留在磁盘数据库中。
Redis通过多种方式支持安全性:一种是使用“ 保护模式 ”功能来保护Redis实例不被外部网络访问。它还支持客户端-服务器身份验证(在服务器中配置密码并在客户端中提供密码)以及所有通信通道(例如客户端连接,复制链接和Redis Cluster总线协议等)上的TLS。
Redis有很多用例,包括数据库缓存,全页缓存,用户会话数据管理,API响应存储,发布/订阅消息传递系统,消息队列等等。这些可以应用于游戏,社交网络应用程序,RSS提要,实时数据分析,用户推荐等。
2. Memcached
Memcached是一个免费,开源,简单但功能强大的分布式内存对象缓存系统。它是内存中的键值存储区,用于存储小块数据,例如数据库调用,API调用或页面呈现的结果。它可以在类似Unix的操作系统(包括Linux和OS X)上运行,也可以在Microsoft Windows上运行。
作为开发人员工具,它旨在通过缓存内容(默认情况下为最近最少使用(LRU)缓存)来提高动态Web应用程序的速度,从而减少磁盘上数据库的负载–它充当以下任务的短期内存应用程序。它提供了最流行的编程语言的API。
Memcached支持将字符串作为唯一的数据类型。它具有客户端-服务器体系结构,其中一半逻辑发生在客户端,另一半发生在服务器端。重要的是,客户了解如何为项目选择要写入或读取的服务器。另外,如果客户端无法连接到服务器,则客户端非常了解该怎么办。
尽管它是一个分布式缓存系统,因此支持群集,但Memcached服务器彼此断开连接(即,它们彼此之间不知道)。这意味着没有像Redis这样的复制支持。他们还了解如何存储和获取项目,管理何时驱逐或重新使用内存。您可以通过添加更多服务器来增加可用内存。
从Memcached 1.5.13开始,它支持通过TLS进行身份验证和加密,但是此功能仍处于试验阶段。
3. Apache Ignite
Apache Ignite,也是一种免费的开放源代码,可水平扩展的分布式内存中键值存储,高速缓存和多模型数据库系统,它提供了强大的处理API,可用于在分布式数据上进行计算。它也是一个内存中的数据网格,可以在内存中使用,也可以与Ignite本机持久性一起使用。它可以在类似UNIX的系统(例如Linux和Windows)上运行。
它具有多层存储,完整的SQL支持和跨多个群集节点的ACID(原子性,一致性,隔离性,耐久性)事务(仅在键值API级别上受支持),共处一地处理和机器学习。它支持与任何第三方数据库(包括任何RDBMS(例如MySQL,PostgreSQL,Oracle数据库等)或NoSQL存储)的自动集成。
重要的是要注意,尽管Ignite用作SQL数据存储,但它并不完全是SQL数据库。与传统数据库相比,它可以明显地处理约束和索引。它支持主索引和辅助索引,但是只有主索引用于强制唯一性。此外,它不支持外键约束。
Ignite还通过允许您在服务器上启用身份验证并在客户端上提供用户凭据来支持安全性。还支持SSL套接字通信,以在所有Ignite节点之间提供安全连接。
Ignite有许多用例,包括缓存系统,系统工作负载加速,实时数据处理和分析。它也可以用作以图形为中心的平台。
4. Couchbase服务器
Couchbase Server还是一个开放源代码,分布式,NoSQL面向文档的参与数据库,以键-值格式将数据存储为项目。它可以在Linux以及Windows和Mac OS X等其他操作系统上运行。它使用功能丰富,面向文档的查询语言称为N1QL,该语言提供了强大的查询和索引服务,以支持对数据的亚毫秒级操作。
它的显着特点是具有托管缓存的快速键值存储,专用索引器,强大的查询引擎,横向扩展体系结构(多维扩展),大数据和SQL集成,全栈安全性和高可用性。
Couchbase Server带有本机多实例集群支持,集群管理器工具可协调所有节点活动,并仅向客户端提供集群范围的接口。重要的是,您可以根据需要添加,删除或替换节点,而无需停机。它还支持跨集群节点的数据复制,跨数据中心的选择性数据复制。
它使用专用的Couchbase服务器端口,不同的身份验证机制(使用凭据或证书),基于角色的访问控制(以检查每个经过身份验证的用户来检查分配给他们的系统定义的角色),审计,日志和会话,通过TLS实现安全性。
它的用例包括统一的编程界面,全文本搜索,并行查询处理,文档管理和索引等等。它是专门为大型交互式Web,移动和IoT应用程序提供低延迟数据管理而设计的。
5. Hazelcast IMDG
Hazelcast IMDG(内存中数据网格)是一种开源,轻量级,快速且可扩展的内存中数据网格中间件,可提供弹性可扩展的分布式内存中计算。Hazelcast IMDG还可以在Linux,Windows和Mac OS X以及安装了Java的任何其他平台上运行。它支持各种灵活的语言本机数据结构,例如Map,Set,List,MultiMap,RingBuffer和HyperLogLog。
Hazelcast是对等的,并支持简单的可伸缩性,集群设置(具有用于收集统计信息,通过JMX协议进行监视以及使用有用的实用程序管理集群的选项),分布式数据结构和事件,数据分配和事务的功能。这也是冗余的,因为它可以将每个数据条目的备份保留在多个成员上。要扩展群集,只需启动另一个实例,数据和备份就会自动且均匀地平衡。
它提供了一组有用的API来访问群集中的CPU,以实现最大处理速度。它还提供了来自Java的大量开发人员友好接口的分布式实现,例如Map,Queue,ExecutorService,Lock和JCache。
它的安全功能包括群集成员和客户端身份验证,以及通过基于JAAS的安全功能对客户端操作进行访问控制检查。它还允许拦截客户端执行的套接字连接和远程操作,集群成员之间的套接字级别通信加密以及启用SSL / TLS套接字通信。但是根据官方文档,其中大多数安全功能都在企业版中提供。
它最流行的用例是分布式内存中缓存和数据存储。但是,它也可以部署用于Web会话集群,NoSQL替换,并行处理,简单的消息传递等等。
6.Mcrouter
Mcrouter是一个免费的开源Memcached协议路由器,用于扩展由Facebook开发和维护的Memcached部署。它具有Memcached ASCII协议,灵活的路由,多集群支持,多级缓存,连接池,多种哈希方案,前缀路由,复制池,生产流量影子,在线重新配置以及目标运行状况监视/自动故障转移的功能。
此外,它支持冷缓存预热,丰富的统计信息和调试命令,可靠的删除流服务质量,较大的值,广播操作,并具有IPv6和SSL支持。
它已在Facebook和Instagram中用作缓存基础结构的核心组件,高峰时每秒处理近50亿个请求。
7.Varnish Cache
Varnish Cache是一种开放源代码的灵活,现代且多功能的Web应用程序加速器,位于Web客户端和原始服务器之间。它可以在所有现代Linux,FreeBSD和Solaris(仅x86)平台上运行。它是一个出色的缓存引擎和内容加速器,您可以将其部署在Web服务器(例如NGINX,Apache等)的前面,以侦听默认的HTTP端口,以接收客户端请求并将其转发到Web服务器,并交付Web服务器响应客户端。
在客户端和原始服务器之间充当中间人的同时,Varnish Cache提供了许多好处,其基本要素是将Web内容缓存在内存中,以减轻Web服务器的负载并提高向客户端的交付速度。
从客户端收到HTTP请求后,它将请求转发到后端Web服务器。Web服务器响应后,Varnish将内容缓存在内存中,并将响应传递给客户端。当客户端请求相同的内容时,Varnish将从缓存提升应用程序响应中提供该内容。如果它不能提供缓存中的内容,则将请求转发到后端,然后将响应缓存并传递给客户端。
Varnish具有VCL(Varnish配置语言,一种灵活的域特定语言),用于配置请求的处理方式以及Varnish模块(VMODS),这些模块是Varnish Cache的扩展。
在安全方面,Varnish Cache支持通过VMODS进行日志记录,请求检查以及限制,身份验证和授权,但缺少对SSL / TLS的本机支持。您可以使用Hitch或NGINX 等SSL / TLS代理为Varnish Cache 启用HTTPS。
您还可以将Varnish Cache用作Web应用程序防火墙,DDoS攻击防御程序,热链接保护程序,负载平衡器,集成点,单点登录网关,身份验证和授权策略机制,用于不稳定后端的快速修复程序以及HTTP请求路由器。
8.Squid
Squid是另一个针对Linux的免费,开源,出色且广泛使用的代理和缓存解决方案。它是功能丰富的Web代理缓存服务器软件,可为流行的网络协议(包括HTTP,HTTPS和FTP)提供代理和缓存服务。它还可以在其他UNIX平台和Windows上运行。
就像Varnish Cache一样,它接收来自客户端的请求并将它们传递到指定的后端服务器。后端服务器响应时,会将内容的副本存储在缓存中,然后将其传递给客户端。将来对相同内容的请求将从缓存中得到处理,从而将内容更快地传递到客户端。因此,它优化了客户端和服务器之间的数据流以提高性能,并缓存常用内容以减少网络流量并节省带宽。
Squid具有一些功能,例如在代理服务器的相互通信的层次结构上分配负载,生成有关Web使用模式的数据(例如,有关访问量最大的站点的统计信息),使您能够分析,捕获,阻止,替换或修改代理的消息。
它还支持安全功能,例如丰富的访问控制,授权和身份验证,SSL / TLS支持以及活动日志记录。
9. NGINX
NGINX(发音为Engine-X)是一种开放源代码,高性能,功能齐全且非常流行的整合解决方案,用于设置Web基础架构。它是HTTP服务器,反向代理服务器,邮件代理服务器和通用TCP / UDP代理服务器。
NGINX提供基本的缓存功能,其中缓存的内容存储在磁盘上的持久性缓存中。NGINX中有关内容缓存的有趣之处在于,当它无法从原始服务器获取新鲜内容时,可以将其配置为从其缓存中传递陈旧的内容。
NGINX提供了多种安全功能来保护您的Web系统,包括SSL终止,使用HTTP基本身份验证限制访问,基于子请求结果的身份验证,JWT身份验证,限制对代理HTTP资源的访问,按地理位置限制的访问,以及更多。
它通常被部署为应用程序堆栈中的反向代理,负载平衡器,SSL终结器/安全网关,应用程序加速器/内容缓存和API网关。它还用于流媒体。
10. Apache Traffic Server
最后但并非最不重要的一点是,我们有Apache Traffic Server,这是一个开源,快速,可扩展且可扩展的缓存代理服务器,支持HTTP / 1.1和HTTP / 2.0。它旨在通过为企业,ISP(Internet服务器提供商),骨干网提供商等在网络边缘缓存经常访问的内容来提高网络效率和性能。
它支持HTTP / HTTPS通信的正向和反向代理。它也可以配置为同时以一种或两种模式运行。它具有持久性缓存,插件API;支持ICP(Internet缓存协议),ESI(包括边);保持活跃等等。
在安全性方面,Traffic Server支持控制客户端访问,方法是允许您配置允许使用代理缓存的客户端,客户端与自身之间以及自身与原始服务器之间的连接的SSL终止。它还通过插件支持身份验证和基本授权,日志记录(接收到的每个请求和检测到的每个错误)以及监视。
Traffic Server可以用作Web代理缓存,正向代理,反向代理,透明代理,负载均衡器或在缓存层次结构中使用。
结束语
缓存是最有益且历史悠久的Web内容交付技术之一,其主要目的是提高网站或应用程序的速度。由于将缓存的数据提供给客户端,因此它有助于减少服务器负载,延迟和网络带宽,从而提高了应用程序响应时间和向客户端的交付速度。