1。应用和静态资源分离最开始,应用和静态资源是放在一起的。当并发量达到一定程度时,需要将静态资源存放在专用的服务器中。静态资源主要包括图片、Video、js、css,以及一些资源文件等,这些文件因为没有状态,分离起来比较简单。它们可以直接存储在相应的服务器中。通常,使用专用域名访问它们。通过不同的域名,浏览器可以直接访问资源服务器,而无需访问应用服务器。架构图如下:2.页面缓存页面缓存就是把应用程序生成的页面缓存起来,这样就不用每次都生成页面,可以节省大量的CPU资源。如果将缓存的页面放在内存中,速度会更快。很快。如果使用Nginx服务器,可以使用其自带的缓存功能,当然也可以使用专用的Squid服务器。pagecache默认的失效机制一般是根据缓存时间来处理的。当然也可以在修改数据后手动使相应的缓存失效。页面缓存主要用在数据很少变化的页面上,但是在很多页面上,大部分数据很少变化,一小部分数据变化非常频繁。比如一个展示文章的页面,正常情况下可以完全静态,但是如果文章后面有“喜欢”和“不喜欢”的功能,并且显示回复数,那么这个数据的变化频率就会是比较高,会影响静电。这个问题可以通过先生成一个静态页面,然后使用Ajax读取和修改响应数据来解决,这样一石二鸟,可以使用页面缓存或者实时显示一些变化频率高的数据时间。其实大家都知道效率最高,耗费最少的就是纯静态的html页面,所以我们尽量让我们网站的页面都使用静态页面。这种最简单的方法实际上是最有效的方法。但是,对于内容量大,更新频繁的网站,我们无法手动一一实现,所以就出现了我们常用的信息发布系统CMS,比如我们经常访问的各种门户网站的新闻频道,甚至他们的其他频道.由信息发布系统管理和实施。信息发布系统可以实现最简单的信息录入,自动生成静态页面。还可以具备频道管理、权限管理、自动爬取等功能。对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。除了门户网站和信息发布网站,对于交互性要求高的社区网站,尽量静态化也是提高性能的必要手段。也是一种被广泛使用的策略,到时候再静态化。猫扑的大杂烩就是用这个策略,网易社区也是。同时,htmlstatic也是一些缓存策略使用的一种手段。对于系统中频繁使用数据库查询但内容更新较少的应用,可以考虑使用htmlstatic来实现,比如论坛中的论坛公共设置信息。这些信息目前所有主流论坛都可以后台管理,存储在数据库中。事实上,这些信息中有大量被前端程序调用,但更新频率很少。可以考虑在后台更新的时候将这部分内容静态化,避免出现大量数据库。访问请求。3、集群和分布式集群是指每台服务器的功能相同。在处理一个请求的时候,可以调用那个服务器,主要起到分流的作用。分布式就是把不同的服务放在不同的服务器上。处理一个请求可能需要多台服务器,这样可以提高一个请求的处理速度,集群和分布式也可以同时使用。集群有两种方式:一种是在静态资源中集群。另一个是应用集群。静态资源集群比较简单。应用集群处理的核心问题是Session同步。session同步有两种处理方式:一种是session发生变化后自动同步到其他服务器,另一种是使用程序统一管理session。所有集群服务器都使用相同的会话。Tomcat默认使用第一种方式,通过简单的配置即可实现。第二种方法可以使用专用服务器安装Mencached等高效缓存程序统一管理session,然后在应用程序中通过重写Request重写getSession方法获取指定服务器中的Session。对于集群来说,另一个核心问题是负载均衡,即收到请求后具体分配服务器处理的问题。这个问题可以通过软件或专用硬件(如:F5)来解决。4.反向代理反向代理是指客户端直接访问的服务器并不真正提供服务,它从其他服务器获取资源,并将结果返回给用户。图:4.1反向代理服务器和代理服务器的区别。代理服务器的作用就是代表我们获取想要的资源,然后将结果返回给我们。我们要获取的资源是我们主动告诉代理服务器的。访问Facebook,但是不能直接访问,那么可以让代理服务器访问,然后返回结果给我们。反向代理服务器就是当我们门正常访问一个服务器的时候,这个服务器自己去调用其他的服务器资源,然后把结果返回给我们,我们是不知道的。代理服务器被我们积极使用并为我们服务。它不需要有自己的域名;反向代理服务器由服务器自己尝试。我们不知道它有自己的域名。我们访问它和访问普通的url没有任何区别。反向代理服务器主要有三个功能:1、可以作为前端服务器与实际处理请求的服务器集成;2、可用于负载均衡;3、转发请求,比如可以将不同类型的资源请求转发到不同的服务器进行处理。5、CDNcdn其实就是一个特殊的集群页面缓存服务器。与普通集群中的多个页面缓存服务器相比,主要是它的存储位置和分配请求的方式有点特殊。CDN服务器分布在全国各地。当收到用户请求时,他们会将请求分发到最合适的CDN服务器节点上获取数据。例如联通用户分配到联通节点,上海用户分配到上海节点。CDN的每个节点实际上就是一个页??面缓存服务器。如果没有请求资源的缓存,则从主服务器获取,否则直接返回缓存的页面。CDN分发请求(负载均衡)方式是在解析域名时,使用专用的CDN域名解析服务器进行分发。一般的做法是在ISP处尝试CNAME将域名解析为具体的域名,然后使用专用的CDN服务器将解析后的域名解析到对应的CDN节点。如图所示。第二步,访问CDN的DNS服务器。CNAME记录的目标域名应该使用NS记录指向CDN的DNS服务器。CDN的每个节点也可以集群多个服务器。6.底层的优化上面提到的所有架构都是基于上面介绍的基本架构。很多地方都需要通过网络传输数据。如果能够加快网络传输的速度,整个系统就会得到改善。7、数据库集群和库表哈希大型网站应用复杂。这些应用程序必须使用数据库。当面临大量访问时,数据库的瓶颈很快就会出现。这时候,一个数据库很快就无法满足应用,所以我们需要使用数据库集群或者库表哈希。在数据库集群方面,很多数据库都有自己的解决方案。Oracle、Sybase等都有很好的解决方案。常用的MySQL提供的Master/Slave也是类似的方案。你用的是什么DB,参考相应的解决方案即可实现。上面提到的数据库集群在架构、成本和可扩展性方面受到所使用的DB类型的限制。因此,我们需要从应用的角度来考虑改进系统架构。数据库表哈希是一种常见且最有效的解决方案。.我们在应用程序中安装业务和应用程序或功能模块来分离数据库。不同的模块对应不同的数据库或表,然后根据一定的策略对某个页面或函数进行更小的数据库哈希,比如用户表,根据用户ID进行表哈希,可以提高系统的性能成本低,可扩展性好。搜狐的论坛采用了这样的结构,将论坛用户、设置、帖子等信息从数据库中分离出来,然后根据板块和ID对帖子和用户进行数据库和表的哈希处理,最后可以在配置文件允许系统随时添加低成本的数据库来补充系统性能。8.总结网站架构的整个演进过程主要是围绕着大数据和高并发这两个问题展开的。解决方案主要分为两种:使用缓存和多资源。多资源主要是指多存储(包括多内存)、多CPU和多网络。对于多资源,可以分为两种:单一资源处理一个完整的请求和多个资源协同处理一个请求,比如多存储和多CPU集群分布,CDN和静态资源分离多网络。理解了整个思路,你就可以把握架构演进的本质,或许可以自己设计出更好的架构。其他简单总结:首先,我觉得在解决一个问题之前,首先要有一个清晰的思路。如果仅仅用于别人的解法,就只能用于说教,没有真正的理解,更没有推论。海量数据和高并发经常被放在一起谈,虽然它们是完全不同的东西。海量数据纯粹是指数据库的海量数据,而并发是指数据库和服务器的高访问量。那么问题来了,既然数据库数据量大,怎么办呢?要解决一个问题,首先要知道问题是什么!!!那么海量数据会给我带来什么样的问题呢?海量数据带来的问题无非就是增删改查的问题。还能有什么问题?不可能是安全问题(打脸,可能是安全问题)1.数据库访问慢2.插入更新慢。这个问题只能通过分库分表来解决。还有其他几个问题可以解决数据库访问慢的问题。method,既然访问数据库很慢,那么逻辑允许的情况下能不能不访问数据库呢?1.使用缓存。2.使用页面静态。由于不访问数据库就无法逃脱,因此我们将优化数据库。3、优化数据库(包括很多内容,比如参数配置、索引优化、sql优化等)4、数据库分离Activedata5读写分离6批量读取和延迟修改;7使用搜索引擎在数据库中搜索数据;8使用NoSQL和Hadoop等技术;9拆分业务;高并发解决方案其实这个问题必须结合上面讨论的海量数据,在什么情况下会出现高并发呢?肯定是平时访问量比较大的情况,所以对应的数据存储越来越对应平时比较大的访问量。与它的数据相比,它并不庞大。那么如何解决访问量大的问题呢?因为这里涉及到服务器和数据库的问题,所以需要从这两个方面进行优化:1、增加web服务器的数量,即集群和负载均衡。既然一台服务器不能完成任务,那就多用几台吧。几个是不够的。机房引出第二种方案之前,除了数据库服务器还有什么优化方法可以做吗?当然还有1.1页面缓存1.2cdn1.3反向代理1.4应用和静态资源分离(比如***下载的资源单独放在一起,为本服务器提供高带宽资源)2增加数据库数量服务器,同样做集群,做负载均衡。海量数据的解决方案1使用缓存很多东西是相辅相成的。与使用缓存相比,更多用于解决高并发问题,因为海量数据导致访问缓慢,容易造成高并发问题的严重性。又因为数据库一般是web访问的瓶颈,只要业务逻辑允许,我们尽量避免去操作数据库,所以就有了缓存。将需要的数据存储在内存中,不用每次都去数据库读取,造成不必要的性能浪费,加快访问速度---这就是缓存的好处。那么在使用缓存和选择管理缓存软件的时候应该注意什么呢?2页面是静态的---不想解释,还有什么值得解释的?3数据库优化3.1数据库表结构涉及3.2数据类型选择3.3SQL优化3.4索引优化3.5配置优化需要注意的地方太多了,应该单独拿出来4数据库中活动数据的分离为什么要它要分开吗??说说我在实际环境中遇到的一个问题!有一张表,只有10个字段,130万条数据,但是大小却达到了5G数据,这本身就是不合理的。这么小的数据量占用了太多的数据,也就是说有些字段存储了大量的字符串(比如文章内容等),这些大字段内容大多不是每次检索这张表都会用到的,但耗时较长,并产生大量慢日志。这时候我们可以考虑垂直拆分表,把活跃的数据分开,这样可以大大加快访问速度。欢迎大家和我一起学习交流搭建Java云架构。本人将近期开发的Java云架构的构建过程和精髓记录下来,以帮助更多有志于开发Java高级架构的朋友。一起来探讨下Java高级架构。构建过程以及如何将其应用到企业项目中。本人诚邀各大BATJ架构专家共同创建Java架构师社区,致力于免费提供一个Java架构行业交流平台。通过这个平台,大家可以互相学习,提高技术,把自己的水平提升到一个更高的层次,成功的成为Java架构技术开发的技术专家或者架构师(关注我:私信:【架构】,可以获得it)希望这篇文章能对您有所帮助,并听取您的意见。欢迎留言讨论,加关注,分享你的看法!持续更新中!
