ChinaUnix网络优化论坛上海站总结

Posted by & filed under Study & Reading.

在绕了N个圈之后我终于找到了会场,看看时间12点48分,按照规定牛人要13点30开始演讲,到了这个时间,我发现只有51.com 的finalbsd同志到场了,主持会议的草上飞(唐川)说嘉宾正在路上,牛人的时间自然贵点,晚点到场也是应该的,于是我安慰了一下自己,牛人于14点左右差不多陆续来了。 FinalBSD同志的“群服务器负载均衡的开源解决方案”讲的很好,个人理解如下: 1、目前最好的负载均衡的硬件设备是F5和Netscaler,两者基本上属于同质品,所以两者是直接竞争者,不过后者可以将TCP的三次握手全部自己搞定,F5是转发到后端,因此Netscaler具有更高的抗DDOS特性。两者拥有太多的相似点,其中之一就是价格,中小互联网企业根本舍不得买,比如BlogBus。 2、F5、Netscaler都能工作在OSI模型的4~7层中。 3、开源软件解决负载均衡中,HaProxy和LVS相对比较优秀,LVS只能工作在4层中,HaProxy能工作在4~7层,并且提供web的状态查询,LVS可以基于命令行进行管理,HaProxy只能通过配置文件实现,HaProxy配置信息子节点可以继承,也可以重新定义,HaProxy能够实现高层应用,也意味着损失一些性能,当然加入实现同样的功能,和LVS差别不大,HaProxy可以很容易实现备份均衡器配置,加入一组负载均衡的机器倒掉之后,HaProxy会自动切换到备份的一组机器上,并且session等信息可以平滑过渡,好处是用户不需要重新登录、购物车不会因切换而被清空等 4、HaProxy实现了负载均衡的ALC控制,减轻后端的集群压力,但是我怀疑这台负载均衡机器的性能是否足够的好,不然会造成单点故障,当然,可以配置多台负载均衡机器 5、HaProxy比LVS更容易实现CDN加速,具体原因没听明白。 接着淘宝来的同志介绍了XEN实现的虚拟化技术,演讲者的名字我也忘了,改日补上。 1、虚拟化主要是指一分多或者多合一,之所以记住这句话,是我的概念中总是以为虚拟化是一分多,可能日常基础的例子都是这样。虚拟主机,VPS等等。 2、虚拟化能够实现快速拷贝环境,配置好一个环境可以复制任意多份运行,前提是物理机器足够的多和强大。 3、虚拟化软件中,Vmware和XEN效率最高,前者是商业软件,后者是免费开源产品。 4、虚拟化并没有在生产环境中得到大规模的应用,目前都是试验性质的,淘宝几乎所有的测试环境都构建于虚拟环境,但生产环境没有例子。 5、虚拟化可以共享存储,真实系统可以读取到虚拟主机中的任意文件,只要设置正确。 第三个是来自这次活动赞助商梭子鱼的经理的演讲,主要是推销梭子鱼的负载均衡设备,号称只有F5三分之一的价格,通过他滔滔不绝的演讲,让我了解(或者叫猜测)到梭子鱼网络均衡设备便宜的原因,实际上梭子鱼就是一个软件集成的厂商,将几个开源软件修改修改,然后丢进一台开起来很山寨的server中,就可以买到F5三分之一的价格,假如这个也叫便宜的话,我觉得F5应该再提价5倍。 第四位依然是51.com的工程师,讲Mysql的灾备体系。 1、灾备体系就是灾难备份体系,也就是在特别紧急情况下的数据恢复问题,比如911事件后,美国摩根斯坦利第二天就能正常运作,这就得意于他们的灾难备份和恢复体系。 2、灾难备份不仅要同地区备份,还要异地备份,最好能定期存入永久存储介质中。 3、备份中需要注意的几个问题是:备份一致性,备份存储,备份对正在运行的业务影响,备份策略等 4、假如11:00发出备份指令,12:00备份完成,如何保证备份时间中的数据一致性问题,主要解决方案如下 a、 使用从库(slave)进行备份,11:00时对从库加锁,然后进行备份,这样做的缺点是,需要增加架设从库的硬件成本,假如有300台主库(master),那么就需要300个从库,当然,可以通过一台机器启动多个从库来减少一部分成本,假如从库压力不大的话。切记要在从库备份前先flush table,不然很多数据还在内存中,无法被备份。 b、直接使用Mysqldump来备份,优点是不会增加太多成本,缺点是一旦启用dump那么数据库将加锁,业务就会被停止,尽管可能停止很短时间 c、使用snapshot(快照)进行备份,此种备份只适合使用InnoDB的存储引擎,因为在备份开始和结束这短时间中,数据库的所有改动操作全部保存在undo log中,备份完成后通过undo log的前滚来保证备份的一致性。 5、在99.9%的情况下Mysql的安全性是可以得到保证的,还有0.1%情况下是不可靠的,比如你正在执行一个删除操作,然后立刻按住CTRL + C中断删除,你会发现一个神奇的事情,你的数据被删了,bin log中却没有任何记录,也就是说,没法恢复了。 6、淘宝现在的所有后台操作只用十几个oracle就搞定了,可见oracle的性能。 7、oracle和Mysql的搭配能显出更高的效率,比如oracle只写,而用Mysql做同步的只读数据。 我感兴趣的内容总结如上,还有其他的演讲者内容就忽略了,抱歉~~ 演讲的PPT估计过几天ChinaUnix会挂出来,隔几日再奉上。

