整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

大型网站技术架构-入门梳理(建议收藏)

大型网站技术架构-入门梳理(建议收藏)

  • 本文是对《大型网站架构设计》(李智慧 著)一书的梳理,类似文字版的“思维导图”
  • 全文主要围绕“性能,可用性,伸缩性,扩展性,安全”这五个要素
  • 性能,可用性,伸缩性这几个要素基本都涉及到应用服务器,缓存服务器,存储服务器这几个方面

概述

  • 三个纬度:演化、模式、要素
  • 五个要素: 性能,可用性,伸缩性,扩展性,安全

演化历程

大型网站架构演化历程:

  1. 初始阶段的网站架构:一台服务器,上面同时拥有应用程序,数据库,文件,等所有资源。例如 LAMP 架构
  2. 应用和数据服务分离:三台服务器(硬件资源各不相同),分别是应用服务器,文件服务器和数据库服务器
  3. 使用缓存改善网站性能:分为两种,缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器的远程缓存
  4. 使用应用服务器集群改善网站并发处理能力:通过负载均衡调度服务器来将访问请求分发到应用服务器集群中的任何一台机器
  5. 数据库读写分离:数据库采用主从热备,应用服务器在写数据时访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库。应用服务器使用专门的数据访问模块从而对应用透明
  6. 使用反向代理和 CDN 加速网站响应:这两者基本原理都是缓存。反向代理部署在网站的中心机房,CDN 部署在网络提供商的机房
  7. 使用分布式文件系统和分布式数据库系统:数据库拆分的最后手段,更常用的是业务分库
  8. 使用 NoSQL 和搜索引擎:对可伸缩的分布式有更好的支持
  9. 业务拆分:将整个网站业务拆分成不同的应用,每个应用独立部署维护,应用之间通过超链接建立联系/消息队列进行数据分发/访问同一数据存储系统
  10. 分布式服务:公共业务提取出来独立部署

架构演化-分布式服务

演化的价值观

  • 大型网站架构的核心价值是随网站所需灵活应对
  • 驱动大型网站技术发展的主要力量是网站的业务发展

误区

  • 一味追随大公司的解决方案
  • 为了技术而技术
  • 企图用技术解决所有问题

架构模式

模式的关键在于模式的可重复性

  • 分层:横向切分
  • 分割:纵向切分
  • 分布式:分层和分割的主要目的是为了切分后的模块便于分布式部署。常用方案:分布式应用和服务分布式静态资源分布式数据和存储分布式计算分布式配置,分布式锁,分布式文件,等等
  • 集群:多台服务器部署相同的应用构成一个集群,通过负载均衡设备共同对外提供服务
  • 缓存:将数据放距离计算最近的位置加快处理速度,改善性能第一手段,可以加快访问速度,减小后端负载压力。使用缓存 两个前提条件 :1.数据访问热点不均衡;2.数据某时段内有效,不会很快过期CDN反向代理本地缓存分布式缓存
  • 异步:旨在系统解耦。异步架构是典型的消费者生产者模式,特性如下:提高系统可用性加快网站访问速度消除并发访问高峰
  • 冗余:实现高可用。数据库的冷备份和热备份
  • 自动化:包括发布过程自动化,自动化代码管理,自动化测试,自动化安全检测,自动化部署,自动化监控,自动化报警,自动化失效转移,自动化失效恢复,自动化降级,自动化分配资源
  • 安全:密码,手机校验码,加密,验证码,过滤,风险控制

核心要素

架构是“最高层次的规划,难以改变的规定”。主要关注五个要素:

  • 性能
  • 可用性(Availability)
  • 伸缩性(Scalability)
  • 扩展性(Extensibility)
  • 安全性

架构

下面依次对这五个要素进行归纳

高性能

性能的测试指标主要有:

  • 响应时间:指应用执行一个操作需要的时间
  • 并发数:指系统能够同时处理请求的数目
  • 吞吐量:指单位时间内系统处理的请求数量
  • 性能计数器:描述服务器或者操作系统性能的一些数据指标

性能测试方法:

  • 性能测试
  • 负载测试
  • 压力测试
  • 稳定性测试

性能测试曲线

