大型网站系统学习笔记

大型网站及其架构演进过程

    (一)网站初建

    作为一个交易网站,需要具备的最基本三个功能:

    (1) 用户:用户注册、用户管理、信息维护……

    (2) 商品:商品展示、商品管理……

    (3) 交易:创建交易、交易管理……

 如果基于JAVA用单机技术,即一台服务器来构建应用,示意图大概会如下所示

 

各个功能模块之间通过JVM内部方法调用来进行交互,而应用和服务器则通过JDBC进行访问

(二)单机负载告警,数据库与应用分离

    网站对外服务后,访问量会不断增大,对服务器的负载持续升高,首先我们考虑从结构上进行优化:把数据库与应用从一台机器分到两台

      

   

    与之前的差别,我们只需把应用的配置中数据库的访问地址从一个地址迁移到另一个地址进行,对开发、部署、测试影响不大。

    调整能够缓解当前系统的压力,但随着访问量继续增大,我们的系统还需继续演进

(三)应用服务器负载告警,让应用服务器走向集群

应用服务器压力增大,我们把应用从单机变为集群的方式来进行优化

  

 

如上图所示,应用服务器从一台变为两台,而它们之间没有直接交互,都是依赖与数据库对外提供服务,但我们有两个问题亟待解决:

    (1)用户对两个应用服务器访问的选择问题:

  • 通过DNS解决:是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器。但它的缺点很明显:

            ① 不能够按照Web服务器的处理能力分配负载。DNS负载均衡采用的是简单的轮循负载算法,不能区分服务器之间的差异,不能反映服务器的当前运     
  行状态。所以 DNS服务器将Http请求平均地分配到后台的Web服务器上,而不考虑每个Web服务器当前的负载情况。如果后台的Web服务器的配置和处理能力不同, 最慢的 Web服务器将成为系统的瓶颈,处理能力强的服务器不能充分发挥作用。

            ② 不支持高可靠性,DNS负载均衡技术没有考虑容错。如果后台的某台Web服务器出现故障,DNS服务器仍然会把DNS 请求分配到这台故障服务器上,导致不能响应客户端。

  • 通过负载均衡硬件设备来解决
  • 通过nginx等WebSever实现负载均衡如:
  • upstream myServer {   

        server 127.0.0.1:9090 down; 
        server 127.0.0.1:8080 weight=2; 
        server 127.0.0.1:6060; 
        server 127.0.0.1:7070 backup; 
    }

    proxy_pass http://myServer;

    (2) 解决应用服务器变为集群后的Session问题:Session通过游览器与服务器会话产生,它往往是保存在单机上的。

       

    而对于上图,如果用户第一次访问网站,请求落到了左边的服务器,那么Session就创建在左边的服务器上,如果不做处理,就不能保存用户请求每次都落在存有其session会话信息的同一服务器上。针对此问题,我们来看看几种解决方案:

        1. Session Sticky(滞粘会话)

            当Web服务器变成多台时,保存同一个会话请求在同一服务器上处理,要做到这一点,需要负载均衡器能够根据每次请求的会话标识来进行请求转发

   

            如使用nginx的ip_hash,此时nginx必须为最前端服务器,否则nginx得不到正确的ip,也不能根据ip做hash;同时nginx后端也不能有其它方式的负载均衡,否则请求又会被再次分流,客户端的请求就很难定位到同一Session应用服务器上了