在Linux上安装mod_wsgi文档中文翻译(二)

Posted by & filed under Study & Reading.

上节我们介绍了mod_wsgi,下面我们讨论怎么在Linux发行版上安装他们。 如果你使用的是Linux操作系统,可以直接从源代码安装。 在Linux上安装可能会遇到的问题,详情请见“安装指导”,如果你喜欢专门为你的Linux发行版准备的包,下面给出详细列表。 Debian 包 可以再这里找到Debian包的详细信息: http://packages.debian.org/unstable/python/libapache2-mod-wsgi 感谢Bernd Zeimet对这个版本的打包的与编译。 Fedora 包 可以在这里找到Fedora包的详细信息,URL是: http://download.fedora.redhat.com/pub/epel/5/i386/repoview/mod_wsgi.html Arch Linux 包 Arch Linux包的详细信息可以在下面链接找到: http://aur.archlinux.org/packages.php?ID=13394 感谢Nicolas Steinmetz在这个发行版上的与编译与打包 SUSE Linux 包 关于SUSE包的详细信息请点击如下链接: http://software.opensuse.org/search?q=mod_wsgi 感谢Peter Poeml在这个发行版上的编译与打包 重启Apache服务 当在Linux上使用与编译的Apache时,他们一般将Apache的启动和停止功能纳入服务进行管理。在这 种情况下’apachectl’脚本将不能正常,这需要使用操作系统的具体机制去启动、重启和停止Apache服务。 在这样的操作系统利用’apachectl’重启Apache服务可能会出现如下错误: httpd (pid 22361?) not running (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down Unable… Read more »

mod_wsgi文档中文翻译(一)

Posted by & filed under Study & Reading.

什么是mod_wsgi ? mod_wsgi的目标是实现一个简单的Apache模块,支持任何Python WSGI的接口的Python应用程序的托管。该模块适用于高性能生产的WEB站点,同时也适用于自己维护站点的WEB 服务托管(虚拟主机环境–译者注)。 运行模式 用mod_wsgi来托管应用,有两个主要的模式可以使用,一种是“嵌入式”模式,Mod_wsgi与Mod_python运行方式相同,所有的python代码都将在apache 子进程中执行。因此当WSGI应用在此模式下运行可以与其他的Apache托管的模块PHP和Perl共享形同进程。 另一个在UNIX Apache 2.*环境下可选替代的daemon模式,这种模式运作的方式在类似的FastCGI / SCGI解决方案,即在不同的进程运行WSGI应用。与FastCGI / SCGI解决方案不同的是,当执行WSGI程序时不需要单独的基础结构(infrastructure),一切都是自动处理的mod_wsgi。 一切都是自动处理的mod_wsgi,影响正常使用的Apache模块的PHP , Perl或其他语言的Apache子进程服务的静态文件和主机应用程序使用大大减少。守护(daemon)进程可能需要时也可以作为一个独特的用户运行以确保WSGI应用程序之间不能互相干扰或获取信息。 服务性能 该mod_wsgi模块是用C代码直接对内部的Apache和Python应用程序接口编程。因此,服务WSGI应用与Apache它具有较低的内存开销和性能优于现有的WSGI适配器mod_python或替代的FastCGI / SCGI / CGI或代理的解决方案。 虽然嵌入式技术模式能够表现得更好, daemon模式通常是最安全的选择使用。这是因为要嵌入模式高性能需要调整apache MPM设置,默认设置偏向于服务静态媒体和PHP应用。如果Apache 的MPM设置未与服务的应用相对应,将会表现出糟糕的性能而不是更好的性能。 因此,除非你非常熟悉Aapache的配置,否则推荐使用daemon模式,总体而言,大型Python Web程序,通常你不能看出嵌入式(embedded mode)和守护模式(daemon mode)明显的差异,因为瓶颈在Python Web和数据库访问上。 支持的应用 mod_wsgi遵循WSGI接口规范,任何符合WSGI接口规范的Python Web框架或者应用都可以被支持。 我们所熟悉的主要的Python web框架或工具,包括CherryPy, Django, Karrigell, Pylons, TurboGears, web.py, Werkzeug 和Zope 运行良好,我们所熟知的主要的Python web应用包括MoinMoin, PyBlosxom 和 Trac 能够很好的运行。 系统要求 mod_wsgi软件包可以编译和使用任何的Apache 1.3 ,… Read more »