性能优化,根据网站分层架构,可以分为三大类:

  • Web 前端性能优化浏览器访问优化减少 http 请求使用浏览器缓存启用压缩CSS 放在页面最上面,JavaScript 放在页面最下面减少 Cookie 传输CDN 加速:本质是一个缓存,一般缓存静态资源反向代理保护网站安全通过配置缓存功能加速 Web 请求实现负载均衡
  • 应用服务器性能优化:主要手段有 缓存、集群、异步分布式缓存(网站性能优化第一定律:优化考虑使用缓存优化性能)异步操作(消息队列,削峰作用)使用集群代码优化多线程(设计为无状态,使用局部对象,并发访问资源使用锁)资源复用(单例,对象池)数据结构垃圾回收
  • 存储服务器性能优化机械硬盘 vs. 固态硬盘B+ 树 vs. LSM 树RAID vs. HDFS

高可用

  • 高可用的网站架构:目的是保证服务器硬件故障时服务依然可用、数据依然保存并能够被访问,主要手段数据和服务的冗余备份及失效转移
  • 高可用的应用:显著特点是应用的无状态性通过负载均衡进行无状态服务的失效转移应用服务器集群的 Session 管理Session 复制Session 绑定利用 Cookie 记录 SessionSession 服务器
  • 高可用的服务:无状态的服务,可使用类似负载均衡的失效转移策略,此外还有如下策略分级管理超时设置异步调用服务降级幂等性设计
  • 高可用的数据:主要手段是数据备份和失效转移机制CAP 原理数据一致性(Consisitency)数据可用性(Availibility)分区耐受性(Partition Tolerance)数据备份冷备:缺点是不能保证数据最终一致和数据可用性热备:分为异步热备和同步热备失效转移:由以下三部分组成失效确认访问转移数据恢复
  • 高可用网站的软件质量保证网站发布自动化测试预发布验证代码控制主干开发、分支发布分支开发、主干发布自动化发布灰度发布
  • 网站运行监控监控数据采集用户行为日志采集(服务器端和客户端)服务器性能监控运行数据报告监控管理警报系统失效转移自动优雅降级

伸缩性

大型网站的“大型”是指:

  • 用户层面:大量用户及大量访问
  • 功能方面:功能庞杂,产品众多
  • 技术层面:网站需要部署大量的服务器

伸缩性的分为如下几个方面

  • 网站架构的伸缩性设计不同功能进行物理分离实现伸缩纵向分离(分层后分离)横向分离(业务分割后分离)单一功能通过集群规模实现伸缩
  • 应用服务器集群的伸缩性设计HTTP 重定向负载均衡DNS 域名解析负载均衡反向代理负载均衡(在 HTTP 协议层面,应用层负载均衡)IP 负载均衡(在内核进程完成数据分发)数据链路层负载均衡(数据链路层修改 mac 地址,三角传输模式,LVS)负载均衡算法轮询(Round Robin, RR)加权轮询(Weighted Round Robin, WRR)随机(Random)最少链接(Least Connections)源地址散列(Source Hashing)
  • 分布式缓存集群的伸缩性设计Memcached 分布式缓存集群的访问模型Memcached 客户端(包括 API,路由算法,服务器列表,通信模块)Memcached 服务器集群Memcached 分布式缓存集群的伸缩性挑战分布式缓存的一致性 Hash 算法(一致性 Hash 环,虚拟层)
  • 数据存储服务集群的伸缩性设计关系数据库集群的伸缩性设计NoSQL 数据库的伸缩性设计

可扩展

系统架构设计层面的“开闭原则”

  • 构建可扩展的网站架构
  • 利用分布式消息队列降低耦合性事件驱动架构(Event Driven Architecture)分布式消息队列
  • 利用分布式服务打造可复用的业务平台Web Service 与企业级分布式服务大型网站分布式服务的特点分布式服务框架设计(Thrift, Dubbo)
  • 可扩展的数据结构(如 ColumnFamily 设计)
  • 利用开放平台建设网站生态圈

安全

