抱歉,你查看的文章不存在

浅谈互联架构下的各种缓存技术

面对巨大的客户端访问量冲击,怎么办?

当业务系统收到突发大流量冲击的时候,怎么办?例如,双十一、双十二,银行遇到的突发交易请求;或者网站遇到突发流量访问,怎么处理?

体现到IT技术上,就是设置多级缓存,层层缓解前端的巨大访问量。等巨大的流量传到应用上时,其“掌力”已经被抵消很多。

缓存的技术有很多种,如:

第一类:客户端:1.浏览器缓存 2.客户端应用缓存

其中浏览器的缓存,我们经常会清除的。

客户端应用缓存,指的是在一些大型促销之前,将App要访问的素材提前下发到客户端进行缓存。

第二类:客户端网络: 代理服务器开启缓存

第三类:广域网:1.使用代理服务器(含CDN);2.使用镜像服务器 .3.使用P2P技术

广域网中,CDN应用的比较多。

CDN的两种机制是:推送(源站数据变化以后,主动推送到边缘节点)和拉取(先访问边缘节点,没有内容时,回到源服务器拿内容)。

第四类:源站及源站网站:1.接入层缓存机制 2.应用层缓存机制 3.分布式缓存 4.静态化、伪静态化 5.使用操作系统缓存。

1.接入层缓存:可以使用Nginx/Haproxy等

2.应用层缓存:是在应用服务器上部署一套Redis,称之为local redis cache。也就是说,应用直接读取本机redis获取数据。应用服务器读取本地redis,适用于数据量访问不是特别大的情况。如果特别大,则需要使用分布式缓存。

3.分布式缓存:如果数据访问量达到单个应用服务器无法承受,则需要使用分部署redis缓存。

目前分布式缓存,比较流行的就是redis。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

接下来,本文主要介绍接入层缓存、应用层缓存和分布式缓存。

正向代理和反向代理

在正式介绍接入层缓存之前,我想简单介绍一下正向代理和反向代理,这两个与软负载关系很大的概念。

正向代理的概念很抽象:正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

但其实,正向代理我们用的很多,比如可以通过Chrome的SwitchSharp,可以上网(具体情况我不解释了)。

看了上面两个截图,大家应该就明白什么是正向代理了。

而反向代理:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。这个服务器没有保存任何网页的真实数据,所有的静态网页或者CGI程序,都保存在内部的Web服务器上。因此对反向代理服务器的攻击并不会使得网页信息遭到破坏,这样就增强了Web服务器的安全性。

反向代理经常和CDN一起工作。CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置反向代理节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

所以简单一句话:正向代理是解决的是客户端访问互联网的问题;反正代理解决的是,互联网收到客户端请求,如何把请求转到内网服务器的问题。

接入层缓存

目前能够做软负载的技术,主要有三种LVS、haproxy、NGINX三种。

我们对三种软负载进行对比:

方案名称

使用层面

优势

劣势

LVS

四层

抗负载能力强、工作稳定、无流量、应用范围比较广

不支持正则表达式处理,不能做动静分离

Haproxy

四层到七层

支持http类应用和HAProxy和TCP协议、负载均衡策略丰富、负载均衡性能高、速度快。

反向代理能力若于Nginx

Nginx

七层

对网络稳定性的依赖非常、中层反向代理能力强

仅能支持http、https和Email协议、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测、不支持Session的直接保持

关于软负载使用的建议:

方案建议

发展的趋势对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术:

第一阶段:业务规模不大,使用单点软负载

利用Nginx或者HAProxy进行单点的负载均衡。如果在Openshift部署,可以利用K8S中的rc保证其高可用。

第二阶段业务规模扩大,单点软负载已经不能满足需求

随着网络服务进一步扩大,这时单点的Nginx已经不能满足,这时使用LVS或者商用负载均衡就是首要选择,Nginx/Haproxy此时就作为LVS或者 F5的节点来使用。