Zend Framework学习笔记(二)

Posted by & filed under Study & Reading.

很多天没再研究Zend Framework了,趁着还有些闲时间,再次研究一下,Zend Framework学习笔记(一)中大概了解了一下Zend Framework的代码接口分布,《Zend Framework in Action》一书中给出的标准文件夹结构如下图: 个人觉得这个结构只适合很小的项目或者不太复杂的项目,因为zend Library是包含在项目里面与web_root同一级,假如我需要创建一个helloword_2的项目,那么不得不再复制一个同样的文件夹结构,Zend Library将会有两份,如果有十几个或者更多的这样的工程,那么Library将会有很多,Zend Framework是个很活跃的框架,没准哪天就升级了好几个版本,如果你需要升级或者打补丁,那么就会烦死。 当然在application下新建一个modules文件夹,将各个功能放在这里也是一个方法,但是你肯定不想一堆一点关联都没有的项目堆在一起,比如豆瓣的九点和群组,这两个几乎没有任何关联,当然实际应用中还有一个非常重要的用户模块。每个应用只做自己该做的事情,才会最大限度的独立很分散,无论是为了负载均衡进行多点发布还是代码维护都非常有用。而且所有的应用都通过一个入口(web_root中的index.php)和同一个分配器来处理,显然并发能力和容错能力都会下降,稍微有点差错,所有的应用都挂了。入口,分配器等属于全局的东西会影响所有应用,事实上可能很多东西对别的应用毫无用处,但是又有很多应用又需要,这时候就产生了浪费。 不过Zend Framework是个自由度很高的框架,可以自己定义一些东西,让Library从项目中独立出来,与项目目录平级,每个项目拥有自己的独立名称、web_root、入口和分配器,这样做可以为每个项目单独添加Vhost,升级内核(zend Library)也只要升级一个即可,有更高的自由度和松散度。所以我推荐如下的结构: 图中的test是一个项目名,请注意是项目名,不是功能名称,在application中你可以为这个项目建立很多modules,我在图中没有建立这样的文件夹,你可以建立test2,test3……项目,这些项目毫不相关,或者关联度很低,比如用户就得是一个独立的项目,其他的功能可能是一个或者几个独立的项目,事实上还有更好的目录结构,我是从神仙那里学过来的.在controllers文件夹中建立front, backend, amdin,三个文件夹,在view中也建立对应的文件夹,放在front中的内容不做任何限制,backend中需要登录,admin就不用说了,渲染views中对应文件夹的模板,全局进行权限控制,似乎神仙这样的结构不能提供精细访问权限,zend Framework提供了这样的精细权限控制。 如果你的代码要改成左图的结构,需要改动一些代码,首先是需要在入口文件中注册这些目录的位置代码如下: define(’APP_PATH’, dirname( dirname ( __FILE__ ) ) ); define(’LIB_PATH’, dirname( APP_PATH ) . "/library"); date_default_timezone_set(’Asia/Shanghai’); //directory setup and class loading set_include_path(’.’ . PATH_SEPARATOR . LIB_PATH . PATH_SEPARATOR . APP_PATH . ‘/application/models’ . PATH_SEPARATOR . get_include_path());… Read more »

发布修改过的WordPress纯白主题一枚

Posted by & filed under Study & Reading.