XSS 攻击和 SQL 注入攻击是构成网站应用攻击最主要的两种手段,此外还包括 CSRF,Session 劫持等手段。

  • 攻击与防御XSS 攻击:跨站点脚本攻击(Cross Site Script)反射型持久型XSS 防御手段消毒(即对某些 html 危险字符转义)HttpOnly注入攻击SQL 注入攻击OS 注入攻击注入防御避免被猜到数据库表结构信息消毒参数绑定CSRF 攻击:跨站点请求伪造(Cross Site Request Forgery)CSRF 防御:主要手段是识别请求者身份表单 Token验证码Referer Check其他攻击和漏洞Error CodeHTML 注释文件上传路径遍历Web 应用防火墙(ModSecurity)网站安全漏洞扫描
  • 信息加密技术及密钥安全管理单向散列加密:不同输入长度的信息通过散列计算得到固定长度的输出不可逆,非明文可加盐(salt)增加安全性输入的微小变化会导致输出完全不同对称加密:加密和解密使用同一个密钥非对称加密信息传输:公钥加密,私钥解密数字签名:私钥加密,公钥解密密钥安全管理:信息安全传输是靠密钥保证的,改善手段有:把密钥和算法放在一个独立的服务器上将加解密算法放在应用系统中,密钥放在独立服务器
  • 信息过滤与反垃圾文本匹配分类算法黑名单

总结

最后针对于上面的知识点我总结出了 “怎样学架构更有效” 做成了文档和架构视频资料免费分享给大家

希望能帮助到您提高自己的技术升职加薪,也节省大家在网上搜索资料的时间来学习,也可以关注我一下以后会有更多干货分享。

转发+关注私信回复【架构资料】领取技术资料【面试资料】

务器划分

对于访问量大的网站而言,将网站的各个部分拆分分别部署到不同服务器上是很有必要的。例如将图片和web站点分开。一般而言,在网站的整个服务器部署上分为如下几种类型:

文件服务器:一般存储系统的相关图片和文件,给各个子系统提供统一的文件调用

代理服务器:一般使用linux+Nginx作为反向代理

web服务器:.net中最常用的Web服务器IIS,Mono中一般使用Nginx

应用服务器:负责系统中各个业务逻辑的提供,比如用户中心,结算中心,支付中心等

缓存服务器:提供MemCached缓存服务

数据库服务器:负责网站数据的提供,一般为Sqlserver,mysql,oracle等

带宽的计算

假设网站每天要承受100万pv的访问量,计算带宽要涉及到两个指标(峰值流量和页面平均大小),带宽单位为bps(bit/s)。

1、假设峰值流量为平均流量的5倍;

2、假设每次访问的平均页面大小为100KB左右。

1B=8b---------------------1B/s=8b/s(1Bps=8bps)

1KB=1024B ------------- 1KB/s=1024B/s

1MB=1024KB------------1Mps=1024KB/s

100万pv访问量一天平均分布,折合每秒大约访问12次,页面大小为字节(Byte),总共访问页面大小就是12*100KB=1200KB,1Byte=8bit,则1200KB=9600Kb,9600Kb/1024大约9Mb/s(9Mbps),我们网站在峰值流量时一定要保持正常访问,则真实带宽应该在9M*5=45Mbps左右。

网站架构的演变过程之一

公司刚刚起步,业务量不大,往往可能在某个虚拟主机空间商租用一个虚拟主机和一个数据库就搭建了一个最基本的网站

网站架构的演变过程之二增加缓存

随着业务量增加,用户的访问越来越多,网站经常性的打不开,慢,甚至出现数据库链接达到最大限制数,这个时候需要针对网站做一些优化策略:

  • 减少Http请求,压缩css,js,图片的大小
  • 将Microsoft Ajax Minifier集成到VS2010对JS,CSS进行编译时压缩
  • 增加页面缓存和增加数据缓存处理
  • cnblogs上的缓存全解析
  • 自购服务器进行IDC托管
  • 自购服务器能够提升硬件的档次以及带宽可以自由控制,一般都是独享带宽,相比共享带宽来说能够支撑更多的访问量

网站架构的演变过程之三增加web服务器

当系统访问量的再度增加,webserver机器的压力在高峰会上升到比较高,这个时候开始考虑增加一台WebServer,但是增加一台WebServer的时候意味着要在两台的服务器上分别建立相同的站点,那么就会出现如下问题:

如何让访问分配到这两台机器上?Nginx

如何保持状态信息的同步,例如用户session等?

正常考虑的方案有写入数据库、开启状态服务器、cookie、写入缓存等。

如何保持数据缓存信息的同步?

缓存服务器

如何让上传文件这些类似的功能继续正常?

采用文件服务器统一管理

网站架构的演变过程之四分库,分表,分布式缓存

通过增加web服务器享受了一段快速访问的幸福后,发现系统又开始变慢了,经过查找,发现数据库写入、更新的这些操作的部分数据库连接的 资源竞争非常激烈,导致了系统变慢,这下怎么办呢?

