Linux抓包工具tcpdump

tcpdump是查看网络状况,诊断网络问题的利器,熟练的使用可以很容易看到连接的建立,收发数据,断开

tcpdump采用命令行方式,它的命令格式为:

tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ] [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ] [ -T 类型 ] [ -w 文件名 ] [表达式 ]

tcpdump的选项介绍
-A     以ASCII格式打印出所有分组,并将链路层的头最小化。
-c      在收到指定的数量的分组后,tcpdump就会停止。
-C      在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
-d      将匹配信息包的代码以人们能够理解的汇编格式给出。
-dd    将匹配信息包的代码以c语言程序段的格式给出。
-ddd  将匹配信息包的代码以十进制的形式给出。
-D      打印出系统中所有可以用tcpdump截包的网络接口。
-e       在输出行打印出数据链路层的头部信息。
-E       用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。
-f        将外部的Internet地址以数字的形式打印出来。
-F        从指定的文件中读取表达式,忽略命令行中给出的表达式。
-i         指定监听的网络接口。
-l         使标准输出变为缓冲行形式。
-L         列出网络接口的已知数据链路。
-m        从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。
-M       如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。
-n        不把网络地址转换成名字。
-N       不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。
-t        在输出的每一行不打印时间戳。
-O       不运行分组分组匹配(packet-matching)代码优化程序。
-P        不将网络接口设置成混杂模式。
-q        快速输出。只输出较少的协议信息。
-r         从指定的文件中读取包(这些包一般通过-w选项产生)。
-S         将tcp的序列号以绝对值形式输出,而不是相对值。
-s         从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
-T         将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。
-t         不在每一行中输出时间戳。
-tt        在每一行中输出非格式化的时间戳。
-ttt       输出本行和前面一行之间的时间差。
-tttt      在每一行中输出由date处理的默认格式的时间戳。
-u         输出未解码的NFS句柄。
-v         输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
-vv       输出详细的报文信息。
-w        直接将分组写入文件中,而不是不分析并打印出来。
-x         以16进制数形式显示每一个报文 (去掉链路层报头) . 可以显示较小的完整报文, 否则只显示snaplen个字节.
-xx        以16进制数形式显示每一个报文(包含链路层包头)。
-X         以16进制和ASCII码形式显示每个报文(去掉链路层报头)。
-XX       以16进制和ASCII吗形式显示每个报文(包含链路层报头)。
-y         设置tcpdump 捕获数据链路层协议类型
-Z         使tcpdump 放弃自己的超级权限(如果以root用户启动tcpdump, tcpdump将会有超级用户权限), 并把当前tcpdump的用户ID设置为user, 组ID设置为user首要所属组的ID

基本用法:

1.1、过滤主机

抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据

tcpdump -i eth1 host 192.168.1.1

指定源地址

tcpdump -i eth1 src host 192.168.1.1

指定目的地址

tcpdump -i eth1 dst host 192.168.1.1

1.2、过滤端口

抓取所有经过eth1,目的或源端口是25的网络数据

tcpdump -i eth1 port 25

指定源端口

tcpdump -i eth1 src port 25

指定目的端口

tcpdump -i eth1 dst port 25

1.3、网络过滤

tcpdump -i eth1 net 192.168

tcpdump -i eth1 src net 192.168

tcpdump -i eth1 dst net 192.168

1.4、协议过滤

tcpdump -i eth1 arp

tcpdump -i eth1 ip

tcpdump -i eth1 tcp

tcpdump -i eth1 udp

tcpdump -i eth1 icmp

1.5、常用表达式

: ! or “not” (去掉双引号)

: && or “and”

: || or “or”

抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP数据

tcpdump -i eth1 ‘((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))’

抓取所有经过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据

tcpdump -i eth1 ‘((icmp) and ((ether dst host 00:01:02:03:04:05)))’

抓取所有经过eth1,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据

tcpdump -i eth1 ‘((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))’

1.6、通过tcpdump抓取mysqltcp协议数据,利用pt-query-digest做分析

tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt

获得抓包结果,-c为抓包数量,可自定义,-i为抓包的网络接口,可自定义,-s为抓取数据包时指定长度,抓取数据包时,默认抓取长度68字节,用-s 0可以抓到完整的数据包

pt-query-digest –type tcpdump mysql.tcp.txt> slow_report9.log

tcpdump -i em1 -s 0 -l -w – dst port 3306 | strings | grep -i -E ‘SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL’

Ansible Dynamic Inventory的使用案例,可以集合CMDB生成

ansible有个hosts文件,这个文件默认是静态的 使用是,我们需要编辑相关主机或者主机组变量什么的,官方的Inventory 是通过调用外部脚本生成指定格式的json串
这样做的好处是 可以直接从数据库拉取相关信息,可以结合cmdb使用
官网的 dynamic inventory 介绍:
http://docs.ansible.com/intro_dynamic_inventory.html

  1. #!/usr/bin/env python  
  2.   
  3. import MySQLdb  
  4. import sys  
  5.   
  6. try:  
  7.         import json  
  8. except ImportError:  
  9.         import simplejson as json   
  10.   
  11. def grouplist():  
  12.         test = MySQLdb.connect(db=’ince’,host=’172.16.10.54′,user=’python_dev’,passwd=’python_dev’,charset=’utf8′)  
  13.         inventory = {}  
  14.         inventory[‘local’] = [ ‘127.0.0.1’ ]  
  15.         cur = test.cursor()  
  16.         cur.execute(“select type,name from hosts”)  
  17.         for row in cur.fetchall():  
  18.                 group = row[0]  
  19.                 if group is None:  
  20.                         group = ‘ungrouped’  
  21.                 if not group in inventory:  
  22.                         inventory[group] = {  
  23.                                 ‘hosts’ : []  
  24.                         }  
  25.                 inventory[group][‘hosts’].append(row[1])  
  26.         cur.close()  
  27.         print json.dumps(inventory,indent=4)  
  28.   
  29.   
  30. if __name__==’__main__‘:  
  31.         grouplist()  
  32.   
  33. —–   
  34. 执行上面脚本,会生成如下结果的主机和组信息,是不是和我们想要的是一样的…..  
  35. {  
  36.     “ungrouped”: {  
  37.         “hosts”: [  
  38.             “172.16.10.251”  
  39.         ]  
  40.     },   
  41.     “db”: {  
  42.         “hosts”: [  
  43.             “172.16.10.54”  
  44.         ]  
  45.     },   
  46.     “app”: {  
  47.         “hosts”: [  
  48.             “172.16.10.55”  
  49.         ]  
  50.     },   
  51.     “local”: [  
  52.         “127.0.0.1”  
  53.     ]  
  54. }  