本主题的原作者是Bob,主题的底部有这位作者的连接,这里我已经附上,我主要是重写的CSS和functions调用,主题的宽度是1200像素的,可能很多人鄙视我设置这样高的像素,但是我更喜欢这样的宽屏界面,虽然现在还是有很多分辨率使用的1024宽度,不过从访问我博客的用户群看来,这样的屏幕占的比例很小,所以我斗胆弄这么大的分辨率。 特别介绍一下,我修改过的代码通过了W3C验证,通过IE6,IE7, firefox 3.0.7 safari 3测试。 我本来没打算发布这个修改过的东西,因为本身就不是我的东西,所以主题中的主题预览都是完整的保留原来的界面预览,以示对原作者的劳动成果的尊重。今天(2008-03-19)打开豆瓣发现有位朋友豆油我,问是否可以共享主题,本来这个就是共享的东西,当然依然可以共享,所以在此就献丑发布一下。如果你在我的基础上又增加了新的修改,而且把它变成了收费的商业模板或者利用修改过的模板牟利(捐助除外),那么请通知一下原作者,至于是否需要我,就随你便了,方便的话,让我也高兴一下,当然,我保证不会从你得到的利润中分去半点,你甚至可以不必通知我。 我在底部留下了由我修改的标记,不是为了增加反向链接,仅仅是为了如果是因为我发布的主题本身出错了,你可以方便的找到我。如果你认为没这个必要,或者觉得碍眼,可以在主题包中的footer.php找到相应的代码删除之,不会删又确实要删的,请在本文后面留言,我尽可能协助。 使用说明 1、使用这款修改过的模板需要你手动修改一个文件,将 header.php中我的导航改成你需要的即可,代码如下: <div id="menu"> <span ><a href ="/about" target="_blank">我的经历</a></span> <span ><a href ="http://cuiyusong.blogbus.com" target="_blank">在BlogBus的日子</a> </span> <span ><a href ="http://delicious.com/aaaacccc" target="_blank">Delicious</a> </span> <span ><a href ="http://www.douban.com/people/cuimuxi/" target="_blank">我在豆瓣</a></span> <span ><a href ="http://www.flickr.com/photos/muxi" target="_blank">Flickr</a></span> <span ><a href ="/contact/" target="_blank">找我聊天</a></span> <span ><a href ="http://muxi.mp" target="_blank">Chi.mp</a></span> </div> 改成你需要的连接和文字即可,如果你不需要这么多的导航,删除几个即可,如果你不喜欢这个导航,直接将这段代码从文件中删除即可,不会的朋友,请在本文后面留言,或者找我 2、将文件夹传到 /wp-content/themes/中 3、打开你的后台,在模板设置中找到limauorange… Read more »

无知害死人

Posted by & filed under Study & Reading.

最近我接连犯了两个比较重大的失误,非常的低级,低级到我无法原谅我自己。 一个是数据删除操作,因为采用全新的框架,不是很熟悉流程,所以在删除前进行了一些断点测试,查看参数调用情况,一直跟踪到核心代码,最后一次测试的时候,字段名没有传入,事实上这完全是我的故意,因为我想知道,字段名没有传入到底框架会给出什么样的错误提示,写了一个这样的SQL语句 DELETE FROM post WHERE ’123456′  AND ‘ 456789′ 这是执行这个语句花了一份多钟,我还以为发生错误了,因为是周六晚上调试的,周日早上睡大觉,运营的同学打电话给我们系统管理员,很多用户反映日志丢失了,我猜想我完了,就昨天我发布了新的功能,因为周末太闲。在mysql 的bin log中查到一条类似如上的SQL语句,转念一想,这个WHERE根本就没用,没有字段的where查询,后面都是true,相当于: DELETE FROM post WHERE  true  AND true 执行了之后的结果是,整个表被清空!还好我们采用的是分库分表的策略,我删除的不过几百个表中的一个,丢掉近一万个用户数据,最后劳烦我们万能的系统管理员花开同学 从备份中给找回来了。这其中得到神仙的协助, 虽然没有任何人批评或指责我,我永远记得这个教训。 第二个是关键词匹配系统,主要用来查找包含关键字的垃圾文章(spam)。这个是写的第一个完全不需要模板的程序,说白了,就是命令行运行的东西,但还算不上真正意义上CLI程序,关键字存在一个表的一个字段中,以回车分割每个字符,这个是通过另外的一套WEB界面输入的,我提取关键词的方法是explode(‘\n’, $str),结果运行了好几十次,查到的匹配文章少的可怜,今天晚上(2009-03-10)老魏告诉我,每天的spam远远大于我查找的数量,我查到的几乎可以忽略不计,这下我汗颜了,我一直以为是我们所有的用户都非常纯洁,所以才只有那么几个spam,原来是我程序出问题了,之前我都是直接增加一个常用的词进行测试的,比如“的”,查找非常准确,所以我深信我的程序没有问题,最后在刚哥(我刚到Bus时被指定的师傅,一位做了8年开发的牛人)的排查下,原来是windows下的换行和Linux下的换行根本就不是一回事,windows下是以 \r ,Linux下是\n,在将每个关键字trim一下之后,搜20个表就搜了近千篇垃圾文章。 我应该好好检讨我自己,无知有时候真的会害死人,因为不知道,所以死了也不知道怎么死了!