分库

分表

Memcache,Redis分布式缓存


架构演变过程之五Web园或增加更多WebServer

在做完分库分表这些工作后,数据库上的压力已经降到比较低了,这个时候可能到了下一个瓶颈,查看windows的性能计数器发现有大量的阻塞请求,于是可以做Web园或者添加一些webserver服务器。在这个添加webserver服务器的过程,有可能会出现如下几个问题:

一台Nginx服务器的软负载已经无法承担巨大的web访问量了,可以用硬件负载解决F5或应用从逻辑上做一定的分类,然后分散到不同的软负载集群中

原有的一些状态信息同步、文件共享等方案可能会出现瓶颈,需要进行改进,也许这个时候会根据情况编写符合网站业务需求的分布式文件系统等;

在做完这些工作后,开始进入一个看似完美的无限伸缩的时代,当网站流量增加时,应对的解决方案就是不断的添加webserver。

架构演变之六读写分离和廉价存储方案

通过增加web服务器享受了一段快速访问的幸福后,发现系统又开始变慢了,经过查找,发现数据库写入、更新的这些操作的部分数据库连接的 资源竞争非常激烈,导致了系统变慢,这下怎么办呢,读写分离,订阅和发布

廉价存储方案Nosql

NoSQL=Not Only SQL 指的是非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。

NoSql数据库大量应用于微博系统等事务性不强的系统

BigTable

MongoDB

http://tech.it168.com/topic/2011/10-1/nosqlapp/index.html

架构演变之七进入大型分布式应用时代和廉价服务器群梦想时代

经过上面这个漫长而痛苦的过程,终于再度迎来了完美的时代,不断的增加webserver就可以支撑越来越高的访问量了,但是原来部署在webserver上的那个web应用已经非常庞大 了,当多个团队都开始对其进行改动时,相当的不方便,复用性也相当糟糕,基本上每个团队都做了或多或少重复的事情,而且部署和维护也是相当的麻烦,因为庞大的应用包在N台机器上复制、启动都需要耗费不少的时间,出问题的时候也不是很好查,另外一个更糟糕的状况是很有可能会出现某个应用上的bug就导 致了全站都不可用,还有其他的像调优不好操作(因为机器上部署的应用什么都要做,根本就无法进行针对性的调优)等因素,根据这样的分析,开始痛下决心,将 系统根据职责进行拆分,于是一个大型的分布式应用就诞生了,通常,这个步骤需要耗费相当长的时间,因为会碰到很多的挑战:
1、拆成分布式后需要提供一个高性能、稳定的通信框架,并且需要支持多种不同的通信和远程调用方式;
2、将一个庞大的应用拆分需要耗费很长的时间,需要进行业务的整理和系统依赖关系的控制等;
3、如何运维(依赖管理、运行状况管理、错误追踪、调优、监控和报警等)好这个庞大的分布式应用。
经过这一步,差不多系统的架构进入相对稳定的阶段,同时也能开始采用大量的廉价机器来支撑着巨大的访问量和数据量,结合这套架构以及这么多次演变过程吸取的经验来采用其他各种各样的方法来支撑着越来越高的访问量。

CDN内容分发网络

什么是CDN?

CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络”边缘”,使用户可 以就近取得所需的内容,解决Internet网络拥塞状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等 原因,解决用户访问网站的响应速度慢的根本原因。

狭义地讲,内容分发布网络(CDN)是一种新型的网络构建方式,它是为能在传统的IP网发布宽带丰富媒体而特别优化的网络覆盖层;而从广义的角 度,CDN代表了一种基于质量与秩序的网络服务模式。简单地说,内容发布网络(CDN)是一个经策略性部署的整体系统,包括分布式存储、负载均衡、网络请 求的重定向和内容管理4个要件,而内容管理和全局的网络流量管理(Traffic Management)是CDN的核心所在。通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务。总的来说,内 容服务基于缓存服务器,也称作代理缓存(Surrogate),它位于网络的边缘,距用户仅有”一跳”(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得CDN服务提供商能够代表他们 客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。据统计,采用CDN技术,能处理整个网站页面的 70%~95%的内容访问量,减轻服务器的压力,提升了网站的性能和可扩展性。

CDN 的工作原理

在描述CDN的实现原理,让我们先看传统的未加缓存服务的访问过程,以便了解CDN缓存访问方式与未加缓存访问方式的差别:

由上图可见,用户访问未使用CDN缓存网站的过程为:

1)、用户向浏览器提供要访问的域名;