利用qrcode生成二维码

下面我们利用python脚本实现,实现之前,我们需要先装两个模块,一个是qrcode,一个是image


pip install qrcode
pip install image
-------
下面是python代码:
#!/usr/bin/env python
import qrcode
qr = qrcode.QRCode(
version = 5,
error_correction = qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data('http://www.xuchanggang.cn')
qr.make(fit=True)
img = qr.make_image()
#img.show()
img.save('/tmp/test.jpg')
-----
下面是相关解释:
version:值为1~40的整数,控制二维码的大小(最小值是1,是个12×12的矩阵)。 如果想让程序自动确定,将值设置为 None 并使用 fit 参数即可。
error_correction:控制二维码的错误纠正功能。可取值下列4个常量。
ERROR_CORRECT_L:大约7%或更少的错误能被纠正。
ERROR_CORRECT_M(默认):大约15%或更少的错误能被纠正。
ROR_CORRECT_H:大约30%或更少的错误能被纠正。
box_size:控制二维码中每个小格子包含的像素数。
border:控制边框(二维码与图片边界的距离)包含的格子数(默认为4,是相关标准规定的最小值)
img.save:是将生成二维码图片保存到哪里
-----
现在我们可以执行这个python脚本,然后到指定目录看看,是不是生成了~~

下面就是生成的图片:

test

Haproxy 服务部署(利用Keepalived实现Haproxy 高可用)

一、Haproxy 简述:
HAProxy是一个开源的、高性能的,基于TCP(第四层)和HTTP(第7层)应用的负载均衡软件。使用HAProxy可以快速可靠地实现基于TCP和HTTP应用的负载均衡解决方案。
作为一个专业的负载均衡软件,他有如下优点:
1.可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备想媲美
2.最高可以同时维护40000-50000个并发连接,单位时间处理的最大请求数达20000个,最大数据处理能力可达10Gbps。
3.支持多达8种负载均衡算法,同时也支持session保持
4.支持虚拟主机功能,使实现web负载均衡更加灵活
5.从HAProxy 1.3版本后开始支持连接拒绝、全透明代理等功能,这些功能是其他负载均衡器所不具备的。
6.有功能强大的监控页面,通过此页面可以实时了解系统的运行状况。
7.拥有功能强大的ACL支持。
HAProxy是借助操作系统的技术特性来实现性能最大化的,因此要想发挥HAProxy的最大性能需要对操作系统性能进行优化。
HAProxy非常适用于那些并发量特别大且需要持久连接或四层和七层处理机制的web系统,例如门户网站或电子商务网站等。
HAProxy也可以用于MySQL数据库(读操作)的负载均衡。

HAProxy的官方文档地址:
http://cbonte.github.io/haproxy-dconv/

二、Haproxy的部署:
1.Haproxy的下载、安装:
下载地址:http://www.haproxy.org/
# 默认已经下载好了
tar -xf haproxy-1.5.11.tar.gz
cd haproxy-1.5.11
make TARGET=linux26 CPU=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy

2.Haproxy 配置文件 修改:[ 配置文件具体含义,参考 linux — linux 配置文件详解 — keepalived 配置文件详解 ]
cd /usr/local/haproxy
mkdir etc logs
cp examples/haproxy.cfg /usr/local/haproxy/etc
cd /usr/local/haproxy/etc
vim haproxy.cfg
global
log 127.0.0.1 local0 info
maxconn 4096
chroot /usr/local/haproxy
uid 99
gid 99
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid

defaults
mode http
option redispatch
option abortonclose
timeout connect 5000ms
timeout client 30000ms
timeout server 3000ms
log 127.0.0.1 local0 err
balance roundrobin

listen admin_stats
bind 0.0.0.0:8888
mode http
option httplog
stats refresh 30s
stats uri /haproxy-status
stats realm Welcome\ login\ Haproxy
stats auth admin:admin
stats hide-version
stats admin if TRUE

listen test1
bind :12345
mode http
server t1 172.16.10.55:80
server t2 172.16.10.56:80

#listen test2 :80
# option httpclose
# option forwardfor
# server s1 192.168.1.101:8080 check weight 1 minconn 1 maxconn 3 check inter 40000
# server s2 192.168.1.102:8080 check weight 1 minconn 1 maxconn 3 check inter 40000

3.编写Haproxy启动脚本:
vim /etc/init.d/haproxy
#!/bin/bash
#chkconfig: 2345 10 90
#description:haproxy
NAME=”haproxy”
DESC=”Haproxy daemon”
BASE_DIR=”/usr/local/haproxy”
CONF=$BASE_DIR/etc/haproxy.cfg
PIDFILE=$BASE_DIR/logs/haproxy.pid
SCRNAME=/etc/init.d/$NAME
ARGV=”$@”

start()
{
echo “START HAPoxy SERVERS”
$BASE_DIR/sbin/haproxy -f $CONF
}
stop()
{
echo “STOP HAPoxy Listen”
kill -TTOU $(cat $PIDFILE)
echo “STOP HAPoxy process”
kill -USR1 $(cat $PIDFILE)
}
case $ARGV in
start)
start
ERROR=$?
;;
stop)
stop
ERROR=$?
;;
restart)
stop
start
ERROR=$?
;;
*)
echo “Useage:$SCRNAME [start|restart|stop]”
esac
exit $ERROR

