大型网站的自强之路
1、大型网站的自强之路
当年马云筹办阿里巴巴的时候并没有说我要做个大型网站,搞个双11,成交额做到千亿级别;马化腾也没有说以后我要做个通讯工具,让13亿乃至更多用户都成为我们的用户……我们现如今看到的各个大型网站或产品都是一步步踏踏实实走过来的,在各种坑和故障中成长起来的。
1.1、一台电脑就是服务器
做过课程设计或者毕业设计的计算机相关的同学都应该有过搭建项目的经验。画一堆界面,结合js和后台实现数据的展现,当然还要有数据来源——数据库,启动一个容器比如tomcat,那么我们就可以在本机上访问我们的网站了。想必没有比这还简单的网站了吧,自己的电脑就充当了服务器的角色,应用和数据库都部署在了自己的电脑上。
1.2、我们需要丰富网站的功能
随着一个单机网站的不断完善,用户的增长,我们不再也不能只是一个完成缴费或者完成选课的单一功能的网站应用。我们需要从各个维度把这些应用分离开来,比如一个电商网站,我们有用户、商品和交易三个基本模块。 用户
- 用户注册
- 用户管理
商品
- 商品展示
- 商品管理
交易
- 订单系统
- 交易管理
随着应用的分块,数据库中表的划分也会相应变化。大概的结构图如下
1.3、应用数据库分离
不管是2.1中的电脑即服务器,还是2.2中的应用和DB放在同一服务器上,这两种都没有将应用和DB做分离。随着我们应用网站的访问量逐渐增多,对于服务器的压力也增大了,我们需要考虑分离应用和数据库以保证应用更加稳定。 相比2.2,我们只是将应用模块和DB模块部署在两台服务器上,这样各自的服务出现问题不会影响对应的模块,同时也减轻了原来一台服务器的压力。
1.4激增的访问让应用服务器走向集群
当应用服务器承受的压力越来越大时,我们考虑将应用服务器走向集群化。大概结构如下:
注意 因为这里使用了多个应用服务器,Session就不再像单应用服务器那样只有一个可选,这时候对于多个应用服务器,可能会出现这次的请求是被A应用服务处理,但是下一次就会被B应用服务器处理,应用Http是无状态,所以需要借助Session实现有状态,但是显然这里Session无法完成这个“艰巨”的任务。 针对这个问题,解决方法较多。比如可以在请求和服务器之间加一个负载均衡器,让负载均衡器维系请求和服务器之间的对应关系,如果发现是张三发来的请求那就扔到服务器A上处理,如果是李四的就扔到服务器B上处理。 还有一种处理方法是添加一个同步操作,在两个服务器之间完成Session同步,这样不管服务器A还是B都会有全集的Session集合了,那么谁处理就显得不重要了。
1.5、数据库扛不住了,读写分离
这个时候我们不能再把自己的应用网站成为小网站了,我们的数据量和访问量空前的增长以至于数据库有些hold不住了。所以我们需要将数据库进行读写分离了,毕竟我们一般的网站应用读数据库占得比重比较多。大概的结构如下:
从图中可以看出,用于读的数据库可以直接被应用读取,同时它与主库之间需要及时同步,当应用需要向主库写入数据时,则需要将写入的数据通过到DB Read数据库中,保证数据的实时性和准确性。 读写分离还有更多的延伸,包括使用缓存以及数据库的垂直和水平拆分等,后面再说吧。
- DataSet与Xml相互转化
- SqlTransaction事务使用示例
- nginx的web缓存服务环境部署记录
- nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
- [转自blueidea]像table一样布局div Ⅰ
- 如何对动态创建控件进行验证以及在Ajax环境中的使用
- 升级个人网站框架组件IBatisNet+Castle
- 如何在多线程中调用winform窗体控件
- gerrit代码简单备份方案分享
- svn代码发版的脚本分享
- 正则表达式提取指定内容
- mysql数据库误删除后的数据恢复操作说明
- 在.NET平台上运行Java程序-IKVM.NET入门
- ArraySegment<T>泛型结构示例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MyBatis 多表操作
- 从0打造wordpress插件wp2oc fileshare (1) – 将wp存储后端做进owncloud
- Python 爬虫保存图片
- 抛物线法、牛顿法、弦截法求根实例
- org.springframework.web.client.ResourceAccessException: I/O error on POST request....
- 升级MySQL InnoDB Cluster的元数据
- 数据分析项目-数据分析岗位近况分析
- Eureka 的服务发现 Discovery 简单配置
- python自动化之JS处理滚动条
- Docker 中启动 ZooKeeper
- 将MySQL复制限制为基于行的事件
- 在tinycorelinux上安装lxc,lxd (1)
- Ubuntu16.04下安装python3.6
- Mybatis 注解
- Python如何使用Matplotlib的作图