2)、浏览器调用域名解析函数库对域名进行解析,以得到此域名对应的IP地址;

3)、浏览器使用所得到的IP地址,域名的服务主机发出数据访问请求;

4)、浏览器根据域名主机返回的数据显示网页的内容。

CDN的通俗理解就是网站加速,可以解决跨运营商,跨地区,服务器负载能力过低,带宽过少等带来的网站打开速度慢等问题。网宿,睿江,蓝讯

一致性Hash算法

分布式架构中,节点的故障是不可避免的,当添加和删除某一节点时,会导致大量散列数据失效,需要重新散列。这意味着这些丢失的数据要去数据库中请求一次以后才能按照hash(key) /服务器数=服务器编号 重新散列缓存到对应的服务器上。这对于高访问量的系统来讲影响是非常大的。
人们采用一致性Hash来解决此类问题

化网站架构对于SEO来说是非常重要的,它可以帮助搜索引擎更好地索引你的网站,提高网站的排名。下面将详细介绍如何构建一个优化SEO的网站架构。

首先,一个良好的网站架构应该是清晰且易于导航的。这意味着你的网站应该有一个明确的主题和目标,并且分类结构应该简单明了。对于用户和搜索引擎爬虫来说,能够快速找到所需要的信息是非常重要的。因此,你需要通过设置简洁的导航菜单和目录结构,来确保用户能够轻松地浏览你的网站。

其次,一个良好的网站架构应该具有扁平化结构。传统的网站结构往往是层级结构,即网站首页链接到二级页面,二级页面链接到三级页面,以此类推。然而,这样的层级结构在SEO上并不理想。因为搜索引擎爬虫在抓取网页时,通常会注重抓取层级较浅的页面,并忽略深层次的页面。因此,采用扁平化结构,减少网页的层级深度,可以提高搜索引擎爬虫对页面的抓取效率,从而更好地索引你的网站。

第三,一个良好的网站架构应该具有清晰的URL结构。URL是网站的地址,它是搜索引擎判断网页内容的一个重要因素。因此,你需要确保你的URL简洁、有意义且易读。避免使用过长的URL,使用短链接和关键词来描述页面内容。另外,确保你的URL结构层次清晰,通过使用文件夹和子文件夹来组织和分类相关的页面。

第四,一个良好的网站架构应该具备合理的内部链接。内部链接是指在网站内部链接到其他页面的链接。它们可以帮助用户和搜索引擎爬虫更好地浏览和索引你的网站。通过合理设置内部链接,可以提高网站的页面权重,帮助搜索引擎更好地理解和索引你的页面。你可以通过在有关的文章中内部链接到其他相关页面,或在页面底部添加相关文章推荐等方式来优化内部链接。

第五,一个良好的网站架构还应该具有良好的页面加载速度。页面加载速度是搜索引擎排名的一个重要因素。如果你的网站加载速度过慢,不仅会影响用户体验,也会导致搜索引擎爬虫无法快速抓取你的页面。为了提高页面加载速度,你可以通过优化图片和视频的大小和格式,压缩CSS和JavaScript文件,使用CDN等方式来减少页面加载时间。

第六,一个良好的网站架构还应该具备响应式设计。响应式设计是指网站能够根据设备的不同而自动调整布局和显示效果。由于移动设备的兴起,越来越多的用户使用手机和平板电脑访问网站。如果你的网站没有良好的响应式设计,则可能导致用户在移动设备上的访问体验不佳,进而影响SEO排名。因此,确保你的网站能够适应不同的设备,并具备良好的移动端访问体验,是提高SEO的重要一步。

最后,要注意避免使用Flash和AJAX等对搜索引擎不友好的技术。尽量选择搜索引擎容易索引的HTML和CSS技术来构建你的网站。另外,还要注意避免使用重复内容和无效的页面。重复内容会被搜索引擎视为垃圾内容,而无效的页面会降低整个网站的质量,影响搜索引擎对其的评级。

总之,一个优化SEO的网站架构应该是清晰、简洁且有良好的导航结构。它应该具备扁平化结构、清晰的URL结构、合理的内部链接、快速的页面加载速度、良好的响应式设计,并避免使用不友好的技术和垃圾内容。通过遵循这些原则,你可以建立一个优化SEO的网站架构,提高你的网站在搜索引擎中的排名。