第5课 大规模数据处理的难点 -- 内存和磁盘

单台Linux服务器瓶颈分析

1、查看平均负载

用top、uptime命令查看平均负载;

1、平均负载很低,系统吞吐量无法提升 --------->检查软件设置是否异常,网络、主机是否存在故障

2、平均负载很高,用sar或vmstat命令查看cpu使用率和I/O等待率

2、确认CPU、I/O是否存在瓶颈;

>如果是CPU负载过高:

1、使用sar或top命令确认是用户程序的瓶颈还是系统程序的问题;

2、用ps命令查看可见进程的状态和CPU使用时间,进一步确认问题进程;

3、确定进程后,使用strace进行跟踪或用oprofile进行剖测;

如果是排除程序失控、磁盘、内存处于理想状态,则需要增加服务器、改善程序逻辑和算法;

>如果是I/O负载过高:

多半是程序发出的I/O请求过多导致负载过高或者是发生页面交换导致频繁访问磁盘,使用sar或vmstat确认交换区状态;

如果是发生页面交换引起:

1. 用ps确认是否有进程消耗了大量内存

2. 如果是程序问题消耗大量内存的,需要改进程序;

3. 如果是因为内存安装不足,则增加内存,无法增加内存的情况,需要考虑分布式

如果不是发生页面交换引起(可能是用于缓存的内存不足):

1.如果增加内存可以扩大缓存,则增加内存;

2.如果增加内存还是无法解决问题,则考虑分布式或增加缓存服务器;


第6课:可扩展的要点

CPU负载的扩展(较简单)

1、增加相同结构的服务器,通过负载均衡器来分散;

2、如:web应用服务器、网络爬虫等;

I/O负载的扩展(较复杂)

1、借助数据库

2、大规模数据


第7课:处理大规模数据的基础知识

处理大规模数据的三个重点:
     写程序的技巧:

*  尽量在内存中完成,:将磁盘寻道次数降到最低;可以实现分布式,有效利用局部性;

* 使用能应对数据量增加的算法,例如:线性搜索 -->二叉树搜索,O(n) -->O(logn)

* 有时可以利用数据压缩和搜索的技术

处理大规模数据之前的三大前提知识:

* 操作系统的缓存
    * 以分布式为前提应用RDBMS时必须要做的事情
    * 大规模环境中的算法和数据结构


第9课:降低I/O负载的策略

以缓存为前提,降低I/O负载的策略:

* 如果数据规模小于物理内存,则全部缓存;
    * 如果数据规模大于物理内存,可以考虑数据压缩(使用数据压缩,在从缓存中读取时是否要进行解压,这是否会增加计算负载呢?);
    * 如果数据规模大于物理内存 ,可以就是扩展到多台服务器。为分散CPU负载,只需要简单增加服务器,为分散I/O负载,需要考虑局部性;
    * 考虑经济成本的平衡性

linux页面缓存策略:(只要可能linux就会把空闲的内存用作页面缓存使用)

1. 从磁盘读取数据
    2. 如果数据在缓存中不存在且有空闲的内存
    3. 建立新的缓存
    4. 如果没有空闲内存供缓存使用,则替换旧的缓存
    5. 进程要求分配内存时,其优先级高于页面缓存;

服务器刚启动时,不要投入生产环境,因为建立缓存需要时间,如果在没有缓存的情况下,大规模的访问造成频繁的读写磁盘,可能会引起宕机;启动后要将经常使用的数据库文件cat一遍,使其放入缓存中;

如何cat?


第10课:利用局部性的分布式
所谓局部性就是Locality,根据访问模式实施分布式;


我理解是按一定的业务规则将访问进行分流,这样单台服务器只要保存对应规则部分的缓存数据即可,那么应用请求分配由谁来完成呢?是LVS?

常用的局部性分布式技术是:Partitioning(分区)
简单的说就是将一个数据库分割到不同的机器上,

* 最简单的分割方法:以表为单位分割,比如表A、B在机器1上,表C、D在机器2上;分割原则是看表的容量和机器缓存容量的匹配上;这样的分割是否意味着不同机器的表之间必须是弱关系的,不能有关联的需求?

* 有一种分割方法是从数据中间进行分割,即对一个表,比如根据ID的起始字母:a-c在机器1,d-f在机器2等;