upstream backend {

server 127.0.0.1:8080 ;

server 127.0.0.1:9090 ;

ip_hash;

}

            针对nginx此点,我们可以使用pstream_hash这个第三方模块,假如前端是squid,他会将ip加入x_forwarded_for这个http_header里,用upstream_hash可以用这个头做因子,将请求定向到指定的后端。再通过

            hash   $http_x_forwarded_for;

            这样就改成了利用x_forwarded_for这个头作因子,在nginx新版本中可支持读取cookie值,所以也可以改成:

            hash   $cookie_jsessionid;

            使用Session Sticky有如下几个问题:

                ① 如果有一台服务器宕机或者重启,那么这台机器上的会话数据会丢失。

                ②负载均衡器变为一个有状态的节点,要将会话保存到具体Web服务器的映射,内存消耗会更大,容灾方面会更麻烦

        2. Session Replication

            如果把Session Styicky 比喻成我们将碗筷(会话数据)放在特定饭店(服务器),然后每次吃饭都去那家饭店,那Session Replication可以比喻成在每个饭店里都存放一套餐具,这样就可以自己根据每家饭店的拥挤情况自由选择饭店了。

            而我们要做的就是在每次任一服务器产生会话数据时,将数据复制到其他服务器中。但这样会引发一些问题:

                ① 同步Session数据造成了网络带宽的额外开销,只要Session数据有变化,就需要将数据同步到所有其他机器中,机器数越多,同步带来的带宽开销就越大

                ②  如果整个集群的Session数很多的话(很多人同时访问网站)每台机器用于保存Session数据的内容占用会很严重

        3. Session数据集中存储

            将Session数据集中存储起来,然后不同web服务器从同一地方获取Session,而存储session的具体方式,可以使用数据库、NOSQL技术或其他分布式存储系统。它的问题有:

                ① 读写Session数据引发网络操作,这相对于本机数据读取来说,就存在时延和不稳定性。

                ② 如果集中存储Session的机器或者集群出现问题,就会影响我们的应用

        4. cookie based

            将Session信息存放到Cookie中,这样不会依赖与外部系统,也没有写入Session数据的网络时延和不稳定性。但Cookie的长度有限制,这样也会限制了Session的长度,同时可能存在被盗取的安全性问题

 (四)数据读压力大,采用读写分离

            主库负责读写,从库只提供读服务。

     

读写分离主要带来的是数据复制问题,对于数据复制的实现,不同数据库都有相应的内置实现,如mysql的Master-Slave配置,我们主要考虑的是时延问题,如果用户修改了信息,但用户即时查看时,获取到的是从库中尚未更新的数据,就会让用户觉得自己没有修改成功。

    (五)读写分离后再遇瓶颈,数据库垂直拆分
   专库专用,数据垂直拆分,把数据库与应用从一台机器分到两台,如下图所示

但垂直拆分可能存在如下问题:
①需配置多个数据源
②分布式事务性能降低
③多表连接查询等操作变得困难

(六)垂直拆分后再遇瓶颈,单表数据水平拆分

但水平拆分可能存在问题:
①sql查询路由问题
②主键不能重复的保证机制
③分页排序等获取问题

时间: 2024-11-03 22:27:38

大型网站系统学习笔记的相关文章

专访曾宪杰:大型网站系统与Java中间件实践

摘要:淘宝近10年来历次技术飞跃的参与者.贡献者和带领者曾宪杰做客了CSDN社区问答栏目,担任第四期的嘉宾,带您了解大型网站系统与Java中间件的实践.在活动开始之前,我们采访到了曾老师,一窥他的技术和人生. 编者按:淘宝技术部总监.淘宝技术委员会Java分会会长曾宪杰将携他的新书<大型网站系统与Java中间件实践>做客我们社区问答栏目,担任第四期的问答嘉宾,届时会接受广大网友的提问,欢迎各位网友前来与淘宝网中间件大牛曾宪杰一起碰撞思想的火花.以下为采访正文:  淘宝技术部总监曾宪杰,他是淘宝

CSDN社区问答第4期:曾宪杰 大型网站系统与Java中间件

问题描述 本期的社区问答(5月19日-5月25日)我们请来了<大型网站系统与Java中间件实践>一书的作者曾宪杰(华黎)为大家解答关于大型网站和支撑大型网站架构的Java中间件.分布式系统方面的问题.曾宪杰,淘宝花名华黎,现任淘宝技术部总监.2002年毕业于浙江大学计算机系.2007年加入淘宝网平台架构团队,负责构建淘宝自主的消息中间件系统,同期主导了淘宝数据层的创建,这两个产品也是淘宝中间件中较为重要的两个.2010年下半年起开始负责整个淘宝中间件团队,帮助团队成为业内知名的Java技术团队

大型网站系统架构演化之路

