大规模web服务开发技术(转)

前段时间趁空把《大规模web服务开发技术》这本书看完了,今天用一下午时间重新翻了一遍,把其中的要点记了下来,权当复习和备忘。由于自己对数据压缩、全文检索等还算比较熟,所以笔记内容主要涉及前5章内容,后面的零星记了一些。本文可能对如下人士比较有帮助:1、对这本书有兴趣,但对内容存疑的;2、对大规模Web服务有一定经验的,可对照着查漏补缺。

Hatena的规模(20104)

  • 注册用户150wUU1900w/
  • 请求数:几十亿/
  • 繁忙时流量:850Mbps(不含图像)
  • 硬件(服务器)600台,通过虚拟化技术,主机超过1300
  • 日志每天几GB级别,数据库GBTB级别

系统增长的战略

  • 最小化开端、预见变化的管理和设计

平衡效率和质量

  • 开会、规范化、文档、敏捷等

GB级别(千万)的文本数据库,不用索引,一句select查询200s也未能执行完

内存和硬盘的速度差异

  • 寻址:前者是后者的10w100w
  • 传输速度(总线):前者——7.5G/s,后者——58M/s

找寻单机瓶颈(用足单机的性能,不要推测,要测量)

  • sarvmstat查看是CPU问题还是IO问题
  • 若是CPU问题
    • topsar查看是系统进程还是用户程序
    • ps查看进程状态和cpu使用情况,确定问题进程
    • straceoprofile找出程序或进程的具体问题所在
  • 若是IO问题
    • 发生频繁页交换--->内存不足
      • ps查看程序所用内存
      • 能否改善程序,减少内存占用
      • 不行增加硬件或分布式
    • 若无,则可能是缓存的内存不够
      • 增加内存
      • 不行就增加机器,分布式

CPU扩展比较方便,但IO负载的扩展比较困难

  • 查看实际负载:top结果中的load average1分钟 5分钟 15分钟)
  • 查看是IO负载过高还是CPU负载过高:sar -P(多核)

 

处理大规模技术的重点

  • 尽量在内存中进行,可实现分布式,利用局部性
  • 算法的复杂度,O(n) --> O(logn)有质的飞跃
  • 数据压缩和检索技术

