当前位置: 首页 > 编程日记 > 正文

BAT架构师分享之:大型网站技术架构

早期的网站为了节省成本一般会设计成集中式系统,应用程序、数据库等都部署在一台服务器上。 但随着业务的快速度发展,逐渐出现瓶颈,按一定原则**(应用拆分、服务拆分、数据拆分、应用解耦)**,向分布式系统转型,涉及到以下环节改造。

主要环节

  • 业务拆分:将整个网站业务拆分成不同的应用,每个应用独立部署维护,应用之间通过RPC或消息队列通信。
  • 集群化(应用服务器;基于RPC的微服务应用等)
  • LVS负载均衡,负责将请求转发给不同业务集群
  • 反向代理服务器,常用的如Nginx
  • 应用服务器,servlet容器,如tomcat
  • 应用和数据服务分离,分别部署在不同的服务器
  • 后端应用合理分层,通常分为表现层或网关层、业务逻辑层、数据持久层
  • 缓存。分为两种:本地缓存;分布式缓存
  • CDN化。静态内容部署到CDN,就近获取,加速网站响应。
  • 数据库读写分离。数据库采用主从热备,应用服务器在写数据时访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库。
  • 分库分表,引入分布式数据框架
  • 引入NoSQL,支持海量数据存储
  • 借助elastics search等开源搜索引擎
  • 异步化,系统解耦。
  • 缩短业务流程,加快网站访问速度
  • 消除并发访问高峰

架构五要素:

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

1、高性能

性能的测试指标主要有:

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

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

  • Web 前端性能优化
  • 减少 http 请求
  • 使用浏览器缓存
  • 启用压缩
  • CSS 放在页面最上面,JavaScript 放在页面最下面
  • 减少 Cookie 传输
  • 应用服务器性能优化:主要手段有 缓存、集群、异步
  • 多线程(设计为无状态,使用局部对象,并发访问资源使用锁)
  • 资源复用(单例,对象池)
  • 数据结构
  • 异步操作(消息队列,削峰作用)
  • 多台应用服务器组成一个集群共同对外服务,提高整体处理能力。
  • 使用 CDN,将网站静态内容分发至离用户最近的网络服务商机房,使用户通过最短访问路径获取数据。可以在网站机房部署反向代理服务器,缓存热点文件,加快请求响应速度,减轻应用服务器负载压力
  • 应用服务器端,可以使用服务器本地缓存和分布式缓存(网站性能优化第一定律:优化考虑使用缓存优化性能)
  • 代码层面,也可以通过使用多线程、改善内存管理等手段优化性能。
  • 数据库服务器端,索引、缓存、SQL 优化等性能优化手段
  • NoSQL 数据库通过优化数据模型、存储结构、伸缩特性等
  • 存储服务器性能优化
  • 机械硬盘 vs. 固态硬盘
  • B+ 树 vs. LSM 树
  • RAID vs. HDFS

2、高可用

高可用的网站架构:目的是保证服务器硬件故障时服务依然可用、数据依然保存并能够被访问,主要手段数据和服务的冗余备份及失效转移

  • 高可用的应用:显著特点是应用的无状态性
  • 通过负载均衡进行无状态服务的失效转移
  • 应用服务器集群的 Session 管理
  • 高可用的服务:无状态的服务,可使用类似负载均衡的失效转移策略,此外还有如下策略
  • 超时设置
  • 异步调用
  • 服务降级
  • 限流
  • 高可用的数据:主要手段是数据备份和失效转移机制
  • 失效确认
  • 访问转移
  • 数据恢复
  • 冷备:缺点是不能保证数据最终一致和数据可用性
  • 热备:分为异步热备和同步热备
  • 数据一致性(Consisitency)
  • 数据可用性(Availibility)
  • 分区耐受性(Partition Tolerance)
  • CAP 原理
  • 数据备份
  • 软件质量保证
  • 自动化测试
  • 预发布验证
  • 灰度发布
  • 网站实时监控
  • 警报系统
  • 自动优雅降级
  • 用户行为日志采集(服务器端和客户端)
  • 服务器性能监控
  • 监控数据采集
  • 监控管理

