Skip to content

Instantly share code, notes, and snippets.

@chenzx
Last active December 22, 2021 10:34
Show Gist options
  • Save chenzx/29fc5a06dcbbd1660406 to your computer and use it in GitHub Desktop.
Save chenzx/29fc5a06dcbbd1660406 to your computer and use it in GitHub Desktop.
网站运维技术与实践
网站运维技术与实践
跳转至: 导航、 搜索
目录
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文件分发项目
运维制度化与自管理
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment