The Mirages

樱桃沟夹事

使用keepalived,是因为keepalvied的切换时间非常短,我在Linux用ping进行测试基本4秒左右就可以切换了,这样的时间还是可以接受的。

做LVS最讨厌的就是有太多的机器做LVS的时候会浪费一半的机器。这样其实是非常不合算的。

而heardbeat实在是太麻烦了。keepalived问题就是文档实在不怎么全,最新的完整文档还是2002年的。

在测试环境中我使用了3台机器,其中每台机器都是前端,但是又各自备了其它的其它2个前端。健康检查是通过实际IP进行的,而所有的服务端口都是跑在vip的端口上。vip也可以指定多个。

机器分配如下:

a: 10.1.41.90   vip  10.1.41.141

阅读全文 »

手术台,去年这个时候我们家球子已经下了手术台了,也正在康复期了。
虽然手术前我觉得应该问题不大,但是我还是很担心,毕竟只要是手术都是有风险,而且该死的医院还一定要签那个生死合同。

那天是我推着你进手术室的,同时也推进去其它的病人,大概有5个手术同时进行。

时间一分一秒的过去了,一会儿站着,一会儿坐着。焦急的等了没多久,居然麻醉师出来了,问我们术后用哪种麻药,汗,压根还没开始。

时间过去2个多小时了,小田子也开始着急起来了,终于主治医生出来了,手里拿着一个小不锈钢杯子,看到那个完整的瘤的时候我心总算落下了。我想我们家宝贝这个手术算是成功了。

接着医生把瘤送到楼下进行化验是良性还是恶性。但是一般来说这样能够完整切除的应该是良性的。当我看到其它恶性的,那真是太恐怖了,虽然不至于看了晕倒吧,可至少也反胃了。

医生又进去了,我想不就是缝缝伤口就可以出来了。可这一等又是2个多小时,我又开始紧张起来了,难道出什么意外了还。想到有些烂医生故意把纱布什么放人家肚子里还。难道这些破医生还出这样的问题?

阅读全文 »

分析基础是之前的shell分析脚本后的csv文件。但是我现在分析的是平均房价等等信息。由于之前那个csv文件格式不是特别好,所以没法使用二维数组这种方式来分析,所以只能简单的使用的一维数组。

分析的步骤基本如下,读入文件,然后根据关键用正则把每个数据读入到一个数组中,方法有点笨,因为原日志文件中有”平米”,’万元’,所以分2次读入的,不直到能否跟简单点,尝试过用group(),但是在compile中没法使用,所以大家有什么好的方法可以回复给我。

 #!/usr/bin/python #coding:UTF-8 import re f = open('../../house/today.anjuke.2010-08-27.csv','r') totalDolar=\[\] totalPingmi=\[\] re_obj = re.compile(r"d+万元") re_num = re.compile(r"d+|d+.d+") re_ping = re.compile(r"d+平米|d.d+平米") for row in f: for match in re_obj.findall(row): for num in re_num.findall(match): totalDolar.append(int(num)) for pingmi in re_ping.findall(row): for pingmiNum in re_num.findall(pingmi): totalPingmi.append(int(pingmiNum)) #print totalPingmi print '共有房产: %d套' % len(totalDolar) print '所有房产总价: %d万元' % sum(totalDolar) avg=float(sum(totalDolar))/(len(totalDolar)) avgPingmi=float(sum(totalDolar))/(sum(totalPingmi)) print '每套均价:%f万元' % avg print '每平米均价:%f万元' % avgPingmi #break f.close() 

###########################################

Best regards
Timo Seven

()
Linux System Admin & MySQL DBA

阅读全文 »

thinkpad最大的优势就是在linux上可以找到很多对应的驱动。无论是风扇转速,CPU温度,以及电池充电,还是最好用的HDAPS(硬盘防震)

还有一个关于thinkpad linux下的很好的wiki:http://www.thinkwiki.org

其实ubuntu已经对thinkpad支持的很好了,但是我们还是安装点附加的软件来实现上面的需求。

首先是要解决的显示风扇转速和CPU温度

 sudo aptitude install sensors-applet 
阅读全文 »

为了能够得到最新的房屋价格,虽然安居客这种网站的价格并不是很准,但是一旦有了历史数据,那分析起来还是可以得到点相关的信息的。分析的结果如下展示:

 http://beijing.anjuke.com/viewprop-act-sell-id-34033853.html 13366569581 南北 美联物业 亚运新新家园朗月园 1450万元 5室3厅 365平米 39726元 共3层 2008 http://beijing.anjuke.com/viewprop-act-sell-id-34033627.html 13161862633 南北 润万嘉 远洋·万和城 760万元 3室1厅 163平米 46626元 8/12 2005 