# 给予脚本执行权限:
chmod +x /etc/init.d/haproxy
# 脚本添加开机启动:
chkconfig -add haproxy
# 注:
如果报如下错:
service haproxy does not support chkconfig
解决方法:
在/etc/init.d/haproxy 中添加下面两句到 #!/bin/bash之后,添加如下内容:
# chkconfig: 2345 10 90
# description:haproxy
—-其中2345是默认启动级别,级别有0-6共7个级别。
—-等级0表示:表示关机
—-等级1表示:单用户模式
—-等级2表示:无网络连接的多用户命令行模式
—-等级3表示:有网络连接的多用户命令行模式
—-等级4表示:不可用
—-等级5表示:带图形界面的多用户模式
—-等级6表示:重新启动
—-10是启动优先级,90是停机优先级,优先级范围是0-100,数字越大,优先级越低。

4.日志支持功能添加
# vim /etc/rsyslog.conf
在最下边增加
local0.* /usr/local/haproxy/logs/haproxy.log
# 重启日志服务
/etc/init.d/rsyslog restart

5.haproxy测试:
(1).10.55/10.56默认web服务已经部署好,默认80 端口;
(2).启动haproxy:
/etc/init.d/haproxy start
(3).登录haproxy监控页面:
http://172.16.10.54:8888/haproxy-status
(4).登录haproxy测试负载均衡:[ 不断刷新,观察变化 ]
http://172.16.10.54:12345/

三、keepalived 部署:
1.10.53/10.54安装keepalived
keepalived 的安装,请参照keepalived服务部署一篇,下面主要讲解相关配置

2.修改keepalived配置文件:vim /etc/keepalived/keepalived.conf [ 没有就创建 ]
global_defs {
notification_email
{
13501960667@139.com # 收件邮箱
}
notification_email_from mysql_lab@localhost # 发件邮箱
smtp_server localhost # 发件服务器
smtp_connect_timeout 30 # 超时时间
router_id HAOWU_55
}
vrrp_script chk_haproxy {
script “/usr/local/keepalived/chk_haproxy.sh”
# interval 2
# weight 2
}
vrrp_sync_group VG1 {
group
{
VI_1
}
}
vrrp_instance VI_1 {
# state MASTER
state BACKUP
nopreempt
interface eth0
virtual_router_id 96
priority 110
advert_int 1
authentication
{
auth_type PASS
auth_pass Pa$$w0rd
}
track_script {
chk_haproxy # 监测haproxy进程状态
}
virtual_ipaddress
{
172.16.10.251
}
}

# 蓝色部分: 是相对其它脚本需要添加的内容;
# 红色部分:是必须要注释掉的部分。如果,不注释掉,keepalived将无法调用脚本;
# 至于master 和backup 配置文件的异同和要修改的部分,请参考keepalived服务部署一篇.

