RRDTool基础

一 22nd, 2012

  • RRDTool介绍

  • RRDTool是基于RRD数据库来存储时间序列数据,并在需要的时候能够很轻易产生漂亮图表的一套工具包。常用于监控领域,比如监控温度、湿度、流量、CPU、内存、磁盘等等。

  • RRD介绍

  • 为什么监控数据采用RRD数据库来存储,如果采用关系数据库将其记录下来有什么问题呢?
    1. 首先,监控一般是7*24小时不间断进行的,长期积累下数据量很大,来给运维带来沉重负担。
    2. 其次,我们对监控数据的关注点也不一样,通常对最近的数据比较关心,而对一年前的数据就只关心一个大致趋势即可。
    3. 再次,我们需要将数据转化为图表以观察变化趋势,如果数据从关系数据库取的话,数据量多、还慢,用户感知也不好。


    RRD(Round Robin Database)最大的特点是以循环格式来存储时间序列格式,在持续不断插入新数据的过程中它不断将老数据淘汰掉,因此它不会积累太多的数据,RRD文件大小也会保持在一个合适的范围内。在使用RRDTool之前,首先需要建立RRD数据库,然后持续将监控数据更新至RRD,最后再将数据从RRD中取出来生成趋势图。建议RRD数据库需要涉及两个概念,一个是数据源DS,一个是循环存档RRA。下面我们就来说说什么是DS和RRA。

  • 数据源DS

  • 我们将采样来的数据放到哪里,以后出图就从那个地方(数据源)取数据。每个RRD文件可以定义多个DS,也就是一个RRD里可以同时保持多个对象的采样数据,这就方便以后我们将这些数据绘制到同一张图表中对比分析。定义数据源最重要的就是给源取个名字,以及指定其类型。
    语法 DS:name:type:heartbeat:min:max
    – name:数据源的名称,长度为1-19个字符
    – type:数据源类型,COUNTER:累计,GAUGE:离散
    – heartbeat:心跳时间,当心跳时间内仍未采样到监控数据时,将此step时间点填充为UNKONWN,一般设置为两倍step,或者取前后采样的平均值
    – min:最小数据界限,在不需要限制的情况下,可以指定为U
    – max:最大数据界限,在不需要限制的情况下,可以指定为U

  • 循环存档RRA

  • DS里源源不断的记录着新采样回来的数据,我们会如何使用这些数据呢?当然是按照指定的时间周期来绘制走势图表了,就好比我们看股票走势图,有时看日线,有时看周线,有时看月线,有时看年线。RRA就是RRD的日线、周线、月线、年线!每个RRD可以定义多个RRA,一个5分钟为周期的RRA,一个半小时为周期的RRA,一个2小时为周期的RRA,等等。之所以定义这么多的RRA是方便以后快速出图,每个RRA都是即时更新,也就是新来一个采样数据,所有的RRA就会计算一次并保存下来,以后要出图就直接从某个RRA中取数据就好了,不需要在出图时再重新计算平均值什么的。
    语法 RRA:cf:xff:steps:rows
    – CF: 聚合函数,定义如何对数据进行聚合[平均:AVERAGE | 最小:MIN | 最大:MAX | 最后一笔:LAST]
    – xff: 聚合时可以容忍多少个UNKOWN值,这个是UNKOWN个数和全体个数的一个比率,一般定义为0.5
    – steps: RRA步长,一般为采样间隔(step)的倍数
    – rows: 此RRA最多保留几份这类采样数据,注意高采样频率的RRA不要保存太多的rows,否则会影响出图性能
    RRA示例图:


  • 创建RRD

  • 语法:

    rrdtool create filename [--start|-b start time]
                            [--step|-s step]
                            [DS:name:type:heartbeat:min:max]
                            [RRA:cf:xff:steps:rows]
    


  • 更新RRD

  • 语法:

    rrdtool update filename timestamp:datapoints
    


  • 简单示例
  • #!/usr/bin/python
    
    import subprocess
    import random
    
    START_TIME = 1324474748
    END_TIME   = 1324996652
    
    # create RRD for cpu traffic
    cmd  = 'rrdtool create cpu.rrd'
    cmd += ' --step 300'
    cmd += ' --start %d' % START_TIME
    cmd += ' DS:sys:GAUGE:600:U:U'
    cmd += ' DS:usr:GAUGE:600:U:U'
    cmd += ' DS:idle:GAUGE:600:U:U'
    cmd += ' RRA:AVERAGE:0.5:1:8640' # 5 min, save 1 month data
    cmd += ' RRA:AVERAGE:0.5:6:5760' # 30 min, save 4 month data
    cmd += ' RRA:AVERAGE:0.5:24:2160' # 2 hour, save 6 month data
    cmd += ' RRA:MIN:0.5:1:8640' # 5 min, save 1 month data
    cmd += ' RRA:MIN:0.5:6:5760' # 30 min, save 4 month data
    cmd += ' RRA:MIN:0.5:24:2160' # 2 hour, save 6 month data
    cmd += ' RRA:MAX:0.5:1:8640' # 5 min, save 1 month data
    cmd += ' RRA:MAX:0.5:6:5760' # 30 min, save 4 month data
    cmd += ' RRA:MAX:0.5:24:2160' # 2 hour, save 6 month data
    cmd += ' RRA:LAST:0.5:1:8640'
    subprocess.call('rm -rf cpu.rrd', shell = True)
    subprocess.call(cmd, shell = True)
    
    # update RRD
    for i in xrange(START_TIME, END_TIME, 300):
            sys  = random.randint(0, 15)
            usr  = random.randint(25, 55)
            idle = 100 - (sys + usr)
            cmd = 'rrdtool update cpu.rrd -t sys:usr:idle %d@%d:%d:%d' % (i, sys, usr, idle)
            retcode = subprocess.call(cmd, shell = True)
    
    # draw graph
    cmd  = 'rrdtool graph cpu.png -h 250 -w 800'
    cmd += ' --start %d --end %d' % (START_TIME, START_TIME + 86400 * 2)
    cmd += ' --title "CPU Load"'
    cmd += ' -v "use percent"'
    cmd += ' DEF:v1=cpu.rrd:sys:AVERAGE'
    cmd += ' DEF:v2=cpu.rrd:usr:AVERAGE'
    cmd += ' DEF:v3=cpu.rrd:idle:AVERAGE'
    cmd += ' AREA:v1#FF2626:"sys"'
    cmd += ' AREA:v2#00FF00:"usr":STACK'
    cmd += ' AREA:v3#C0C0C0:"idle":STACK'
    subprocess.call(cmd, shell = True)
    

    标签:

    你刚才在淘宝上买了一件东西[技术普及贴](转)

    一 21st, 2012

    原文地址: http://www.vjianke.com/ZZB24.clip

    你发现快要过年了,于是想给你的女朋友买一件毛衣,你打开了www.taobao.com。这时你的浏览器首先查询DNS服务器,将www.taobao.com转换成ip地址。不过首先你会发现,你在不同的地区或者不同的网络(电信、联通、移动)的情况下,转换后的ip地址很可能是不一样的,这首先涉及到负载均衡的第一步,通过DNS解析域名时将你的访问分配到不同的入口,同时尽可能保证你所访问的入口是所有入口中可能较快的一个(这和后文的CDN不一样)。

    你通过这个入口成功的访问了www.taobao.com的实际的入口ip地址。这时你产生了一个PV,即Page View,页面访问。每日每个网站的总PV量是形容一个网站规模的重要指标。淘宝网全网在平日(非促销期间)的PV大概是16-25亿之间。同时作为一个独立的用户,你这次访问淘宝网的所有页面,均算作一个UV(Unique Visitor用户访问)。最近臭名昭著的12306.cn的日PV量最高峰在10亿左右,而UV量却远小于淘宝网十余倍,这其中的原因我相信大家都会知道。

    因为同一时刻访问www.taobao.com的人数过于巨大,所以即便是生成淘宝首页页面的服务器,也不可能仅有一台。仅用于生成www.taobao.com首页的服务器就可能有成百上千台,那么你的一次访问时生成页面给你看的任务便会被分配给其中一台服务器完成。这个过程要保证公正、公平、平均(暨这成百上千台服务器每台负担的用户数要差不多),这一很复杂的过程是由几个系统配合完成,其中最关键的便是LVS,Linux Virtual Server,世界上最流行的负载均衡系统之一,正是由目前在淘宝网供职的章文嵩博士开发的。

    经过一系列复杂的逻辑运算和数据处理,用于这次给你看的淘宝网首页的HTML内容便生成成功了。对web前端稍微有点常识的童鞋都应该知道,下一步浏览器会去加载页面中用到的css、js、图片等样式、脚本和资源文件。但是可能相对较少的同学才会知道,你的浏览器在同一个域名下并发加载的资源数量是有限制的,例如ie6-7是两个,ie8是6个,chrome各版本不大一样,一般是4-6个。我刚刚看了一下,我访问淘宝网首页需要加载126个资源,那么如此小的并发连接数自然会加载很久。所以前端开发人员往往会将上述这些资源文件分布在好多个域名下,变相的绕过浏览器的这个限制,同时也为下文的CDN工作做准备。

    据不可靠消息,在双十一当天高峰,淘宝的访问流量最巅峰达到871GB/S。这个数字意味着需要178万个4mb带宽的家庭宽带才能负担的起,也完全有能力拖垮一个中小城市的全部互联网带宽。那么显然,这些访问流量不可能集中在一起。并且大家都知道,不同地区不同网络(电信、联通等)之间互访会非常缓慢,但是你却发现很少发现淘宝网访问缓慢。这便是CDN,Content Delivery Network,即内容分发网络的作用。淘宝在全国各地建立了数十上百个CDN节点,利用一些手段保证你访问的(这里主要指js、css、图片等)地方是离你最近的CDN节点,这样便保证了大流量分散已经在各地访问的加速。
    这便出现了一个问题,那就是假若一个卖家发布了一个新的宝贝,上传了几张新的宝贝图片,那么淘宝网如何保证全国各地的CDN节点中都会同步的存在这几张图片供用户使用呢?这里边就涉及到了大量的内容分发与同步的相关技术。淘宝开发了分布式文件系统TFS(taobao file system)来处理这类问题。

    好了,这时你终于加载完了淘宝首页,那么你习惯性的在首页搜索框中输入了’毛衣’二字并敲回车,这时你又产生了一个PV,然后,淘宝网的主搜索系统便开始为你服务了。它首先对你输入的内容基于一个分词库进行的分词操作。众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我 是 一个 学生。

    进行分词之后,还需要根据你输入的搜索词进行你的购物意图分析。用户进行搜索时常常有如下几类意图:(1)浏览型:没有明确的购物对象和意图,边看边买,用户比较随意和感性。Query例如:”2010年10大香水排行”,”2010年流行毛衣”, “zippo有多少种类?”;(2)查询型:有一定的购物意图,体现在对属性的要求上。Query例如:”适合老人用的手机”,”500元 手表”;(3)对比型:已经缩小了购物意图,具体到了某几个产品。Query例如:”诺基亚E71 E63″,”akg k450 px200″;(4)确定型:已经做了基本决定,重点考察某个对象。Query例如:”诺基亚N97″,”IBM T60″。通过对你的购物意图的分析,主搜索会呈现出完全不同的结果来。

    之后的数个步骤后,主搜索系统便根据上述以及更多复杂的条件列出了搜索结果,这一切是由一千多台搜索服务器完成。然后你开始逐一点击浏览搜索出的宝贝。你开始查看宝贝详情页面。经常网购的亲们会发现,当你买过了一个宝贝之后,即便是商家多次修改了宝贝详情页,你仍然能够通过‘已买到的宝贝’查看当时的快照。这是为了防止商家对在商品详情中承诺过的东西赖账不认。那么显然,对于每年数十上百亿比交易的商品详情快照进行保存和快速调用不是一个简单的事情。这其中又涉及到数套系统的共同协作,其中较为重要的是Tair,淘宝自行研发的分布式KV存储方案。

    然后无论你是否真正进行了交易,你的这些访问行为便忠实的被系统记录下来,用于后续的业务逻辑和数据分析。这些记录中访问日志记录便是最重要的记录之一,但是前边我们得知,这些访问是分布在各个地区很多不同的服务器上的,并且由于用户众多,这些日志记录都非常庞大,达到TB级别非常正常。那么为了快速及时传输同步这些日志数据,淘宝研发了TimeTunnel,用于进行实时的数据传输,交给后端系统进行计算报表等操作。

    你的浏览数据、交易数据以及其它很多很多的数据记录均会被保留下来。使得淘宝存储的历史数据轻而易举的便达到了十数甚至更多个PB(1PB=1024TB=1048576GB)。如此巨大的数据量经过淘宝系统1:120的极限压缩存储在淘宝的数据仓库中。并且通过一个叫做云梯的,由2000多台服务器组成的超大规模数据系统不断的进行分析和挖掘

    从这些数据中淘宝能够知道小到你是谁,你喜欢什么,你的孩子几岁了,你是否在谈恋爱,喜欢玩魔兽世界的人喜欢什么样的饮料等,大到各行各业的零售情况、各类商品的兴衰消亡等等海量的信息。

    说了这么多,其实也只是叙述了淘宝上正在运行的成千上万个系统中的寥寥几个。即便是你仅仅访问一次淘宝的首页,所涉及到的技术和系统规模都是你完全无法想象的,是淘宝2000多名顶级的工程师们的心血结晶,其中甚至包括长江学者、国家科学技术最高奖得主等众多大牛。同样,百度、腾讯等的业务系统也绝不比淘宝简单。你需要知道的是,你每天使用的互联网产品,看似简单易用,背后却凝聚着难以想象的智慧与劳动。

    标签:

    EXT文件系统的文件隐藏属性

    一 19th, 2012

    在Linux上除了常用的user、group、other属性外,基于EXT2、EXT3、EXT4系列文件系统上还提供一种隐藏属性机制,一定程度上增强了系统的安全。

    文件隐藏属性通过chattr指令修改,通过lsattr查询,具体用法man中写得很详细,这里就不罗嗦了。
    这里只简单介绍隐藏属性的一些常用场景:

  • 1. 文件只能增加数据,不能删除也不能修改,注:只能root用户才能设置这个属性
  • [root@centos tmp]# touch log
    [root@centos tmp]# echo “log information…” >> log
    [root@centos tmp]# cat log
    log information…
    [root@centos tmp]# chattr +a log
    [root@centos tmp]# lsattr log
    —–a——-e- log
    [root@centos tmp]# echo “log information…” >> log
    [root@centos tmp]# echo “log information…” > log
    -bash: log: Operation not permitted
    [root@centos tmp]# rm log
    rm: remove regular file `log’? y
    rm: cannot remove `log’: Operation not permitted

  • 2. 目录只能增加数据,不能删除也不能修改。注:只能root用户才能设置这个属性
  • [root@centos tmp]# mkdir log
    [root@centos tmp]# lsattr -d log
    ————-e- ./log
    [root@centos tmp]# chattr +a log/
    [root@centos tmp]# lsattr -d log
    —–a——-e- ./log
    [root@centos tmp]# cd log/
    [root@centos log]# touch file1
    [root@centos log]# echo “file1′s content” >> file1
    [root@centos log]# echo “file1′s content” > file1
    -bash: file1: Operation not permitted
    [root@centos log]# rm file1
    rm: remove regular file `file1′? y
    rm: cannot remove `file1′: Operation not permitted

  • 3. 锁定目录。确保只能查看,不能对该目录下的任何文件进行删除或修改。注:只能root用户才能设置这个属性。
  • 这里通过简单的python脚本实现目录加锁与解锁功能:

    #!/usr/bin/python
    
    import os
    from subprocess import call
    
    def lock(path):
        call('chattr +i %s' % path, shell = True)
        for root, dirs, files in os.walk(path):
            for e in dirs:
                call('chattr +i %s' % os.path.join(root, e), shell = True)
            for e in files:
                call('chattr +i %s' % os.path.join(root, e), shell = True)
    
    def unlock(path):
        call('chattr -i %s' % path, shell = True)
        for root, dirs, files in os.walk(path):
            for e in dirs:
                call('chattr -i %s' % os.path.join(root, e), shell = True)
            for e in files:
                call('chattr -i %s' % os.path.join(root, e), shell = True)
    
    标签:

    Gentoo下ssh认证模式修改

    一 12th, 2012

    从安全角度考虑,Gentoo下sshd默认采用的是keyboard-interactive authentication,导致客户端(比如我的SecureCRT)不能保存密码,每次登陆都需要手工输入密码,比较麻烦。

    需要将sshd的认证模式修改为密码认证方式:

    vi /etc/ssh/sshd_config
    
    找到
    #PasswordAuthentication no
    
    修改为
    PasswordAuthentication yes
    
    重启sshd
    /etc/rc.d/sshd restart
    
    标签:

    进程控制系统supervisor

    一 8th, 2012

    supervisor是一个采用Python开发的后台进程管理系统,实现了对后台进程的启动、停止、故障重启、服务状态监控、日志监控等功能,另外还可以通过XML-RPC方式实现远程控制操作,比较适合需要对大量后台进程进行管理的场合。
    官方网址: http://supervisord.org

  • 安装
  • easy_install supervisor
    
  • 生产原始配置文件
  • echo_supervisord_conf > /etc/supervisord.conf
    

    修改配置/etc/supervisord.conf

    [program:test]
    command=/root/test.py
    autostart=false
    autorestart=true
    stopsignal=KILL
    redirect_stderr=true
    stdout_logfile=/root/test.out
    stdout_logfile_backups=5
    stdout_logfile_maxbytes=1MB
    
  • 后台程序
  • #!/usr/bin/python
    
    import os
    import sys
    import time
    
    sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
    print 'daemon process runs for 10 seconds, pid =', os.getpid()
    for i in range(10):
        print '.',
        time.sleep(1)
    print '\ndaemon process stopped\n'
    
  • 启动
  • [root@centos ~]# supervisord
    Unlinking stale socket /tmp/supervisor.sock
    [root@centos ~]# supervisorctl
    test                             STOPPED    Not started
    supervisor> start test
    test: started
    supervisor> status
    test                             RUNNING    pid 1498, uptime 0:00:08
    supervisor> tail -f test
    ==> Press Ctrl-C to exit <==
    10 seconds, pid = 1481
    . . . . . . . . . .
    daemon process stopped
    
    daemon process runs for 10 seconds, pid = 1482
    . . . . . . . . . .
    daemon process stopped
    
    daemon process runs for 10 seconds, pid = 1483
    . . . . . . . . . .
    daemon process stopped
    
    daemon process runs for 10 seconds, pid = 1484
    . . . . . . . . . .
    daemon process stopped
    
  • 访问WEB控制台
  • XML-RPC控制示例: rpctl.py
  • #!/usr/bin/python
    
    from xmlrpclib import Server
    
    server = Server('http://user:123@192.168.214.133:9001')
    
    info = server.supervisor.getProcessInfo('test')
    if 'STOPPED' == info['statename']:
        print 'server is stopped, we start it!'
        server.supervisor.startProcess('test')
    elif 'RUNNING' == info['statename']:
        print 'server is running, web stop id!'
        server.supervisor.stopProcess('test')
    
    print 'test process state is:', server.supervisor.getProcessInfo('test')['statename']
    
  • 运行:rpctl.py
  • [root@centos ~]# ./rpctl.py
    server is running, web stop id!
    test process state is: STOPPED
    [root@centos ~]# ./rpctl.py
    server is stopped, we start it!
    test process state is: RUNNING
    

    在Linux环境下Weblogic10.3启动超慢原因分析

    十二 30th, 2011

    环境:

    OS: Linux gentoo 3.0.4-hardened-r5
    JDK: Java HotSpot(TM) Server VM version "1.6.0_05"
    WebLogic: 10.3
    


    今天有同事问我为什么在新服务器上启动startWebLogic.sh时老是卡在这一句不动了。

    <Dec 30, 2011 1:47:33 PM CST> <Info> <Management> <BEA-141107> <Version: WebLogic Server 10.3  Fri Jul 25 16:30:05 EDT 2008 1137967 >
    

    查看CPU、内存、IO使用都正常,很是奇怪,于是kill -3 PID 做一个线程dump,发现有个线程一直卡readBytes走不下去:

    "main" prio=10 tid=0x08059000 nid=0x72f runnable [0xf75bb000..0xf75bd1d8]
       java.lang.Thread.State: RUNNABLE
            at java.io.FileInputStream.readBytes(Native Method)
            at java.io.FileInputStream.read(FileInputStream.java:199)
            at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:185)
            at sun.security.provider.NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:202)
            - locked <0xeee333e0> (a java.lang.Object)
            at sun.security.provider.NativePRNG$RandomIO.access$300(NativePRNG.java:108)
            at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:102)
            at java.security.SecureRandom.generateSeed(SecureRandom.java:495)
    

    Google一把发现这是JDK的bug! JDK生成随机数出现问题
    解决方法为在weblogic的启动脚本commEnv.sh中添加一句:

    export JAVA_OPTIONS="$JAVA_OPTIONS -Djava.security.egd=file:/dev/./urandom"
    
    标签:

    判断某目录下文件的变动情况

    十二 24th, 2011

    今天是2011年的平安夜,老婆和崽崽都在益阳,我也没什么事做,就只好敲代码,实现了一个小功能,逻辑很简单,但感叹python的生产力确实很高,区区三十几行代码就弄出来了,这种感觉真好。

  • 功能: 用于判断某个目录下文件的变动情况:哪些是修改过的、哪些是新增的、哪些被删除了。
  • #!/usr/bin/python
    
    import os
    import shelve
    import hashlib
    
    odb = shelve.open('saleserv.dat')
    ndb = {}
    for root, dirs, files in os.walk('/home/steven'):
        for e in files:
            filepath = os.path.join(root, e)
            f = open(filepath, 'rb')
            m = hashlib.md5()
            m.update(f.read())
            ndb[filepath] = m.hexdigest()
            f.close()
    
    nkeys = ndb.keys()
    okeys = odb.keys()
    for k in nkeys:
        if k in okeys:
            if ndb[k] != odb[k]:
                odb[k] = ndb[k]
                print 'UPT ', k
        else:
            odb[k] = ndb[k]
            print 'ADD ', k
    
    for k in okeys:
        if k not in nkeys:
            del odb[k]
            print 'DEL ', k
    
    odb.close()
    
    标签:

    资源平台开发环境

    十一 22nd, 2011
  • 软件&文档:
  • http://192.168.102.250/soft/cloud/


  • 安装指南
  • 官方文档:
    nagios-3.pdf 344页 Fedora Quickstart
    NRPE.pdf 4页 INSTALLATION

    http://www.nconf.org/dokuwiki/doku.php?id=nconf:help:documentation:installation


    自己总结的:

    http://www.stevenlife.com/?p=520


  • CVS设置:
  • 帐号: yanyb, zhoubing

    修改hosts文件,添加:
    192.168.102.253 wadecvs

    Repository folder: /wade
    Module: apps/cloud

  • 测试机
  • 192.168.102.254
    nagios地址: http://192.168.102.254/nagios
    帐号密码:nagiosadmin/123456

    nconf地址:http://192.168.102.254/nconf
    帐号密码: admin/nconf

    标签:

    NGINX做WebLogic前端七层负载均衡

    十 18th, 2011
  • 准备安装包(nginx和upstream_hash)
  • 
    https://github.com/evanmiller/nginx_upstream_hash
    
    http://nginx.org/download/
    


  • 编译安装
  • tar -zxvf nginx-0.7.65.tar.gz
    unzip cep21-nginx_upstream_hash-99ace64.zip
    
    patch -p0 < ../cep21-nginx_upstream_hash-99ace64/nginx.patch
    patching file src/http/ngx_http_upstream.h
    
    ./configure --add-module=../cep21-nginx_upstream_hash-99ace64 --prefix=/ngboss/webproxy1
    make && make install
    


  • 配置nginx
  • #user  webproxy1 webproxy1;
    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 {
    	use			epoll;
    	worker_connections	51200;
    }
    
    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  15;
    
    	#gzip  on;
    
    	userid          on;
    	userid_name     QHAINGBOSSID;
    	userid_domain   192.168.102.249;
    	userid_path     /;
    	userid_expires  2d;
    
    	upstream ngboss_cluster {
    		hash   $cookie_QHAINGBOSSID;
    		server 192.168.102.249:8081;
    	}
    
    	upstream saleserv_cluster {
    		hash $cookie_QHAINGBOSSID;
    		server 192.168.102.249:8083;
    	}
    
    	server {
    		listen       9090;
    		server_name  localhost;
    
    		proxy_redirect off;
    
    		location /saleserv {
    			if ($request_uri ~* ".*\.(js|css|gif|jpg|jpeg|png|bmp|swf)$") {
    				expires max;
    			}
    			proxy_pass http://saleserv_cluster;
    		}		
    
    		location / {
    			if ($request_uri ~* ".*\.(js|css|gif|jpg|jpeg|png|bmp|swf)$") {
    				expires max;
    			}
    			proxy_pass http://ngboss_cluster;
    		}
    	}
    }
    


  • 起停控制
  • # 启服务
    sbin/nginx
    
    # 停服务
    sbin/nginx -s stop
    
    # 平滑重启
    kill -HUP `cat logs/nginx.pid `
    
    标签:

    Linux双机高可用keepalived配置

    十 18th, 2011
  • 安装基础支持软件
  • yum install kernel-devel kernel-headers
    yum install openssl openssl-devel
    yum install popt popt-devel
    


  • 安装ipvsadm
  • yum install ipvsadm
    


  • 检查ipvsadm是否被正确安装
  • [root@proxy1 ~]# ipvsadm
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    


  • 查看是否存在ip_vs模块:
  • [root@proxy1 ~]# lsmod | grep ip_vs
    ip_vs                 121217  0
    


  • 安装keepalived
  • # 下载地址:http://www.keepalived.org/download.htm
    
    tar -zxvf keepalived-1.1.18.tar.gz
    cd keepalived-1.1.18
    ./configure --prefix=/usr --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.18-128.el5-x86_64/
    


  • configure成功后的显示为:
  • Keepalived configuration
    Keepalived version : 1.1.15
    Compiler : gcc
    Compiler flags : -g -O2
    Extra Lib : -lpopt -lssl -lcrypto
    Use IPVS Framework : Yes
    IPVS sync daemon support : Yes
    Use VRRP Framework : Yes
    Use LinkWatch : No
    Use Debug flags : No
    


  • 编译,安装
  • make
    make install
    


  • 编辑keepalved.conf配置文件(master:主服务器)
  • vi /etc/keepalived/keepalived.conf
    
    global_defs {
            router_id LVS_MBOSS_1
    }  
    
    vrrp_instance V_MBOSS {
            state MASTER
            interface eth0
            lvs_sync_daemon_inteface eth0
            virtual_router_id 51
            priority 200
            advert_int 2
            authentication {
                    auth_type PASS
                    auth_pass 1111
            }
            virtual_ipaddress {
                    10.238.15.103
            }
    }
    


  • 编辑keepalved.conf配置文件(backup:热备服务器)
  • # vi /etc/keepalived/keepalived.conf  
    
    global_defs {
            router_id LVS_MBOSS_2
    }  
    
    vrrp_instance V_MBOSS {
            state BACKUP
            interface eth0
            lvs_sync_daemon_inteface eth0
            virtual_router_id 51
            priority 100
            advert_int 2
            authentication {
                    auth_type PASS
                    auth_pass 1111
            }
            virtual_ipaddress {
                    10.238.15.103
            }
    }
    


  • 将keepalived服务加入开机启动启动
  • chkconfig --add keepalived
    chkconfig --level 35 keepalived on
    


  • 启动keepalived
  • keepalived
    


  • 查看keepalived是否已经启动
  • [root@proxy1 keepalived]# ps -ef | grep keepalived
    root      4003     1  0 Apr01 ?        00:00:00 keepalived -D
    root      4004  4003  0 Apr01 ?        00:05:32 keepalived -D
    root      4019  4003  0 Apr01 ?        00:05:39 keepalived -D
    


  • 发现VIP 10.238.15.103地址,证明MASTER已经启用指定的VIP地址
  • [root@proxy1 keepalived]# ip add
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
        link/ether 00:23:7d:d1:be:0e brd ff:ff:ff:ff:ff:ff
        inet 10.238.15.101/24 brd 10.238.15.255 scope global eth0
        inet 10.238.15.103/32 scope global eth0
        inet6 fe80::223:7dff:fed1:be0e/64 scope link
           valid_lft forever preferred_lft forever
    3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
        link/ether 00:23:7d:d1:be:10 brd ff:ff:ff:ff:ff:ff
    4: sit0: <NOARP> mtu 1480 qdisc noop
        link/sit 0.0.0.0 brd 0.0.0.0
    5: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop
        link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    


    标签: