苹果相关

浏览模式: 标准 | 列表 | 图文
chromeOS随想

chromeOS随想

虽然我不管是果粉,也不能算是强烈的G粉吧。chromeOS来势汹汹的。叫了大约一年,也就这么上市了。

上市那天,所有的网站会议视频、文字、评测文章、心得等乱七八槽的文件铺天盖地。
CB上特别明显,几乎平均每5篇新闻中就有一篇在讲chromeOS,这只是显示出来的,如果算上那些被CB编辑枪毙的文章,估计要每三篇就有一篇了吧?

云概念,从ChromeOS中又见云概念。存储都在服务端。方便了,也让人感到恐怖了。毕竟东西都存在云端,谁来保证数据的安全?会不会有第二个艳照门?(或许这不会发生了,毕竟修电脑的时候,再也不用担心硬盘数据被别人看了)

纯WEB浏览器的操作不是每个人都能习惯的吧?或许又会是一些极端主义者的爱好的理由 。。。

至少,在国内,网络还不是特别健全的情况下,恐怕不能被推行了吧?
而且根据那天的会议中也可以略微看出,google对这个操作系统是软件不要钱,但硬件要钱。所以我估计他以后最大的应用应该是SAAS吧?

一个小型机上也可以装上这个系统,比如收银机?仓储管理员的机器等。低配置就可以跑起来了。也不用担心他们安装其他程序。。。。以前的那种所谓的终端机也可以不用了。。。

乱想想而己

修改Linux操作系统下22端口两种方法

修改Linux操作系统下22端口两种方法

公司内部禁用了一堆端口...唉...SSH连不上去
不得不换端口...

第一种:

01假如要改SSH的默认端口(22),那么你只要修改:/etc/ssh/sshd_config中Port 22,这里把22改成自己要设的端口就行了,不过千万别设和现已有的端口相同哦,以防造成未知后果。

02假如要限制SSH登陆的IP,那么可以如下做:

先:修改/etc/hosts.deny,在其中加入sshd:ALL

然后:修改:/etc/hosts.allow,在其中进行如下设置:sshd:192.168.0.241

这样就可以限制只有192.168.0.241的IP通过SSH登陆上LINUX机器了。

第二种:

首先修改配置文件

vi /etc/ssh/sshd_config

找到#Port 22一段,这里是标识默认使用22端口,修改为如下:

Port 22

Port 50000

然后保存退出

执行/etc/init.d/sshd restart

这样SSH端口将同时工作与22和50000上。

现在编辑防火墙配置:vi /etc/sysconfig/iptables

启用50000端口。

执行/etc/init.d/iptables restart

现在请使用ssh工具连接50000端口,来测试是否成功。如果连接成功了,则再次编辑sshd_config的设置,将里边的Port22删除,即可。

之所以先设置成两个端口,测试成功后再关闭一个端口,是为了方式在修改conf的过程中,万一出现掉线、断网、误操作等未知情况时候,还能通过另外一个端口连接上去调试以免发生连接不上必须派人去机房,导致问题更加复杂麻烦。

来源:http://if.vc/

网站性能、安全监控

网站性能、安全监控

前两天有人就告诉我,监控宝不错,于是,我就申请了一个帐号,然而不知道是出于岐视还是啥,反正我的YAHOO邮箱并没有收到激活邮件。今天一大早,朋友就发来了使用图片,看上去不出,只是需要打开snmp服务,并添加一个只读帐号。(搞半天,原来是通过这个帐号来对信息进行处理并发送到该网站啊?)

老王说,360还有一个挂马监视中心,欣欣然转贴一下下

网站监控对任何一个严肃的网站而言,都是必不可少的。有实力的网站往往会由专门的运维人员来负责这部分工作,不过对于多数中小网站而言,这部分开支往往是拿不出来了,为了满足这些网站的需求,就有了很多第三方网站提供在线网站监控功能,比如说:360挂马检测中心,监控宝等等,你只要注册了,就能用非常Easy的方法打造非常Cool的网站监控。

360挂马监控中心:

f0d766ba7a6e86829a347ef54348a599


监控宝:

0a7c41fd916830d14171ad8e57db7937


这两个网站提供的网站监控选项非常丰富,从木马到CPU,内存,磁盘占用率等等,应有尽有,只要注册了,这一切都能免费使用,并且在网站出现异常的时候会 自动发送电子邮件通知你。看到仅仅是电子邮件通知,很多读者肯定要失望了,毕竟这不能保证我们立刻知道网站发生故障,最好还是通过短信通知,懂技术的站长 们或许已经通过飞信之类的软件实现了这个功能,但至少对我来说,这太复杂了,如果你也是这么想的,接着看下面:

如果你是移动的手机用户,那么就注册一个139.com的邮箱,当有新邮件到达时,会自动给你的手机免费发送一条短信;如果你是联通的手机用户,那么就注册一个m165.com的邮箱,有同样的功能,不过和移动邮箱相比,联通邮箱每个月有几块钱的使用费,虽然不多,但还是感觉有点不爽。手机邮箱的名字缺省是你的手机号,不过为了防止你的手机号被泄露,移动和联通都提供了别名的功能,建议使用。

有了可以免费发短信的手机邮箱后,剩下的就简单了,修改注册360木马监控中心和监控宝时的账号信息,把电子邮件换成你的手机邮箱即可。

当然,你也可以自己写一些监控脚本,一旦发现问题,就往手机邮箱里发邮件,同样也可以得到短信通知。至于如何发邮件,可以自己安装sendmail之类的东西,如果你和我一样讨厌sendmail,可以使用Gmail之类的邮箱通过SMTP发信,恕不详述。

---EOF--

老王说的发邮件、发短信的事情,这个我在之前也有提过。139固然可以提醒,但现在也还有飞信可以使用。网上也有一些飞信的PHP接口。当然还可以购买SP的短信服务,自己通过SP的接口来给自己发短信【如果您能够为我提供一个好的思路,如果被采用了,我将免费赠送1000条短信给您使用(如何利用更大限度的利用短信服务而不会使人反感)】

本人已经有一些思路,为避免冲突,我可以列出一小部分:

1、短信提醒(139邮箱好象已经有类似功能)
2、对于网站主来说,对于安全字或者有人在尝试注入的时候,通过程序发短信
3、如果是论坛用户,在用户量并不特别大的时候,可以考虑短信祝福生日,以加强互动
4、短信订阅站内通知。(这个就需要有限度了。。。)

其实还有一些想法,只是意义不大就不列出来了

VIM 乱弹

cnbeta上面关于vim今天吵开了。接二连三的稿件投上来被采用,评论也是几百字几百字的上,果然有吸引力啊。。

来吧。看他们是怎么说的
第一篇:

大家都说用VIM的是高手,我说不对,随便看一下程序图片,简直就是绝世高手用的编辑器。我折腾了半夜,反而被它给折腾了,因此为了朋友们的幸福着想,我不再一一列举它的用法。其实最大的原因是:不好意思,我也没能学会传说中的绝世武功。

据说,VIM(编辑器)+GCC(编译器)+GDB(调试器)是Linux下最常用的开发工具链。自小被VS2005浸染的我,不习惯VIM,不习惯GCC,不习惯GDB,叫我怎么敢跑到Linux下写程序。高手们似乎很喜欢用VIM加上一大堆插件来写程序,根据我看到的做法,要想有VS那样的智能补全功能,VIM首先要Ctags(这是要输入一长串命令的),接着输入几个字母再按一下Tab键(需要SuperTab插件),才能出现智能提示。

这还不是最紧要的,在VIM里面,删除一行字,请按d两下,删除一个字,请按一下x。以及一长串的需要记忆的命令列表,例如gg是跑到文章的最前面,shift+4是跑到行首,等等。我不自觉地想起了小学五年级那个暑假学的WPS,要输入一大堆的指令才能输出一篇格式整齐的文档,在别人眼里看起来绝对是很牛的事情。现在会用Office2007的,也不止你我他吧?至于那个时候所学的一大堆WPS控制指令,还有五笔字型,到现在全忘了。

我肯定不是个记忆强的人才。帅哥拿起个Ubuntu,手中熟练地敲打着一堆我看不懂的指令,看得我眼花缭乱。用Linux,我最头疼的事情是干什么事情我都要先敲入一个命令,然后–help找帮助来看,否则绝不会记得那个命令是怎样用的。一开始还说这是学习阶段要好好熬,尝试多了以后就会觉得这事真的很折腾。

你说,好好一个软件为何就不写个gui界面,非得让我敲命令去记忆每个参数什么意思,好好一个配置为何就不写个gui界面,非得让我把整个配置文件研究完才知道我该去哪里修改配置参数。