Zend Framework学习笔记(一)

Posted by & filed under Study & Reading.

1、请求  ,Zend_Controller_Request_Http 类提供了整个的HTTP访问需要的环境。 2、路由  ,路由特性是由 Zend_Controller_Router_Interface实现的,由Zend_Controller_Router_Rewrite提供URL重写功能。 3、分配器 ,Zend_Controller_Dispatch_Standard类控制 4、Actiong ,所有的动作都是源自于Zend_Controller_Action这个抽象类,Zend_Controller_Action提供了两个级别的处理请求,一个是init(),另外一个是preDispatch() init()函数是在控制器被调用的时候触发的  ,如果该控制器被调用多次,那么preDispatch()将被调用多次,而init()只调用一次。 5、Response(响应) Zend_Controller_Response_Http 是为编写web程序准备的 Zend_Controller_Response_CLI适应更多的场合 Zend_Controller_Response_Http包含三种信息:header,body和exception(异常) 6、Front Controller Plug-ins(前端控制器插件) 所有的插件都实现于Zend_Controller_Plugin_Abstract这个抽象类,一共有六个事件方法可以被重写。 1)routeStartup() 2)dispatchLoopStartup() 3)preDispatch () 4)postDispatch() 5)dispatchLoopShutDown() 6)routeShutDown()

地主家也没有余粮了

Posted by & filed under Study & Reading.

Google App Engine Blog公布了具体收费细节的同时也公布了一项大幅削减免费用户资源的方案,收费方案和之前坊间传说的差不多: * $0.10/CPU core小时 * $0.15/每月每GB空间 * $0.12/每GB输出带宽 * $0.10/每GB输入带宽 * $0.0001 每封发出的邮件*每个收件人 同时免费资源削减为: CPU Time: 6.5 小时每天, 现在是46小时 (WTF!) Bandwidth: 进出共1 GB 每天, 现在是进出各10GB (WTF!) 之前Google曾削减过员工数量,并终止了很多项目,最有名就是Google Notebook,我是Google Notebook的忠实用户,我还指望Google Notebook哪天推出更多的功能,现在Google又加紧了APP engin的商业化步伐,一向财大气粗的Google,现在也开始精兵简政,开源节流了,看来地主家也没有余量了。 更新: CPU Time 通俗的讲就是占用CPU大部分资源的时间

晒一下“奋斗足迹”访问者浏览器分析

Posted by & filed under Study & Reading.

从07年4月燃起写博客的欲望之后,中间经历了很多,甚至有放弃的念头,但每每受到各种诱惑,最后还是坚持下来了,今天起得很早,闲来无事,看看几乎快忘记的Google Analytics,曾经我用过yahoo统计,51啦,最后在师傅的强烈影响下,挂了Google的代码,事实上之前我曾挂过Google分析代码,但当时博客放在dreamhost,本来打开就不快了,Google的代码加载还需要那么长时间,最后下决心给弄掉了,这个毛病到现在Google也没改掉,不过还好,花开同学的慷慨,让我挂在河南最好机房中,虽然是网通机房,从我得到的测试数据来看,教育网和电信访问速度都还可以,当然,这其中也有cost-html-cache插件的功劳,让我得以将访问量比较大的几个页面给静态化了,页面打开速度也有很大提升,另外感谢firebug 和针对firebug插件的插件Yslow,firebug让我优化了不少CSS,尤其是针对IE6的优化,YSLOW给出的建议让我受益匪浅。 一番啰嗦之后,具体看看数据,从08年8月挂了Google analytics代码之后,数据显示每个星期的平均访问量为650左右(流量少得可怜,呵呵),总的访问量我没找到在哪里看,看来要好好学学了。 估计是我总是写一些技术方面的文章的原因,访问我博客的浏览者使用非IE核心的浏览器居然超过43%,令我惊讶的是连chrom这个新的浏览器都占6.19%,具体数据请看下图 firefox用户高达33.71%,看来火狐在开发人员中还是相当受欢迎的。 同时我也看到另外一个数据,访问我博客最多的地理位置是广东和上海,其次是北京和杭州,这刚好符合中国的IT产业格局,广东、上海、北京是中国IT的产业中心,其次是类似浙江这样的正在赶超的省(市),当然也存在另外一种可能就是:广东、上海、北京这几个城市比较发达,拥有电脑的人数和成熟网民的例比较高,不过这种可能对我的博客来说几乎不存在,因为一般的用户不会来我的博客,特别是我的博客流量很高比例都来自Google搜索,一般网民比较喜欢用百度。