最终形成比较理想的状态为:F5/LVS<—>Haproxy<—>AppServer。

笔者的建议是,对于金融行业对软负载有一定性能要求的场景,可以使用LVS+HAproxy两层架构来实现软负载。这样做到了将LVS和HAproxy做到优势互补,架构又比较简洁。

在技术支持方面,可以通过购买红帽RHEL订阅加一定量的人天服务,作为技术保障,为客户托底。

红帽的Openshift内部集成的软负载,是Haproxy。这个haproxy,是由一个pod提供的。

在openshift中,每个计算节点(node)最多运行一个router。多个router之间可以做负载均衡。当然,这就要求多个router前面再放一个负载均衡器。可以是软负载,也可以是硬负载。

我们登录到这个router容器中,可以看到haproxy的配置文件:

查看这个配置文件,这个配置文件分为5段:global、Default、frontened、backend、listen。

全局设置:

默认设置:

对前端配置:

对后端配置:

监听状态:

应用层缓存与分布式缓存

应用层缓存:是在应用服务器上部署一套Redis,称之为local redis cache。也就是说,应用直接读取本机redis获取数据。应用服务器读取本地redis,适用于数据量访问不是特别大的情况。如果特别大,则需要使用分布式缓存。

分布式缓存:如果数据访问量达到单个应用服务器无法承受,则需要使用分部署redis缓存。

目前分布式缓存,比较流行的就是redis。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis集群部署方式

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自懂切换。

Sentinel它的主要功能有以下几点:

  • 不时地监控redis是否按照预期良好地运行;
  • 如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);
  • 能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。

目前Redis集群有多种部署方案:

方案一:全套Sentinel主备监控切换功能

此方案存在以下优点:

  • 官方2.8之后的主流方案。存在大量案例经受考验。
  • 有人贡献单独的console进行管理。

此方案存在以下缺点:

  • 应用端须采用Sentinel的接入方式,对现有接口API部分需要进行调整。
  • 同时目前jedis版本不支持同时支持Sentinel和sharding。可能需要进行取舍。
  • 仲裁机制比较复杂。目前项目中可能采用更为简洁的方式就可以。部分Redis的切换依赖于自开发脚本;因主备切换存在丢失数据可能,因此对主备切换较为审慎的,采用人工审核确认后手动切换。
  • 需要独立部署Sentinel集群以监控Redis主从,从而引入更多的依赖。

方案二:Sentinel感应升主+F5感应并VIP切换

此方案存在以下优点:

  • 因为应用端不采用Sentinel的接入方式,对现有接口API部分不需要进行调整。

此方案存在以下缺点:

  • 和现有方案一样,F5和Sentinel无法同步协作,健康检测部分重复,对master的不可用确认,可能会存在时间差,从而对Redis主备提升的衔接出现问题。
  • 目前采用此种方式的案例比较少。

需要独立部署Sentinel集群以监控Redis主从,从而引入更多的依赖

方案三:Redis Cluster加主从切换

在Redis的3的大版本中,已经自带了Redis Cluster。除了主要提供分片集群的功能,还涵盖了sentinel中主从检测切换的功能。

此方案存在以下优点:

  • 因为应用端不采用Sentinel的接入方式,对现有接口API部分不需要进行调整。
  • 将主从选择和切换交由集群负责,免去原有架构中人工脚本或Sentinel外部的依赖
  • 部署结构相对简单,建议容器化处理

Redis在容器中的部署

红帽官方提供基于Openshift Redis Cluster镜像,可以直接使用,无需再人工配置。

部署Redis集群,至少需要三个分组:每组为主从备份方式部署。因此,至少需要6个节点。

Redis集群的结构如下图所示:(由于笔者实验环境有限,只有一个master和一个node,因此只展示成功部redis容器,不再展示部署redis cluster)

镜像名称:registry.access.redhat.com/rhscl/redis-32-rhel7

查找镜像:

下载镜像:

