marschen2007
7/24/2014 - 12:54 PM

网站运维技术与实践

网站运维技术与实践

网站运维技术与实践
跳转至: 导航、 搜索
目录

    1 服务器监测
    2 产品访问监测
    3 数据采集、传输与过滤
    4 数据分析与报警
    5 测试评估
    6 集群架构规划
    7 弹性控制和部署
    8 分布式文件系统
    9 数据库
    10 备份与同步技术
    11 运维制度化与自管理

服务器监测

    ps auxfww # COMMAND列显示进程的父子关系
        ps awxo pid,rss,vsz,etime,args --sort=rss | grep apache | tail 
    netstat -st | grep conn
    iostat -x
        IOPS %r %w 
    dstat 更偏重实时采集
        针对Intel多队列网卡,可通过绑定队列到CPU中断的方式让中断分布平均化
            lspci -vvv | grep MSI
            更好的做法是,手工绑定每个队列的rx/tx到同一个CPU上:
                从/proc/interrupts取出中断的MASK,写到对应的/proc/irq/$IRQ/smp_affinity 
    mtr(My traceroute):集成ping和traceroute
    iptraf -z eth0
    tcpdump -nnvXSs 0 -c2 icmp
        或可tcpdump -s0 -w保存好全部数据包,交给WireShark 
    SystemTap .stap/.stp(待监控的模块可以不必是debug版吗?)(相当于运行时的动态trace输出)
        stap -ve 'probe begin { log("hello"); exit(); }' 动态编译内核模块???
        stap -e 'probe kernel.function("vfs_read") { printf("%s\n", $$parms$$); exit(); }'
        探针
            同步事件
                kernel.function("vfs_read").call/return
                syscall.read
                process("/lib/libc.so.6").function("*malloc")
                kernel.statement("*@kernel/sched.c:2917") 
            异步事件
                begin, end, timer.jiffies(1000), timer.ms(200).randomize(50) 
        额外的函数:pid() uid() execname() tid() gettimeofday_s() print_stacktrace()
        目标变量
            $$vars probe点的每个变量
            $$locals, $$parms 输出的值是内存地址,要看内容需要在后面再加一个$
            $$return 
        运用示例
            设置tcp_init_cwnd
                stap文件:probe kernel.function("tcp_init_cwnd").return { $return = $1 }
                stap -p4 -g -m initcwnd tcp_init_cwnd.stap 10 && staprun -o initcwnd.out -D initcwnd.ko && insmod initcwnd.ko 
    SmokeKing网络质量监测
    Nagios分布式监测
        Shinken项目:完全用Python重新实现了Nagios Core??? 
    SNMP网络监控:MIB/OID
        OMD项目 

产品访问监测

    HAR:实际上就是将HTTP请求响应整理为JSON保存
    p89 QQ.com是国内前端优化最好的门户网站(1秒钟以内??)
    基调网络:Lastmile/IDC
    p96 YAHOO! Boomerang 

数据采集、传输与过滤

    RSyslog?
        RainerScript 
    消息队列:JBoss Messaging、ActiveMQ、Qpid、RabbitMQ、Beanstalkd、HTTPSQS、Q4M
        主流的消息中间件标准:AMQP(8字节为单位的数据流)、MQTT(小带宽)、STOMP(基于文本的)(JMS基于API的不推荐?)
        ZeroMQ/redis 
    RPC
        Thrift 
    Gearman:更偏向于任务分发
    p122 数据收集传输框架
        Twitter的Storm
        Linkedin的kafka
        Facebook的Scribe
        Cloudera的Flume
        Hadoop的Chukwa 
    日志收集系统框架
        Flume-ng 去除了原先架构中的ZooKeeper高可用等组件
            source, sink, channel 
        logstash
            JRuby编写,除一小部分Joda和RPC连接ElasticSearch的插件,其余都可以在MRI上运行
            input, filter, output(插件)
            Grok filter:将文本转换为JSON?
                修改NginX默认日志格式为json,就可以免去不必要的额外处理 
            WebUI:Kibana 

数据分析与报警

    RRDtool
        Holt-Winters预测算法? 
    Graphite
    OpenTSDB
    Splunk的开源替代:ES
    可视化:AmCharts
    信息推送:略 

测试评估

    IOzone
    Netperf
    sysbench
    http_load
    weighttp(配合lighttpd)
    AutoBench
    TCPcopy 

集群架构规划

    IDC
    CDN
        DNS:Google “edns-client-subnet”
        BGP和anycast(网络负责尽力将数据报投递到至少一个...有点像LVS)
            anycast只能作为目的地址,不能作为源地址(所以只能用于UDP?如果能用于TCP呢?) 
    缓存设计
        Squid的LM-factor算法 / ACL控制 / aufs/coss缓存引擎 
    使用SSD
        FB的flashcache内核模块(把ssd作为缓存) ==> Squid-SSD / TrafficSerer-SSD
        写入放大问题 
    本地负载均衡
        LVS
            注意,核心概念:集群对外显示一个公网IP,而网内各个主机分配一个VIP
            转换机制:nat/fullnat/synproxy(TUN) -- 所有的L3数据包来回都要经过调度器,会不会有单点故障?
            IP隧道 可以适应将请求数据包发送到全球WAN任一主机(全球转发?但是延时呢?)
            直接路由(DR)
                将数据包的目标MAC地址修改为后端选中服务器的,真实服务器收到数据包处理后,将响应直接发回给客户端源主机,无需经过调度器(关键是修改数据链路层)——嗯,这里对Linux Kernel的路由需要做怎么样的修改?
                效率最高,但要求集群所有服务器都处于同一个网络(其实这没什么问题吧) 
            vs Yahoo! L3DSR(Direct Server Return)
                改用DSCP(Differentiated Services Code Point)作为关系映射VIP(这意味着网内不能再用DSCP做QoS) 
        keepalived与VRRP高可用原理 
    NginX的upstream(vs HAProxy)
        consistent_hash
        p271 和ngx_lua的配合 
    squid的cache_peer
        ICP/HTCP 

弹性控制和部署

    SSH::Batch
    Puppet
        CFengine的描述语言接近于C语言,生成的则是XML,不适合运维人员?
        ENC?实现“特定服务器具体加载哪种配置”
        *命令行打包FPM 
    随时控制成本
        CGroup
            cpuset
            blkio
            tc限速
                iptables标记和SMP不能共存,Linux内核在自动支持SMP后,已经去除了iptables owner模块关于pid/cmd的match支持 
    p338 CloudFoundry仅能运行在Ubuntu 12.04上,而Ubuntu Server的市场占有率远远不如RHEL 

分布式文件系统

    NFS
    FUSE
    MogileFS 

数据库

    慢查询分析mysqlsla
    Persona工具集
    监控:mytop、innotop
    MySQL集群
        MHA:多Master方案,基本原理仍然是binlog传输和replaylog重放,最好开启5.5+半同步复制 

备份与同步技术

    rsync
    inotify和sersync
    netcat
    murder:Twitter开源的P2P文件分发项目 

运维制度化与自管理