3、伸缩性

大型网站需要面对大量用户的高并发访问和存储海量数据,不可能只用一台服务器就处理全部用户请求,存储全部数据。网站通过集群的方式将多台服务器组成一个整体共同提供服务。所谓伸缩性是指通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。

衡量架构伸缩性的主要标准就是是否可以用多台服务器构建集群,是否容易向集群中添加新的服务器。加入新的服务器后是否可以提供和原来的服务器无差别的服务。集群中可容纳的总的服务器数量是否有限制。

对于应用服务器集群,只要服务器上不保存数据,所有服务器都是对等的,通过使用合适的负载均衡设备就可以向集群中不断加入服务器。

对于缓存服务器集群,加入新的服务器可能会导致缓存路由失效,进而导致集群中大部分缓存数据都无法访问。虽然缓存的数据可以通过数据库重新预热,但是如果应用已经严重依赖缓存,可能会导致整个网站崩溃。需要改进缓存路由算法保证缓存数据的可访问性。

关系数据库虽然支持数据复制,主从热备等机制,但是很难做到大规模集群的可伸缩性,因此关系数据库的集群伸缩性方案必须在数据库之外实现,通过路由分区等手段将部署有多个数据库的服务器组成一个集群。

至于大部分 NoSQL 数据库产品,由于其先天就是为海量数据而生,因此其对伸缩性的支持通常都非常好,可以做到在较少运维参与的情况下实现集群规模的线性伸缩。

概括起来伸缩性的分为如下几个方面:

  • 应用服务器集群的伸缩性设计
  • 轮询(Round Robin, RR)
  • 加权轮询(Weighted Round Robin, WRR)
  • 随机(Random)
  • 最少链接(Least Connections)
  • 源地址散列(Source Hashing)
  • DNS 域名解析负载均衡
  • 反向代理负载均衡(在 HTTP 协议层面,应用层负载均衡)
  • IP 负载均衡(在内核进程完成数据分发)
  • 数据链路层负载均衡(数据链路层修改 mac 地址,三角传输模式,LVS)
  • 分布式缓存集群的伸缩性设计
  • Memcached 客户端(包括 API,路由算法,服务器列表,通信模块)
  • Memcached 服务器集群
  • 分布式缓存的一致性 Hash 算法(一致性 Hash 环,虚拟层)
  • 数据存储服务集群的伸缩性设计
  • 关系数据库集群的伸缩性设计
  • NoSQL 数据库的伸缩性设计

4、可扩展

系统架构设计层面的“开闭原则”,构建可扩展的网站架构

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

5、网站的安全架构

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

  • 攻击与防御
  • Error Code
  • 表单 Token
  • 验证码
  • jsonp请求的,Referer 校验
  • SQL 注入
  • html 危险字符转义
  • XSS 攻击:跨站点脚本攻击(Cross Site Script)

对js转义,使其失去执行功能,只作为纯字符串展示

  • CSRF 攻击:跨站点请求伪造(Cross Site Request Forgery)

防范:httpOnly;增加token校验;通过Referer识别。

  • 网站安全漏洞扫描


相关文章:

mysql isreg_`Innodb` MySQL中如何优雅的删除大表跑路

最近很想写写MySQL相关的内容,就从这个话题出发吧有人说删MySQL表谁不会不就是drop table TABLENAME如果在生产环境中,你对一张TB级别的大表,敲下这行命令那么你的主管,大主管,隔壁的大主管 就会气势汹汹的冲向你其原因…

常用正则表达式集锦

链接地址:http://blog.csdn.net/tjcyjd/article/details/48416405 验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0-9]*)$验…

C(第一个C程序) 和 C++ (第一个C++程序)对比碰撞

个人博客首页(点击查看详情) -- https://blog.51cto.com/11495268 1、简介 C 是对 C 的继承、扩展,但从语言角度来说,这是 两种变成语言,就一定存在不同,本文 就借助于 C、C 的 最精简标准程序 进行对比…

java的byte与C#的异同引起的字符处理问题。

