关于web系统扩展的几点记录

星期六, 11月 1st, 2008 244 次访问

注:本文只谈系统的可扩展点,并不涉及相关技术的具体实现。可扩展性的定义特性: 1.系统可以容纳使用率的增加,可以简单的理解为用户数的增加2.系统可以容纳数据集的增加。3.系统可维护。误区:1.可扩展不是指原始速度,性能和可扩性是不同的问题2.可扩展性与是否选择某种语言无关。3.可扩展性与特定的技术是无关的。扩展的几个方向与要点:一,扩展硬件平台硬件扩展大体上可以分为两类:1.垂直扩展:原理:很简单当机器性能不足时买一台更大,更强,更猛的机器代替。优点:设计容易实现,只需在本地机器上构建系统。一定体系稳定,只要换好的机器就行。不足: 成本不是线性增加的,可能是指数级的。尽管你很有钱,不担心钱的问题,不过由于单台机器的能力有限的,那么这种模型最终会受到限制。2.水平扩展:原理:不断的增加更多的硬件,不同垂直扩展的是增长不需要超级强劲的机器,只要很多常规机器。优点:能够混用不同服务器并且能够配备最便宜服务器的应用程序,将一直保持成本上的优势。不足:添加减少机器可能比较容易,但不会过于简单.你将要花费大量的管理成本。3.冗余:不管是垂直扩展还是水平扩展,机器都有可能发生故障,这样的话给机器做完全热备是必要的,当一个组件故障时,其他组件自动接手它的工作。二,负载平衡1. DNS负载平衡这个最简单的平衡方案,同时存在不少的问题.1)做法:在 DNS中给一个域添加多个IP,这样请求域名解析的时候分随机的返回不同的IP地址实现平衡的目的2)问题: 更新dns的速度比较缓慢,如果要移除一台坏的机器比较的困难了,另一个问题就是无法实现精确控制,也不能定制化平衡。总得来说DNS负载不是一个好的方案。2.VIP:这个名词比较有意思,记得有一回去yahoo,技术人员与我谈代码发布时谈到了VIP的一个问题,我就有点乱了,VIP===》贵宾?。还冒出了MVP之类的概念.:VIP是虚拟IP的意思,一个VIP是由负载平衡器提供的一个IP地址,背后其实有多个实际的IP地址在处理请求.负载平衡器也被称作虚拟服务器。3.硬件方式的负载平衡:1)别名:web交换机,内容交换机,内容路由器.2)特点:非常的昂贵。4.软件方式的负载平衡:1)前一段时间才知道lvs(http://www.linuxvirtualserver.org)是一个给linux打上内核补丁的负载平衡操作系统,不过lvs是为了处理极为复杂的负载情况,对于一般平衡就没有必要。2)第四层与第7层负载平衡注意这个第字。刚接触的时候不理解,直接看成四层,与7层。呵呵,7层比4层多三层当然7层要牛很多。第7层的确比第4层更灵活,但原因绝对不是7比4大.第4层与第7层指的是网络分层.

关于web系统的瓶颈几点记录

星期日, 10月 26th, 2008 306 次访问

所谓找出瓶颈,就是找出程序中费时最多的部分。要查看各个时间段,从请求进入到我们网络的边界开始,直到响应离开。 Donald Knuth: 在条件不成熟的情况下贸然进行优化是程序设计中所有罪恶的源泉。如果只是想着要重构X,就能加快这儿的速度,而不去实际测试系统并确认X处于关键路径中,那就是在浪费时间和精力。关于CPU:  在不成熟的观察者看来,cpu时间是每个应用程序的主要瓶颈,而实际上,这种情况很少发生,影响程序的主要性能的真正原因是 IO.什么是IO?IO包括了所有的数据移动,数据移动的本质上就是应用程序中所做的一切。和大家的观点相反,cpu处理速度基本上从来不是web应用程序中的瓶颈。如果发现主要瓶颈在cpu,那很有可能在基本设计层面存在问题.(那些少数cpu密集任务除外,如处理图像,视频,音频,加密大段数据等)  top命令的%CPU列显示每个进程占用cpu的情况,也可以用uptime看一下当前系统的平均负载。代码性能测试:  捕捉运行中代码的运行信息用,识别代码中最费时的部分有利于代码的优化。比较简单直接的做法不是在函数运行之前记下当前时间戳,到了函数运行之后再记一下时间,两个时间相差就可以算出当前函数花费时间。对于php程序员来说用xdebug(http://xdebug.org)是一个好的选择,安装了xdebug之后在脚本运行之前调用xdebug_start_profiling(),在脚本调用结束后运行xdebug_dump_function_trace()就可以以html来输出性能测试数据的表格。大家可以一试,很不错。测试代码会大大降低执行速度,如果有一个负载均衡池,可以让一部份的生产流量流经剖析工具。提高代码运行的速度:  1.操作码缓存: 在cgi模式下,每执行一次脚本都要编译源代码。可以借助一些工具把源码编码成OPCODE做存起来多次运行,APC缓存是一个好的方案  2.提高模板反应速度: 与opcode相同的原理,多次编译是浪费时间,模板可以保存编译结果多次调用。在调用时默认会查看源模板文件,如果有更新就重新编译。在很多时候可以关闭检查模板是否更新的开关,减少文件IO.提高反应速度:$smarty->compile_check=0.关于I/O  1.磁盘IO:可以通过系统的一些工具更好的了解磁盘的IO情况,可以用iostat查看当前的系统的磁盘IO值.这装命令:sudo apt-get install sysstat 

数据的安全性与一致性中的几个要点

星期二, 10月 21st, 2008 256 次访问

数据完整性的原则:应用程序内部的数据是有用的,换句话说就是引入的数据在边界处被过滤,以过滤后的结果存储,在输出数据的时不再需要做任何处理。在过滤数据时要分清好的,有效的,无效的数据的处理。基于以上原则在做web程序设计是要注意以下几点:1.过滤不支持的编码格式   如果你的整个体系里面用的是utf-8编码,那么你就在数据输入的时候过滤或者转化掉其他编码的字符.   相关php方法: utf8_encode($input), iconv("utf-8","utf-8",$str);注后者要装iconv扩展2.过滤控制字符  很多时候输入中含有控制字符,这此控制字符虽然是有效的数据,但不是良好的数据。这时候最好把控制字符给过滤掉,可以简单的把小于0x20的 ascii字符过滤之。   相关方法:    1. preg_replace('!\p{C}!u','',$data)//清除所有控制字符    2.preg_replace('!\r\n?','\n',$input) //统一所有平台的回车,还省空间3.过滤html  html的过滤比较头痛,可以用strip_tags()进行过滤,所有的html标签,但是想有选择的过滤html就比较惨了。这时个可以要你写比较复杂的正则表达式。  注:把所有的外部来源的数据当成是感染过的数据是重要的,只有你自己消除感染的数据才是安全的。  有时间 可以看一下lib_filter(http://code.iamcal.com/php/lib_filter) 4.防止sql注入攻击: 

smarty局部页面缓存

星期日, 8月 3rd, 2008 2,378 次访问

web2.0网站速度优化的最好方案是减少数据库访问. 缓存是减少数据库访问的最佳方案. 有两种最基本缓存的方式 1.页面缓存 1.1 如果你用的是smarty做为ui模板的话.页面缓存十分的方便 require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = 1; if(!$smarty->is_cached('index.tpl')) { // No cache available, do variable assignments here. $contents = get_database_contents(); $smarty->assign($contents); } $smarty->display('index.tpl'); 以上为最基本的缓存方案,对于同一个tpl,根据不同的参数可以缓存多个. $smarty->is_cached('index.tpl',params); //根据参数判断 $smarty->display('index.tpl' ,params);//根据参数显示 以上实现了整个页面的缓存 很多时候为了优化用户的体验,需要对局部即时显示.最方便的方案是对即时显示的部分做一下块标记.