* 还有一种特别的分割方法是根据业务用途,将数据分割成“数据岛”;例如Hatena BookMark是根据HTTP请求的User-Agent和URL进行分离的,例如:一般用户分配到岛1,部分API请求分配到岛2,Google bot、Yahoo!等爬虫分配到岛3;

* 使用局部性的分布式,要求应用程序做相应的修改,同时存在的问题是:如果需要改变分割粒度,需要将数据合并一次后再进行分割,比较麻烦;


第11课:正确应用索引 ----分布式MySQL应用的大前提

* 在设计大数据量的表时,尽量紧凑一些,让记录尽可能的小,因为表结构稍微有错误,数据量就会以GB的单位递增;

* 要注意表设计过程中对冗余列的处理,如果一个表包含冗余列,会浪费存储空间,如果将冗余列分割到另一个表,也许会节省空间(不一定,需要评估),但同时也增加了查询的复杂度,因此在时间和空间的取舍上要进行衡量;

* MySQL中建立索引的数据结构就是B树的变种B+树,B树可以通过调整节点数参数M,使得每个节点的大小在4KB,从而使得磁盘寻道次数和节点访问次数相同;而二叉树是固定为2个节点,因此不具备这样的调节能力;

* 从理论上,B(+)树的复杂度为Olog(n),而线性搜索的复杂度为O(n)

Mysql索引的规则:

* where、order by、group by中指定的列会使用索引

* 何时索引有效?明确添加的索引、主键,UNIQUE约束;

* 想同时应用多个列上的索引,就必须使用复合索引;

* 确认索引是否有效的命令:explain


第12课:MySQL的分布式 -- 以扩展为前提的系统设计

MySQL的Replication:

* master/slave的架构;
    * 查询发给slave,更新发给master;通过ORM来控制;
    * slave前面放负载均衡器,如:LVS 、MySQL Proxy,从而将查询分散到多台服务器上;

Master/Slave的特征:

查询可以扩展,只需增加Slave服务器即可,但在增加前添加适当的内存;

Master无法扩展,虽然web应用90%以上是读操作,但如果需要扩展,则需要通过对表进行分割或更换实现方法;

  • 进行表分割:分散写入操作,将数据文件分散到同一机器的不同磁盘上或不同的机器上
  • 不使用RDBMS,采用key-value存储结构,如:Tokyo Tyrant、Redis

第13课:MySQL的横向扩展和Partitioning

以Partitioning为前提的设计

例如表entry和表tag是一对多的关系,如果要取出包含标签“perl”的书签,需要使用JOIN查询,将两个表关联。但是如果entry和tag表放在不同的机器上,MYSQL就无法实现JOIN(MySQL的FEDERATED表可以实现),只有通过先查找包含“perl”标签的记录,再到entry表中根据eid找对应的entry记录。因此,JOIN查询只能在保证表以后不会被分割到不同机器上的前提下才能使用。

利用where…in…来避免JOIN

select  url from entry INNER JOIN bookmark on entry.eid = bookmark.eid where bookmark.uid = 169848 limit 5;

=>

select eid from bookmark where uid = 169848 limit 5;

select url from entry where eid in (0,4,5,6,7);


第14课:特殊用途索引----处理大规模数据

问题:当数据规模超过RDBMS的处理能力时怎么办?

方法:利用批处理操作从RDBMS中提取出数据,建立索引服务器之类的,再让WEB应用程序通过RPC等访问索引服务器。

     


第30课:云 vs 自行构建基础设施

Amazon EC2 (Amazon Elastic Compute Cloud),是不负责储存的,储存由S3 (Amazon Simple Storage Service)服务负责,所以得有脚本每次重启时从S3恢复数据库

Amazon S3 (Amazon Simple Storage Service)

Google App Engine

Microsoft Windows Azure


第31课:层和可扩展性

一台服务器的处理能力大概为100万~200万PV(page views)/月左右  4核CPU,8G内存

各层可扩展性:

应用程序服务器,配置相同,不持有状态,容易扩展

数据源(数据库服务器、文件服务器):read的分布式容易,write 的分布式难


第33课:保证冗余性

应用程序服务器:

增加服务器数量

用负载均衡器实现失败转移和失败恢复

数据库服务器:

Multi-master:是今年Mysql服务器构建的主要方法。该架构中,服务通常是两台,组成Active/Standby结构。其中,一台是Active,另一台是Standby,通常只向Active写数据。一旦Active停机,Standby通过VRRP协议监视到这一情况,即把自己提升为Active,变成新的master。而停机的那台经过人工修复后变成Standby,或恢复为原来的结构。为了从外部判断哪台是Active,需要用到虚拟IP(VIP),即Active服务器除了原有的IP地址,还会被分配一个服务用的虚拟IP地址。应用程序服务器始终访问这个虚拟IP。切断时将这个虚拟IP分配给新的Active。从而实现master的透明切换。


第38课:网络的分界点

PC路由器的极限:超过1Gbps(30pps,即每秒30万包数据,按每包300字节算,为1Gbps)

一个子网的极限:500台主机

一个数据中心无法实现全球化

CDS:(Content Delivery Network),基本原理就是在世界各地放置服务器,将媒体文件缓存后,用户就可以从最近的服务器下载了。

如:Amazon CloudFront

转载于:https://www.cnblogs.com/xiekeli/archive/2012/05/30/2527103.html

《大规模web服务开发技术》阅读笔记相关推荐

  1. trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer

    一.代码结构概览 1.核心部分 configs:储存各种网络的yaml配置文件 datasets:存放数据集的地方 detectron2:运行代码的核心组件 tools:提供了运行代码的入口以及一切可 ...

  2. VoxelNet阅读笔记

    作者:Tom Hardy Date:2020-02-11 来源:VoxelNet阅读笔记

  3. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  4. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  5. Mina源码阅读笔记(一)-整体解读

    2019独角兽企业重金招聘Python工程师标准>>> 今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者 ...

  6. “CoreCLR is now Open Source”阅读笔记

    英文原文:CoreCLR is now Open Source 阅读笔记如下: CoreCLR是.NET Core的执行引擎,功能包括GC(Garbage Collection), JIT(将CIL代 ...

  7. QCon 2015 阅读笔记 - 团队建设

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 中西对话:团队管理的五项理论和实战 - 谢欣.董飞(今日头条,LinkedI ...

  8. 05《软件需求模式》阅读笔记

    剩下的两个阅读笔记写第二部分.各类需求模式,共八个领域和它的需求模式,这一次写前四个. 基础需求模式,它是所有种类的系统都可能需要的一些东西.系统间接口需求模式使用系统间接口需求模式定义被定义的系统和 ...

  9. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  10. 大型网站技术架构:核心原理与案例分析阅读笔记二

    大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...

最新文章

  1. linux 源码搭建lnmp_Linux精华篇—CentOS 7.4下源码编译构建LNMP架构
  2. icem密度盒怎么设置_icem一些总结精编版
  3. JS-String方法
  4. Python基础教程:连接列表的八种方法,你都知道吗?
  5. Arduino学习笔记24
  6. 未来已来!医院数字化转型为“看病难”画上“休止符”
  7. 指北针邮件工具 v1.5.6.1
  8. 玩转 SpringBoot 2 之整合 JWT 上篇
  9. 清华大学刘知远:在深度学习时代用HowNet搞事情
  10. GBase数据库-时间函数
  11. Arduino与Proteus仿真实例-AD5242数字电位器驱动仿真
  12. 纯前端实现pdf分页下载,完美支持横屏竖屏
  13. php李炎恢第二季视频_李炎恢PHP视频教程第二季资源推荐
  14. 微信小程序ui布局常用技巧
  15. 自动化办公学习笔记(风变编程)
  16. linux开发之deamon的写法
  17. 微型计算机的主机常用部件,组成微型机主机的部件是
  18. 蓝牙音箱方案选用及设计注意
  19. 可惜我是水瓶座 你不懂的水瓶座,不为人知的秘密
  20. 2006年9月15日

热门文章

  1. 为什么 Kafka 速度那么快?
  2. Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝!
  3. JavaWeb-Spring中注解大全与详解
  4. 8.程序什么时候应该使用线程,什么时候单线程效率高?
  5. java强制编译通过_强制java使用用户输入作为消息进行编译错误
  6. python 实例变量_Python的类变量和实例变量详解
  7. c语言删除s字符串中所有子串t,从串s中删除所有和串t相同的子串的算法
  8. 未来的数据中心(二)
  9. AI:Algorithmia《2020 state of enterprise machine learning—2020年企业机器学习状况》翻译与解读
  10. 成功解决TypeError: ‘encoding’ is an invalid keyword argument for this function