他们说:Unix哲学是:一个程序只做一件事,并做好。但是不知道为什么,Linux下的软件作者似乎就是懒得写个gui,或者他们认为他们只需把软件的逻辑做好就可以了,至于gui方面,根据简单原则,应该由其他有兴趣的人去做。其实我觉得原因有二,一则是没有强大的开发工具(要像C#那样拖个控件就可以写gui),二则程序员也懒。

为什么没有强大的开发工具呢,为什么Linux下没有VS这样的重磅武器?我再从VIM+GCC+GDB说起吧。VIM的难刚才说过了,GCC的话,要是有几个文件你非得自己手动写一个makefile不可,GDB我基本没试过,据说也有些图形界面的调试工具,可以像VS那样按一下快捷键就能调试(这个肯定也是要配置N久的),我看过一份GDB的使用手册,又要记忆很多调试指令,我觉得我快要崩溃了。

上面所说的“一个程序只做一件事,并做好”现在已经造成了许多弊端,最可见的是依赖性。

相信在Linux下稍微深入过进行开发的知道,GCC的版本号是件很痛苦的事情,有些程序要A版本的GCC编译,有些程序要B版本的GCC编译,高点低点版本号都不行。再加上相应的头文件库文件版本号,你是不是有种抓狂的感觉。悄悄地,我再告诉你,Linux现在发展很快,版本号一直在不停地变,你可以去发疯了。

譬如,A作者维护一份A程序,B作者维护一份B程序,两个程序之间是有依赖的(可能的情况是B程序是A程序的gui),突然B作者想去周游世界不继续开发B程序了,A作者继续开发下去,接口变了,那B程序基本就没用了。作为使用者的你,要么只能怨天尤人,要么改行帮B继续开发。

开源模式无疑是有很多长处的,但是其短处一直没有被正视。开源意味着源代码开放,人人都可以修改提交,可是就实际情况而言,更多的是做横向的,而不是做纵向的。我所说的横向是指开发配套软件,纵向是指对软件进行更深入的开发。因为横向的容易,只需要知道要配套的接口就可以了,而做纵向则需要将源码读懂。

继续说为什么Linux下不可能出现VS这样的重量级应用。VIM+GCC+GDB一样可以实现VS的功能,可以进行编码,编译以及调试,但为什么它们合起来就不是VS?因为没有架构。

现在开源的开发模式说到底还是陈旧的开发模式。软件工程的概念已经提出来好几十年了,可是当你想深入了解某个开源软件,接着去下载其源代码的时候,会很悲哀地发现:你找不到任何对应的开发文档。所有能帮助你理解源代码的只是程序源代码中的注释。

假如你很牛,想要做一个Linux下比VS还强的IDE,要用到VIM、GCC和GDB,你要做哪方面的工作呢?以进行一次小小的开发为例吧。先不管VIM中代码智能提示是怎么来的(至今我还不知道如何写好函数名后提示我参数列表),辛辛苦苦写好代码后,要编译是吧?假设编译出错了,GCC会提示你哪里错了,还显示出一个行号提示是哪里的错误,错误是什么。想快速定位到错误的地方吗?不好意思,GCC说我是编译器这事不归我管,VIM是个编辑器,这事归它管。可我总得知道是哪里错吧?谁给我这个定位的参数?GCC只能输出信息,它意识不到VIM的存在。这时候你得写个适配接口,将GCC的输出信息转换一下,然后提交给VIM,VIM再跳转到出错的地方。当然这个VIM插件是有的,叫做quickfix。

诸如此类的问题很多,VIM、GCC和GDB是基本没什么关系的软件,要想使它们可以通信,你必须写一大堆的适配程序,写适配程序还得考虑VIM的接口是怎样的,GCC的接口是怎样的,GDB的接口又是怎样的,这些你又得去学习。而在VS中,这是一个设计好了的架构,不同模块之间的接口是已经定义好了的,它们之间传输的数据也是定义好了的,想要通信是吧?简简单单在内存传送一个变量过来就可以了。而在VIM+GCC+GDB的通信中,数据的传送是很麻烦的事情,有时候还要通过写入读出硬盘,很神奇吧?

由于没有架构,所以要写一大堆的适配器才能将它们集成起来,还有些是适配器做不了或者做得不够好的功能,譬如刚才所说的代码智能提示,的确是有 VIM插件可以做,但是如果你看过写C#时候VS的行云流水,就知道那些插件做得远远不够。这不是插件的问题,而是VIM+GCC+GDB们在该内聚的时候没有内聚。当然这也不是它们的分内事,它们本来就不是打算做IDE的。这时候你还会觉得“一个程序只做一件事,并做好”是绝对好事吗?

知道了没有架构之后,你可能会想,要是有了架构,是不是就可以做出VS那样的IDE了?这还得考虑开源开发者的软件工程水平。就我看来,还是有许许多多的开源开发者基本是没有软件工程概念的。在现实中,你可以要求一个开发者按照你的思路你的文档去开发,因为你掌握着他的薪酬。而在网络中,一则没有软件工程开发观念,二则他们也不会去学习新的一门学科,各种各样的软件工程开发模式,咱做开源只是兴趣而已,此处不留爷,自有留爷处。你拿什么来管理这些不想被束缚的开发者们呢?

除非,有架构,而且VIM和GCC和GDB按照架构去做,否则绝不会做出VS那样的IDE。可是几乎在一盘散沙各自为政的开源界,有可能吗?所以我断言,开源界不可能出现VS那样的重量级应用。

第二篇:

十年前,会打字就叫做计算机高手了。今天,会写程序也叫做计算机高手了。我相信过了十年后,写程序会是件相当普遍的事情。打字是表达思想,写程序也是表达 思想,我个人觉得,无谓为了这些艰难的入门而浪费用户有限的精力,同时可以将用户的精力用于更关键的地方,这才是开源界所要做的工作。

粗粗看过文后的评论,不出所料地引来骂声一片。再不出所料的是,反驳我的评论无一例外地对作者本身先做一番评论再对文章说事,甚至再加上对作者身份的断定(肯定是在线大学生写的云云),好比骂人前先扣一尿盆子到头上再开骂不迟。这些尿盆子是:自我感觉太好、无知、自己水平差(所以就别乱说)、白痴等等。其实我想说,心态很重要,您如若抱着这样的心态我们继续讨论下去,大家都不愉快,我不如打白旗率先退出为好。

至于质疑我用的是不是正版VS的问题,以至于质疑我不尊重软件价值的问题,这也是个扯开话题攻击人身的问题,尽管回答这个问题很没有必要,我还是做出回答,我所用的VS和OFFICE都有授权的。希望我们不要扯到正版盗版的问题方面去,继续问我电脑里面所有的软件是不是都是正版的,就算是正版的又怎样,你还会进一步质疑我肯定听过MP3,看过RMVB吧,这些作者都付费了吗?

何况质疑我的大多热门评论里面提到的都是VIM。我无意加入Emacs和VIM和各种编辑器之间的骂战,更无意想强加我对萝卜青菜的喜欢于各位。我只是通过VIM来引出我对开源项目管理模式的不满而已,何故各位对我的萝卜青菜之爱严加指责呢?另我感到惊愕的是,大家都在对我不爱VIM表示了很大的不满,而对我说的项目管理模式丝毫不提及。须知道,编码只是最底层的一个工作,而我说的是上层建筑的架构有问题。至于怎么编码,这是个人喜好的问题。

而我说的那些依赖性的问题,各个软件之间配合工作的问题,等等,有人肯质疑吗?

有网友提出我文中工具链的说法是错误的,我查了一下,的确我的提法是错误的,感谢指正。

先说效率问题。有人评论说VIM高效,这点毋庸置疑,我同意。有人评论说VIM使用面广,我也同意。可问题是我质疑的不是这个呀,我只是说VIM命令繁多,记忆困难而已。

“如果你还在编码,这文章等你10年后来看看,不知道你会不会觉得当年很无知”。请容许我举个例子,现在的十年前,打五笔的笑打拼音的,五笔打字的确是快,比拼音快多了。到现在,五笔还是比打拼音的要快,可是现在打五笔的还有几何?一个Coder好比一个打字员希望看稿打字一样,当然希望拿起详细设计直接就来编码。这时候,编辑器的效率是很重要的。但是做上层设计工作的知道,脑子其实比手动得慢,一个程序编码的时间比思考的时间少多了,整个项目中,编码时间只占10%左右的工作时间。

好比写文章和看稿打字的区别。写文章用五笔,思路好不容易整理好,打字的时候发现有个字五笔不记得怎么打,是件很恼火的事情。用VIM写程序,逻辑设计好以后,编码又不记得某个函数的参数列表的先后次序,也是件很恼火的事情,再加上繁文缛节一般的操作命令,我不知道我是专注于程序多一些还是专注于VIM多一些了。当然看稿打字那就容易多了,所全神贯注的地方是如何把每个字打好了,而不用考虑整篇稿子的起承转合问题。

GUI和文本模式各有优缺点,只是在未来的潮流发展中,哪个利多弊少的问题。当年DOS下的WPS是很牛,可是也被现在的WPS取代了,当年DOS的《仙剑奇侠传》是赚取了大量热泪,但是现在再出一个同样品质的《XX传》,会有人买账吗?VIM若是现在冒出来的,会有那么多人捧场称颂吗?无非是习惯作用罢了。我还记得VIM有个列块操作,DOS版的WPS也有,在教程中还专门写上了,可是真正用得上列块操作的人又有多少呢?

我还想起了Linux下compiz桌面特效可以画一团火,初看是很帅,实际上后来根本就没人会无聊到在自己桌面上花一团火出来玩。

试问,十年后,一定就会知道鹿死谁手吗?我说的是我是那样的一种懒惰的人,而且深信正是懒惰使世界进步,而且我相信这种人不在少数,如果觉得VIM更适合自己的,无妨忽视我。

再说Eclipse和NetBeans。相信同时深入用过VS和Eclipse的人都知道就开发(不分语言)而言,孰优孰劣。Code::Blocks我也用过,就C++开发而言,跟VS就不是一个重量级的。(我说的不是VC6,是VS2005,不要拿98年的VC6来和现在的比)

我文中提到开源模式的问题,似乎没有人做出反驳,只是针对我的个人喜好做出来驳斥,倒是赞同的有一些,其实我拿VIM说事的重点是开源模式有问题,希望大家可以在这方面对我进行批评。这里我再提一句,Eclipse和NetBeans一开始都不是开源的,它们之所以成为重量级IDE,它们的架构是一早就规划好的了,我没发现开源之后它们的架构有哪方面重大的变化(以至于我阴谋地怀疑它们开源的原因只是想利用开源界的编码力量而已)。

再说LaTeX。用过LaTeX的相信都是被其强大的数学公式编辑功能所吸引过去的。OFFICE2007里面也有,LaTeX的文法,可视化的数学公式,不用再编译生成就可以知道自己输入的是什么东西,这不更好吗。

批评我浅尝辄止的话,有一个评论说得很对,我们应该把精力放在关键的地方(只是可惜不知道为什么,没人支持也没人反对)。世界上好玩的东西很多,不是什么东西都可以弄精通的。假设我才智中等,把VIM弄精通了,把GCC弄精通了,把GDB弄精通了。这就意味我要放弃另外一些也很好玩的东西。我的意见是对每样东西都浅尝辄止,只对自己很有兴趣的进行深度挖掘。至于VIM对我而言,它只是个工具,还没有上升到设计甚至思想方面的高度,不是说它不好,而是就算精通了我又能怎样,打字快点而已吗?计算机永远只是一个辅助工具,对人的辅助作用始终是有限的。

再到gui的问题。有人说不需要gui,因为不需要gui也工作得很好,因为服务器要gui是要耗费资源的。先弄明白gui是干什么用的,不是机器要看到 gui,而是人要看到gui。gui只有在需要的时候才需要被启动。好的gui可以使人工作效率提高,如apache为例吧,我是赞成apache用文本配置的,尽管我第一次配apache,sendmail这些花了老半天时间,因为一般用户用不上,这些事情应该由专业的网络管理员去做。

十年前,会打字就叫做计算机高手了。今天,会写程序也叫做计算机高手了。我相信过了十年后,写程序会是件相当普遍的事情。打字是表达思想,写程序也是表达思想,我个人觉得,无谓为了这些艰难的入门而浪费用户有限的精力,同时可以将用户的精力用于更关键的地方,这才是开源界所要做的工作。

终于有人忍不住了:

作为程序员,我们应该对开发环境和工具软件有着严肃的态度,真正弄明白各类工具的用法和用途,好歹这些是我们吃饭的家伙,是不是?不会使用各种开发工具的程序员,不是个好程序员:你拖了团队的后腿,减少了大家的工具选项,降低了团队的开发水准。另一方面,不知道该在什么项目中采用什么开发工具的,也不是好 的team leader,眼界太窄,更可能影响开发的成败。强大的开发工具并不是在各方面都强大,尺有所短,寸有所长。

不想当将军的士兵不是好士兵,在我眼你,不愿意研究开发工具的人也不是个好程序员,这样的人很多很多,浮躁而不自知,自大而不自信,不尊重自己的工作,也不知道尊重前辈的知识。就这么浑浑噩噩在开发圈子里混着,一年两年,逐渐对自身的待遇不满,也逐渐不能胜任工作的要求。

10年前,正是互联网泡沫第一次开始破灭的开端,一家家公司接连倒闭,很多刚入职几个月的计算机专业的学生很快又得再次求职……程序员的贬值,程序员队伍整体水平的滑坡,正是从那时开始的。回忆当时,一般的程序员还真不敢自称高手。

作为一个断续做了6年windows开发,断续做了11年Linux开发(中间有重合的交集)的老程序员,我换过若干家公司,经历过一些不同性质的项目,windows下mfc的,纯sdk的,数据库的,c/s、b/s的,ddk的(有早期的vxd,也有后来的wdm)经历过,linux下的小驱动,通讯设备研发,媒体设备研发也做过不少,还有业余做的php、ror项目,现在更是专职在做大流量高并发的……在线游戏后台,为玩家们提供坚固的精神鸦片支撑。用过的语言和工具比较多了,从在校学习的tc2、bc++3开始,到自学的vc、delphi、bcb,还有些忘了名,但第一份工作用的工具vc。从vc4开始的,后来一直升级,到最近的vs2008,我甚至业余做过VS和BCB的插件。另一方面,自己笔记本上始终安装的是linux,最初是 redhat后来是slackware,debian,ubuntu,arch。也尝鲜过一些别的发行版,其他os这里就不提了。长期做嵌入,自然长期用 GNU/Linux (这是正式的名称)。我想不管是对于windows还是对于linux下的各种工具,我自认了解程度和使用经验,应该为比《别碰我,VIM》的作者要更多。我就倚老卖老吧,希望作者能听几句老家伙的废话。

作为程序员,我们应该对开发环境和工具软件有着严肃的态度,真正弄明白各类工具的用法和用途,好歹这些是我们吃饭的家伙,是不是?不会使用各种开发工具的程序员,不是个好程序员:你拖了团队的后腿,减少了大家的工具选项,降低了团队的开发水准。另一方面,不知道该在什么项目中采用什么开发工具的,也不是好的team leader,眼界太窄,更可能影响开发的成败。强大的开发工具并不是在各方面都强大,尺有所短,寸有所长。说到这里,相信你也明白钻研的重要性了吧,更不要轻视业界都依赖的重要软件。你是非常聪明的,大家的智商也不会有多低下。一个如此差劲的软件偏偏那么多人喜欢去用,事出反常必有妖,这里的怪异之处,难道不值得去仔细思考吗?

接下来我说说《别碰我,VIM》里的一些小问题,希望作者,也希望有兴趣的围观者能有点小收获。都是些常识话,主要是说给有志于软件开发事业的人,可能比较无聊,而且刺耳。无兴趣就不要看了。

软件间依赖性问题称为耦合,这是包管理器自动完成的事情,对用户而言是自动的,透明的,使用者没有必要去关心这些,而开发者自然应该知道这些。这实在不该是指责某个软件的理由。linux的工具是相当精干的,工具间相互配合,胜任各种复杂任务,我看不出这是什么缺点。如果有一个开发软件,很庞大,不依赖别的什么软件,自身就可以完成全部开发所需的功能,这样的软件就是好的吗?记住一句常识吧:不要重复发明轮子。当然这在windows下是不可能的,因为 windows系统根本就没有开发用的任何轮子,所以,各个开发商,必须自备轮子。以至于很多人已经习惯了自备车轮,该换个角度思考问题了。

接下来说说效率问题,编程不等于打字,程序员总会有更多独特的要求。写过很多程序,维护过很多程序之后,你就会明白为什么vim比vs更好用了,这是用了才能体验的事情。我感觉在和你讨论“子非鱼,安知鱼之乐”了。哎,vim对coder们的体贴之处,怎么是几句话能说清的呢?总而言之:快捷键,正则式、以及!执行等等功能,对程序员而言,都是相当重要的,这些vim有而vs没有的功能,让我极大的感觉到vim的爽,以及vs的不便之处,只写hello world是无法了解这一点的。程序员们热爱vim到什么程度了呢?firefox都有vim插件,让我们能够以vim的操作方式看网页。用久了vim,你会上瘾。一个能让人上瘾的软件,绝不是会是你眼中的废品。当然另外一面,如果你不是长期写程序,没有那些特殊的需求,你就不会觉得vim有任何的好处。如果只准我用vs会有什么感觉呢?就像一个专业的车手,不让开赛车,让我用强大而舒适的自动波,那是很郁闷的。作为程序员,本着对工作负责的态度,不管开发工具有多糟糕多难用,你也应该掌握,这是本职所在。况且效率上vim其实更高,而现在不专业的你,还没学会,完全对vim没有应具备的认知。

懒惰使世界进步,所以我们我们用使工作效率更高的软件,而不是相反。公司对效率的追求是没有止境的,程序员绝对不是个舒适的职业,你可以想办法更省事的完成任务,但绝不要笨鸟还不飞。懒惰到一定程度,连什么工具干活更快更省都不清楚,那就有生存危机了。你也许觉得写程序,大部分时间都在思考,打字速度无所谓。但很多公司的程序员试用期都会考核英文打字速度,这就是对效率的追求,绝不是无聊。在校学生,职场新人,都要有这个心理准备,不要以为编程的工作多轻松。

至于compiz什么的我不多说,这与程序员无关。我是用compiz + cairo-dock的,只是为了养眼,没有提高或者降低工作效率。

再说Eclipse,这是很多公司的标准开发环境,不管你是不是喜欢,不管你的VS用得多好,都要面对这个现实。说些废话:我接触的用Eclipse的薪资水平比用VS的基本上要高,用VIM的又更高一点。国人浮躁,用金钱衡量价值显得权威一些,如果我说技术水平……大家不服气,呵呵。就冲着RMB,大家还是多掌握些手艺吧。二者的优劣,我不想多说,这是见仁见智的问题。VS就像IE,Eclipse就像Firefox,跨平台,功能要靠扩展的,当然我个人是更喜欢Eclipse。

至于开源模式。这个话题相当有分量,我不认为这是现在的你能谈论的。什么是开源什么是自由软件?什么叫分布式协同开发,什么叫持续集成滚动更新什么叫永远的beta版?Agile是什么Scrum是什么?呵呵,相信我,这只能是做过很多个不同模式的项目管理的人,才能有体验的。软件架构和开发模式,目前离你都比较远,没有实践而探讨,就成了空话。你真的应该相信长者,去看前人的经验和教训的总结,《大教堂与集市》这样的文章,真不是垃圾。

就我所知道的,业余参与GNU项目的,大部分都是公司的牛人,而专职的自由软件开发者,基本上都是业界的顶尖人物。如果连你都轻易的发现他们的开发模式错了,那全球软件行业还真是脑残集中营了。否决这么一大票牛人还真是需要勇气的。

LaTeX可以直接用,也可以用来实现可见即所得的编辑器,攻击排版软件的基石也需要极大的勇气啊。Openoffice.org很好用,甚至国产的 WPS Office也都很好,为什么要花那么多钱买Office呢。我的windows里安装的还是Openoffice.org,公司采购的是WPS。在 Linux里,大部分时间我是用简单的abi的,对我够用了,用不着那么多复杂功能。

世界上好玩的东西很多,不是什么东西都可以弄精通的,但吃饭的家伙还真得精通。厨师不能靠意念炒菜、司机不能靠意念开车,你也不能靠意念写程序,人不能活在想象之中,电脑帮我们写程序的科幻时代还没到来。学不好,是你没刻苦努力,与你的才智无关。我从小就很普通,父母说我呆,同学说我笨,从小学到大学习成绩都不太好,大学挂掉n门课,但这并没妨碍我把VIM弄精通了,把GCC弄精通了,把GDB弄精通了,把几个专用的嵌入式操作系统弄精通了。只要功夫深,铁杵磨成针,大道理不多说,你别总给自己找借口,这些软件都是你应该精通的。这些其实也都是很无聊的,并不是什么有趣的东西。学习它掌握它,精通它,是你的责任,不管是不是有兴趣都要去做到。

最后说场合问题:无GUI的环境永远会存在,不是所有的设备都必须连接键盘鼠标。服务器永远都不需要GUI,这与时代进步无关。做windows开发用 VS是天经地义,做服务器、嵌入式、Linux或者跨平台开发,用VIM也是很适合的选择。我不明白为什么作者要把两个在工作中很难有交集的东西做对比,这就是本文标题的由来了。如果硬要做对比的话,我要说,windows 开发真tmd不爽(个人喜好,请勿模仿),我就是不喜欢不对我公开的东西,就是不喜欢难调试的东西,就是不喜欢开发速度慢的东西,就是不喜欢负载能力低下的东西……个人情绪宣泄而已,就是这样。不要上纲上线的谈tmd什么模式、技术水平,这是我个人的情绪和喜好,没有理由。

不想当将军的士兵不是好士兵,在我眼你,不愿意研究开发工具的人也不是个好程序员,这样的人很多很多,浮躁而不自知,自大而不自信,不尊重自己的工作,也不知道尊重前辈的知识。就这么浑浑噩噩在开发圈子里混着,一年两年,逐渐对自身的待遇不满,也逐渐不能胜任工作的要求,逐渐一个个消失在开发界。而我这样的老家伙们,渐渐的成了你所不能理解的人。

第三篇相对比较客观。我不用VIM,因为我不会用,但insert和保存退出还是需要的,毕竟我在ssh的时候,总不能使用gui界面的程序吧?

Unix 40周岁生日快乐!

今年8月份,Unix操作系统迎来了自己的40周岁生日,在这过去的40年中,Unix操作系统取得了不少令世 人瞩目的成就。Unix操作系统的孕育地是 贝尔实验室,当时AT&T,麻省理工学院,通用电器以及贝尔实验室三家机构正在设计一款名为Multis的操作系统,不过由于进展缓慢这个项目最 后中止了,不过正是这个计划催生了Unix,Unix的设计目标是要充分发挥当时大型计算机的性能,并能控制多部电脑运行。

3a5d387f1429a6692dac26addef0e533

Ken Thompson是Unix计划背后的主要研究人员之一,他每个月都花一周的时间(这段时间他的妻子正好会带女儿一起回外地的娘家一次)来编写Unix, 系统共分为四个部分,分别是操作系统,外壳,编辑器以及汇编器。后来AT&T公司将这套操作系统对外免费供应,因此Unix很快就风靡全球。

1975年,Unix操作系统成为互联网的标准操作系统,这在Unix的历史上同样也是一个重要的事件,从设计之初开始,这款操作系统就对网络应用的需求考虑得十分充分。

后来,Unix操作系统终于逐步进入服务器,台式机以及笔记本领域,也出现了许多不同的各种版本。

今天,以各种形式存在的Unix仍然在扮演着十分重要的角色,我们的互联网仍然采用基于Unix的服务器系统,而且Unix操作系统的一套哲学观点也对开源软件,Linux甚至Windows都起到了重大的影响作用

祝Unix40周岁生日快乐!

CNBeta编译
原文:
neowin

来自SA Notes 关于linux性能提升的文章

来自SA Notes 关于linux性能提升的文章

文章比较多,所以,我又学习上次,采用ScrapBook进行了简单的打包。ScrapBook打包后,原有的样式都保留。而且也不是特别大。还能够直接导入ScrapBook,所以我觉得不错的说。

文章都是来自于SaNotes,那么,什么是SA呢?
SANotes网上有定义:

sa 的职位定义包括但不限于:

Making the system available to others
Monitoring the usage of the system
Maintaining a certain level of performance
Planning for future processing needs

呵呵,还是直接下载文章看吧。当然,如果你认为下载起来很繁,也可以看以下链接:

图片:

e9608e60f1c5e9423c42e5579530b4c4

或者下载附件:
a06810233bbb38aaf4daf0db44dfd46c

Linux下安装TM2008

Linux下安装TM2008

正是因为看了这篇文章,我才能在linux下面使用TM进行聊天,以前都是使用虚拟机的。如今。我也可以直接在ubuntu下面聊天了。

内容如下[说明一下,本篇内容为精简版,如需查看完整版,请到http://rainux.org/running-tm2008-beta-with-wine]:

腾讯已经发布了官方的 QQ for Linux,虽然有很多问题,例如没有 amd64 版本,功能太弱,聊天记录格式与 Windows 下的 QQ/TM 格式不一致等等,但无疑是 Linux 里使用 QQ/TM 最简单的方案。如果它已经能满足你的需求了,那么不必浪费时间看本文。

精简版本

如果你没时间看我唠叨,精简的版本是:TM2008 Beta 运行需要 Unicode 版本的 IE6、rpcrt4.dll、Visual C++ 2005 SP1 运行库,安装程序需要 GDI+。不可以使用 IEs4Linux,因为它安装的 IE6 及相关运行库是 Win9x 的 ANSI 版本。必须使用 CrossOver Games 里的 rpcrt4.dll,然后用 winetricks 安装 msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1 即可安装运行 TM2008 Beta。

详细版本

只看精简版没搞定?请看详细的(唠叨的)版本:

安装 Wine,运行一下 winecfg,让它生成一个干净的 ~/.wine 目录。如果要使用已有的 ~/.wine,请先将其备份。同时确保 winecfg 里设置的 Windows 版本至少是 Windows 2000(我用的是 Wine 1.x 默认的 Windows XP)。

获取一份 CrossOver Games 里的 rpcrt4.dll, 将其复制为 ~/.wine/drive_c/windows/system32/rpcrt4.dll(覆盖已有的文件),运行 winecfg,在 Libraries -> DLL Overrides 里将 rpcrt4 设置为 Native (Windows)。

下载 winetricks,使用它安装 IE6 和一些重要的运行库。如果这个过程失败,删除 ~/.wine(或者恢复备份的 ~/.wine)并从头再来。

sh winetricks msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1

此时如果你有 Windows 上安装好的 TM2008,它已经可以运行了,但是无法登录,会提示“网络连接失败,请检查网络。”。所以还是老老实实用安装程序装一次吧。这里有个很莫名的问题,如 果直接使用 Wine 运行 TM2008 安装程序,它很可能会直接崩溃,看不到任何图形界面的提示。而使用 Wine 运行一个其它的程序,例如 cmd.exe 或者 Total Commander,再用这个程序去启动 TM2008 安装程序则不会有任何问题。

查看聊天记录时的性能问题

好了,现在不会有什么问题阻挡你了,TM2008 Beta 安装和启动都非常顺利,使用也很稳定。甚至 QQ2009 Preview4 都可以安装并启动,不过使用时很容易崩溃。但是如果你像我这样疯狂地保存了七八年的聊天记录,你会发现:

  • 每次启动 TM2008 后第一次给任何人发消息都会导致 TM2008 失去响应将近 20 秒钟,之后继续发消息则不会有问题。第一次接收到某人的消息也会同样如此。
  • 任何试图查看聊天记录的操作都会导致 TM2008 消耗 100% CPU 并且很长时间没有反应,等待足够长的时间后才可以看到聊天记录。

这是由于 TM2008 的聊天记录数据库使用了 Windows 的 Structured Storage 技术,而其 API 库 ole32.dll 的 Wine 实现还不完善或者可能性能太低。虽然可以用 winetricks 安装 dcom98 来获取一个 Win9x 的 ANSI 版本的 ole32.dll,但它没法让 Unicode 版本的 TM2008 运行起来。搜遍了网络也找不到在 Wine 里使用 Win2k 以上系统的 ole32.dll 的方法。没办法,为了保持聊天记录的一致性,只有两个选择。要么不在 Linux 里看聊天记录;要么把聊天记录数据库 Msg2.0.db 备份并从 QQ Profile 目录(我的文档\QQ Files\QQ 号码)里删除,让 TM2008 自己生成一个空白的 Msg2.0.db,暂时抛弃历史包袱,以后再到 Windows 下把新的记录导出为备份文件后合并到老的数据库里。

Linux下清除.svn目录

Linux下清除.svn目录

SVN给开发带来了方便,但在导出的时候,如果选择了checkout,那么目录里是带有.svn目录的,除非是export。

如果您的项目中是checkout的,如果还要export,那就烦了一点。因为export是从服务器上导回来的。如果服务器速度慢(网上的免费SVN服务器),那就更痛苦了。因此直接删除.svn目录是最快的解决方法。

windows下面可以直接搜索.svn,然后delete就行了
linux下面怎么办?

其实更方便,只要一句话
进入项目目录后,运行 find . -name ".svn" | xargs rm -rf
然后你就会发现。.svn目录全没有了。HOHO

查了一下google,发现还有另外一个方法:

find -name "CVS" -exec rm -f {} \;

利用-name和-exec两个参数组合,可以实现批量查找删除指定文件的目的。

要活用find,它是很强大的。

find [path...] [expression]

-name pattern
Base of file name (the path with the leading directories removed) matches shell pattern pattern. The metacharacters (`*', `?', and `[]') do not match a `.' at the start of the base name. To ignore a directory and the files under it, use -prune; see an example in the description of -path.

-exec command ;
Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of `;' is encountered. The string `{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a `\') or quoted to protect them from expansion by the shell. The command is executed in the starting directory.
带你深入了解Web站点数据库的分布存储【转帖】

带你深入了解Web站点数据库的分布存储【转帖】

我是从SA Notes转载的,因此,虽然本文属于他转载的内容,但我仍然感谢 Sa Notes的转载,否则我也看不到此内容。

原文如下:

转自:http://database.csdn.net/page/b12503e6-9f14-4cc1-90dd-88632444a46e

在Web 2.0时代,网站将会经常面临着快速增加的访问量,但是我们的应用如何满足用户的访问需求,而且基本上我们看到的情况都是性能瓶颈都是在数据库上,这个不 怪数据库,毕竟要满足很大访问量确实对于任何一款数据库都是很大的压力,不论是商业数据库Oracle、MS sql Server、DB2之类,还是开源的MySQL、PostgreSQL,都是很大的挑战,解决的方法很简单,就是把数据分散在不同的数据库上(可以是硬 件上的,也可以是逻辑上的),本文就是主要讨论如何数据库分散存储的的问题。

目前主要分布存储的方式都是按照一定的方式进行切分,主要是垂直切分(纵向)和水平切分(横向)两种方式,当然,也有两种结合的方式,达到更贴切的切分粒度。

1. 垂直切分(纵向)数据是数据库切分按照网站业务、产品进行切分,比如用户数据、博客文章数据、照片数据、标签数据、群组数据等等每个业务一个独立的数据库或者数据库服务器。

2. 水平切分(横向)数据是把所有数据当作一个大产品,但是把所有的平面数据按照某些Key(比如用户名)分散在不同数据库或者数据库服务器上,分散对数据访问的压力,这种方式也是本文主要要探讨的。

本文主要针对的的 MySQL/PostgreSQL 类的开源数据库,同时平台是在 linux/FreeBSD,使用 php/Perl/Ruby/Python 等脚本语言,搭配 Apache/Lighttpd 等Web服务器 的平台下面的Web应用,不讨论静态文件的存储,比如视频、图片、CSS、JS,那是另外一个话题。

说明:下面将会反复提到的一个名次“节点”(Node),指的是一个数据库节点,可能是物理的一台数据库服务器,也可能是一个数据库,一般情况是指一台数据库服务器,并且是具有 Master/Slave 结构的数据库服务器,我们查看一下图片,了解这样节点的架构:

一、基于散列的分布方式

1. 散列方式介绍

基于散列(Hash)的分布存储方式,主要是依赖主要Key和散列算法,比如以用户为主的应用主要的角色就是用户,那么做Key的就可以是用户ID 或者是用 户名、邮件地址之类(该值必须在站点中随处传递),使用这个唯一值作为Key,通过对这个Key进行散列算法,把不同的用户数据分散在不同的数据库节点 (Node)上。

我们通过简单的实例来描述这个问题:比如有一个应用,Key是用户ID,拥有10个数据库节点,最简单的散列算法是我们 用户ID数模以我们所有节点数,余数就是对应的节点机器,算法:所在节点 = 用户ID % 总节点数,那么,用户ID为125的用户所在节点:125 % 10 = 5,那么应该在名字为5的节点上。同样的,可以构造更为强大合理的Hash算法来更均匀的分配用户到不同的节点上。

2. 散列分布存储方式的扩容

我们知道既然定义了一个散列算法,那么这些Key就会按部就班的分散到指定节点上,但是如果目前的所有节点不够满足要求怎么办?这就存在一个扩容的问题,扩容首当其冲的就是要修改散列算法,同时数据也要根据散列算法进修迁移或者修改。

(1) 迁移方式扩容:修 改散列算法以后,比如之前是10个节点,现在增加到20个节点,那么Hash算法就是[模20],相应的存在一个以前的节点被分配的数据会比较多,但是新 加入的节点数据少的不平衡的状态,那么可以考虑使用把以前数据中的数据按照Key使用新的Hash算法进行运算出新节点,把数据迁移到新节点,缺点但是这 个成本相应比较大,不稳定性增加;好处是数据比较均匀,并且能够充分利用新旧节点。

(2) 充分利用新节点:增 加新节点以后,Hash算法把新加入的数据全部Hash到新节点上,不再往旧节点上分配数据,这样不存在迁移数据的成本。优点是只需要修改Hash算法, 无须迁移数据就能够简单的增加节点,但是在查询数据的时候,必须使用考虑到旧Key使用旧Hash算法,新增加的Key使用新的Hash算法,不然无法查 找到数据所在节点。缺点很明显,一个是Hash算法复杂度增加,如果频繁的增加新节点,算法将非常复杂,无法维护,另外一个方面是旧节点无法充分利用资源 了,因为旧节点只是单纯的保留旧Key数据,当然了,这个也有合适的解决方案。

总结来说,散列方式分布数据,要新增节点比较困难和繁琐,但是也有很多适合的场合,特别适合能够预计到未来数据量大小的应用,但是普遍 Web2.0 网站都无法预计到数据量。

二、基于全局节点分配方式

1. 全局节点分配方式介绍

就是把所有Key信息与数据库节点之间的映射关系记录下来,保存到全局表中,当需要访问某个节点的时候,首先去全局表中查找,找到以后再定位到相应节点。全局表的存储方式一般两种:

(1) 采用节点数据库本身(MySQL/PostgreSQL)存储节点信息,能够远程访问,为了保证性能,同时配合使用 Heap(MEMORY) 内存表,或者是使用 Memcached 缓存方式来缓存,加速节点查找

(2) 采用 BDB(BerkeleyDB)、DBM/GDBM/NDBM 这类本地文件数据库,基于 key=>value 哈希数据库,查找性能比较高,同时结合 APC、Memcached 之类的缓存加速。

第 一种存储方式是容易查询(包括远程查询),缺点是性能不太好(这个是所有关系型数据库的通病);第二种方式的有点是本地查询速度很快(特别是hash型数 据库,时间复杂度是O(1),比较快),缺点是无法远程使用,并且无法在多台机器中间同步共享数据,存在数据一致的情况。

我们来描述实施 大概结构:假如我们有10个数据库节点,一个全局数据库用于存储Key到节点的映射信息,假设全局数据库有一个表叫做 AllNode ,包含两个字段,Key 和 NodeID,假设我们继续按照上面的案例,用户ID是Key,并且有一个用户ID为125的用户,它对应的节点,我们查询表获得:

Key NodeID
13 2
148 5
22 9
125 6

可以确认这个用户ID为125的用户,所在的节点是6,那么就可以迅速定位到该节点,进行数据的处理。

我们来查看一下分布存储结构图:

2. 全局节点分布方式的扩容

全局节点分配方式同样存在扩容的问题,不过它早就考虑到这个问题,并且这么设计就是为了便于扩容,主要的扩容方式是两种:

(1) 通过节点自然增加来分配Key到节点的映射扩容

这 种是最典型、最简单、最节约机器资源的扩容方式,大致就是按照每个节点分配指定的数据量,比如一个节点存储10万用户数据,第一个节点存储0-10w用户 数据,第二个节点存储10w-20w用户数据,第三个节点存储20w-30w用户信息,依此类推,用户增加到一定数据量就增加节点服务器,同时把Key分 配到新增加的节点上,映射关系记录到全局表中,这样可以无限的增加节点。存在的问题是,如果早期的节点用户访问频率比较低,而后期增加的节点用户访问频率 比较高,则存在节点服务器负载不均衡的现象,这个也是可以想方案解决的。

(2) 通过概率算法来映射Key到节点的的扩容

这种方式是在既然有的节点基础上,给每个节点设定一个被分配到Key的概率,然后分配Key的时候,按照每个节点被指定的概率进行分配,如果每个节点平均的数据容量超过了指定的百分比,比如50%,那么这时候就考虑增加新节点,那么新节点增加Key的概率要大于旧节点。

一般情况下,对于节点的被分配的概率也是记录在数据库中的,比如我们把所有的概率为100,共有10个节点,那么设定每个节点被分配的数据的概率为10,我们查看数据表结构:

NodeID Weight
1 10
2 10
3 10

现在新加入了一个 节点,新加入的节点,被分配Key的几率要大于旧节点,那么就必须对这个新加入的节点进行概率计算,计算公式:10х+у=100, у>х,得出:у{10...90},х{1...9},x是单个旧节点的概率,旧节点的每个节点的概率是一样的,y是新节点的概率,按照这个计算 公式,推算出新节点y的概率的范围,具体按照具体不同应用的概率公式进行计算。

三、存在的问题

现在我们来分析和解决一下我们上面两种分布存储方式的存在的问题,便于在实际考虑架构的时候能够避免或者是融合一些问题和缺点。

1. 散列和全局分配方式都存在问题

(1) 散列方式扩容不是很方便,必须修改散列算法,同时可能还需要对数据进行迁移,它的优点是从Key定位一个节点非常快,O(1)的时间复杂度,而且基本不需要查询数据库,节约响应时间。

(2) 全局分配方式存在的问题最明显的是单点故障,全局数据库down掉将影响所有应用。另外一个问题是查询量大,对每个Key节点的操作都必须经过全局数据库,压力很大,优点是扩容方便,增加节点简单。

2. 分布存储带来的搜索和统计问题

(1) 一般搜索或统计都是对所有数据进行处理,但因为拆分以后,数据分散在不同节点机器上,无法进行全局查找和统计。解决方案一是对主要的基础数据存储在全局表中,便于查找和统计,但这类数据不宜太多,部分核心数据。

(2) 采用站内搜索引擎来索引和记录全部数据,比如采用 Lucene 等开源索引系统进行所有数据的索引,便于搜索。 对于统计操作可以采用后台非实时统计,可采用遍历所有节点的方式,但效率低下。

3. 性能优化问题

(1) 散列算法,节点概率和分配等为了提高性能都可以使用编译语言开发,做成lib或者是所有php扩展形式。

(2) 对于采用 MySQL 的情况,可以采用自定义的数据库连接池,采用 Apache Module 形式加载,能够自由定制的采用各种连接方式。

(3) 对于全局数据或都频繁访问的数据,可以采用APC、Memcache、DBM、BDB、共享内存、文件系统等各种方式进行缓存,减少数据库的访问压力。

(4) 采用数据本身的强大处理机制,比如 MySQL5 的表分区或者是 MySQL5 的Cluster 。另外建议在实际架构中采用InnoDB表引擎作为主要存储引擎,MyISAM作为一些日志、统计数据等场合,不论在安全、可靠性、速度都有保障。

使用Apache做负载均衡

使用Apache做负载均衡

看到这个标题的时候,我和此文作者是一样的心态,apache也能做这个?我一向以为是nginx之类的才行?
仔细一想,如果可行,那应该是用了apache 的 proxy吧?以前用proxy做过asp的代理,如果负载均衡,估计用这个也应该可以吧?
究竟是不是这样呢?看看原文内容就知道了
原文地址为:http://tech.idv2.com/2009/07/22/loadbalancer-with-apache/
内容如下:

第一次看到这个标题时我也很惊讶,Apache居然还能做负载均衡?真是太强大了。 经过一番调查后发现的确可以,而且功能一点都不差。 这都归功于 mod_proxy 这个模块。 不愧是强大的Apache啊。

废话少说,下面就来解释一下负载均衡的设置方法。

一般来说,负载均衡就是将客户端的请求分流给后端的各个真实服务器, 达到负载均衡的目的。还有一种方式是用两台服务器,一台作为主服务器(Master), 另一台作为热备份(Hot Standby),请求全部分给主服务器,在主服务器当机时, 立即切换到备份服务器,以提高系统的整体可靠性。

负载均衡的设置

Apache可以应对上面这两种需求。先来讨论一下如何做负载均衡。 首先需要启用Apache的几个模块:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so

mod_proxy提供代理服务器功能,mod_proxy_balancer提供负载均衡功能, mod_proxy_http让代理服务器能支持HTTP协议。如果把mod_proxy_http换成 其他协议模块(如mod_proxy_ftp),或许能支持其他协议的负载均衡, 有兴趣的朋友可以自己尝试一下。

然后要添加以下配置:

ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://node-a.myserver.com:8080
BalancerMember http://node-b.myserver.com:8080
</Proxy>
ProxyPass / balancer://mycluster

# 警告:以下这段配置仅用于调试,绝不要添加到生产环境中!!!
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from localhost
</Location>

从上面的 ProxyRequests Off 这条可以看出,实际上负载均衡器就是一个反向代理, 只不过它的代理转发地址不是某台具体的服务器,而是一个 balancer:// 协议:

ProxyPass / balancer://mycluster

协议地址可以随便定义。然后,在<Proxy>段中设置该balancer协议的内容即可。 BalancerMember指令可以添加负载均衡组中的真实服务器地址。

下面那段<Location /balancer-manager>是用来监视负载均衡的工作情况的, 调试时可以加上(生产环境中禁止使用!),然后访问 http://localhost/balancer-manager/ 即可看到 负载均衡的工作状况。

OK,改完之后重启服务器,访问你的Apache所在服务器的地址,即可看到负载均衡的效果了。 打开 balancer-manager 的界面,可以看到请求是平均分配的。

如果不想平均分配怎么办?给 BalancerMember 加上 loadfactor 参数即可,取值范围为1-100。 比如你有三台服务器,负载分配比例为 7:2:1,只需这样设置:

ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://node-a.myserver.com:8080 loadfactor=7
BalancerMember http://node-b.myserver.com:8080 loadfactor=2
BalancerMember http://node-c.myserver.com:8080 loadfactor=1
</Proxy>
ProxyPass / balancer://mycluster

默认情况下,负载均衡会尽量让各个服务器接受的请求次数满足预设的比例。 如果要改变算法,可以使用 lbmethod 属性。如:

ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://node-a.myserver.com:8080 loadfactor=7
BalancerMember http://node-b.myserver.com:8080 loadfactor=2
BalancerMember http://node-c.myserver.com:8080 loadfactor=1
</Proxy>
ProxyPass / balancer://mycluster
ProxySet lbmethod=bytraffic

lbmethod可能的取值有:

lbmethod=byrequests 按照请求次数均衡(默认)
lbmethod=bytraffic 按照流量均衡
lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)

各种算法的原理请参见Apache的文档。

热备份(Hot Standby)

热备份的实现很简单,只需添加 status=+H 属性,就可以把某台服务器指定为备份服务器:

ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://node-a.myserver.com:8080
BalancerMember http://node-b.myserver.com:8080 status=+H
</Proxy>
ProxyPass / balancer://mycluster

从 balancer-manager 界面中可以看到,请求总是流向 node-a ,一旦node-a挂掉, Apache会检测到错误并把请求分流给 node-b。Apache会每隔几分钟检测一下 node-a 的状况, 如果node-a恢复,就继续使用node-a。