keepalived.conf之vrrp instance部分解读

keepalived既可以配合lvs使用,也可以单独使用,所以它的配置文件分为如下几个部分:

  1. Global Configuration
  2. Global definitions
  3. Static routes/addresses
  4. Vrrpd Configuration
  5. VRRP synchronization group(s)
  6. VRRP instance(s)
  7. Lvs Configuration
  8. Virtual server group(s)
  9. Virtual server(s)

这次由于主要用到vrrp instance,所以重点对配置文件这个部分进行解读

下面是对这个配置的解释

state MASTER|BACKUP
#如果不指定Master或者BACKUP,那priority最高的就是master

interface eth0
#监听的实际网口

virtual_router_id 51
#组播ID,通过224.0.0.18可以监听到现在已经存在的VRRP ID,最好不要跟现有ID冲突

priority 100
#权重为100,权重数字越大就越高

advert_int 1
#发送组播包的间隔时间,默认为1秒

smtp_alert
#发送邮件报警

authentication {
auth_type PASS
auth_pass hdtv
}
#这个是验证类型为PASS(明文),密码为hdtv。验证类型也可以选择IPSEC,但是官方是不推荐的

virtual_ipaddress {
10.1.41.141
}
#虚拟IP为10.1.41.141

#############下面这些是文档中存在,但是在上面没有用到的#############################

dont_track_primary
#忽略网卡错误

track_interface {
eth0
eth1
}
#监控eth0和eth1这2块网卡的状态

mcast_src_ip
#使用这个地址作为多播包的源IP,而不是使用interface eth0上的IP

lvs_sync_daemon_interface eth1
#绑定eth1作为lvs同步的

garp_master_delay 2
#master和slave漂移时间改为2秒,默认位5秒,怪不得我昨天发现每次都是5秒才转移