缓存机制

  • 页面缓存(page cache
    • 现代操作系统均采用虚拟内存
    • 内核分配过的内存会尽量留下来,下次无需访问磁盘,即页面缓存
    • 操作系统以页为单位缓存,即虚拟内存的最小单位
    • 增加内存可提高缓存的命中率,降低IO负载
  • sar命令
    • sar -r 即可查看当前的内存状态(kbbuffered缓存使用的物理内存大小)
    • sar  1 3 一秒1次,总共3
    • sar -u 查看CPU使用率
    • sar -q 查看平均负载
    • sar -r 查看内存使用情况

降低IO负载的策略

  1. 提高缓存,即加内存
  1. 扩展到多台服务器
  1. 2实际可能未提高缓存命中率(每台机器的数据不变),需要切分(Partition)数据

切分(Partition)——利用局部性的分布式

  • RDBMS的表为单位
  • 从数据中间切分
    • a-c服务器1d-f服务器2……
    • 一致性哈希
  • 按用途将系统分成不同的“岛”
    • 爬虫
    • 图像API
    • 一般访问

以页面缓存为基础的基本运维规则

  • 操作系统启动时不要马上投入生产环境,要先预热,即读一遍所有文件
  • 性能测试要在缓存优化后进行

 

数据库横向扩展策略

灵活应用操作系统缓存

  • 尽量让数据库大小小于物理内存
  • 考虑表的结构设计对数据库大小的影响

建立索引

  • B+
  • 提高搜索效率(logn),改善磁盘寻道次数
  • MySQLexplain命令帮助查看索引是否有效

MySQL的分布式

  • master/slave设计(master更新,slave读)
    • 查询可以扩展(slave
    • master无法扩展(数据一致性)
      • Web应用大多数情况下90%都是读取查询
      • master的负载可通过分库分表或更换实现方法来解决

MySQLPartition

  • 将联系不紧密的表放在不同机器上
  • 避免对不同机器上表进行JOIN操作
    • 使用INNER JOINwhere...in…
    • 使用自定义的ORM
  • Partition的代价
    • 运维变得复杂,故障率上升,成本上升
  • 实现冗余化最少需要多少台机器
    • 4台——1master3slave
    • 3slave中,一台用于提供持续服务,一台可能会故障,最后一台用于故障后复制

 

Web服务的基础设施重视的三点

  1. 低成本、高效率
    • 不应追求100%可靠性
  1. 设计很重要
    • 可扩展性和响应时间
  1. 开发速度很重要
    • Web服务经常添加或更改功能,需为服务提供灵活的资源

 

一台服务器能处理的流量极限

  • Hatena标准服务器:4CPU8G内存;
  • 性能:繁忙时每分钟几千请求
  • 4CPU*232G内存
    • 100w~200wPV/

调优

  • 掌握负载
    • 服务器监控工具

 

冗余性与系统稳定性

master的冗余化

  • multi-master
    • 通常有两台服务器,组成Active/Standby结构
    • 一台是Active的,另一台Standby
    • 两台服务器互为slave,一方的写入数据传入另外一方,双向replication
    • Standby通过VRRP协议发现Active停机,则Standby自动提升为Active,变成新的master
    • Active服务器有个虚拟ip,将此ip分配给哪台机器,哪台机器就是Activemaster
    • 缺点
      • 还是有不一致的风险

系统的稳定性

  • 资源应都保留一定余量,只用到70%左右
  • 去除不稳定因素(尽量自动化处理)
    • 规定SQL负载上限
    • 减少内存泄露,遇到可自动重启
    • 异常行为的自律控制
      • 自动DOS判断
      • 自动重启
      • 自动终止耗时查询

 

虚拟化技术

  • 好处
    • 可扩展性
      • 将额外开销降至最低
      • 动态迁移
    • 性价比
      • 提高资源利用率
      • 提高运维的灵活程度
        • 软件层面的主机控制
    • 高可用性
      • 环境隔离
  • Hatena的虚拟化应用
    • XenCentOS 5.2Xen 3.0.3本地磁盘构建LVM
    • HyperVisor替代IPMI
    • 使用准虚拟化(ParaVirtualization
    • 控制资源消耗
      • 负载过高时警告
      • 调整负载
    • 检测工具:monit
    • 提高资源利用率
      • CPU空闲 --> Web服务器
      • IO空闲 --> 数据库服务器
      • 内存空闲 --> 缓存服务器
      • 避免消耗倾向相同的组合在一起
    • 虚拟化的额外开销
      • CPU2%~3%
      • 内存性能:10%
      • 网络性能:50%
      • IO性能:5%

SSD的寿命

  • 损耗程度指标:S.M.A.R.T值中的E9Media Wearout Indicator---> smartctl命令
  • Hatena写入最频繁的SSD用了9个月左右

 

网络的分界点

  • 1Gbps,即30wpps,是PC路由器的极限(1Gbps是千兆以太网的界限,30wppsLinux内核的极限)
    • 对策:多个PC路由,购买昂贵成品路由
  • 500台主机,是子网、ARP表的极限
    • 对策:对网络进行层次化

 

RDBMS还是k-v存储

  • 判断依据
    • 平均数据大小
    • 最大数据大小
    • 新数据增加频率
    • 更新频率
    • 删除频率
    • 访问频率
  • MyISAM vs. InnoDB
    • MyISAM
      • 优点
        • 未经updatedelete的表也能快速insert
        • 启动、停止十分迅速
        • 表移动、改名称可直接从文件系统中操作
      • 缺点
        • 异常停止可能会损坏表
        • 不支持事务
        • updatedeleteinsert(追加数据之外)会锁表,在更新较多的应用中性能不好
      • 适合场景
        • 只有数据追加
        • 使用SELECT COUNT(*)
    • InnoDB
      • 优点
        • 支持事务
        • 异常停止恢复
        • 数据更新时执行行锁定
      • 缺点
        • 启动、停止慢
        • 表操作完全通过数据库
      • 适合场景
        • 更新频率高
        • 需要事务
  • 分布式k-v
    • memcached
    • TokyoTyrant

 

缓存系统

  • Squid
    • 用作HTTPHTTPSFTP等多种(反向)代理
    • 访问控制、认证功能
  • Varnish
    • 高性能HTTP加速器
    • 灵活的设置语言
    • 基本完全在内存中执行
    • 速度比Squid
  • nginxpound……
  • 缓存服务器上线时注意
    • 两台负载均衡时,一台故障会导致另一台无法承受负载
      • 备足服务器
    • 即使备足服务器也要注意
      • 新服务器(或刚启动)要预热,流量从小到大慢慢增大

转载于:https://www.cnblogs.com/qq78292959/archive/2012/12/27/2835930.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO多路复用的三种机制Select,Poll,Epoll

IO多路复用的本质是通过系统内核缓冲IO数据让单个进程可以监视多个文件描述符,一旦某个进程描述符就绪(读/写就绪),就能够通知程序进行相应的读写操作。 select poll epoll都是Linux提供的IO复用方式,它们本质上都是同步IO,因为它…

qt中按钮贴图

一.QT之QPushButton按钮贴图 二.QT之QToolButton按钮贴图 一.QT之QPushButton按钮贴图具体操作流程 1. Qt Designer中拖入一Tool Button 2. 选择图标的图片放入工程目录下,如放在Resources内 3. 双击工程的Resource Files下的qrc文件,如图 4. 在弹出的窗…

Ubuntu手动编译gVim7.3修复终端启动时与ibus的冲突

个bug伴随着Ubuntu/ibus的升级苦憋已久,症状为终端启动gvim时卡死,gvim -f可以缓解此问题,但偶尔还是要发作,况且每次末尾托个&也不方便。其实新版gvim已经修复此bug,不过ubuntu安装包一直没更新,那我们…

Android Activity类讲解(一)

--by CY[kotomifigmail.com] 1.protected void onCreate(Bundle savedInstanceState) { throw new RuntimeException("Stub!");   } 当创建一个Activity时,系统会自动调用onCreate方法来完成创建工作.该创建工作包括布…

Mysql的undo、redo、bin log分析

目录关于undo log关于redolog关于binlog一个事务的提交流程undo log :记录数据被修改之前的样子 redo log:记录数据被修改之后的样子 bin log:记录整个操作。 关于undo log 关于undo log: 在执行一条涉及数据变更的sql时,在数据…

typedef 字符串_typedef在C中使用字符数组(定义别名来声明字符串)的示例

typedef 字符串Here, we have to define an alias for a character array with a given number of maximum characters length to read strings? 在这里,我们必须为具有给定最大字符长度数的字符数组定义别名,以读取字符串 ? In the below-…

最小堆实现代码

参考算法导论、数据结构相关书籍&#xff0c;写得最小堆实现的源代码如下&#xff1a; 1 //2 //--最小堆实例3 //4 5 #include <iostream>6 #include <vector>7 #include <string>8 using namespace std;9 10 template<typename Comparable>11 class m…

非常好的在网页中显示pdf的方法

今天有一需求&#xff0c;要在网页中显示pdf&#xff0c;于是立马开始搜索解决方案&#xff0c;无意中发现一个非常好的解决方法&#xff0c;详见http://blogs.adobe.com/pdfdevjunkie/web_designers_guide。 其实就光看这个网站也足够了&#xff0c;http://www.pdfobject.com/…

Redis字典实现、Hash键冲突以及渐进式rehash

本笔记参考《Redis设计与实现》 P24~ 37 目录Redis字典实现哈希表节点结构哈希表结构字典哈希算法解决hash冲突rehash渐进式hashRedis字典实现 哈希表节点结构 typedef struct dictEntry {// 键void *key;// 值 : 可以是一个指针&#xff0c;或者是一个uint64/int64 的整数un…

Java线程类void setContextClassLoader(ClassLoader loader)方法,带示例

线程类void setContextClassLoader(ClassLoader loader) (Thread Class void setContextClassLoader(ClassLoader loader)) This method is available in package java.lang.Thread.setContextClassLoader(ClassLoader loader). 软件包java.lang.Thread.setContextClassLoader(…

JPA概要

本文最新版已更新至&#xff1a;http://thinkinside.tk/2012/12/30/JPA.html JPA定义了Java ORM及实体操作API的标准。本文摘录了JPA的一些关键信息以备查阅。 如果有hibernate的基础&#xff0c;通过本文也可以快速掌握JPA的基本概念及使用。 Table of Contents 1 JPA概述2 实…

如何配置能让fiddler抓去https的请求?

1、打开fiddler&#xff0c;>>Tools>>Fiddler Options&#xff0c; 打开如图所示的HTTPS配置项&#xff1a;点击Export Rppt Certifica to Desktop :桌面上多了一个证书&#xff1a;下面就是将证书导入&#xff1a;点击开始-运行&#xff0c;输入&#xff1a;mmc,…

Redis对象的refcount与lru属性(内存回收、对象共享、空转时长)

本笔记参考《Redis设计与实现》 P84~P88 内存回收 Redis在对象系统中使用reference counting技术实现了内存回收机制。程序可以通过跟踪对象的引用计数信息&#xff0c;在适当的时候自动释放对象并进行内存回收。 typedef struct redisObject {// ...// 引用计数int refcoun…

【闲聊】Baidu Map,excellent !!!Diaoyv island is China 's

【钓鱼岛】钓鱼岛是中国的&#xff01;Diaoyu Islands are Chinas! 釣魚島は中国のアール! ————————————youngLaker转载于:https://www.cnblogs.com/younglaker/archive/2012/12/31/2840190.html

08:vigenère密码_密码技术:Vigenére密码,Playfair密码,Hill密码

08:vigenre密码1)Vigenre密码 (1) Vigenre Cipher) This technique is an example of Polyalphabetic Substitution technique which uses 26 Caesar ciphers make up the mono-alphabetic substitution rules which follow a count shifting mechanism from 0 to 25. That is,…

Redis的RDB文件与AOF文件

本笔记参考《Redis设计与实现》 P118 ~ P150 RDB文件 1、RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据 2、SAVE命令由服务器进程直接执行保存操作&#xff0c;该命令会阻塞服务器 3、BGSAVE命令由子进程执行保存操作&#xff0c;不会阻塞服务器 注意此时服…

eclipse扩容

eclipse扩容 -vmD:/jdk-6u17-windows-i586/jdk1.6.0_17/bin/javaw.exe-startupplugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar-nlen_US--launcher.libraryplugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120913-144807-productorg.eclipse…

node oauth2验证_如何设置和使用护照OAuth Facebook身份验证(第2部分)| Node.js

node oauth2验证In my last article (How to set up and use passport OAuth Facebook Authentication (Section 1) | Node.js), we looked at another form of authentication called the OAuth authentication which involves sign in or signup using social media. 在我的上…

Python and Microsoft Word

国外网站看到的文章&#xff1a;Accessing Microsoft Word with Python follows the same syntax that we used for Excel. Let’s take a quick look at how to access Word.from time import sleep import win32com.client as win32RANGE range(3, 8)def word():word win32…

东哥读书小记 之 《一个广告人的自白》

掰着指头一算&#xff0c;端午假期确实完成不少事情&#xff0c;过的太尼玛充实鸟&#xff1a;去健身房2小时&#xff0c;且老夫的平板支撑终于能坚持超过1分钟&#xff0c;普大喜奔有木有&#xff1b;给合租的室友买蛋糕过了个生日&#xff1b;去 去哪儿 参加W3ctech的技术交流…