大规模网站开发技术
Posted jiangxiaobo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大规模网站开发技术相关的知识,希望对你有一定的参考价值。
(一)单机构建网站
关于系统负载
什么是系统负载?
系统负载(System Load)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。
平均负载(Load Average)是一段时间内系统的平均负载,这个一段时间一般取1分钟、5分钟、15分钟。
如何查看系统的负载情况?
top、uptime、w等命令都可以查看系统负载。
(二)应用服务器与数据库分类
应用服务器需要处理大量的逻辑,所以需要强大的CPU;
文件服务器需要存储大量用户上传的文件,所以需要更大的硬盘;
数据库服务器需要快速磁盘检索和数据缓存,所以需要更大的内存和更快的硬盘
(三)应用服务器集群
负载均衡
什么是负载均衡?
负载均衡(Load Balance)是分布系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。
负载均衡的工作方式
1. http重定向
当http代理(比如浏览器)向web服务器请求某个Url后,web服务器可通过Http响应头信息中的Location标记来返回一个新的URL。这意味着HTTP代理需要继续请求这个新的URL,完成自动跳转。
缺点:吞吐率限制
优点:不需要任何额外支持
适用场景:我们需要权衡转移请求的开销和处理实际请求的开销,前者相对于后者越小,那么重定向的意义就越大,例如下载,你可以去很多镜像下载网站,会发现基本下载都使用了Location做了重定向
2. DNS负载均衡
DNS负责提供域名解析服务,当访问某个站点的时候,实际上首先需要通过该站点域名的DNS服务器来获取域名指向的IP地址,这一个过程中,DNS服务器完成了域名到P地址的映射,同样,这样映射也可以是一对多的,这时候,DNS服务器便充当了负载均衡调度器。
使用命令:dig google.cn 查看DNS的配置
DNS服务器可以在所有可用的A记录中寻找离用户最近的一台服务器。
缺点:DNS记录缓存更新不及时、策略的局限性、不能做健康检查。
优点:可以寻找最近的服务器,加快请求速度。
适用场景:一般我们在多机房部署的时候,可以使用。
3.反向代理负载均衡
在用户请求到达反向代理服务器的时候(已经到达网站机房),由反向代理服务器根据算法转发到具体的服务器。常用的apache、nginx都可以充当反向代理服务器。反向代理的调度器扮演的是用户和实际服务器中间人的角色。
工作在HTTP层(第7层)
缺点:代理服务器成为性能的瓶颈,特别是一次上传大文件。
优点:配置简单,策略丰富、维持用户会话,可根据访问路径做转发。
适用场景:请求量不高的,简单负载均衡。后端开销大的应用。
4.IP负载均衡
工作在传输层(第4层)
通过操作系统内修改发过来的IP数据包,将数据包的目标地址修改为内部实际服务器地址,从而实现请求的转发,做到负载均衡。lvs的nat模式。
缺点:所有数据进出还是要过负载均衡的服务器,网络带宽成为瓶颈。
优点:内核完成转发,性能高。
适用场景:对性能要求高,但对带宽要求不高的应用。视频和下载等大带宽的应用,不适合。
5.数据链路层的负载均衡
工作在数据链路层(二层)
在请求到达负载均衡器后,通过配置所有集群机器的虚拟IP和负载均衡器相同,再通过修改请求的mac地址,从而做到请求的转发。与IP负载均衡不一样的是,当请求访问完服务器之后,直接返回客户。而无需再经过负载均衡器。LVS DR(Direct Routing)模式。
缺点:配置复杂
优点:由集群机器直接返回,提供了出口带宽。
适用场景:大型网站使用最广的一种负载均衡的方式。
负载均衡中如何维持用户的session会话?
1.把同一个用户在某个会话中的请求,都分配到固定的某一台服务器中,常见的负载均衡算法有ip_hash法。
2.session数据集中存储。session数据集中存储就是利用数据库或者缓存来存储session数据,实现了session和应用服务器的解耦。
3.使用cookie来代替session的使用。
负载均衡的常见策略
轮询(Round Robin):能力比较弱的服务器导致能力较弱的服务器最先超载
加权轮询(Weighted Round Robin):这种算法解决了简单轮询调度算法的缺点:传入的请求按顺序被分配到集群中的服务器,但是会考虑提前为每台服务器分配的权重
最少连接数(Least Connection):最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有块有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前连接数最小的一台服务器来处理当前的请求,尽可能地提高后端服务器的利用效率,将负责合理地分流到每一台服务器。
加权最少连接数(Weighted Least Connection):如果服务器的资源容量各不相同,那么“加权最少连接”方法更合适:在考虑连接数的同时也权衡管理员根据服务器情况定制的权重。
源ip_hash(source Ip Hash):这种方式通过生成请求源ip的哈希值,并通过这个哈希值来找到正确的真实服务器,这意味着对于同一主机来说他对应的服务器总是相同。
随机:通过系统随机算法,根据后端服务器的列表大小值来随机选取其中一台服务器进行访问,实际效果接近轮询的结果。
常见的负载均衡方案
硬件:常见的硬件有比较昂贵的NetScaler、F5、Radware和Array等商用的负载均衡器。优点就是专业的维护团队维护、性能高。缺点就是昂贵,所以对于规模较小的网络服务来说暂时还没有需要使用。
软件:nginx、Haproxy、LVS等
负载均衡技术 | 优点 | 缺点 | 并发数 |
LVS | 抗负载能力强、配置性比较低、工作稳定、应用范围广 | 不支持7层转发,配置较为繁琐 | 十多万的并发 |
Haproxy | 4层和7层都支持,配置简单,有监控界面 | 性能没有LVS高 | 可以支持5到10万的并发 |
Nginx | 只支持7层转发、配置简单、epoll模型能挡高并发 | 主要支持http和email应用范围小 | 1万次 |
F5 BIG-IP | 性能非常强大,功能非常强大 | 需要专业维护人员,售价几十万,比较贵 | 几百万并发 |
LVS这么牛逼能不能只用它就够了?
不可以,假如现在每天并发数在1000W,应该怎么设计这个架构呢?
答案:域名一个,对应多个IP服务器(不同地区都是独立且相同的负载均衡器及服务器集群),通过DNS解析到用户临近的服务器。当DNS解析到某个负载均衡器后,受理业务。比如,现在一个负载均衡器可以并发10W,那么DNS可以映射10个,那么最大并发量就是100W。
(四)数据库读写分离化
随着访问量的提高,数据库的负载也在慢慢增大。大部分互联网的业务都是“读多写少”的场景,数据库层面,读性能往往成为瓶颈。业界通常采用“一主多从,读写分离,冗余多个读库”的数据库架构来提升数据库的读性能。
问题:
主从数据库之间数据同步怎么实现?
根据负载量,如何计算需要扩展的从库数量?
同步的延迟如何保证读数据的准确?
MYSQL复制原理
1.master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
2.slave将master的binary log events拷贝到它的中继日志(relay log);
3.slave重做中继日志中的事件,将改变反映它自己的数据。
负载容量的规划
例如:假设工作负载为20%的写以及80%的读。为了计算简单,假设有一些前提:
读和写查询包含同样的工作量。
所有的服务器都是等同的,每秒能进行1000次查询。
备库和主库有同样的性能特征。
可以把所有的读操作转移到备库。
如果当前有一个服务器能支持每秒1000次查询,那么应该增加多少备库才能处理当前两倍的负载,并将所有的读查询分配给备库?
解:
两倍负载: 1000 * 2 = 2000
写负载: 2000 * 20% = 400
读负载: 2000 * 80% = 1600
每个从库的可以承受负载: 由于每个从库都需要从中继日志中同步400次,所以原本1000的负载,每个从库服务器变成 1000 - 400 = 600
从库数量: 1600 / 600 约等于 3,所以需要三台从库
DB主从架构一致性优化方法
以上是关于大规模网站开发技术的主要内容,如果未能解决你的问题,请参考以下文章