第一列为房子的具体链接地址,第2列为销售的手机号,第3列为房子的朝向,第4列为中介公司,第5列为楼盘名字,第6列为总价,第七列为户型,第8列为楼层,第9列为房子年代

具体的shell脚本如下,得到的最后csv文件可以用excel或者python matlab进行画图。

 #!/bin/bash cd /home/timo/house day=\`date +%F-%H:%M\` today=\`date +%F\` wget --header="Host: beijing.anjuke.com" --user-agent=Mozilla/5.0 http://203.166.162.82/v2/sale/W0QQdsmZmmQQmodeZ1QQs5Zall -O anjuke.txt grep "房龄|viewprop-act-sell-id" anjuke.txt | grep -v option > result.txt sed '{N;s/n/ /}' -i result.txt if \[ ! -f today.anjuke.$today.csv \] ; then touch today.anjuke.$today.csv fi templink=\`awk -F'"' '{print $2}' result.txt | tail -n 1\` tempid=\`grep -c "$templink" today.anjuke.$today.csv\` if \[ $tempid -le 0 \] ; then echo "$day" >> today.anjuke.$today.csv awk '{print $2,$3,$11}' result.txt | awk -F'"' '{print $2,$4,$5}' | sed 's#_|_|,|单价:|楼层:|房龄:# #g' | sort -k 5 >> today.anjuke.$today.csv fi sed -e 's#二手房# #g' -i today.anjuke.$today.csv for linenum in {1..25} do temp_phone=\`awk '{print $2}' today.anjuke.$today.csv | tail -n 25 | sed -n "$linenum"p| egrep "^\[0-9\]+" | wc -l\` if \[ $temp_phone -le 0 \] ; then for x in \`awk '{print $1}' today.anjuke.$today.csv | tail -n 25 | sed -n "$linenum"p\` do wget --user-agent=Mozilla/5.0 $x -O phone.txt phone=`egrep -e '"telphone">\[0-9\]+' phone.txt | sed -e 's#

|

|t##g'` orien=\`grep '朝向' phone.txt | grep -w li | sed -r 's#\[a-z\]||"|/|=|t|朝向:##g'\` shop=\`grep 'images.anjukestatic.com/broker' phone.txt | awk -F'"' '{print $12}' | awk '{print $1}'\` sed -e "s#$x#$x $phone $orien $shop#g" -i today.anjuke.$today.csv done fi done 

计算所有房子总价的平均价格,不算不知道,一算吓我一跳阿

阅读全文 »

puppet dashboard是一个puppet的展示模块,自身就带有了一个web服务器。 ruby on rail 嘛!

但是我们还需要安装mysql数据库

安装具体步骤如下:

1. 安装mysql5.0或者mysql5.1

2. 安装ruby,一定要1.8.7版本

阅读全文 »

说是使用autobench,其实autobench是一个Perl脚本用来调用httperf来进行测试。所以我们需要先安装httperf然后安装autobench。

安装过程简单如下

 wget http://httperf.googlecode.com/files/httperf-0.9.0.tar.gz tar xvzf httperf-0.9.0.tar.gz cd httperf-0.9.0 ./configure make && make install cd .. wget http://www.xenoclast.org/autobench/downloads/autobench-2.1.2.tar.gz tar zxvf autobench-2.1.2.tar.gz make make install 

然后我们就可以直接调用autobench进行测试了,测试结果可以直接保存为tsv格式,这个可以用excel直接打开,然后进行画图。

 autobench --single_host --host1 www.test.com --uri1 /10K.html --quiet --low_rate 20 --high_rate 200 --rate_step 20 --num_call 10 --num_conn 5000 --timeout 5 --file /tmp/results.tsv 

上面这个表示测试 http://www.test.com/10K.html
,从并发20个连接一直到并发200个连接(每个连接包含了10个请求),以20为递进。每个测试总共都会有5000个连接,如果5秒内没有响应就表示出错。最终的结果保存在/tmp/results.tsv

阅读全文 »

