您的位置:首页 > 运维架构 > 网站架构

探索大型网站技术架构(一)

2015-12-23 16:38 225 查看
最近总是在思考一些架构的问题,这些东西了解的确实不多,感觉是自己的短板,所以经常在网上查相关资料然后总结自己去思考,这个过程应该很漫长,因为这是一个重新构建世界的过程,好了闲话不说,将自己总结的一些东西记录下来。

首先我们来思考一下什么叫大型网站,很多人提起大型网站无疑都会说,大访问量和高并发的网站,这样说的话举个例子,hao123,这个大家都很熟悉的,他的访问量和并发量很高,那么他算大型网站吗?我觉得hao123这种网站其实是很简单的站,只要他不断的增加服务器,完全可以应对高强度的并发和大量的访问。

其实我理解中的大型网站,是指的在业务层次和技术层次,其中任意一个比较复杂难度较大的称之为大型网站,一般新网站基本不可能出现超大访问量,和超高的并发量,所以一般我们最简单的架构设计就是这个样子的。



这个设计的目的是为保证网站的稳定性,我们一般会把系统部署在至少两台服务器上,万一一台挂掉了,另一台还可以持续为用户提供服务,而且能够保证在高并发和大访问量的情况下,系统能够稳定为用户提供服务,两台服务器有一台共同的DB服务器。

要实现以上系统所需要实现的功能,说说其实很简单,架构看起来也相当简单,但是还有一个重要的问题需要解决,因为我们这里使用的是两台web服务器,所以用户访问网站的时候,会被负载均衡服务器经过一定的算法路由到任意一台web服务器,这个时候如果用户进行登录,那么他的session只会保存在当前这台服务器上,如果用户刷新页面可能就又被分配到另一台web服务器上了,这个时候登录状态就丢失了。

这种情况叫做,session不同步,因此,实现此架构,首先要解决的就是session同步的问题。

为了回答上面的问题,我们首先要理解下session的机制,session信息在web容器里都是存储在内存里的,web容器会给每个连接它的客户端生成一个sessionid值,这个sessionid值会被web容器置于http协议里的cookie域下,当响应被客户端处理后,客户端本地会存储这个sessionid值,用户以后的每个请求都会让这个sessionid值随cookie一起传递到服务器,服务器通过sessionid找到内存中存储的该用户的session内容,session在内存的数据结构是一个map的格式。

那么,根据上面session的原理,我们不难想想,解决他的办法就是在两个web容器之间,相互复制session。那说到这里就不得不说一下,我们大家都知晓的tomcat,在处理session同步的时候就使用这种方案,确实这种方案可以解决这个问题,不过据我所知,这种方案会有瓶颈,不能无限制的增加web容器,因为不同服务器之间不停的复制session也要消耗不少资源,当到web容器数量达到一个级别的时候,这种同步session的方法非但不能提高并发数,反而会降低。

还有一种解决方案,就是将session信息放到客户端的cookie里,这样每次请求先去web容器查找是否有session信息,如果没有再去cookie里面找,记得之前老淘宝使用的解决方案,不过后来可能是因为放的数据太多了,已经超过了浏览器的限制…所以后来改变方案了,其实只要cookie里面不放特别敏感的信息,倒也不用过多的担心安全性的问题。

另外现在各种云服务器提供托管服务,我们可以把自己的系统放上去,并发和session同步等问题,不需要我们去关心,不过DB如果也放上去的话,建议还是做好备份操作,即使云平台的供应商再怎么说自己的平台安全,我们也要好好考虑考虑要不要完全相信他们。

现在通用的解决方案一般是使用第三方缓存,也就是搞一台缓存服务器,专门用来处理这个,一般我们会考虑用memcache或者redis这两种缓存技术,如果担心session放到一台缓存服务器上不放心,可以考虑搭建集群,多搞几台缓存服务器。

说到这个集群上面,这里memcache和redis还有点不一样,假设有A、B两台memcache缓存服务器,如果A挂掉了,那么A中存储的session数据就会丢失,而redis在这方面做的很好,redis具有专业的数据备份机制,就算A挂掉了,A中的数据也不会丢失,redis会根据一些情况将数据备份到磁盘上,而不是单纯的放到内存中。

OK,这里不详细的拆开解释这两种缓存技术了,想了解的大家可以去查一下相关的资料。

如果使用缓存服务器的话,用户发送请求的时候,http中会携带sessionid,经过负载均衡路由到一台web服务器上,然后拿着sessionid去任意一台缓存服务器上获取该id对应的session信息。

另外,上面架构图上有写到第二层F5,作为负载均衡服务器,F5是一种硬件负载均衡服务器,不过价格比较昂贵,我等屌丝一般都使用软件达到相同效果,比如Nginx,LVS,haproxy,apache等,用户请求先由经负载均衡服务器,经过路由才会到响应的web服务器。

已经写了不少了,先到这里吧,虽然文字不少,但是介绍的技术点还真不多,只不过建立了一个简单的世界,让你有一点概念~~OK,剩下的后续会发,顺着这条线一直探索下去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: