06.04
Reloading

我很喜欢《苹果往事》这本书,它以工程师的视角写记录了很多趣闻轶事。加上是APPLE ][将我带入计算机这个领域的,所以我对这家公司有着相当的感情。
书中有多很有趣的事,放到近三十年后的今天也还一样。例如,工程师周末、晚上常加班,还是主动的;不少有价值的东西是工程师利用业余时间制作的;用代码行数统计工程师的工作量时工程师会填上负数;开发经理和工程师互动常有困难;工程师有惰性时,好的老板能够逼工程师完成工程师自己认为不可能的任务;现实扭曲力场(Reality Distortion Field)对创造力的作用….
还有一点我看出来了,工程师普遍采用的时区是当地时区-8
书中的故事都可以着folklore.org网站上读到。
有自己的VPS,很多服务都可以自己来做了,例如我自己安装一个VPN用来穿墙。今天用PowerDNS做了一个动态域名解析服务,替换过去老旧的方法。现在不仅可以自己用,还可以提供给其他有动态域名解析需求的同学。
更新域名的API很简单,一个HTTP请求即可。API地址是: http://dynamic.wacao.com/api/plain.php,参数为,
其中host和shared_key需要我来提供。这里提供一个的host和shared_key给大家测试。testing d035cdac09dd866ed8f4a244567c4daf。域名为testing.dynamic.wacao.com.。
由于仅是一个HTTP请求,客户端很容易用各种语言实现。我自己用的是一个简单的shell脚本。
#!/bin/bash
function usage {
echo "Usage: $0 {host} {shared_key}"
}
if test -z $1 || test -z $2
then
usage
exit 1
fi
HOST=$1
SHARED_KEY=$2
ENDPOINT="http://dynamic.wacao.com/api/plain.php"
TIME=`date +%s`
SIGN=`echo -n "${HOST}${TIME}${SHARED_KEY}" | sha1sum -t | awk '{print $1}'`
URL="${ENDPOINT}?host=${HOST}&time=${TIME}&sign=${SIGN}"
curl "$URL"
执行后立即能够解析,TTL为5秒。
$ update-dynamic-dns.sh testing d035cdac09dd866ed8f4a244567c4daf ok. 58.33.69.77 $ host testing.dynamic.wacao.com. testing.dynamic.wacao.com has address 58.33.69.77
我将这个脚本加到crontab里,每5分钟更新一次。
*/5 * * * * /usr/local/sbin/update-dynamic-dns.sh ${HOST} ${SHARED_KEY}
如果觉得testing.dynamic.wacao.com这样的域名不好看,而且你有自己的域名,可以想我一样,给自己的域名加一个CNAME。例如我把alcohol.swanpan.com做了一个CNAME指到alcohol.dynamic.wacao.com
;; ANSWER SECTION: alcohol.swanpan.com. 86400 IN CNAME alcohol.dynamic.wacao.com. alcohol.dynamic.wacao.com. 5 IN A 58.33.69.77
这样我在各个地方都能用alcohol.swanpan.com这个域名访问家里的机器,方便用它穿墙。
想试试的朋友告诉我你要的host,我给你发送shared_key。
AirPort Extreme可以外接USB硬盘提供文件服务,但是和它的路由功能一样,都不够满足我的需求。而作为穿墙路由器的华硕小机器有4个USB口,我还用它兼作文件服务器使用,提供Samba和NFS。
但是Gentoo在这里遇到两个小问题。
第一个问题,USB硬盘是可以热拔插,这样由于载入顺序的问题,每个硬盘设备名称可能会变化。例如这个机器自带一个读卡器,在没有外挂USB硬盘时启动后候设备名为/dev/sdb。之后插入USB硬盘,USB硬盘的设备名为/dev/sdc。但是如果挂着USB硬盘启动,这两个设备的设备名就正好反过来了。我希望是固定的设备名。
第二个问题,USB硬盘长时间不访问的时候不会自动停下来,这样既不省电也不利延长硬盘的寿命。我希望在不用的时候它可以休眠。
设备名的问题可以用udev的rules解决。我加了一个udev配置文件/etc/udev/rules.d/99-external-storages.rules。
KERNEL=="sd*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="0158", ATTRS{serial}=="20071114173400000", SYMLINK+="cardreader%n"
KERNEL=="sd*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1bcf", ATTRS{idProduct}=="0c31", ATTRS{serial}=="20090717090A", SYMLINK+="storage/neso%n"
这样给内置的读卡器添加了一个设备名的符号链接/dev/cardreader;给我的NESO 1T硬盘添加了设备名符号链接/dev/storage/neso。用固定名称访问设备的问题就解决了。
第二个问题稍微复杂些,一直没找到方便的方法。laptop-mode-tools也没能满足我的要求。一番搜索后找到sdparm可以用来控制USB硬盘,还有一段perl脚本用来调度sdparm。这样就可以满足我的需求了。脚本的原始出外我给忘了,这里我稍微修改了一点,增加对设备名符号链接的支持。
#!/usr/bin/perl -w
use File::Basename;
use Cwd 'abs_path';
$statfile = "/proc/diskstats";
die "$0: Cannot read $statfile\n" unless -r $statfile;
$| = 1;
($disk, $interval) = (@ARGV);
if (-l $disk) {
$original_disk = $disk;
while (-l $disk) {
$disk = readlink $disk;
}
$disk = dirname($original_disk) . "/" . $disk;
$disk = abs_path($disk);
}
$disk =~ s,/dev/,,;
print "$0: disk: $disk, interval: $interval\n";
$halted_data = $last_seen = '';
while (1) {
open(STATUS, $statfile);
($_) = grep(/^\s+\d+\s+\d+\s+$disk\s/o, <STATUS>);
close STATUS;
if ($last_seen eq $_ && $halted_data ne $_) {
print "Spinning down: $disk\n";
system "sync";
system "sdparm", "--command=stop", "/dev/$disk";
$halted_data = $_;
}
$last_seen = $_;
sleep $interval;
}
最后在启动脚本里加上
ebegin " - Spindown USB HD" nohup /usr/local/sbin/spindown-usbhd /dev/storage/neso 1200 >> /var/log/spindown-usbhd.log 2>&1 & eend $?
好了,20分钟这块硬盘没有读写之后自动休眠。
每次ESXi要在服务器上开启SSH服务,总是忘记具体操作方法,都要去google才行,这里记录一下。
1. Go to the ESXi console and press alt+F1
2. Type: unsupported
3. Enter the root password(No prompt, typing is blindly)
4. At the prompt type “vi /etc/inetd.conf”
5. Look for the line that starts with “#ssh” (you can search with pressing “/”)
6. Remove the “#” (press the “x” if the cursor is on the character)
7. Save “/etc/inetd.conf” by typing “:wq!”
8. Restart the management service “/sbin/services.sh restart”
用下面的方法可以避免重新启动机器
8. Restart the management service “/sbin/services.sh restart”
10 – Kill inetd : kill `ps | grep inetd | cut -f2 -d” “‘
11 – Start inetd: inetd
先开门见山,安居客招聘架构师,包括软件架构师和系统架构师。工作地点是上海浦东陆家嘴。有意者请与我联系,@erning 或 erning at anjuke dot com。
随着公司的发展,安居客也开始组建专门的架构师团队了。这个职位没还有特定的需求描述,简单说需要具备互联网应用的多方面经验。还有至少要会写代码,会翻墙。
安居客目前需要从架构方面解决的问题有很多,比如从代码的框架、开发流程开始,使得我们越来越多的工程师能够方便的并行开发;项目能够更方便的部署到测试环境、staging环境和生产环境;更有效的监控网站的各个模块;提高性能;消除减少单点故障……
我们需要已经具备实际经验的资深人士加盟,当然也欢迎认为自己能行的年轻人。
很多人可能还不了解或不知道安居客(http://www.anjuke.com/),我稍微介绍一下。
安居客也是一个start-up公司(有VC、有上市计划,这些都可以google到)。从2007年开始,经过三年的努力,在网络找房的平台上做到了一定的成绩。从各项数据上看,都做到了每年10倍的增长。
业务上安居客有明确的商业模式,很早就盈利了(不是靠流量买广告)。从刚开始的2007年就有收入,到2009年全年实现的销售收入比年初的计划翻了一倍多。具体数额公司没说能够公开,就不好透露。
还是主要说说技术部门的情况。在2007年网站刚上线的时候还部署在虚拟机里的,2个开发工程师。2008年初有三台服务器,不到20万的日访问量,5个开发工程师。现在近百台服务器部署在多个IDC,约1000万的日访问量,差不多20个开发工程师。
网站目前架构简单说是PHP+MySQL运行在Linux上,加上用Java实现的一些后端服务模块。一样也用到了很多开源项目,例如搜索用的是Lucene,消息系统用的是RabbitMQ,前端是Nginx。图片存储用到了MogileFS(现在每天上传的照片超过40万张)。还有Squid, Memcached等等。
大致情况就是这样了。再有在安居客这样快速发展的start-up公司,以我的经验可以体验到和大公司不同的乐趣。因为你可以也需要接触到开发和运营一个网站的各个方面;有个平台可以将自己的想法付诸实现;还能享受到将一个网站从小做到大的快乐。
再次邀请有兴趣的朋友加盟。还请朋友们多帮我推荐。另外安居客除了架构师还需要很多PHP开发工程师、Java开发工程师、测试工程师和系统管理员。
之前我搞了一台华硕的小机器做穿墙路由器,操作系统用的是Gentoo Linux。
SSH的socks5钻墙是好了,但我现在还想要开VPN到墙外,还有VPN到公司里,这样在家里用起来就更方便了。
有些PPTP的VPN需要mppe,mppc。而我用的Gentoo不像Ubuntu,原装的内核不带mppe-mppc模块,得自己打补丁。可是这补丁只到2.6.13,之后的没有了。之前每次内核升级都遇到同样麻烦:|
不过最终还是google到了devil-linux项目里现成的2.6.31补丁。
cd /usr/src/patches wget http://ftp.devil-linux.org/pub/devel/sources/1.4/linux-2.6.31-mppe-mppc-1.3.patch.bz2 bunzip2 linux-2.6.31-mppe-mppc-1.3.patch.bz2 cd /usr/src/linux patch -p1 < /usr/src/patches/linux-2.6.31-mppe-mppc-1.3.patch make menuconfig
选上CONFIG_PPP_MPPE_MPPC=m
Device Drivers ---> [*] Network device support ---> <M> PPP (point-to-point protocol) support <M> Microsoft PPP compression/encryption (MPPC/MPPE)
然后重新编译安装内核。这样就有了ppp_mppe_mppc模块。
最后emerge ppp的时候需要带上USE=”mppe-pmmc”参数。我是把”net-dialup/ppp mppe-mppc”添加到”/etc/portage/package.use”文件里。
使用透明网关,将web流量通过squid走,cache之后可以提高家里机器访问web的速度。
通过squid配置,将被墙的站点设置成通过SSH隧道走。但squid本身不能forward给socks5代理,因此中间加了个privoxy中转。被墙的站点也可以在squid缓存,节省流量。
如果所有的web访问都通过SSH隧道,访问国内的站点慢了。不仅会反向被墙还浪费海外主机的流量。
没有海外主机的时候,SSH隧道可以用TOR替代。
https不可以做透明代理,这时候需要将浏览器的proxy设置到网关的squid。
图上没标出,网关上还安装有bind,提供域名解析服务,用来对付DNS解析被篡改的问题。
现在这个硬件用的是Asus EeeBox b202,安静省电。