博文

目前显示的是 三月, 2013的博文

2013-3-15

最近觉得脑子越来越不好使了。如前文所说,我最近的工作是把tudou的视频信息生成一个sitemap.xml交给百度,这里面包含了土豆当前所有视频的信息,是全量。但是百度提了一个很无理的要求,要求我把之前提交过,但是现在不在最新的全量数据里的那些视频,即,从土豆后台删除的视频以及我误提交的视频,也包含在这个xml里。这个功能看起来很简单。我原来的流程是:从mysql读数据,过滤,生成xml。 现在的流程是从mysql读数据,存入hadoop。读最近1天hadoop上存的数据,取并集做为一个大全量。然后对那个大全量,和最近最新的这份数据,各自过滤,然后相互diff,然后把diff的结果包含在输出的xml中。 这个逻辑是错的。问题出在我对历史各个版本的数据取并集得到大全量那里。我假定我是不知道过滤规则的,只是简单的集合取并,而且以最新的一个为准。假如一个item在新版本中是该被过滤,而老版本中是不被过滤。理论来说这个应该被加入到delete列表。但是merge的结果是这个不被过滤,所以diff的结果不会包含它。所以,我应该在hadoop上存的不是原始数据,而是过滤后的数据。我存原始数据是为了防止扯皮时查错难。结果……唉

在hadoop上构建版本化的文件存储

background: 我最近在做SEO项目,说实际点就是生成sitemap.xml给搜索引擎,但是百度最近给我提了一个新需求,让我把delete接口也合并到sitemap.xml中。也就是说,虽然我的sitemap.xml是一个全量数据,包含了我想提交给百度的所有url,但是如果,我今天4点生成的比3点生成的少了10条,那么这10条要依然保留在4点的xml中,并标记为is_deleted。于是,我的想法就是把历史生成的所有xml都保存起来,放在hadoop中,然后做diff。然后我就实现了第一个版本的VersionedFolder。它在根目录下有一个名为VERSIONS的sequence file,key是版本号,value是时间(只是给人读)。然后在这个目录下有很多按照版本号命名的子目录,里面是具体存放数据。版本号是从1开始递增。写入的时候先读VERSIONS文件,得到最新的版本号,然后写数据,然后写VERSIONS文件。读的时候先读VERSIONS文件,然后fetch相应的数据。于是,以很简单的方式,就实现one-writer/multiple-reader。我的生成程序会先读后台的数据库,然后把sitemap.xml写入hadoop中,然后写了一个很通过的fs_get工具,把这个文件download到httpd的目录下。这个工具刚上线半天就救我于水火。事情是这样,baidu说我把一个不可播的视频输出给它了,我说我没有!我把sitemap.xml下载下来然后grep,找不到!百度说,你虽然现在没有,但是曾经有过,所以我要封你!然后我就背黑锅了。我在开发这个新需求的时候,程序执行前,把输入数据在hadoop上存了一份,执行后,输出数据也在上面。然后baidu斥责我的时候,我拿着这些历史数据grep一下,问题立刻明了。我觉得我这个经验值得大力推广,尤其是数据的来源和输出涉及到跨部门、跨公司的时候。我下一步的想法就是把这个VersionedFolder完善,把locking加进去。这样的话万一有多个进程同时写入也不会造成太恶劣的结果。然后拿它来备份mysql、备份线上程序包,瞬间我就有了一个容量无限大的time machine,有木有!!再下一步就是把写入完成后的notify加入进去,这样我就不是定时抓取,而是watch、fetch、mv。瞬间就改变了原本的apa…

ipsec vpn的防火墙设置

