Sep
18
2009
很长一段时间以来,总能听到或者看到“千万级”数据(库)这种叫法,无论是网上论坛帖子还是招聘要求里。这对我来说是个怪异的概念,猜不出是什么意思。看了网上多篇文章,似乎概念上大家约定俗成就是指数据量比较大的情况下,如何提高以保证返回结果的时间在用户可接受的范围内。恩,终于明了了,就是性能评测(benchmarking)中的响应时间(response time)嘛。套了个马甲。
第一份工作的时候在银行业,有些表每天的新增数据就有2.3亿条记录(拜大集中所赐),这还只是半个中国的数据。因此从一开始,对大规模数据的处理就是我工作的基本要求。前辈们总结处很多编程与操作的规定,以满足性能上的需要。这里的性能,更多的指在规定要求的时间内完成规定的事情。在这段时间,没有人会提“千万级数据”,因为它太少了。
后来进了DB2的老家IBM, 做起了DB2的技术支持,那些DB2的开发设计大牛来讲DB2的架构,各部分的实现原则与部分细节,终于从更深层次了解了数据库是如何操作数据的,如何计算,如何join, 优化器如何改写SQL并决定访问路径(Access Path - 话说这中文翻译还真是别扭).这背后其实是cost-based estimator, 一切皆以statistics统计数据作为输入,进过DB2优化器的数学模型,得到对结果集大小、CPU时间、I/O时间等等的预测,最后得到一个时间估计,选取估计值最小的方案。
每个人都希望自己的查询(query)有快又好,但这是要跟多种因素相关联的。除了优化器选择access path以外,跟DB系统参数,Bufferpool大小,Sortpool大小,CPU,IO性能都有关系。
当然,大部分个人用户不会考率为了数据库的性能而更换或者扩展CPU数量,换用高性能的企业级存储这样的要钱的方式,因此就省下压榨database系统了。因此在互联网建站和小型企业数据库上,才更多的提到“千万级”的概念 --世上本没这个词,提的人多了也就成了个概念吧。
网上一个不算新但是很详细和典型的帖子:http://www.xiaohui.com/dev/server/20070701-discuz-mysql-cpu-100-optimize.htm
一个典型的场景就是系统突然出现了一个状况(CPU high或者响应慢到不能忍受),于是要分步排除问题,首先系统IO方面时候遇到瓶颈--打开文件数量到上限了?cache出了问题?这个部分没问题了,再看看DB系统的配置参数如何?是不是bufferpool或者sortpool大小不合适所以导致了过多的page-in,page-out?
如果上两点都没有问题,初步可以排除环境方面的因素,接下来就可以关注在具体SQL query的性能了。
那么关注哪些SQL呢?常用的关系型数据库系统(DB2, Oracle也包括MySQL等等),都有工具或者命令抓到耗时最长的SQL query. 例如MySQL下你可以用show processlist;
找到了最慢的sql,有两个方向可以选择:A 从SQL Query涉及的object(table,view)出发分析结构上的欠缺如缺少必要的index等等;另一个方向是用explain得到slow SQL的access path, 看看是不是table scan了,发生在什么环节然后去做修改。
上面是最最通用的数据库调优(Performance tuning)的策略,基本宗旨还是我们创造条件去帮助优化器(DB optimizer)以得到最优解。相信大部分DBA都熟悉。接下来说一下一个极端情况,就是无论你怎么做,优化器认为的最优解在你的特例中实际上却是最糟糕的。我们不能神话优化器,没有一种算法是能够在所有情况下都是最好的,因此极少数的SQL在特定的data特性下,我们需要去“误导”甚至是“欺骗”优化器来的到我们想要的最优解--即便这个方案在优化器看来是很糟糕的。这就是access path hint, 名字可能略有差异但是DB2,Oracle等主流数据库系统都是支持的。我们可以用自己的大脑代替优化器来决定少数特殊query的access path.
啰嗦了这么多,其实是想说,被常常使用的“千万级数据(库)”的概念,其实跟技术没多大关系,只是一个模糊的对DB甚至是整个IT系统的性能要求,有时候可以理解为性能调优技术的要求。以后见到这个概念,知道背后是怎么一回事就行了--尤其是对HR和猎头这类技术盲来说。
P.S. 数据库还有另一个scaling方面的技术来提高性能,这个是架构方向,互联网企业用的比较多。以后有空再写一写。其实网上这样的文章很不少了。
no comments | tags: database, DB2, mysql, oracle, performance tuning | posted in 编程开发, 电脑网络, DB2
Sep
22
2008
如果你看过了上一篇关于用Amazon EC2作为Ruby on Rails的server的文章的话,这里还有一些补充。
EC2onrails是包含一个AMI和gem的RoR Deployment解决方案。现成的系统和gem让你的deploy非常简单。不过,AMI里面的Apache是你想用的么?各项配置是否正如你所愿?如果不是的话,我们有没有别的选择呢?
答案是肯定的。还有不少方法可以帮助你快速的deploy ROR application:
首先说heroku.com 专门针对ror的一揽子解决方案,你可以在线上创建rails app,在线编辑,部署。因为Heroku本来就是跑在Amazon EC2上的。所以你的Rails app自然也跑在上边了。不过heroku是个商业网站,虽然现在beta阶段我们可以上去随便编辑和部署(简单的,多服务器的肯定不会让你免费来),以后的收费可不好说,另外要使用额外的资源,清提交申请并乖乖奉上银子。建议初学者学习rails的时候玩玩。可以省下setup生产环境的时间。
rightscale.com也是大名鼎鼎(有用的功能也收钱),不过上去试用了一番,实在用不惯,直接放弃研究了。清各位看官自行探索
说说免费的拉,Elastic Rails是一个plugin (plugin 有plugin的好处)。因为有下面的视频短篇,我就不多说了。我最喜欢screencast了。简单明了:
http://s3.amazonaws.com/rc_files/elastic-rails.html
需要指出的是它的网站一直上不去,不知道是不是墙的问题
Capazon 与上面类似:
http://soylentfoo.jnewland.com/articles/2007/04/30/capazon-0-2-released-capistrano-2-0-compatible
Rubber:
http://github.com/wr0ngway/rubber/wikis/faq
具体用哪一种方案请各取所需
2 comments | tags: ec2, rails | posted in 编程开发, Ruby
Sep
16
2008
Amazon EC2不是什么新东西了,不过从cheewu那里得知他的垂直搜索引擎是用EC2的。偶也有兴趣试用一下,反正钱也不多,呵呵
EC2其实是虚拟化的一台机器,物理上来讲书也不知道你自己的实例在群里的那个部分运行着。不过这并不重要,重要的是只要你想,就可以随时在Amazon的computer farm上开出一块自己的”自留地”,计算能力可以选择的,也支持多个实例组成cluster.
Virtualization已经是当今的潮流,估计不用普及了,现在用电脑的,最少也用过VMware吧。呵呵。使用EC2只要简单的几个条件:
- 在amazon AWS上注册一个id
- 把EC2 服务加到你的AWS id服务中来(点一个按钮即可,但是很多人不知道,一些教程里面也没写,少了这个步骤,会导致ssl授权通不过的问题,切记)
- 一个可供网上支付的信用卡,VISA,Mastercard,AE什么的都可以
ok,添好这些,就可以使用EC2的服务了。别着急,您至少先看看收费标准吧EC2 price
都没问题了我们就可以在本地setup EC2的使用环境了。具体可以看这里EC2 Getting Start,我就不罗嗦了。
觉得命令行麻烦的话,推荐一个Firefox插件Elasticfox,大大简化的EC2的操作。反正我是不喜欢用ec2那些奇怪的命令。呵呵。命令行控们可以看这篇How To: Getting Started with Amazon EC2
有个虚拟的机器,用什么OS呢?Amazon上面已经有很多现成的AMI了,把他理解成定制好的系统,可以直接启动。你只要在启动EC2 instance的时候指定某个AMI的ID就可以了。对于Ruby on Rails来说,我推荐EC2onRail的AMI,有32bit和64bit两个版本:
- ami-c9bc58a0 (32-bit)
- ami-cbbc58a2 (64-bit)
几乎你会用到的东西在AMI里面都是ready的:
Features of the EC2 image:
- Ready to deploy a Rails app with little or no configuration of the server required
- Automatic backup of MySQL database to S3 (full backup nightly + incremental backup using binary logs every 5 minutes)
- Capistrano tasks to customize the server image, archive and restore the database to/from S3, and more (available as a rubygem)
- Mongrel_cluster behind Apache 2.2, configured according to
Coda Hale’s excellent guide
- Ruby on Rails 2.1.0, 2.0.2 and 1.2.6
- Ruby 1.8.6
- MySQL 5
- memcached
- monit configured to monitor apache, mongrel, mysql, memcached, drive space and system load
- Ubuntu 8.04 LTS “Hardy” base image built using Eric Hammond’s EC2 Ubuntu script
- SSL support
- Amazon AMI tools installed
- MySQL, Apache, and syslog configured to use /mnt for data and logging so you don’t fill up EC2′s small root filesystem
- Automatically archives Rails and Apache logs to S3 nightly.
- 32-bit and 64-bit images available (supports all instance types, small to extra large).
- Created using a build file, full source is available (the EC2 on Rails script is run from Eric Hammond’s EC2 Ubuntu script)
- Can be used as a clustered Rails app running on multiple instances
- Automatically runs hourly, daily, weekly and monthly scripts if they exist in Rails application’s script directory
- Local Postfix SMTP mail server (only available from within the instance, not listening on external network interfaces)
如果你自己还需要别的东西的话,尽可以自己安装(Ubuntu的apt-get或者手动),然后把Image传到S3上就成为自己定制的AMI了。具体过程不难,请参考这个小短文HOWTO Build EC2 image
EC2 instance ready了还没完,你自己的本地开发环境也要作一些事情
- sudo gem install ec2rails
- copy capify,deploy 脚本到你的app目录下(用过capistrano的人都知道)
- run capistrano task吧。集体还是看ec2rails的说明
ok,建一个自己的instance尽情享受root的快感去吧
3 comments | tags: ec2, facebook, facebook app, facebooker, ruby on rails, ubuntu | posted in 编程开发, Ruby
Aug
5
2008
用那个主机host你的应用?
前文题到了ssh tunnel方式提供自己的server到local开发环境的连接以方便开发和调试。不过这个方法需要服务器上的ssh配置支持client端指定端口。相信大部分人用的虚拟主机都不会支持的--大家都共享一个ip.要是每个人都指定端口难免冲突或者乱套。除非虚拟主机提供商提供(或者加钱购买)独立固定的ip才有可能(只是可能)。如果谁知道那里有便宜的虚拟主机提供商能提供的话,请告诉我一声,不身感激。
要是有一个自己的box那就好多了。自己是root自然干什么都没问题。可惜这样的主机价钱就不一样了。在若干个月之前,我们还有一个好的选择,就是joyent.com的针对facebook app应用的免费计划!只要你有facebook app并且转台处于active and in-use状态就可以通过申请这也个计划得到一个原本价值75$/m的主机。自己有root权限。不限流量,1/32的cpu quota。免费期是一年。相信对大多诗人都够用了--一年以后,要么你的app失败了,要么早就要升级扩展了。这么好的计划人们自然趋之若骛。结果就是后来的条款越来越苛刻--主大欺客嘛。新的条款增加了facebook应用的活动用户数量要求:至少50个活动用户;还有30天未登录就会被取消帐户。这个50个active user成了一个比较高的门槛,要知道active user的计算方法可不是有50个人add了你的app就行的。
难道走投无路了么?也不是。两个方法可以work:
No.1 麻烦一点儿,每次更改都deploy到自己的rails虚拟主机上,不用ssh tunnel。优点是简单,所有的rails主机都可以用。缺点是共享主机性能不佳会拖后腿,而且很快就要面临升级。
No.2 现买joyent的最便宜的主机,快速把自己的app弄好,然后发动自己所有的facebook朋友成为你的active user.(在家靠父母,出门靠朋友),说不准成立个facebook app developer群,大家互相访问好了。然后就可以转免费1年的计划了。这样可以达到keep住免费的主机的最低要求,不过不是长久之计。关键还是要作出好东东来吸引大量的用户。此方法只适合新的facebook app developer度过最开始的没钱时期,app发展起来了马上就会面临扩容问题。当然,joyent提供的扩容方式还是足够你的要求。再说,真的到那时,你已经有一个不过的demo可以用来说服你的投资人了。
no comments | tags: facebook, facebook app, facebooker, free hosting, hosting, rails, rfacebook, ruby on rails, web2.0 | posted in 编程开发, Ruby
Aug
2
2008
这个主题的贴子秉承了我的一贯传统,就是慢慢吞吞,哈哈。除了不喜欢火急火燎的做事情的风格以外,还有一个重要的原因:rails以及相关的东东变化实在太快了。学了半天然后发现人家一升级又有好多东西不一样了或者不兼容了;还比如一个很多人用的plugin或者module突然就宣布不再维护了….不一而足。
我干嘛要找这些接口呢?实在是因为,今天发现了一个令我吃惊的“旧闻”—rfacebook的作者在年初就有要停止rfacebook维护的意思,曾经在自己的blog上发帖找人接手,同时还推荐了facebooker作为替代。作为有9个月历史(截止作者发贴时)的rails下最有名的facebook api的ruby封装库,rfacebook的使用者不在少数(google一下便知)。不过目前为止,情况还是不太乐观。当然,作者也不是置大家于不顾,因为作者自称在开发rfacebook之初对ruby,facebook甚至编程都不太熟,所以设计上就欠考虑(也可能是人家谦虚啦),结果有一些用户遇到了bug的折磨。现在由于时间和项目的关系,没法在做rfacebook的维护了,同时也发现rfacebook可以改进的方面已经有facebooker做到了。本着”不要重复发明轮子”的原则,作者向大家推荐了facebooker. 详情请自己看作者的blog.
所以接下来要换facebooker了。这篇是在给老爸老妈新买的机器上写的,没有rails环境,不贴代码了。
1 comment | tags: facebook app, facebooker, ruby on rails | posted in 编程开发, Ruby
Jul
28
2008
上一篇说了不少虚的,现在作点儿实在的:
Step.1 Facebook注册一个App.
作为facebook的用户,在也面最下方的developer连接可以进入开发者的portal. 这需要你加入developer app(这本身也是facebook的一个app).之后你就可以创建facebook app了。你需要指定的最基本的信息包括application name, callback url和canvas page url. 尤其是后者,可以看作是facebook给你分配的地址,不可重复。由于facebook已经有了超过26000个app,好名基本都有人用了,因此想要找一个长度合适有好记又有意义的canvas url药费一下脑筋了。
注册好的app也可以更改属性,并不是一成不变的。过程简单不贴图了。总之你的app有了自己的key和secret. 这两个是facebook识别app的重要依据。
Step.2 本地开发环境安装rfacebook和rfacebook plugin (前提是你有一个work的rails环境哦,别告诉我还没有。翻翻我之前的帖子)
sudo gem install rfacebook
rails yourappname
cd yourappname
script/plugin install svn://rubyforge.org/var/svn/rfacebook/trunk/rfacebook/plugins/rfacebook
Step.3 配置facebook app信息
生成facebook.yml文件:
rake facebook:setup
将facebook.yml按照facebook app的信息进行填写
注意facebook.yml每段都有tunnel:
tunnel:
username: yourLoginName
host: www.yourexternaldomain.com
port: 1234
local_port: 5678
这是用来提供你自己的电脑和虚拟主机服务器之间的链路的。要知道facebook把对你app的访问请求转到我们自己的虚拟主机上,要是开发的时候任何一点变化都要deploy到服务器上才能生效的话,怕是要累死了。所以tunnel提供了使用ssh来使得服务器到本地开发环境的链路。这样可以认为facebook把访问请求转到了local的机器上。
怎么用这个tunnel配置呢?看例子
tunnel:
username: foobar < ----- ssh user id
host: www.mysite.com < ----- server adderss
port: 8888
local_port: 3000
配只好之后就rake之:
rake facebook:tunnel:start
(待续)
1 comment | tags: facebook, facebook app, rails, rfacebook, Ruby, ruby on rails, web2.0 | posted in 编程开发, 电脑网络, Ruby
Jul
28
2008
facebook为app提供了很庞大的用户群体和不错的API支持(至少对ruby on Rails来说是如此),对于想把Web2.0作为创业方向的同学来说,可以节省积累用户的时间。
要学习facebook app的基础知识的同学请参看这里,已经对facebook熟悉的同学请跳过:
[连接丢失,抱歉]
看完之后你至少应该知道Facebook App有三种和facebook耦合的方式(external,Iflame,FBML),这就ok了.
前面说过用Ruby开发facebook app有不错的支持,是因为这个东东: “rfacebook” 什么?这么大名鼎鼎的东西不知道?那你得看看这个
http://rfacebook.rubyforge.org/
不看也行,你知道rfacebook提供了facebook api的ruby接口就行了。新版的rfacebook还连同一个rails plugin一起release,大大方便了使用rails的同学
网上能找到不少有关RoR开发Facebook App的教程。比如一下这些,建议大家都看看:
http://www.liverail.net/articles/2007/6/29/tutorial-on-developing-a-facebook-platform-application-with-ruby-on-rails
http://giantrobots.thoughtbot.com/2007/6/14/fist-in-your-facebook
看过上面的教程相信大家有了更多认识;更相信大家有一个印象,就是这些教程太老了(没办法,谁让rails更新的这么快呢),通过这些教程理解要点还可以,跟着作是没什么希望的。反正我是看到rhtml的后缀就没法再忍受往下看了。网上爬了个遍也没看到有更新的教程。那就自己摸索这来吧。(待续)
1 comment | tags: api, facebook, facebook app, rails, rfacebook, RoR, Ruby, web2.0 | posted in 编程开发, Ruby
Jul
17
2008
Ubuntu 8.04 with 3D desktop.
Ruby 1.8.6 + Rails 2.1
IDE: Gedit customized like textmate (How-to)
3D桌面很方便(尤其是向我这种没钱买n个显示器的人),使用Cube,左边是cheetsheet作参考,右面是firefox随时查资料。cube的翻转比较容易保持思维的连贯性。不像之前只能tab翻来翻去最后发现自己都忘记做到哪里了。
说道cheetsheet,网上不少哦,不过质量到不一定高。而且个人认为cheetsheet这种东西最好是自己整理,查起来才得心应手。
1 comment | tags: rails, RoR, textmate, ubuntu | posted in 编程开发, 电脑网络, Ruby