镜像下载完毕以后,可以在Openshift中创建项目:

但通常通过模板直接部署Redis 模板,下图是导入模板:

模板参数设置如下:

创建容器:

容器化redis创建好以后,可以很容易实现秒级扩展。

参考文献:

《亿级流量网站架构核心技术》张开涛

https://baike.baidu.com/item/%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86/9524799?fr=aladdin

https://baike.baidu.com/item/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/7793488?fr=aladdin

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Load_Balancer_Administration/ch-keepalived-overview-VSA.html#s1-lvs-basic-VSA

http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.performance.html

https://wenku.baidu.com/view/62eb30050740be1e650e9af4.html

http://www.ha97.com/5646.html

http://blog.csdn.net/gzh0222/article/details/8540604

http://blog.csdn.net/chengxuyuanyonghu/article/details/60468829

原文发布于微信公众号 - 大魏分享(david-share)

原文发表时间:2017-10-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

相关文章

来自专栏即时通讯技术

开源轻量级IM框架MobileIMSDK v3.0发布!

本次更新为主版本更新,更新内容包含了简化了消息发送目标的方式、支持Web版与APP版互通、优化了Protocal协议结构等主要升级,详细更新内容见“版本更新说明...

34010
来自专栏企鹅号快讯

使用Jest测试原生TypeScript项目

问题:我怎么才能收到你们公众号平台的推送文章呢? 最近写了一个wechat-colorpicker小项目。 主要是为了练习下TS。既然写了一个小库,我就想着顺便...

43360
来自专栏Java后端技术栈

小白入门:大型网站技术架构负载均衡技术介绍及学习资源推荐

十年间,负载均衡的前沿技术层出不穷,令用户眼花缭乱。经常在技术网站、文档中出现的“四层负载均衡”、“七层负载均衡”字眼有什么含义?有什么区别?对客户网络有哪些不...

10310
来自专栏杨建荣的学习笔记

Oracle中的PGA监控报警分析(r11笔记第96天)

最近接到一个数据库报警,让我颇有些意外,这是一个PGA相关的报警。听起来感觉是应用端的资源调用出了问题。 报警内容大体如下: 报警内容: PGA Alarm o...

40380
来自专栏DevOps时代的专栏

Hygieia 为何物?DevOps 利器也

一、前言碎语 Hygieia是什么? Capitalone(全美十大银行之一)开源的DevOps利器。 使用Hygieia后,在整个软件开发周期中,用户可以选择...

47060
来自专栏.net core新时代

开源任务管理平台TaskManager介绍

  很早之前准备写Quartz系列文章,现在终于能够实现了。从本篇开始将带你实现一款自己的任务管理平台。在工作中你曾经需要应用执行一个任务吗?这个任务每天或每周...

40990
来自专栏AI2ML人工智能to机器学习

轻度解释Cloud Foundry命令行

我们知道Cloud Foundry (CF)是一个PaaS平台。 CF命令行(CLI)作为开始部署使用CF云平台的用户来说,一个轻度的CF CLI的解释会是一...

12130
来自专栏Petrichor的专栏

git: 为什么 pull request 不叫 push request

在日常的开源社区使用中,有时候会遇到我 想要 协助修改 的 开源项目。这个时候,pull request(合并申请功能)就可以让原本 没有 该仓库 修改权限 ...

2.5K20
来自专栏FreeBuf

渗透测试系统BackBox Linux 4.1发布

BackBox是基于Ubuntu的Linux发行版,它是一款用于网络渗透测试及安全评估的操作系统。新版本包括Linux 3.13内核,EFI 模式,匿名模式,L...

26650
来自专栏张戈的专栏

在Linux中发现IP地址冲突的方法

Linux 下出现 IP 冲突,是不会像 Windows 那样,在右下角弹出冲突提示的。博主就出过一次糗,记得当时是在 VM 虚拟机里面安装了 4 个 redh...

44570

扫码关注云+社区

领取腾讯云代金券