大型网站系统架构演化之路 前言 一个成熟的大型网站(如淘宝.天猫.腾讯等)的系统架构并不是一开始设计时就具备完整的高性能.高可用.高伸缩等特性的,它是随着用户量的增加,业务功能的扩展逐渐演变完善的,在这个过程中,开发模式.技术架构.设计思想也发生了很大的变化,就连技术人员也从几个人发展到一个部门甚至一条产品线.所以成熟的系统架构是随着业务的扩展而逐步完善的,并不是一蹴而就:不同业务特征的系统,会有各自的侧重点,例如淘宝,要解决海量的商品信息的搜索.下单.支付,例如腾讯,要解决数亿用户的实时消息传

大型网站系统架构的演进(一)(转)

前言 写这篇文章的目的是想用来帮助自己思考和理清头绪,以及如何从一个简单的网站架构演进发展成一个大型网站架构,主要侧重在技术方面  简单的网站 由于我没有做过php,那么就以jsp为例,jsp做网站前端,以电子商务网站为例,描述一个简单的网站架构  前端 jsp+css+js  后端 java ssh  Web容器 tomcat  数据库 mysql  开发人员,美工1个,前端一个,java一个  部署方案为:  一台服务器,部署tomcat和mysql  架构图如下:  应用和数据库分布式部署

TheBeerHouse网站项目学习笔记(5)---架构设计

摘要:TheBeerHouse整个网站是属于CMS(Content Management System)架构的系统,即基于内容的网站 设计,这是网站设计最普遍的一种架构.在此网站的设计中,为什么需要用到许多抽象基类,为什么需要各种 看似让人难以理解的属性和成员变量,设计意图是什么,这么设计有什么好处等等这类问题,都是值得我 们思考和探讨的问题.我们将从层次关系.类图关系.设计意图这几个方面讨论上述提出的问题. 一. 层次关系 如上图,红色虚线框内的将是我们讨论的内容,这里面几乎全部是类,他们共同

TheBeerHouse网站项目学习笔记(1)----换肤技术

对于ASP.NET学习的中期,TheBeerHouse 项目是一个不错的选择,这个项目几乎囊括了所有ASP.NET 2.0 下所有的技术点,而且其设计的类图架构知识值得我们借鉴.关于此项目的介绍,在此不罗嗦,可以参看如下 地址: 1. 源码下载: http://www.asp.net/Downloads/starter-kits/the-beer-house 2. 功能技术点介绍: http://www.codeplex.com/TheBeerHouse 3. 该项目真实网站: http://w

Bootstrap栅格系统学习笔记_javascript技巧

Bootstrap栅格系统知多少? 1.简介 Bootstrap内置了一套响应式.移动设备优先的流式栅格系统,随着屏幕设备或视口(viewport)尺寸的增加,系统会自动分为最多12列.它包含了易于使用的预定义classe,还有强大的mixin用于生成更具语义的布局. 2.栅格选项 bootstrap3.x使用了四种栅格选项来形成栅格系统,这四种选项在官网上的介绍如下图,很多人不理解,这里跟大家详解一下四种栅格选项之间的区别,其实区别只有一条就是适合不同尺寸的屏幕设备.我们看class前缀这一项

TheBeerHouse网站项目学习笔记(4)----安全管理(下)

摘要: 安全管理是网站设计不可回避的问题,也是网站设计的重用组成部分.这些组成部分都需要对不 同的用户进行识别,检查用户是否有权限对那些受限制的网页进行访问,这种方法称为认证 (authentication).决定用户可以对哪些内容进行访问,这种方法称为授权(authorization).这两个概念容 易弄混淆,那么可以这么来理解: 认证---你是谁? 授权---我已经知道你是谁,你可以做什么?认证和授 权是网站成员权限管理的一部分,包括创建新用户,用户证书管理(包括密码保护机制,例如为遗忘密码

TheBeerHouse网站项目学习笔记(3)----安全管理(上)

摘要: 安全管理是网站设计不可回避的问题,也是网站设计的重用组成部分.这些组成部分都需要对不 同的用户进行识别,检查用户是否有权限对那些受限制的网页进行访问,这种方法称为认证 (authentication).决定用户可以对哪些内容进行访问,这种方法称为授权(authorization).这两个概念容 易弄混淆,那么可以这么来理解: 认证---你是谁? 授权---我已经知道你是谁,你可以做什么?认证和授 权是网站成员权限管理的一部分,包括创建新用户,用户证书管理(包括密码保护机制,例如为遗忘密码