在来sohu之前,其实我是先面的创新工场,在一个周六的上午面的,清华科技园某座16楼,由于当天的前台跟人事没沟通好,所以还得我打给人事打手机问下具体情况,结果前台说人事正在清华校招呢。所以最后那天是直接进去喊人有没人约的我,汗一个!
虽然我看连前台都用上了google calendar,但是显然这个google calendar没有跟人事的进行同步。
应该说创新工场的人事还是很尽责,在约人之前在电话里跟我进行了详细的沟通,估计沟通了1个小时左右。我觉得这点很好,经常碰到有些人事和猎头搜索到关键字就说要让你去,到底专不专业阿? 就算来了不是浪费大家时间阿。
面我的是个看着脸膀还有点清涩的孩子,主要是关于数据库方面的DRBD这些东西。具体什么内容由于几个月都过去了,都已经健忘了,只记得当时是在kaifulee的办公室里面的。
当然没有多久我就接到了二面通知,还是之前那位人事通知的。二面是位中年人,很明显创新工场实在太挤了,我们两就在一个角落了聊了会,接着就说让人事总监跟我最后谈谈,可过会说总监不在,只能另约,这一另约就是慢慢1个多月啊。而在这个时候我也跟SOHU给确认好了。是人才在什么平台上都能发挥自己最灿烂的一面的。
总结:
一:创新工场招人很多,但是都很谨慎。
二:创新工场给钱不多
三:给不给期权未知,因为最后一轮没有谈
四:工作比较累,加班较多,周六也要上班
五:工作氛围应该不错,我面的时候看到大家都热火朝天的很努力
六:上班很挤,还要占座
七:招聘流程会很长,会一个多月
八:创新工场项目很多,得具体问清楚什么项目
九:创新工场有自己孵化项目和外来项目(可能给的待遇会不同)
十:找一个靠谱的领导比找一个靠谱的公司重要
###########################################
Best regards
Timo Seven

在squid中可以很简单的查看squid的命中率,但是在nginx需要在日志中添加$upstream_cache_status这个参数,这样就可以显示它的cache状态,有

  1. MISS

  2. EXPIRED - expired, request was passed to backend

  3. UPDATING - expired, stale response was used due to proxy/fastcgi_cache_use_stale updating

  4. STALE - expired, stale response was used due to proxy/fastcgi_cache_use_stale

  5. HIT

共这样5种状态。
我的日志文件的格式为:

 log_format cache '$remote_addr - $remote_user \[$time_local\] - $request ' 'upstream_response_time $upstream_response_time ' 'msec $msec request_time $request_time - $upstream_cache_status'; 

在我的日志文件中计算了upstream的响应时间和命中状态。

这样很容易就能从日志中计算出nginx cache的命中率了。

阅读全文 »

nginx cache现在已经在0.8以上的版本默认启用了,其实是作为proxy部分的一部分。而且现在nginx cache已经支持expires, gzip,内存cache管理等等,已经可以作为线上可以使用了。

使用nginx cache一直是有这个想法的,因为squid实在是太过臃肿了,而连接数到达400已经很吃力了,而nginx的优势恰恰是在连接数上。下面就开始试用吧。

首先是安装,我还特地下载了一个purge工具,专门用来进行推送,但是还是要单独安装squidclient。

 ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --with-file-aio --add-module=/home/timo/download/ngx_cache_purge-1.2 
 make 
 make install 

下面这个是我自己的一个Nginx.conf文件,用来做最简单的cache功能

user www-data;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;

#pid logs/nginx.pid;

events {
  worker_connections 1024;
  use	epoll;
  }

http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';

access_log logs/access.log main;

sendfile on;
tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;

gzip on;
gzip_http_version 1.0;
gzip_comp_level 9;
gzip_proxied any;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
#gzip_min_length 1100;
gzip_buffers 16 8k;
#gzip_disable "MSIE [1-6]\.(?!.*SV1)";

proxy_cache_path /var/www/nginx_cache levels=1:2
keys_zone=cache_one:200m inactive=1d max_size=200m;
# proxy_temp_path /var/www/nginx_cache/temp;

server {
listen 10.1.41.81:81;
# expires 2d;

location / {
  proxy_cache cache_one;
  # proxy_cache_valid 200 301 302 304 30d;
  proxy_cache_key $host$uri;
  proxy_hide_header Vary;
  proxy_set_header Host $host;
  proxy_set_header Accept-Encoding '';
  proxy_set_header X-Forwarded-For $remote_addr; add_header X-Cache "HIT from cache_test";
  proxy_pass http://10.1.41.81;
  if ( $request_method = "PURGE" ) {
  rewrite ^(.*)$ /purge$1 last;
  }
}

location ~ /purge(/.*) {
  allow 10.0.0.0/8;
  deny all;
  error_page 405 =200 /purge$1;
  proxy_cache_purge cache_one $host$1$is_args$args;
  }
}
}
阅读全文 »
0%