访谈:生产环境中的Gentoo

http://www.gentoo.org/news/zh_cn/gmn/20080424-newsletter.xml#doc_chap3

这个月,我们得到了采访Hyves的系统工程部门领导Ramon van Alteren的机会。Hyves是欧洲一个类似MySpace,FaceBook和Orkut的社区交友网站。

GMN:请简要介绍一下你自己和你在Hyves的工作。

Ramon:我在生活和工作中使用Gentoo都有很长时间了——在2002年开始从Mandrake转用Gentoo。在那之前我使用Linux大约已经有5年了。

Hyves是一个类似于MySpace,FaceBook,Orkut等等的社区交友网站。这个网站是由Koen,Floris和Raymond创立的。我在2005年11月作为第一个拿薪水的系统管理员加入公司,帮助管理40多台Gentoo Linux服务器。

现在的系统工程部是一个9个人的团队,负责管理所有服务器的方方面面,从硬件架构到包括网络设施在内的软件应用。网站本身是由一支14人的开发者队伍建立的。

GMN:你们网站的规模有多大?

Ramon:目前我们有600万注册用户并且还在增加。目前的访问峰值是每天1亿5000万以上页面浏览(每小时1300万)。这还是过滤后的页面浏览量,我们的服务器接受的http请求远超过每秒2万次。

后端的mysql,在访问的最高峰时每秒大概要进行10万次操作。除了web前端和数据库后端,我们还有一个非常大的文件库用来存放用户上传的媒体 文件,大约已使用了280TB。算上所有的主机,我们大约有1800台服务器,大部分是双核或四核。所有机器都运行Gentoo Linux。:-)

GMN:你们为什么选择在你们的设备上运行Gentoo Linux?是什么特性让你们从各种发行版中选择了它?

Ramon:我们从网站创立的时候就运行Gentoo Linux。在最开始很短的一段时间里公司有两台预装Fedora的托管服务器,不过那是很久以前的事了。我们改用Gentoo的主要理由有:

  • USE标记(轻松地打开或关闭附加功能的能力)
  • 极高的可定制性(自定义ebuild,安装位置等等)
  • 对上游开发的密切跟踪(更新速度快)
  • 很好的社区支持
  • 很棒的文档

在某些情况下,为了调整我们网站的规模和/或性能,我们使用一些处于非稳定状态的软件来运行我们的网站,一般来说这些软件都有相当广泛的可定制性。 为了达到这种特性,Portage、overlays和ebuild系统已经做了很多;而在Gentoo的内部框架内则可以实现其它的东西。

有这样一个事实:一个最基本的Gentoo系统不会带来各种让人不快的东西和针对发行版的定制。这让我们的系统保持精简。

在从php-4升级到php-5的过程中我们发现solt技术(portage的一个功能)真是个无价的功能,它让我们的迁移过程相当轻松。有一段 时间我们就不得不继续使用php-4,直到Gentoo宣布不支持它为止。通过ebuild来下载安装安全补丁是相当简单的事情,这让我们可以按照自己的 步伐来进行迁移。

GMN:请描述一下你们是如何使用Gentoo提供的工具来帮助维护这样一个大型服务器池。

Ramon:我们大多数的系统管理不是使用Gentoo的工具,而是使用一个用于Unix主机的叫puppet的自动配置管理系统。它使用了eix来创建软件包数据库。

在Gentoo提供的工具里面:

  • 我们使用catalyst来创建我们自己的stage3和stage4压缩包。
  • 我们使用的quickinstall作为我们后备架构的一部分。
  • Catalyst依赖genkernel来创建我们的内核。
  • 我们使用Portage的二进制包来应付紧急修改。

GMN:在搭建你们的系统架构的过程中,你们有遇到过什么大的障碍吗?如果有,你们是如何解决的?在当时,你们觉得Gentoo提供的那几种(社区)支持的途径有帮助吗?

Ramon:当然有一些!大多数都与Gentoo没什么关系,而是跟各个软件的bug和性能问题相关。

说到社区支持,我们在IRC和bugzilla上进行活跃的搜索和查询,有时还有论坛。另外,我们也跟踪gentoo-dev邮件列表里的邮件。对 于我们碰到的桌面问题(多大数的系统工程组运行Gentoo做为桌面系统),论坛是个非常宝贵的资源。但是,对于大型服务器的问题,它噪音/内容比有些 高,这主要是由于其桌面性质所致。

我们尽量把我们遇到的问题通过报告bug(可能的话提交补丁)回馈给社区。但是,我们发现大多数我们提交的问题在社区里只吸引了很有限的兴趣,因为这些问题都是针对我们的环境的。