我之前的防火墙规则特别复杂,是从网上抄来的。它主要解决了,server如果没有固定IP该怎么办的问题。关于iptables的比较新的官方文档可见这里:https://access.redhat.com/knowledge/docs/en-US/Red\_Hat\_Enterprise\_Linux/6/html/Security\_Guide/sect-Security\_Guide-IPTables.html 这是CentOS 6的。我们的需求:做SNAT。众所周知,公网IP很有限,都得花钱买。所以在这样的场景下,分给client的一般都是内网IP。比如192.168.3.4。那么当client想访问google这样的网站时,vpn server就必须充当路由器的作用,做地址翻译,即SNAT。SNAT的意思是指,修改第一个IP包的source地址。与之相反的是DNAT,修改第一个IP包的destination地址。允许任何人从外网访问racoon daemon。因为这是建立IPSec连接的第一步啊。先说第一个。iptables中,SNAT有两种方式,-j SNAT或-j MASQUERADE假设我的分配给VPN的ip pool是172.17.34.0/24,那么iptables -t nat -A POSTROUTING -o eth0 ! -d 172.17.34.0/24 -j SNAT --to 173.245.73.182或 iptables -t nat -A POSTROUTING -o eth0 ! -d 172.17.34.0/24 -j MASQUERADE第一条适用于server有固定IP。第二条适用于server没有固定IP。如果server没有固定IP,我们可以在mangle中加一条规则,在路由之前给esp包加一个mark-A PREROUTING -i eth0 -p esp -j MARK --set-mark 1然后在filter中,所有被mark的input和forward应当被接收-A INPUT -i eth0 -m mark --mark 1 -j ACCEPT-A FORWARD -i eth0 -m mark --mark 1 -j ACCEPT然后说第二个需求:IPSec的IKE server的默认端口是500-…

2013-03-04

我感觉用ipsec然后改路由表,要比我的spdy proxy访问国外页面要快,不知道是不是心理作用。今天终于装了卡巴的mac版,还没有buy。先用1个月再说吧。那些相信mac不会中病毒的人都是脑子有水的,不必理会。看看android第三方市场的现状就知道了。然后用win8 把我的backup disk重新分了下区。好在它内置了ntfs file system shrink的功能,想当年用xp的时候,只能用魔术分区来干这种事,然后我几乎有3/4的机会都整坏了(数据没了)。我这个backup disk比较大,超过了2T,所以只能用GPT分区,还好mac对GPT的支持挺不错的。只是time machine比起ghost 15来,简直太慢了!Ghost 15在我机器上,能做到70-80MB/s的在线备份速度,500GB的硬盘只要1-2个小时就能全备份完。而mac的time machine则是2-8MB/s,慢了一个数量级还要多啊!于是我就只有整夜不关机了。另外今天从vandyke的官网上下载了SecureCRT 7.1 beta版,果然,如它所说,解决了 "SHIFT and CONTROL keys did not work with the Chinese input methods sougou, baidu and QIM" 的问题。mac os x下清空路由表的命令是route flush。我的路由表大概有1000多项,执行一次需要不知道多少分钟,总之我从没执行成功过。用top看,route命令的CPU占有率始终100%。mac下我还没有找到类似于ptrace的工具,不晓得这家伙到底在干嘛呢。不过估计就算有ptrace,这家伙的binary也没符号吧?我的IPSec连接每隔1个小时左右会断一次,看服务器日志似乎是IPsec-SA 过期,SPI无效,重新认证失败。不晓得是我配置错误,还是有人故意为之。然后今天还装了gnupg和pwman。因为想像delphij说的那样,用pgp做password manager。而pwman恰好就是这么做的,只不过给加了一个基于ncurses的UI。可惜啊,pwman根本不好使,得我有空去查BUG去porting了。

vpn,想说爱你不容易

windows 7/8内置了SSTP VPN,这是一种新的VPN,走SSL协议、443端口,所以目标很小。可惜它用的还是TCP。网上有篇10多年的文章,讲为什么TCP不适合用来做VPN “Why TCP Over TCP Is A Bad Idea” ,大意是说,当下层发生tcp delay时,会更更新自己的tcp timer,但是无法把这些更新通知给上层,使得上层很容易暴躁的向下层要求传更多的重传包。Cisco的旧的VPN协议大概是目前支持最广、跨平台性最好的VPN了。在iPhone上无需越狱即可使用。它就是直接使用的IPSec,但是在auth上有所更改。比起L2TP/IPSec来说,因为少了一层,配置和管理都简单很多。但是racoon这样的程序有个问题,它不能像openvpn那样把route table推给client。于是我在此很推荐https://github.com/ashi009/bestroutetb 这个项目。根据APNIC的最新IP地址分配表来生成路由表。但是这样依然有个问题,DNS怎么办? 因为存在人为的DNS污染,所以不能用本地的,必须用VPN Server的。然后许多国内的网站就会被解析到它在美国的服务器上去,所以即便修改了route table,访问这些网站依然还是很慢,而且依然还是会走vpn。比如sina weibo,从2-5ms到300-400ms左右。差别太大了。这个问题有办法解决吗? 我还没找到。VPN最大的问题还是目标太大,特征非常明显,很容易被某防火墙检测到。