virtual_ipaddress {
/ brd dev scope label 192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
#vip可以写成整个网段和某块网卡上的所有IP

virtual_ipaddress_excluded {
/ brd dev scope / brd dev scope ...
}
#排除哪些IP

virtual_routes {
src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1 192.168.110.0/24 via 192.168.200.254 dev eth1 192.168.111.0/24 dev eth2 192.168.112.0/24 via 192.168.100.254
}
#当状态切换的时候会增加和删除路由,格式如src [to] / via|gw dev scope tab

nopreempt
#这个参数是用来,当master当掉,slave接替原来的master作为master后,这个时候当master重新起来后,有了这个参数后原来的slave就不会自动再自动切换为slave,而是继续作为master

preempt_delay 300
#接上面那个参数,这个表示,只有在老的master重新正常300秒后,老的master才会切换为master,这个参数范围是0-1000,默认为0

notify_master | notify_backup
| notify_fault | notify |
smtp_alert
#各种报警方式,可以定义具体的内容来达到不同的报警信息。

上面这些是官方的配置文件,下面这些是放狗搜索出来的其它配置,主要是为了做服务状态的检测,不然keepalived只能看网口有没有down掉再进行迁移,那样就要另外写其它的监控脚本来达到当服务挂掉后就把网口down掉。
下面这个是从邮件列表中抄袭而来,但是没有测试过,明日会找时间进行测试。下面这个是在1.1.13版本之后就实现了。

! Configuration File for keepalived
vrrp_script chk_sshd {
script "killall -0 sshd" # cheaper than pidof
interval 2 # check every 2 seconds weight -4 # default prio: -4 if KO }
vrrp_script chk_haproxy {
script "killall -0 haproxy" # cheaper than pidof
interval 2 # check every 2 seconds }
vrrp_script chk_http_port {
script "/tcp/127.0.0.1/80" # connects and exits
interval 1 # check every second
weight -2 # default prio: -2 if connect fails
}
vrrp_script chk_https_port {
script "/tcp/127.0.0.1/443"
interval 1
weight -2
}
vrrp_script chk_smtp_port {
script "/tcp/127.0.0.1/25"
interval 1
weight -2
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 100
virtual_ipaddress {
192.168.200.18/25
}
track_interface {
eth1 weight 2 # prio = +2 if UP
eth2 weight -2 # prio = -2 if DOWN
eth3 # no weight, fault if down
}
track_script {
chk_sshd # use default weight from the script chk_haproxy weight 2 # +2 if process is present
chk_http_port
chk_https_port
chk_smtp_port
}
}
vrrp_instance VI_2 {
interface eth1
state MASTER
virtual_router_id 52
priority 100
virtual_ipaddress {
192.168.201.18/26
}
track_interface {
eth0 weight 2 # prio = +2 if UP
eth2 weight -2 # prio = -2 if DOWN
eth3 # no weight, fault if down
}
track_script {
chk_haproxy weight 2
chk_http_port
chk_https_port
chk_smtp_port
}
}

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

Best regards
Timo Seven
blog: http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

初次使用keepalived

使用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

b: 10.1.41.91  vip   10.1.41.142

c: 10.1.41.92  vip   10.1.41.144

keepalived安装很容易,基本的安装就可以了。

修改keepalived.conf配置文件。下面这个是a机的keepalived.conf文件,其它2台注意修改MASTER和SLAVE,以及priority,priority值越大说明权重越高。

!This is keepalived config file
global_defs {
   notification_email {
        timoqi@sohu-inc.com
   }
   notification_email_from hdtv@sohu-inc.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   lvs_id LVS_DEVEL_1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    smtp_alert

    authentication {
        auth_type PASS
        auth_pass hdtv
    }
    virtual_ipaddress {
        10.1.41.141
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 10
    advert_int 1
    smtp_alert

    authentication {
        auth_type PASS
        auth_pass hdtv
    }
    virtual_ipaddress {
        10.1.41.142
    }
}

vrrp_instance VI_3 {
    state BACKUP
    interface eth0
    virtual_router_id 53
    priority 10
    advert_int 1
    smtp_alert

    authentication {
        auth_type PASS
        auth_pass hdtv
    }
    virtual_ipaddress {
        10.1.41.144
    }
}

然后我们就可以启动keepalived。它的启动方式如下:

/usr/sbin/keepalived -f /etc/keepalived.conf

keepalived的启动方式还有很多选择。

  keepalived --vrrp               -P    Only run with VRRP subsystem.
  keepalived --check              -C    Only run with Health-checker subsystem.
  keepalived --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
  keepalived --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
  keepalived --dont-fork          -n    Dont fork the daemon process.
  keepalived --use-file           -f    Use the specified configuration file.
                                Default is /etc/keepalived/keepalived.conf.
  keepalived --dump-conf          -d    Dump the configuration data.
  keepalived --log-console        -l    Log message to local console.
  keepalived --log-detail         -D    Detailed log messages.
  keepalived --log-facility       -S    0-7 Set syslog facility to LOG_LOCAL[0-7]. (default=LOG_DAEMON)
  keepalived --help               -h    Display this short inlined help screen.
  keepalived --version            -v    Display the version number
  keepalived --pid                -p    pidfile
  keepalived --checkers_pid       -c    checkers pidfile
  keepalived --vrrp_pid           -r    vrrp pidfile

续:明日会继续测试keepalived其它功能,比如对服务进行健康检查等。

手术台

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

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

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

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

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

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

终于护士叫上球子家属了,看到穿着病号服的球子,我立刻就推起了病床,第一天还得在加护病房呆着。我们只能在门外偷看几眼,有时候还叫叫球子的名字,发现有反应,心里就安慰好多。

为了防止意外,护士还要求病人家属第一天晚上要守在病房外面,想想我还得上班,这个艰巨的人物给了伯父。球子每次说起这个事情还老说我,艾。。。。。

一直等到下午4点多,我就走了。一次完整的守手术台的过程就这样结束了。

这应该不是我第一次守手术台。小时候我妈生我妹的时候我就等在手术室外面呢。

也想起了死在了手术台上的娜娜,虽然我从来没有真的见过你,可每次见到信就好像你就在我面前跟我说一样。

跟我们家球子也是通过书信的方式渐渐的得到了沟通。其实从书信里远比通过email,电话,短信透露更多的东西。我想当我们渐渐老去的时候我们还是会经常翻翻这些书信。在夕阳下,躺在躺椅上,喝着茶,读着你的这些信件,那是多么的美好阿。

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

Best regards
Timo Seven
blog: http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

用python写的房价分析脚本

分析基础是之前的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
blog: http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

ubuntu安装thinkpad必备软件

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

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

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

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

sudo aptitude install sensors-applet

安装完成后右击上面面板–添加到面板–hardware sensors monitor–sensors–只选择ibm-acpi部分的CPU和FAN。

电池充电

sudo aptitude install tp-smapi-dkms
sudo modprobe tp_smapi

tp-smapi-dkms不光有电池控制,还有aps的驱动。20和100表示低于20%才开始充电,一直充到100%才结束。

安装HDAPS
我用的是gnome-hdaps-applet visual display of disk protection status in gnome panel http://www.dresco.co.uk/hdaps/gnome-hdaps-applet-20081204.tar.gz 安装方式如下

sudo apt-get install libpanelappletmm-2.6-dev libpanelappletmm-2.6-1c2
tar zxvf gnome-hdaps-applet-20081204.tar.gz
gcc $(pkg-config --cflags --libs libpanelapplet-2.0) -o gnome-hdaps-applet gnome-hdaps-applet.c
sudo cp gnome-hdaps-applet /usr/bin/
sudo cp hdaps*.png /usr/share/pixmaps/gnome-hdaps-applet/
sudo cp GNOME_HDAPS_StatusApplet.server /usr/lib/bonobo/servers/
sudo logout

重新登录到界面后:右击上面面板–添加到面板-HDAPS Status

关于指纹识别,由于我的x200比较新,所以实在也装不上,如果T60,X60什么应该是没有问题.

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

Best regards
Timo Seven
blog: http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

一个分析安居客最新房价的shell脚本

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

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#<em>\|</em>\|,\|单价:\|楼层:\|房龄:# #g' | sort -k 5 &gt;&gt; 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"&gt;[0-9]+' phone.txt  | sed -e 's#<div class="telphone">\|</div>\|\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

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

awk 'NF > 10' today.anjuke.2010-08-24.csv | awk '{print $6}' | awk -F'万元' '{print $1}' | awk 'BEGIN {sum=0} {sum+=$0} END{print sum/FNR}'
283.187

好了,其它的也就依样画葫芦计算拉。发现awk太强大了。

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

Best regards
Timo Seven
blog: http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA

安装puppet dashboard进行Puppet展示

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

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

安装具体步骤如下:

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

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

wget ftp://ftp.ruby-lang.org//pub/ruby/1.8/ruby-1.8.7-p248.tar.bz2
tar jxvf ruby-1.8.7-p248.tar.bz2
cd ruby-1.8.7
./configure
make && make install

3. 安装gem

wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.5.tgz
tar zxvf rubygems-1.3.5.tgz
cd rubygems-1.3.5
ruby setup.rb

4. 通过gem来安装rake和libmysql

gem install rake
gem install mysql

5. 安装puppet dashboard

wget http://puppetlabs.com/downloads/dashboard/puppet-dashboard-1.0.3.tgz
tar zxvf puppet-dashboard-1.0.3.tgz
cd puppet_dashboard-1.0.3/config
cp database.yml.example database.yml
vim database.yml

修改3个文件块中数据库连接配置文件。建议把dashboard develpment的数据库改为dashboard_dev,这样省的跟线上数据库发生冲突。

执行下列步骤给数据库建立表和数据

rake RAILS_ENV=production db:create
rake RAILS_ENV=production db:migrate
rake db:migrate db:test:prepare

6. 修改服务器端上的puttet.conf文件

reports = puppet_dashboard, log, store

7. 修改客户端的puttet.conf文件

report = true

重启客户端

8. 部署lib文件

cp ext/puppet/puppet_dashboard.rb /usr/lib/ruby/site_ruby/1.8/puppet/reports/ 

重启服务器端

9. 启动dashboard服务器

./script/server -e production

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

Best regards
Timo Seven
blog: http://www.timoseven.com
twitter: http://twitter.com/zauc
Linux System Admin & MySQL DBA