运行这么大型的服务器通常用掉了大多数可用的时间,所以只剩下很少一点时间来清理补丁和/或ebuild,使到它们的使用范围更广。在配置服务器的过程中,我们确实提交过相关的amd64关键字稳定报告,(然而)至今还没被标志为稳定。

GMN:你觉得Gentoo还需要有什么功能吗?

Ramon:让我想想(绕着桌子思考我们希望gentoo应该拥有的功能大列表)。事实上,该列表出乎意料地短:

  • 目前我正忙于让stackless python以一种和Gentoo的python框架内的其他东西兼容的方式运行起来。我们已经做出了初步的stackless python的ebuild,基本上该ebuild会把stackless python与普通python并排安装在/opt下面。不过我认为这种方式即便不是错的,至少也不能算是最理想的。我们还没完成这项工作,但我认为这是可行的。
  • 我 真的真的很希望看到一个基于发行版本的Portage快照能随实际相应的发行版本一起发行。但是,如果同时没有对应的distfiles快照,这就没什么 用了。这将使Gentoo不再成为一个移动对象,并且可成为建立服务器的更可靠的基础。这已经在一些邮件列表上讨论过,那里人们都反对,原因是这样的稳定 实际上是一种错觉,因为没人将会负责给旧版本打上安全补丁。但就我们所关心的,这些都不是必须的。我们明白这样的要求对于镜像系统带来的挑战。目前我们内 部针对我们的stage4文件正是这样做的,并且具有相当的可操作性。然而,我们做的镜像只包括distfiles里的部分软件(那些在我们的 stage4里面用到的)而不是整个Gentoo发行版里包括桌面相关软件在内的所有软件。
  • 我们非常依赖Gentoo中对二进制软件包的支持,并且当我们需要采用不同的USE标记的同一个软件包时,我们需要为此创建多个ServerOS镜像(stage4)。我希望对二进制包有适当的USE标志支持。
  • 对Portage树中(老版本)ebuild的删减速度慢一些会更好。许多人可能还在使用apache-2.0.x,我们也是。像这些软件包的ebuild离开了Portage真是令人伤心,我怀念它们!

GMN:有没有总结性的评论?

Ramon:Gentoo的魅力在于它提供了一个灵活的框架。有了它,你可以建立一个高度定制的linux平台来跑你的应用程序而不会受到阻碍。而这种灵活性和定制性也带来了复杂性。但在我所关心的范围内,这种复杂性是值得的。

由仅仅9个人来运转这类架构是一种高度有组织的疯狂。如果在阿姆斯特丹有开发者或系统管理员对高性能和大规模的架构有很大兴趣,我愿意跟他们交流。我们在开发和系统工程方面均有空缺职位,愿意在Gentoo社区中雇人。

我们欢迎来自社区的反馈。大家可以通过与我个人联系,或者在IRC(我在Freenode的昵称是Innocenti)上找我。如果谁有兴趣与我们共同工作,请不要联系我个人,直接给发邮件就行了。

最后但并非最不重要,我非常高兴地宣布以下几点:

基于最近与来自gentoo-infra的和的 讨论,Hyves将向Gentoo社区捐赠用于Bugzilla的新服务器。我们正提供两个配备有快速的SCSI硬盘的16Gb大型AMD64服务器作为 数据库后台,还提供两个健壮的web服务器以改善现在bugzilla服务器的状况。当前我们正在让这个架构运转起来。希望不久就能跑起来。

GMN:谢谢Ramon,感谢你在百忙之中抽空接受我们的采访!


图示 3.1: Hyves小组成员(从左到右): Jeffrey Lensen,Marlon de Boer,Eugene Molenaar,Ramon van Alteren,Gerwin Scheeve,Maarten van der Bogaard,Stefan van der Wiele和Frank Zwart

Fig. 1: Hyves Team

4. 心得技巧

加速系统启动时间

启动电脑时您是否感到不耐烦?如果是的话,请尝试以下内容:

代码 4.1: 告诉Gentoo的启动系统并行打开服务

$ $EDITOR /etc/conf.d/rc
(修改)
RC_PARALLEL_STARTUP="no"
(为)
RC_PARALLEL_STARTUP="yes"

代码 4.2: 阻止内核显示状态消息

(假定你在使用GRUB并且/boot分区已正确装载)
$ $EDITOR /boot/grub/grub.conf
(将你正在使用的内核加上“quite”选项,比如:)
kernel /boot/vmlinuz-2.6.23.9 root=/dev/hda2 quiet

代码 4.3: 移除你不需要的服务

(查看当前启动中有哪些服务处于激活状态)
$ rc-status boot
(检查默认的runlevel下可以启动那些程序)
$ rc-status default
(例如,如果你要是一台车载电脑的话你很可能不需要keymap服务)
$ rc-update del keymap

如果您编译了一个不使用模块的内核,你可以将各模块从启动中删除。