java的byte是有符号类型(java就没有无符号类型的数据),值域:-0128~127 c#的byte是无符号类型数值,值域:0~255 这在依赖字符编码处理程序中,两者源代码就不能通用了。 知道原因结局办法就容易多了。 1.使用&与运算 …

exec不同文件l怎么汇总_ABAQUS常见问题汇总 - 2.0版.doc

您所在位置:网站首页 > 海量文档&nbsp>&nbsp计算机&nbsp>&nbspC/C资料ABAQUS常见问题汇总 - 2.0版.doc154页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整性&#xff0c…

1月12号 UIView

UIView 1.为什么要UIView .可以用UIView作为容器,存放子视图 .管理事件UIEvent 2.ios坐标系 以左上角为坐标原点,向右边是x的正方向,向下是y的正向方 bounds: 相对于视图本身而言(0,0,w, h) fra…

小虎计算器-技术支持

2019独角兽企业重金招聘Python工程师标准>>> 最简单的计算器,包含历史记录 转载于:https://my.oschina.net/u/1405818/blog/3050764

jquery即时搜索查询插件jquery.search.js

jquery.search.js搜索插件是一款基于jquery的插件,任何一个input输入款均可即时转为查询框,可分为前台数据直接显示和后台传输数据显示两种方案! 文档说明:http://www.sameus.com 代码下载地址: http://code.google.com/p/17sameus/downloads/list 使用方式 jquery.search.js插…

node mysql 批量写入_请问如何使用node.js在MySQL中进行批量插入

catspeake我四处寻找关于批量插入对象的答案。Ragnar123的回答使我得出了这样的结论:function bulkInsert(connection, table, objectArray, callback) {let keys Object.keys(objectArray[0]);let values objectArray.map( obj > keys.map( key > obj[key]…

win10 UWP 应用设置

win10 UWP 应用设置 简单的把设置需要的,放到微软自带的LocalSettings LocalSettings.Values可以存放几乎所有数据 如果需要存放复合数据,一个设置项是由多个值组成,可以使用ApplicationDataCompositeValue将多个合并。 存放一个string strin…

通过loganalyzer展示数据库中的日志

目的:通过loganalyzer展示数据库中的日志 准备环境: CentOS7_1:用来生成日志 CentOS7_2:用来存放日志的数据库 CentOS7_3:LAP服务器 第一步:在CentOS7_2安装mysql数据库 此处使用二进制安装mariadb…

libmemcached 1.0.11 发布

libmemcached 1.0.11 删除了 memcached 的定制版本,更新了硬化(hardening)规则,修复了 socket 连接返回错误的问题。 libmemcached是C客户端到memcached服 务器的接口库。具有低内存占用率、线程安全、并提供对memcached功能的全面支持。它还采用多种命令…

python描述器做权限控制_Python装饰器14-描述器

描述器这是Python一个重要的概念,英文名:Descriptordescriptor是对象的一个属性,只不过它存在于类的dict中并且有特殊方法get(可能还有set和__delete)而具有一点特别的功能,为了方便指代这样的属性,我们给它起了个名字叫descripto…

数据结构(1)有序表查找

有序表查找 /* 主函数 */public class OrderTableSearch {public static void main(String[] args) {int [] a {0,1,16,24,35,47,59,62,73,88,99}; System.out.println(FibonacciSearch(a, 10, 88));System.out.println(InsertKeySearch(a, 10, 88));System.out.println(Bina…

Java实现MD5(32/16位大小写)加密

MD5简单介绍 大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”…

OD使用教程6 - 调试篇06|解密系列

OD使用教程6 - 调试篇06 让编程改变世界 Change the world by program 这一讲开始,小甲鱼带大家接触真正程序的逆向。其实也没啥大不了的,也就是对之前所学的知识进行巩固和加强。 不过,在每一节课中,小甲鱼都会教给大家不同的新…

宝塔面板 mysql装不上_宝塔面板强制安装mysql8.0

释放双眼,带上耳机,听听看~!mysql终于更新到8.0,mysql8.0对比以往的版本有了很大的提升,但是要求的服务器配置也就变得越来越高。对于低配置服务器,在宝塔面板进行安装时,总会出现“至少需要2个…

android studio 怎么运行java

方法/步骤 1、新建一个project,或者如果已经有project的话,那就直接新建一个module.注意选择Java library,然后下一步 2、输入module的一些信息。点击finish 3、在左侧找到build.gradle,双击打开,参照图中修改一下配置…

运行PHP出现No input file specified错误解决办法

配置了一台新服务器,使用的是IIS Fastcgi PHP 5.3.X,访问php页面的时候就会报错“No input file specified” 在php.ini文件里面修改: 1、增加一行(这个最重要) fastcgi.impersonate 1 2、修改两项(解开…

Microsoft Security Essentials 4.1.522.0 RTM

简单说一下新版本的新功能,其中最强的是云端修复系统受损或病毒感染文件功能、重新编写的网络检查系统防御病毒入侵、新增自我保护,后台监控主进程无法用任务管理器结束。 Microsoft Security Essentials 是 Microsoft 提供的免费杀毒下载软件&#xff0…

wincc vbs mysql_Wincc VBS操作txt及SQL2005

系统:Win7 32Bits 旗舰版wincc: 7.0 sp3英文版Dim strConnectionStringDim objConnectionDim objCommandDim strSQLDim RsDim sdayDim smonthDim edayDim emonthDim str1Dim str2Dim tempDim sqlwhereDim msgDim CDG, WSH, FilePathDim fso, fo, slDim read_tempDim OrderFileN…

[Python]网络打解包

Python与C、C交互的时候,如果进行网络消息的收发,需要讲数据打包解包为字节流。 这时候就会用到Struct模块中的pack、unpack函数 打包: PKG # ! means network byte#PkgHeadPKG pack(!i, 0x54434d) #intPKG pack(!H, 4) #us…

TiKV 成功晋级 CNCF 孵化项目

今天,CNCF(Cloud Native Computing Foundation,云原生计算基金会)技术监督委员会(TOC)宣布已经投票决议通过,正式将 TiKV 从沙箱项目晋级至孵化项目。 TiKV 是一个开源的分布式事务 Key-Value 数…

平均符号熵的计算公式_交叉熵(Cross Entropy)从原理到代码解读

交叉熵(Cross Entropy)是Shannon(香浓)信息论中的一个概念,在深度学习领域中解决分类问题时常用它作为损失函数。原理部分:要想搞懂交叉熵需要先清楚一些概念,顺序如下:1.自信息量—>2.信息熵(熵)—>3.相对熵(KL散度)—>…

在 Ubuntu 配置 PPTP Server

本文在 Ubuntu 12.4 或 14 亲测有效。 建立 PPTP 服务器 首先安装 pptp 服务器。 # apt-get install pptpd 然后配置 pptpd。 # sudo vi /etc/pptpd.conf 在 pptpd.conf 文件末尾添加服务器 IP 和客户端 IP。 localip 192.168.3.1 remoteip 192.168.3.100-200 以上配置意味着服…

IAP超级详解,偷懒了,不用自己去翻译了

转载自:http://gaohaijun.blog.163.com/blog/static/176698271201143194018328/ 一、In App Purchase概览 Store Kit代表App和App Store之间进行通信。程序将从App Store接收那些你想要提供的产品的信息,并将它们显示出来供用户购买。 当用户需要购买某件…

linux负载均衡(什么是负载均衡)

linux负载均衡(什么是负载均衡) 一、总结 一句话总结: 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 关键点一&#xff1a…

win8数据源设置mysql_Win8系统ODBC数据源有何重要功能?

对计算机发展比较有研究的朋友一定会知道ODBC,它是一个比较古老的东西,发展到现在Win8系统上版本已经是3.8了。微软虽然没有对ODBC做很大的更新,但是正因为ODBC是一个比较成熟和古老的规范,因此它的作用才显得不那么突出&#xff…

【HTML/XML 11】XML和HTML的混合使用

导读:在前面介绍了很多关于XML和HTML的东西,他们其实各有各的好处,在很多时候都需要结合起来使用。现在已经有XML和HTML结合的产物:XHTML(可扩展超文本标记语言)。在本篇博客中,则主要介绍通过引…

web架构之mysql服务器

SQL概述结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。从上可以看出我们数据库…