3.编写haproxy 检测脚本:
vim /usr/local/keepalived/chk_proxy.sh
#!/bin/bash
A=`ps -C haproxy –no-header |wc -l`
# 当检测到haproxy宕机后,试图重新启动haproxy,如果是测试,建议先注释掉所有红色部分代码
if [ $A -eq 0 ];then
/etc/init.d/haproxy start
sleep 3
if [ `ps -C haproxy –no-header |wc -l` -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi

4.给予检测脚本执行权限:
chmod +x /usr/local/keepalived/chk_proxy.sh

5.官网建议的内存优化配置:
echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 0 > /proc/sys/net/ipv4/tcp_ecn
echo 1 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_dsack

四、下面就可以进行测试了
1.启动所有服务:
先启动haproxy,再启动keepalived,再启动 55 56上的web
2.输入 172.16.10.251:12345 测试
期间停止haproxy,看vip是否漂移
网站是否能正常打开

Keepalived 简介、原理及服务部署

一、Keepalived的介绍:
keepalived是以 VRRP(Virtual Router Redundancy Protocol)协议为实现基础的,即虚拟路由冗余协议。
虚拟路由冗余协议可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面,有一个master和多个backup;
master上面有一个对外提供服务的vip,该路由器所在局域网内其他机器的默认路由为该vip;
master会发组播,当backup收不到vrrp包时,就认为master宕掉了;
这时,就需要根据VRRP的优先级,来选举一个backup当master。
这样的话就可以保证路由器的高可用了。

二、Keepalived的原理:
keepalived也是模块化设计,不同模块复杂不同的功能,下面是keepalived的组件:
core check vrrp libipfwc libipvs-2.4 libipvs-2.6

core:是keepalived的核心,复杂主进程的启动和维护,全局配置文件的加载解析等
check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析
vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的
libipfwc:iptables(ipchains)库,配置LVS会用到
libipvs*:配置LVS会用到

# 注:
keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已
Image
keepalived启动后会有三个进程
父进程:内存管理,子进程管理等等
子进程:VRRP子进程
子进程:healthchecker子进程

由图可知,两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事;
healthchecker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等等;
如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态

三、Keepalived的部署:
1.安装相关依赖包:
yum -y install openssl* popt popt-devel

2.keepalive的安装,安装目录为/usr/local/keepalived
# 默认软件已上传 并且 解压,进入keepalived目录
./configure –prefix=/usr/local/keepalived
make && make install

# Keepalived 安装完成后,会在安装目录/usr/local/keepalived 生成 bin,etc,man,sbin 这4 个目录。其中etc为配置文件所在的目录。

3.配置 keepalived 环境变量
# 给root用户增加环境变量,在export PATH行之前加入一行:
vi ~/.bash_profile
PATH=$PATH:/usr/local/keepalived/sbin
保存退出,执行下面命令,使参数生效
. ~/.bash_profile

4.整理相关文件和命令,方便使用service 启动
cp -a /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp -a /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp -a /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# 让chkconfig管理新添加的服务
chkconfig –add keepalived
# 添加启动级别
chkconfig keepalived on
# 查看启动设置
chkconfig –list keepalived

5.keepalived配置文件的修改如下:配置文件目录在( /etc/keepalived/keepalived.conf ),没有就自己建一个
配置文件参考: linux — linux 配置文件详解 — keepalived 配置文件详解
vim /etc/keepalived/keepalived.conf
# master 参考配置文件
global_defs {
notification_email
{
13501960667@139.com # 收件邮箱
}
notification_email_from mysql_lab@localhost # 发件邮箱
smtp_server localhost # 发件服务器
smtp_connect_timeout 30 # 超时时间
router_id HAOWU_55
}
vrrp_sync_group VG1 {
group
{
VI_1
}
}
vrrp_instance VI_1 {
state MASTER
# state BACKUP
# nopreempt
interface eth0
virtual_router_id 96
priority 110
advert_int 1
authentication
{
auth_type PASS
auth_pass Pa$$w0rd
}
virtual_ipaddress
{
172.16.10.251
}
}

注:
# 红色部分 是在我们实际配置中,需要修改的地方;
# 紫红色部分 是我们在HA操作中,可以参考的设置下:
具体理解如下:
主/从的state 都设置为: BACKUP ,同是将 priority( 110>100 ) 大的机器设置为 nopreempt 可以避免切换后,vip抢占问题;
nopreempt 只能工作于 state 为BACKUP 的状态下;

# 如果利用keepalived调用脚本,则脚本里不能含有weight ,否则,会无法调用脚本。

linux系统下如何查看分区uuid

1. sudo blkid
/dev/sda1: UUID=”9ADAAB4DDAAB250B” TYPE=”ntfs”
/dev/sdb1: UUID=”B2FCDCFBFCDCBAB5″ TYPE=”ntfs”
/dev/sdb5: UUID=”46FC5C74FC5C5FEB” TYPE=”ntfs”
/dev/sdb6: TYPE=”swap” UUID=”2cec6109-5bcf-45a3-ba1b-978b041c037f”
/dev/sdb8: UUID=”9ee6f22d-b394-422c-9b4a-1525a3220942″ SEC_TYPE=”ext2″ TYPE=”ext3″
/dev/sdb7: UUID=”4bcb9381-6e25-4304-8743-f882039ff3ad” TYPE=”ext3″
2. ls -l /dev/disk/by-uuid

针对Zabbix库中history相关大表分区优化实践

1.对原有的history 相关表进行改造,建立分区表,这样下面的脚本才能更好的执行分区;

2.由于原表有主键,所以,需要删除主键,创建普通索引;

3.具体的表结构创建语句如下:(这的最后一个分区,一定得是 脚本执行当天的日期,不然,会少建分区)
CREATE TABLE `history` (
`itemid` BIGINT(20) UNSIGNED NOT NULL,
`clock` INT(11) NOT NULL DEFAULT ‘0’,
`value` DOUBLE(16,4) NOT NULL DEFAULT ‘0.0000’,
`ns` INT(11) NOT NULL DEFAULT ‘0’,
KEY `history_1` (`itemid`,`clock`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
PARTITION BY RANGE(clock)
(
PARTITION p20141214 VALUES LESS THAN (1418572800) ENGINE = INNODB,
PARTITION p20141215 VALUES LESS THAN (1418659200) ENGINE = INNODB
);

CREATE TABLE `history_log` (
`id` BIGINT(20) UNSIGNED NOT NULL,
`itemid` BIGINT(20) UNSIGNED NOT NULL,
`clock` INT(11) NOT NULL DEFAULT ‘0’,
`timestamp` INT(11) NOT NULL DEFAULT ‘0’,
`source` VARCHAR(64) NOT NULL DEFAULT ”,
`severity` INT(11) NOT NULL DEFAULT ‘0’,
`value` TEXT NOT NULL,
`logeventid` INT(11) NOT NULL DEFAULT ‘0’,
`ns` INT(11) NOT NULL DEFAULT ‘0’,
KEY parimary_id(`id`),
KEY `history_log_2` (`itemid`,`id`),
KEY `history_log_1` (`itemid`,`clock`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
PARTITION BY RANGE(clock)
(
PARTITION p20141214 VALUES LESS THAN (1418572800) ENGINE = INNODB,
PARTITION p20141215 VALUES LESS THAN (1418659200) ENGINE = INNODB
);

CREATE TABLE `history_str` (
`itemid` BIGINT(20) UNSIGNED NOT NULL,
`clock` INT(11) NOT NULL DEFAULT ‘0’,
`value` VARCHAR(255) NOT NULL DEFAULT ”,
`ns` INT(11) NOT NULL DEFAULT ‘0’,
KEY `history_str_1` (`itemid`,`clock`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
PARTITION BY RANGE(clock)
(
PARTITION p20141214 VALUES LESS THAN (1418572800) ENGINE = INNODB,
PARTITION p20141215 VALUES LESS THAN (1418659200) ENGINE = INNODB
);

CREATE TABLE `history_text` (
`id` BIGINT(20) UNSIGNED NOT NULL,
`itemid` BIGINT(20) UNSIGNED NOT NULL,
`clock` INT(11) NOT NULL DEFAULT ‘0’,
`value` TEXT NOT NULL,
`ns` INT(11) NOT NULL DEFAULT ‘0’,
KEY parimary_id(`id`),
KEY `history_text_2` (`itemid`,`id`),
KEY `history_text_1` (`itemid`,`clock`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
PARTITION BY RANGE(clock)
(
PARTITION p20141214 VALUES LESS THAN (1418572800) ENGINE = INNODB,
PARTITION p20141215 VALUES LESS THAN (1418659200) ENGINE = INNODB
);

CREATE TABLE `history_uint` (
`itemid` BIGINT(20) UNSIGNED NOT NULL,
`clock` INT(11) NOT NULL DEFAULT ‘0’,
`value` BIGINT(20) UNSIGNED NOT NULL DEFAULT ‘0’,
`ns` INT(11) NOT NULL DEFAULT ‘0’,
KEY `history_uint_1` (`itemid`,`clock`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
PARTITION BY RANGE(clock)
(
PARTITION p20141214 VALUES LESS THAN (1418572800) ENGINE = INNODB,
PARTITION p20141215 VALUES LESS THAN (1418659200) ENGINE = INNODB
);

4.下面是创建脚本:
定时执行的:(每周日12点执行一次)
0 0 * * 0 bash /home/michael/zabbix_partition.sh
#!/bin/bash
# 参考: https://github.com/xsbr/zabbixzone/blob/master/zabbix-mysql-autopartitioning.sql
# 功能: 放入定时任务,为zabbix创建和删除分区

MY_HOST=”数据库服务器”
MY_USER=”数据库用户名”
MY_PASS=”数据库密码”
MY_DB=”数据库库名”
# 创建分区时的最大天数
MAX_DAYS=14

# 删除分区时保留的天数
MIN_DAYS=7

function MySQLStatQuery() {
if [ -z “$1” ]; then
echo “ERROR: [MySQLStatQuery] sql empty.”
else
mysql -s –skip-column-names -h${MY_HOST} -u${MY_USER} -p${MY_PASS} ${MY_DB} -e “$1″
fi
}

function CreatePartition() {
local schemaName=”$1″
local tableName=”$2″
local partitionName=”$3″
local clock=”$4″

local sql=”SELECT count(1) FROM information_schema.partitions WHERE table_schema = ‘${schemaName}’ AND table_name = ‘${tableName}’ AND partition_name = ‘${partitionName}’;”
local partitionExist=$(MySQLStatQuery “$sql”)

if [ $partitionExist -eq 0 ]; then
echo “INFO: [CreatePartition] schema_name=’$schemaName’ table_name=’$tableName’ partition_name=’$partitionName’ clock=’$clock'”
sql=”ALTER TABLE ${schemaName}.${tableName} ADD PARTITION ( PARTITION ${partitionName} VALUES LESS THAN (UNIX_TIMESTAMP(‘${clock}’)));”
MySQLStatQuery “$sql”
fi
}

function DropPartition() {
local schemaName=”$1″
local tableName=”$2″
local partitionName=”$3″

local sql=”SELECT count(1) FROM information_schema.partitions WHERE table_schema = ‘${schemaName}’ AND table_name = ‘${tableName}’ AND partition_name = ‘${partitionName}’;”
local partitionExist=$(MySQLStatQuery “$sql”)

if [ $partitionExist -eq 1 ]; then
echo “INFO: [DropPartition] schema_name=’$schemaName’ table_name=’$tableName’ partition_name=’$partitionName'”
sql=”ALTER TABLE ${schemaName}.${tableName} DROP PARTITION ${partitionName};”
MySQLStatQuery “$sql”
fi
}

function CreateNextPartition() {
local schemaName=”$1″
local tableName=”$2″

local nextClock=””
local partitionName=””
local clock=””

local i=1
while true; do
nextClock=$(date +%Y%m%d –date “$i days”)
partitionName=”p$nextClock”
i=$(expr $i + 1)
clock=”$(date ‘+%Y-%m-%d 00:00:00’ –date “$i days”)”
CreatePartition “$schemaName” “$tableName” “$partitionName” “$clock”
[ $i -gt $MAX_DAYS ] && break
done
}

function DropOldPartition() {
local schemaName=”$1″
local tableName=”$2″

local oldClock=””
local partitionName=””

local i=$MAX_DAYS
while true; do
oldClock=$(date +%Y%m%d –date “-$i days”)
partitionName=”p$oldClock”
DropPartition “$schemaName” “$tableName” “$partitionName”
i=$(expr $i – 1)
[ $i -lt $MIN_DAYS ] && break
done
}

function main() {
# 需要分区的表,库名默认为zabbix
local tables=(history history_log history_str history_text history_uint)

local tableName=””

for tableName in ${tables[@]}; do
CreateNextPartition ‘zabbix’ “$tableName”
done

for tableName in ${tables[@]}; do
DropOldPartition ‘zabbix’ “$tableName”
done
}

main $*

淘宝在数据处理领域的项目及开源产品介绍

淘宝在数据存储和处理领域在国内互联网公司中一直保持比较靠前的位置,而且由于电子商务领域独特的应用场景,淘宝在数据实时性和大规模计算及挖掘方面一直在国内保持着领先,因此积累了很多的实践的经验和产品。

TimeTunnel

  1. 基于Hbase打造的消息中间件,具有高可靠、消息顺序、事务等传统特性,还能按时间维度反复订阅最近历史的任意数据
  2. 高性能的broker,单节点达2万TPS,实际支持上千长链接并发
  3. 承载海量的数据传输,日同步数据达10TB,并且包含淘宝主营收入等关键性数据
  4. 在各IDC内,部署了超过2000个客户端,覆盖全网日志传输
  5. Scribe、flume、activemq、ZeroMQ?我们可以做得更强大

TBFS

  1. 基于Hdfs 0.20进行全面改造,设计目标:单个集群可达10000台服务器,支持10亿文件、100PB的数据的存储
  2. 领先于社区的全新设计,彻底解决namenode单点问题,并可实现集群在线升级
  3. 期待你来挑战:snapshot、异地数据复制、多级的cache、软硬链接支持

Hbase

  1. 基于Hbase0.90.3进行改造,目前有上百台的Hbase服务器,支淘宝7个online应用,online数据存储达100T
  2. 支持本地化数据计算、二级引索
  3. 期待你来挑战:无阻塞的compact、更多的事务支持、更短的请求响应时间、更强大的索引(Lucene for hbase)

Mapreduce

  1. 基于Hadoop0.19改造,最大单个集群规模达2000台服务器,兼容hadoop0.20 绝大多数API
  2. 实际存储数据超过10PB,日运行mapreduce job达5万个
  3. 期待你来挑战:更高效任务调度、更优雅的计算资源管理、更灵活的分布计算模型

Hive

  1. 基于hive0.6改造,修改的patch达上百个,支持SQL中间结果复用等众多特性
  2. 支持淘宝几乎所有的商业数据分析任务,是各行业数据分析师和数据开发工程师必备的技能
  3. 期待你来挑战:Hive & Pig能混合编程?现在不能,你敢想就可以来做!

Taobao-pamirs-schedule

taobao-pamirs- schedule是一个基于分布式环境的多线程任务处理框架。目的是让一种批量任务或者不断变化的任务,能够被动态的分配到多个主机的JVM,不同的线程组中并执行。所有的任务能够被不重复,不遗漏的快速处理。它将需要执行的任务抽象成一致的任务模型,进行统一的管理和监控。运用schedule,任务能够比较均匀的分发到多台机器上进行处理,并且可以动态的进行水平扩展。

QLExpress

一个轻量级的脚本引擎,作为一个嵌入式规则引擎在业务系统中使用。让业务规则定义简便而不失灵活。让业务人员就可以定义业务规则。 支持标准的JAVA语法,还可以支持自定义操作符号、操作符号重载、函数定义、宏定义、数据延迟加载等。

UIC

Uic是个海量数据的高稳定高并发高响应高可靠高一致性的系统。海量数据:现在整个用户中心的注册用户数接近6亿,加上地址,支付宝绑定数据,接近20亿。现在通过分库分表存在了16个库1024张表里面。高稳定,高可靠:用户中心是淘宝最为核心的系统之一,一个完整的交易流程需要访问UIC高达几十次,所以UIC的稳定是整个淘宝的重中之重,我们为了UIC的稳定做了很多容灾的方案,包括多机房的备份,缓存的容灾,mysql的容灾,流量的控制等等,可以说UIC的核心就是各种容灾体系和在各种极端情况的下解决措施高并发,高响应:每天访问UIC的数据在200亿左右,我们使用了tair做为缓存,使用protobuf序列化, 尽可能的提高缓存的命中率,现在用户数据的命中率在99%。

Prom

海量数据实时计算框架。基于搜索技术对海量明细数据做实时计算。目前主要对交易数据做分析,应用于数据魔方中 特点:

  1. 多维索引组合查询
  2. 支持任意维度的计算
  3. 实时响应(秒级)
  4. 结果精确

Andes

Andes是基于HBase的任意数据长时间维度高性能数据查询集群系统。解放数据魔方在查询时间段上的限制。 采用key-list存储方式,对于任何时间长度的查询均仅需一次数据库访问即可完成,规避查询时间对于查询性能的影响。

KeyKeys

用户搜索query数据分析系统。应用于淘词中,提供实时匹配用户输入query做关键query、关键热词的查询计算。

Myfox/Nodefox

MyFOX是一个针对海量统计数据设计的高性能分布式MySQL集群中间层,承担着数据魔方90%以上的数据存储和查询需求。MyFOX能够提供: • 1) “表字段+数据行数”相组合的数据切分规则; • 2) 完全透明的标准SQL查询接口 • 3) 同样的SQL语句,在10亿数据量下,与1000万数据量时完全相同的查询性能 • 4) 每份数据跨机房冗余,单机故障时受影响分片在集群内迅速自我复制; • 5) 冷热数据分离;实时监控查询频繁的数据分片,必要时在集群内进行扩充性的自动复制。

Glider

Glider是建立在MyFOX、Prom以及Keykeys等异构数据源之上的统一的数据中间层,是数据魔方、淘宝指数以及开放API等数据产品的统一的数据查询出口。 Glider对各个异构数据源进行高度抽象,并在此基础上进行通用的JOIN、UNION、排序、去重、表达式求值等计算。这一复杂过程仅通过简单的配置即可实现。 Glider目前承担着单机每天超过2000万的数据查询请求,8月25日的平均响应时间126毫秒。

Node.js

Node.js是一个基于V8引擎的服务器端JavaScript运行环境,提供非阻塞、事件驱动、异步等特性。对于高负载应用服务场景,以及最大化利用服务器硬件资源具有很大实用价值。我们是国内最早将Node.js引入互联网商业开发领域的团队,已应用此技术开发了taojob(http://taojob.tbdata.org)、数据魔方俱乐部等一系列Web产品。目前正在使用Node.js对Myfox、Glider进行升级改造,并将其应用于“淘宝指数”的产品开发。

数据可视化

数据可视化是关于使用图形化的手段,清晰有效地传达与沟通信息的研究。淘宝数据可视化实验室自2010年成立以来,使用最新的数据可视化技术对淘宝海量商业数据进行研究分析,通过一系列可视化应用向外界展示淘宝数据蕴藏的价值,展现数据之美,为用户提供了了解数据、分析数据的全新的方式。

体感交互

通过对最新体感交互技术的研究,我们将在数据可视化及数据产品中为用户提供革命性的交互体验,帮助用户更方便的使用互联网数据产品。

分布式推荐系统

基于HADOOP-MAHOUT分布式机器学习技术、面向个性化主题的数据处理平台(PDP)核心应用之一;应用架构为offline计算+online两层推荐引擎;数据分为采集中心、算法中心、发布中心、评价中心。 淘宝网消费者购物模式挖掘 淘宝网消费者购物模式挖掘是淘宝指数项目中的一个子项目,通过分析消费者历史购物行为,挖掘和识别消费的购物模式和购物心理。项目中我们采用购物类目关联图分析的手段,通过图论技术来实现消费者相似购物模式的挖掘。其中类目相似连接图构造,相似购物团簇发掘是其中的核心点。

商品评论情感分析打分

商品评论情感分析打分系统是基于淘宝网海量商品评论数据,采用关联规则挖掘的方法,构建高频特征词;通过语义分析、消费者情感趋向分析,并结合评论者本人的评论习惯(评论者得分)给出商品评论分,以此得出该商品的最终评论打分。该得分反映商品对于购买者的满意程度。

银河流数据处理平台

通用的流数据实时计算系统,以实时数据产出的低延迟、高吞吐和复用性为初衷和目标,采用actor模型构建分布式流数据计算框架(底层基于akka),功能易扩展、部分容错、数据和状态可监控。 银河具有处理实时流数据(如TimeTunnel收集的实时数据)和静态数据(如本地文件、HDFS文件)的能力,能够提供灵活的实时数据输出,并提供自定义的数据输出接口以便扩展实时计算能力。 银河目前主要是为魔方提供实时的交易、浏览和搜索日志等数据的实时计算和分析。

开放式数据体系

真正基于云平台的数据体系及数据处理平台,秉承透明、标准、隐私保护的设计理念,实现了包括主题研究、挖掘算法、实时计算数据组合的开放式数据体系。

极限存储

数据仓库应用与分布式计算的经典结合,在云梯1上实现了数据高达120:1的压缩比,迄今为止已有30余种业务数据完成应用,累积节省存储达15PB,此外,在提高数据访问效率,降低计算消耗方面也有十分显著的效果。

Dbsync

用于实时同步数据库数据到HDFS的产品,通过解析各类RDBMS的log文件来提取相应的数据库动作,进而达到数据库到HADOOP的数据同步,供相关部门提取增量数据,通过dbsync,能够了解并得到所有数据的任意变化轨迹。

DataX

  1. DataX是一个在异构的数据库/文件系统之间高速交换数据的工具。
  2. 采用Framework+plugin架构构建,Framework处理了缓冲,流控,并发,上下文加载等高速数据交换的大部分技术问题,插件仅需实现对数据处理系统的访问。
  3. 运行模式 :stand-alone / on hadoop
  4. 数据传输过程在单进程内完成,全内存操作,不读写磁盘,也没有IPC。
  5. 开放式的框架,开发者可以在极短的时间开发一个新插件以快速支持新的数据库/文件系统。

SKYNET

天网调度系统(SKYNET)作为淘宝数据平台的核心调度系统,承载着淘宝数据跨部门/数十条业务线/超过一万个作业的调度和运维工作,具有图形化、跨平台、自动部署、线上运维、智能容灾的特点,是淘宝数据平台的中枢系统。

数据开发服务平台

数据开发服务平台整合IDE、调度、监控、告警、元数据、成本优化、权限控制、审计、用户管理能功能。平台将复杂的技术细节屏蔽在平台内部,为使用者提供简单便捷的用户体验,使开发者能够专注于商业领域的需求,降低用户在云梯上进行数据应用开发和数据分析的门槛。

SuperMario

海量数据的实时处理能力:SuperMario,基于erlang语言和zookeeper模块开发的高性能数据流处理框架,使用订阅者模式构建流节点间的流关系,支持高性能的数据流式实时处理。

Openresty

以更低的成本支持更高的并发处理能力:Openresty,基于Nginx构建的量子web服务框架,让web server成为量子网站核心容器,通过nginx_lua_mod的扩展,能够高效、便捷的开发高性能web服务。

LzSQL

更高效、敏捷的数据开发能力:LzSQL,基于perl::parser模块构建的量子数据库小语言,封装了数据库分库、分表,以及异构数据实时融合(数据库和第三方引擎)的功能,便于进行快速的REST数据接口开发。

利用源码制作 RPM 包(三):制作MySQL RPM包

1.建立用于制作RPM包的目录:
     默认,我们在 /usr/src 目录下建立 rpmbuild 目录:
     再在 rpmbuild 目录下建立:BUILD RPMS SOURCES SPECS SRPMS  [目录均为大写]
          [root@localhost rpmbuild]# mkdir  BUILD RPMS SOURCES SPECS SRPMS
   注:
          在centos 系统中,默认为root/rpmbuild/{ BUILD RPMS SOURCES SPECS SRPMS}
          在redhat 系统中,默认为/usr/src/redhat/{BUILD RPMS SOURCES SPECS SRPMS}
          但往往我们需要重新定义这个目录:
          如下命令:
               将新目录路径写入到 当前用户家目录下的  .rpmmacros
                    echo “%_topdir /usr/src/rpmbuild” >> $HOME/.rpmmacros
 

2.安装mysql 编译需要的相关依赖包:
      yum -y  install gcc-c++ ncurses-devel  make perl bison ncurses cmake
 
3.编写spec文件 【 spec 文件参考网站:http://www.percona.com/downloads/percona-release/percona-release.spec 】
 [ 这个spec文件,没有初始化数据库,只做编译]

Summary: MySQL 5.5.37
Name: mysql
Version:5.5.37
Release: 1%{?dist}
License: GPL
URL: http://downloads.mysql.com/archives/get/file/mysql-5.5.37.tar.gz
Group: applications/database
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: cmake
Packager: cloud_data@163.com
Autoreq: no
Source: %{name}-%{version}.tar.gz
prefix: /project/class/mysql
 
       %description
%define MYSQL_USER mysql
%define MYSQL_GROUP mysql
%define __os_install_post %{nil}
 
       %prep
/usr/sbin/groupadd mysql
/usr/sbin/useradd -g mysql mysql
 
       %setup -q
 
       %build
CFLAGS=”-O3 -g -fno-exceptions -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing”
CXX=g++
CXXFLAGS=”-O3 -g -fno-exceptions -fno-rtti -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing”
export CFLAGS CXX CXXFLAGS
cmake .                                                                     \
-DCMAKE_INSTALL_PREFIX:PATH=%{prefix}               \
-DSYSCONFDIR:PATH=%{prefix}                                \
-DCMAKE_BUILD_TYPE:STRING=Release                     \
-DENABLE_PROFILING:BOOL=ON                                 \
-DWITH_DEBUG:BOOL=OFF                                        \
-DWITH_VALGRIND:BOOL=OFF                                   \
-DENABLE_DEBUG_SYNC:BOOL=OFF                            \
-DWITH_EXTRA_CHARSETS:STRING=all                      \
-DWITH_SSL:STRING=bundled                                    \
-DWITH_UNIT_TESTS:BOOL=OFF                                \
-DWITH_ZLIB:STRING=bundled                                    \
-DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON        \
-DWITH_INNOBASE_STORAGE_ENGINE:BOOL=ON         \
-DWITH_ARCHIVE_STORAGE_ENGINE:BOOL=ON           \
-DWITH_BLACKHOLE_STORAGE_ENGINE:BOOL=ON        \
-DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON     \
-DDEFAULT_CHARSET=utf8                                         \
-DDEFAULT_COLLATION=utf8_general_ci                      \
-DWITH_EXTRA_CHARSETS=all                                   \
-DENABLED_LOCAL_INFILE:BOOL=ON                            \
-DWITH_EMBEDDED_SERVER=0                                   \
-DINSTALL_LAYOUT:STRING=STANDALONE                  \
-DCOMMUNITY_BUILD:BOOL=ON  ;
make -j `cat /proc/cpuinfo | grep processor| wc -l`
 
       %install
make DESTDIR=$RPM_BUILD_ROOT install#%pre%post
#ln -s %{prefix}/lib %{prefix}/lib64
mkdir  -p  %{prefix}/log
chown -R %{MYSQL_USER}:%{MYSQL_GROUP} %{prefix}/log%preun%clean
rm -rf $RPM_BUILD_ROOT%files
%defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP})
%attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) %{prefix}

%changelog


 
4.进入SPECS目录:
     执行如下命令:
     以下命令 二 选 一
          rpmbuild -ba mysql.spec      # 这个制作成功会在RPMS里生成rpm包,在SRPMS里生成 源码的 RPM包
          rpmbuild -bb mysql.spec      # 这个只在在RPMS里生成rpm包
 
5.下面就可以利用刚才的RPM包安装了
         这个安装包相当于 二进制安装包,安装完成后,需要手动初始化数据库,启动数据库
 

利用源码制作 RPM 包(二):SPEC文件的书写规则阐释

SPEC 文件规范说明:
Summary:软件摘要、说明
Name:软件包名称
Version:软件包版本
Release:发行版本号,用于修复补丁之类的,每次修改,在原有基础上加 1
Group:组描述,这个官方有特定的组,可随便选一个
License:发行许可证,通常为GPL
Url:软件主页
Vendor:发行商或打包组织信息
Distribution: 发行版系列
Packager: 打包人的信息
Source[0-n]:指定源代码包,可以为多个
BuildRequires:编译源码时依赖的软件包
Requires:安装软件包时依赖的软件
BuildRoot:安装或编译文件时候的根目录
 一般定义为:
%{_tmppath}/%{name}-%{version}-%{release}-root
%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n} 
该参数非常重要,在生成RPM包过程中,执行make install 就会把软件安装到上述路径,打包也依赖该路径
Description:关于RPM包的描述

Pre:安装前的准备
Prep:编译前的准备
Setup:寻找将源码包并解压
Build:编译
Install:安装
File:文件列表
Changelog:修改日志段,可以将软件的每次修改记录下来,保存在软件包了,以便查询。以减号开始
Defattr:文件属性
Post:安装之后的收尾工作
Preun:卸载软件前的准备工作
Postun:卸载软件后的收尾工作