command pigz

  1. pigz简介

    1
    pigz是一个高效的压缩工具,可以将多核CPU的每一分剩余性能都用来做压缩计算.而传统的gzip则只能用单核CPU.比如一台2个8core cpu服务器采用pigz和gzip压缩相同的数据,一般性能差距至少在7-8倍以上(一般不会达到理论的16倍,因为受限于磁盘的读写速度和内存等资源)
  2. pigz 安装

    1
    [root@localhost ~]# yum -y install pigz
  3. pigz 使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //压缩
    tar cvf - {dir_name} | pigz -9 -p 24 > file.tgz

    说明:
    -9 表示压缩比,数值越大压缩率越大
    -p 表示指定cpu的核数


    //解压
    pigz -d file.tgz
    tar -xf --format=posix file
  4. pigz 扩展

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    之前,跨主机拷贝大数据时,通常做法如下:
    * 在源端打包压缩为tar.gz文件
    * 采用scp或者rsync等方式拷贝到目标主机
    * 在目标主机解压文件
    这三个过程是同步阻塞,即不能同时异步执行,导致效率低下

    现在,我们将过程优化为以数据流的方式,同时执行(非阻塞模式),则效率一般可以提高到原来的3倍以上,具体实现如下:
    磁盘读取-->打包(tar)-->压缩(gzip)-->传输(ssh)-->解压缩(gzip)-->拆包(tar)-->落盘

    比如,我要将本地的test目录拷贝到"目标IP"的的data目录,则命令如下:
    tar -c test/ |gzip |ssh -c arc 目标IP "gzip -d|tar -xC /data"

    如果不需要解压,则命令变为:
    tar -c test/ |pigz |ssh -c arc 目标IP "cat >/data/test.tar.gz"

    注意: 因为采用了流式压缩,解压过程必须加上-i参数,及tar –ixf /data/test.tar.gz

nginx rewrite

nginx rewrite

  1. rewrite规则
  1. 示例1:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [root@192 vhost]# cat zabbix.conf
    # zabbix
    server {
    listen 80;
    server_name zabbix.test.cn;

    location / {
    rewrite ^/ http://zabbix.test.cn/zabbix/;
    }

    location /zabbix {
    proxy_pass http://192.168.13.202;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    access_log /mnt/log/nginx/zabbix.test.cn.log main;
    }

logstash filter grok

logstash filter grok

  1. grok语法说明
    1
    2
    3
    4
    5
    6
    grok的语法格式为 %{SYNTAX:SEMANTIC}
    * SYNTAX是文本要匹配的模式
    例如: 3.14匹配NUMBER模式; 127.0.0.1匹配IP模式
    * SEMANTIC是匹配到的文本片段的标识
    例如: 3.14可以是一个时间的持续时间,所以可以简单地叫做"duration";字符串"55.3.244.1"可以被标识为"client"
    默认情况下,所有的SEMANTIC是以字符串的方式保存,如果想要转换一个SEMANTIC的数据类型:%{NUMBER:num:int}

log_format main ‘$remote_addr $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent ‘
‘“$http_user_agent” $http_x_forwarded_for $request_time $upstream_response_time’;

101.201.57.207 - [11/May/2017:10:06:38 +0800] “POST /ssp-switch-automapping/ws/autoOnOff HTTP/1.1” 200 265 “Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.42000)” - 0.301 0.297

%{IP:client} 101.201.57.207
%{WORD:method} POST

%{NUMBER:bytes} 265
%{NUMBER:duration} 0.301
%{NUMBER:duration} 0.297


[root@smallasa conf]# cat test.conf
input{
file {
path => [“/mnt/log/nginx/test/inbound.log”]
exclude => [“kibana.log”,”toolstmp.log”,”pennswitch*.log”]
type => “nginx_log”
discover_interval => 15
sincedb_path => “/mnt/data/logstash”
sincedb_write_interval => 15
stat_interval => 1
start_position => “beginning”
}
}
filter{

}
output{
stdout{
codec => rubydebug
}
}
[root@smallasa conf]# /mnt/app/logstash/bin/logstash -f /mnt/app/logstash/conf/test.conf –configtest
Configuration OK

[root@smallasa conf]# /mnt/app/logstash/bin/logstash -f /mnt/app/logstash/conf/test.conf
Settings: Default pipeline workers: 2
Pipeline main started

[root@smallasa test]# echo ‘101.201.57.207 - [11/May/2017:10:09:12 +0800] “POST /gateway-inbound/rest/inv.xml HTTP/1.1” 200 566 “-“ - 0.013 0.011’ | tee -a inbound.log

[root@smallasa conf]# /mnt/app/logstash/bin/logstash -f /mnt/app/logstash/conf/test.conf
Settings: Default pipeline workers: 2
Pipeline main started
{
“message” => “101.201.57.207 - [11/May/2017:10:09:12 +0800] \”POST /gateway-inbound/rest/inv.xml HTTP/1.1\” 200 566 \”-\” - 0.013 0.011”,
“@version” => “1”,
“@timestamp” => “2017-05-14T02:59:53.713Z”,
“path” => “/mnt/log/nginx/test/inbound.log”,
“host” => “smallasa”,
“type” => “nginx_log”

}

[root@smallasa conf]# cat test.conf
input{
file {
path => [“/mnt/log/nginx/test/inbound.log”]
exclude => [“kibana.log”,”toolstmp.log”,”pennswitch*.log”]
type => “nginx_log”
discover_interval => 15
sincedb_path => “/mnt/data/logstash”
sincedb_write_interval => 15
stat_interval => 1
start_position => “beginning”
}
}
filter{
if [type] == “nginx_log” {
grok {
match => [“message”, “%{COMBINEDAPACHELOG}”]
}
}
}
output{
stdout{
codec => rubydebug
}
}
[root@smallasa conf]# /mnt/app/logstash/bin/logstash -f /mnt/app/logstash/conf/test.conf –configtest
Configuration OK

[root@smallasa conf]# /mnt/app/logstash/bin/logstash -f /mnt/app/logstash/conf/test.conf
Settings: Default pipeline workers: 2
Pipeline main started

[root@smallasa test]# echo ‘101.201.57.207 - [11/May/2017:10:09:12 +0800] “POST /gateway-inbound/rest/inv.xml HTTP/1.1” 200 566 “-“ - 0.013 0.011’ | tee -a inbound.log

[root@smallasa conf]# /mnt/app/logstash/bin/logstash -f /mnt/app/logstash/conf/test.conf
Settings: Default pipeline workers: 2
Pipeline main started
{
“message” => “101.201.57.207 - [11/May/2017:10:09:12 +0800] \”POST /gateway-inbound/rest/inv.xml HTTP/1.1\” 200 566 \”-\” - 0.013 0.011”,
“@version” => “1”,
“@timestamp” => “2017-05-14T03:07:45.105Z”,
“path” => “/mnt/log/nginx/test/inbound.log”,
“host” => “smallasa”,
“type” => “nginx_log”,
“tags” => [
[0] “_grokparsefailure”
]
}

zabbix grafana install

zabbix grafana install

  1. grafana简要说明

    1
    2
    3
    Grafana是Graphite和InfluxDB仪表盘和图形编辑器.
    Grafana是开源的,功能齐全的度量仪表盘和图形编辑器,支持Graphite,InfluxDB和OpenTSDB
    Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源;Graphite和InfluxDB 查询编辑器等等
  2. Grafana install

    1
    2
    3
    4
    5
    6
    7
    [root@192 app]# wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.2.0-1.x86_64.rpm
    [root@192 app]# yum -y install initscripts fontconfig freetype* urw-fonts
    [root@192 app]# rpm -Uvh grafana-4.2.0-1.x86_64.rpm
    [root@192 app]# rpm -qc grafana
    /etc/init.d/grafana-server
    /etc/sysconfig/grafana-server
    /usr/lib/systemd/system/grafana-server.service
  3. Granfana 配置文件

    1
    2
    3
    4
    5
    6
    [root@192 app]# vim /etc/grafana/grafana.ini

    [root@192 app]# mkdir -p /mnt/data/grafana/plugins
    [root@192 app]# mkdir -p /mnt/log/grafana
    [root@192 app]# chown -R grafana.grafana /mnt/data/grafana
    [root@192 app]# chown -R grafana.grafana /mnt/log/grafana
  4. Granfana 启动

    1
    2
    3
    4
    [root@192 app]# systemctl daemon-reload
    [root@192 app]# systemctl start grafana-server
    [root@192 app]# systemctl status grafana-server
    [root@192 app]# systemctl enable grafana-server
  5. Granfana install plugins

    1
    2
    3
    4
    [root@192 app]# grafana-cli plugins list-remote
    [root@192 app]# grafana-cli plugins install alexanderzobnin-zabbix-app
    [root@192 app]# grafana-cli plugins install grafana-clock-panel
    [root@192 app]# systemctl restart grafana-server
  6. Granfana控制台

    1
    2
    3
    open: http://{grafana}:3000    admin:admin

    open: 左上角 -> plugins -> apps -> zabbix ->enable
  7. Granfana添加数据源

    1
    open: 左上角 -> data sources -> add data source -> zabbix ->enable

python 数据类型

python 数据类型

Python 数值类型包括:

  1. Number类型(数值类型)
    Number类型即数值类型,通常用于存储数字,最常用的是变量类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    //类型定义
    * Integer 整型
    * Long integer 长整型,数值后面以l或L结尾
    * Bollean 布尔值,True或False
    * Double-precision floating 双精度浮点数,可以使用浮点数或科学计数法表示,每个浮点占8个字节
    * Complex number 复数

    //操作符
    1.算数操作符
    * A + B 加号,正数
    * A - B 减号,负数
    * A * B 乘号
    * A / B 除号,B!=0
    * A % B 取余
    * A ** B 幂操作:A的B次方
    * A // B 取整操作:A除以B,结果整数部分
    * not A 取反操作: 只用于Boolean类型
    * A > B 判断A是否大于B,True/False
    * A < B 判断A是否小于B,True/False
    * A == B 判断A是否等于B,True/False
    * A >= B 判断A是否大于等于B,True/False
    * A <= B 判断A是否小于等于B,True/False
    2.二进制比特操作符
    * ~A 按二进制取反,结果数字是-(A+1)
    * A & B 并操作,只有两个比特位都为1时结果中对应比特位才为1,否则为0
    * A | B 或操作,只要两个比特位有一个为1结果中对应比特位就为1,否则为0
    * A ^ B 异或操作,如果两个比特位相同,则结果中设置为0,否则为1
    * A >> B 按比特位右移,在A转换二进制后,右边去掉B个位,左边补齐0
    * A << B 按比特位左移,在A转换二进制后,后面添加B个0

    //内置函数
    * cmp(A,B) 比较二者大小,如果前者小返回-1,前者大返回1,相等返回0
    * str(A) 将参数转换为可显示的字符串
    * type(A) 返回参数的类型对象
    * bool(A) 将参数转换为布尔类型
    * int(A) 将参数转换为整数类型,以十进制表示
    * long(A) 将参数转换为长整型,以十进制表示
    * float(A) 将参数转换为浮点类型
    * complex(A) 将参数转换为复数类型

    //数值类型特定函数
    * abs(A) 取绝对值
    * coerce(A,B) 将A和B转换成一个类型,并生成一个元组
    * divmod(A,B) 除模操作: 生成一个元组(A/B,A%B)
    * pow(A,B) 幂操作符: A的B次方
    * round(A) 返回四舍五入的结果
    * hex(A) 将A转换为十六进制表示的字符串
    * oct(A) 将A转换为八进制表示的字符串
    * chr(A) 将A转换为ASCII字符,要求0<=A<=255
    * ord(A) chr(A)的反函数
  2. Sequence类型簇(序列类型)
    python中的字符串(String),元组(Tuple),列表(list)都属于序列类型簇
    可以将字符串看作由字符组成的序列类型;元组是任意对象组成的不可修改序列类型;列表是任意对象组成的可修改序列

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    //操作符
    * A[index] 获取序列中第index个元素,index从0开始
    * A[index1:index2] 切片操作,获取index1-index2的子序列
    * A in B 判断序列B中是否有A,如果有返回True,否则False
    * A not in B 判断序列B中是否有A,如果没有返回True,否则False
    * A + B 链接A和B,生成新的序列返回
    * A * number 将A重复number次,正常新的序列并返回
    * A > B 判断A是否大于B,结果为True/False
    * A < B 判断A是否小于B,结果为True/False
    * A == B 判断A是否等于B,结果为True/False
    * A >= B 判断A是否大于等于B,结果为True/False
    * A <= B 判断A是否小于等于B,结果为True/False

    //内置函数
    * enumberate(A) 对序列A生成一个可枚举对象,对象中每个元素是一个二位元组,元组内容为(index,item),即(索引号,序列元素)
    * len(A) 返回序列的长度
    * list(A) 转换为list类型
    * max(A) A是一个序列,返回A中最大的元素
    * max(a,b,...) 返回所有参数中最大的元素
    * min(A) A是一个序列,返回A中最小的元素
    * min(a,b,...) 返回所有参数中最小的元素
    * reversed(A) 生成A的反向序列
    * sorted(A,func=None,key=None,reverse=False) 对A排序,排序规则按照参数func,key,reverse指定的规则排序
    * sum(A,init=0) 对A中的元素求和
    * tuple(A) 转换为Tuple类型
  3. String类型(字符串类型)
    字符串是由零个或多个字符组成的有限序列
    python中使用单引号或双引号意义相同,都可以表示字符串

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //基本使用
    python字符串分两种:
    1.普通字符串(使用引号声明的字符串)
    2.Unicode字符串(在引号之前加上字母u的,汉子需要声明Unicode字符串)

    字符串是不可变类型,改变一个字符串的元素需要新建一个新的字符串

    //字符串格式化
    字符串格式化是按指定的规则连接,替换字符串并返回新的复合要求的字符串

    * %c 转为单个字符
    * %r 转为repr()函数表达式的字符串
    * %s 转为str()函数表达式的字符串
    * %d/%i 转为有符号的十进制整数
    * %u 转为无符号的十进制整数
    * %o 转为无符号的八进制整数
    * %x 转为无符号的十六进制整数,十六进制小写字母表示
    * %X 转为无符号的十六进制整数,十六进制大写字母表示
    * %e 转为科学计数法表达的浮点数,其中e小写表示
    * %E 转为科学计数法表达的浮点数,其中E大写表示
    * %f/%F 转为浮点数
    * %g 由python根据数字大小自动判断转换为%e或%f
    * %G 由python根据数字大小自动判断转换为%E或%F
    * %% 输出"%"

    //辅助格式化符号
    * * 定义宽度或小数点精度
    * - 左对齐
    * + 对正数输出正值符号"+"
    * <sp> 数字大小不足m.n的要求时,用空格补位
    * # 在八进制前显示0,在十六进制前显示0x或0X
    * 0 数字大小不满足m.n时,用0补位
    * m.n m是显示的最小总宽度,n是小数点后的位数
  4. Tuple类型(元组类型)
    Tuple即元组,用圆括号”()”表示,不同的元素之间以逗号分隔.
    Tuple比list的操作速度快

  5. List类型(列表类型)
    List即列表,使用中括号”[]”表示,不同的元素之间以逗号分隔

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //list 内置函数
    * append(obj) 在列表尾部追加一个对象
    * count(obj) 计算对象在列表中出现的次数
    * extend(seq) 把序列seq的内容添加到列表中
    * index(obj,i=0,j=len(list)) 计算对象obj在列表中索引的位置
    * insert(index,obj) 把对象插入列表index指定的位置
    * pop(index=1) 读取并删除index位置对象,默认为最后一个对象
    * remove(obj) 从列表删除对象obj
    * reverse() 获得反向列表
    * list.sort(func=None,key=None,reverse=False) 以指定的方式排序列表中的成员
  6. Set类型(集合类型)
    set类型即集合,用于表示相互之间无序的一组对象
    集合在算术上运算包括: 并集,交集,补集
    python集合分为两种: 普通集合 和 不可变集合
    普通集合: 在初始化后支持并集,交集,补集等运算
    不可变集合: 初始化后就不能改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//类型定义
关键字 set 用于定义普通集合
关键字 frozenset 用于定义不可变集合
初始化集合内容的方法是向其传入sequence类型簇的变量

//集合操作符
* in 判断包含关系
* not in 判断不包含关系
* == 判断等于
* != 判断不等于
* < 判断绝对子集关系
* <= 判断非绝对子集关系
* > 判断绝对超集关系
* >= 判断非绝对超集关系
* & 交集运算
* | 并集运算
* - 差集运算
* ^ 对称差运算
* |= 执行并运算并赋值
* &= 执行交运算并赋值
* -= 执行差运算并赋值
* ^= 执行绝对称差运算并赋值

//内置函数
set类型有自己的内置函数,用于增删改操作
* add() 增加新元素
* update(seq) 用序列更新集合,序列的每个元素都被添加到集合中
* remove(element) 删除元素
  1. Dictionary类型(字典类型)
    Dictionary类型即字典,代表键/值存储库,工作方式像映射表
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //类型定义
    Dictionary是python中唯一表示映射关系的类,所以有其独特的定义和操作方式
    {key1:value1,key2:value2,...} 进行初始化

    //内置函数
    * clear() 清除字典中所有键值对
    * copy() 复制字典的一个副本
    * fromkeys(seq,val=None) 用seq中的元素作为键创建字典,所有键的值都为val,val默认为None
    * get(key,default=None) 读取字典中的key,返回该键的值,如果读取不到返回default所设的值
    * has_key(key) 判断键key在字典中是否存在,存在返回True,否则False
    * items() 返回一个包含字典中(键,值)对元组的列表
    * keys() 返回一个保护字典中所有键的列表
    * iteritems() 返回字典中所有键值对的迭代器
    * iterkeys() 返回字典中所有键的迭代器
    * itervalues() 返回字典中所有值的迭代器
    * pop(key[,default]) 读取某键的值,并且从字典中删除该键的值.如果键不存在,并且未设置default,返回KeyError异常
    * setdefault(key,default=None) 设置字典中key的值为default
    * update(dict) 合并字典
    * values() 返回一个保护字典中所有值的列表

python 变量

python 变量

  1. 变量的赋值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    name = "smallasa"
    print(name)

    从代码角度来讲,我们把"smallasa"交给变量name保存,这个过程称为赋值
    python中使用'='来表示赋值
    从硬件的角度来讲,给变量赋值的过程,就是把数据存入内存的过程

    a = 1
    b = a + 3
    print(b)
    变量名直接参与运算,这是迈向抽象思维的第一步
    变量提供的符号化表达方式,是实现代码复用的第一步
  2. 变量的类型

    1
    2
    3
    4
    5
    python能自由改变变量类型的特征被称为动态类型;在静态类型的语言中,变量需要事前说明好类型,特定类型的数据必须存入特定类型的变量.相比静态类型,动态类型显得更加灵活方便

    计算机需要用不同的方式来存储不同的类型:整数可以直接用二进制的数字表示,浮点数确要额外记录小数点的位置
    每种数据所需的存储空间也不相同.计算机存储空间以位(bit)为单位,每一位存储一个0或1的数字
    为了效率和实用性,计算机在内存中必须要分类型存储

python 流程控制

python 流程控制

流程控制语句用来实现对流程的选择,循环和返回等进行控制
Python中主要的流程控制包括: if(判断),for(循环),break(跳出),continue(继续)等语句

  1. 理解程序块与作用域
  • 程序块结构: 程序块结构是一种程序结构形式,使得程序变得清晰,便于阅读和修改
  • 作用域: 作用域是按变量或函数的可见性定义的程序子集
    python 将两个概念进行了结合,用一种表达式方式(缩进)同时表达’程序块’和’作用域’概念,即:
    相同缩进范围内的代码在一个程序块和作用域中,且同一程序块和作用域中不能有不同的缩进

补充: Python使用pass语句来定义作用域,但不执行任何操作

  1. 判断语言
    条件判断是依据指定的变量或表达式的结果,决定后续运行的程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    语法一:
    if expression1:
    block_for_line

    语法二:
    if expression1:
    block_for_line
    else:
    block_for_line

    语法三:
    if expression1:
    block_for_line
    elif expression2:
    block_for_line
    else:
    block_for_line
  2. 循环语言
    循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序叫作循环体.循环语句由循环体及循环的终止条件两部分组成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    1. while 语句
    while expression:
    block_repeat

    2. for 语句
    for element in iterable:
    block_repeat

    注意: interable可以是任意sequence类型簇,集合或迭代器

    3. breakcontinue
    * break 在循环体中提前结束循环
    * continue 在本次循环体中尚未结束时开始下一轮循环
  3. 语句嵌套
    python允许if,while,for等语句的嵌套使用

python library MySQLdb

python library MySQLdb

  1. MySQLdb Download

  2. MySQLdb install

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@localhost ~]# yum -y install python-devel
    [root@localhost ~]# unzip MySQL-python-1.2.5.zip
    [root@localhost ~]# cd MySQL-python-1.2.5
    [root@localhost MySQL-python-1.2.5]# python setup.py build
    [root@localhost MySQL-python-1.2.5]# python setup.py install
    [root@localhost MySQL-python-1.2.5]# pip list|grep MySQL
    MySQL-python (1.2.5)

    或者:
    [root@localhost ~]# pip install MySQL-python
  3. MySQLdb常用参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    * connect() 方法用于连接数据库,返回一个数据库连接对象
    例如: db = MySQLdb.connect(host="{hostname|IP}",user="{user}",passwd="{passwd}",db="{dbname}")

    connect()的参数列表如下:
    * host
    连接的数据库服务器主机名,默认为本地主机(localhost)
    * port
    指定数据库服务器的连接端口,默认是3306
     * user
    连接数据库的用户名,默认为当前用户
    * passwd
    连接密码,没有默认值
     * db
    连接的数据库名,没有默认值
    * unix_socket
    在unix中,连接使用的套接字,默认使用TCP
     * conv
    将文字映射到Python类型的字典.默认为MySQLdb.converters.conversions
     * cursorclass
    cursor()使用的种类,默认值为MySQLdb.cursors.Cursor
     * compress
    启用协议压缩功能
     * named_pipe
    在windows中,与一个命名管道相连接
     * init_command
    一旦连接建立,就为数据库服务器指定一条语句来运行
     * read_default_file
    使用指定的MySQL配置文件
     * read_default_group
    读取的默认组

    * 连接对象的db.close()方法可关闭数据库连接,并释放相关资源

    * 连接对象的db.cursor([cursorClass])方法返回一个指针对象,用于访问和操作数据库中的数据

    * 连接对象的db.begin()方法用于开始一个事务,如果数据库的AUTOCOMMIT已经开启就关闭它,直到事务调用commit()和rollback()结束

    * 连接对象的db.commit()和db.rollback()方法分别表示事务提交和回退

    * 指针对象的cursor.close()方法关闭指针并释放相关资源

    * 指针对象的cursor.execute(query[,parameters])方法执行数据库查询

    * 指针对象的cursor.fetchall()可取出指针结果集中的所有行,返回的结果集一个元组(tuples)

    * 指针对象的cursor.fetchmany([size=cursor.arraysize])从查询结果集中取出多行,我们可利用可选的参数指定取出的行数

    * 指针对象的cursor.fetchone()从查询结果集中返回下一行

    * 指针对象的cursor.arraysize属性指定由cursor.fetchmany()方法返回行的数目,影响fetchall()的性能,默认值为1

    * 指针对象的cursor.rowcount属性指出上次查询或更新所发生行数.-1表示还没开始查询或没有查询到数据
  4. 通过 MySQLdb 验证连通性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [root@localhost ~]# cat dbtest.py
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-

    import MySQLdb

    db = MySQLdb.connect(host='127.0.0.1',
    unix_socket='/mnt/data/mysql/3306/mysql.sock',
    db='test')

    cursor = db.cursor()

    cursor.execute("SELECT VERSION()")

    data = cursor.fetchone()

    print "Database version : %s " % data

    db.close()
    [root@localhost ~]# python dbtest.py
    Database version : 5.6.36-log
  5. 通过 MySQLdb 创建表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    [root@localhost ~]# cat dbtest.py
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-

    import MySQLdb

    db = MySQLdb.connect(host='127.0.0.1',
    unix_socket='/mnt/data/mysql/3306/mysql.sock',
    db='test')

    cursor = db.cursor()

    cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

    sql = """CREATE TABLE EMPLOYEE (
    FIRST_NAME CHAR(20) NOT NULL,
    LAST_NAME CHAR(20),
    AGE INT,
    SEX CHAR(1),
    INCOME FLOAT )"""

    cursor.execute(sql)

    cursor.execute("SHOW TABLES")

    data = cursor.fetchall()

    print "%s" % data

    db.close()
    [root@localhost ~]# python dbtest.py
    ('EMPLOYEE',)
  6. 通过 MySQLdb 插入数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [root@localhost ~]# cat dbtest.py
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-

    import MySQLdb

    db = MySQLdb.connect(host='127.0.0.1',
    unix_socket='/mnt/data/mysql/3306/mysql.sock',
    db='test')

    cursor = db.cursor()

    sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
    LAST_NAME, AGE, SEX, INCOME) \
    VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
    ('Mac', 'Mohan', 20, 'M', 2000)

    try:
    cursor.execute(sql)
    db.commit()
    except:
    db.rollback()

    db.close()

    [root@localhost ~]# python dbtest.py
  7. 通过 MySQLdb 查询数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    [root@localhost ~]# cat dbtest.py
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-

    import MySQLdb

    db = MySQLdb.connect(host='127.0.0.1',
    unix_socket='/mnt/data/mysql/3306/mysql.sock',
    db='test')

    cursor = db.cursor()

    sql = "SELECT * FROM EMPLOYEE"

    try:
    cursor.execute(sql)

    results = cursor.fetchall()

    for row in results:
    fname = row[0]
    lname = row[1]
    age = row[2]
    sex = row[3]
    income = row[4]
    print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
    (fname, lname, age, sex, income )
    except:
    print "Error: unable to fecth data"

    db.close()
    [root@localhost ~]# python dbtest.py
    fname=Mac,lname=Mohan,age=20,sex=M,income=2000
  8. 通过 MySQLdb 更新数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [root@localhost ~]# cat dbtest.py
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-

    import MySQLdb

    db = MySQLdb.connect(host='127.0.0.1',
    unix_socket='/mnt/data/mysql/3306/mysql.sock',
    db='test')

    cursor = db.cursor()

    sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')

    try:
    cursor.execute(sql)
    db.commit()
    except:
    db.rollback()

    db.close()
    [root@localhost ~]# python dbtest.py
  9. 通过 MySQLdb 删除数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [root@localhost ~]# cat dbtest.py
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-

    import MySQLdb

    db = MySQLdb.connect(host='127.0.0.1',
    unix_socket='/mnt/data/mysql/3306/mysql.sock',
    db='test')

    cursor = db.cursor()

    sql = sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (10)

    try:
    cursor.execute(sql)
    db.commit()
    except:
    db.rollback()

    db.close()
    [root@localhost ~]# python dbtest.py

python 特殊说明

python 特殊说明

  1. import 和 reload 的区别
    1
    2
    3
    4
    5
    6
    * import
    导入/引入一个python标准模块,其中包括.py文件,带有__init__.py文件的目录
    多次重复使用import语句时,不会重新加载被指定的模块,只是把对该模块的内存地址给引用到本地变量环境
    * reload()
    对已经加载的模块进行重新加载,一般用于原模块有变化等特殊情况,reload前该模块必须已经import过
    reload会重新加载已加载的模块,但原来已经使用的实例还是会使用旧的模块,而新生产的实例会使用新的模块;reload后还是用原来的内存地址;不能支持from..import

监控知识体系

监控知识体系

  1. 监控目标

    1
    2
    3
    4
    5
    6
    7
    8
    * 对系统不间断实时监控
    实际上是对系统不间断的实时监控
    * 实时反馈系统当前状态
    我们监控某个硬件,或者某个系统,都是需要能实时看到当前系统的状态,是正常,异常,或者故障
    * 保证服务可靠性安全性
    我们监控的目的就是要保证系统,服务,业务正常运行
    * 保证业务持续稳定运行
    如果我们的监控做得很完善,即使出现故障,能第一时间接收到故障报警,在第一时间处理解决,从而保证业务持续性的稳定运行
  2. 监控方法

    1
    2
    3
    4
    5
    6
    7
    8
    * 了解监控对象
    我们要监控的对象你是否了解呢?比如CPU到底是如何工作的?
    * 性能基准指标
    我们要监控这个东西的什么属性?比如CPU的使用率,负载,用户态,内核态,上下文切换
    * 报警阈值定义
    怎么样才算是故障,要报警呢?比如CPU的负载到底多少算高,用户态,内核态分别跑多少算高?
    * 故障处理流程
    收到了故障报警,那么我们怎么处理呢?有什么更高效的处理流程吗?
  3. 监控核心

    1
    2
    3
    4
    5
    6
    7
    8
    * 发现问题
    当系统发生故障报警,我们会收到故障报警的信息
    * 定位问题
    故障邮件一般都会写某某主机故障,具体故障的内容,我们需要对报警内容进行分析,比如一台服务器连不上:我们就需要考虑是网络问题,还是负载太高导致长时间无法连接,又或者某开发触发了防火墙禁止的相关策略等等,我们就需要去分析故障具体原因
    * 解决问题
    当然我们了解到故障的原因后,就需要通过故障解决的优先级去解决该故障
    * 总结问题
    当我们解决完重大故障后,需要对故障原因以及防范进行总结归纳,避免以后重复出现
  4. 监控工具

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    * 老牌监控
    * MRTG
    MRTG是一套可用来绘制网络流量图的软件
    * Grnglia
    Grnglia一个跨平台的,可扩展的,高性能的分布式监控系统,如集群和网格
    * Cacti
    Cacti是一套基于PHP,MySQL,SNMP和RRDtool开发的网络流量监测图形分析工具,它通过snmpget来获取数据使用RRDtool绘图,但使用者无须了解RRDtool复杂的参数
    * Nagios
    Nagios是一个企业级监控系统,可监控服务的运行状态和网络信息等,并能监视所指定的本地或远程主机状态以及服务,同时提供异常告警通知功能等
    * Smokeping
    Smokeping主要用于监视网络性能,包括常规的ping,www服务器性能,DNS查询性能,SSH性能等
    * OpenTSDB
    OpenTSDB用Hbase存储所有时序的数据,来构建一个分布式,可伸缩的时间序列数据库
    * 王牌监控
    * Zabbix
    Zabbix是一个分布式监控系统,支持多种采集方式和采集客户端,有专用的Agent代理,也支持SNMP、IPMI、JMX、Telnet、SSH等多种协议,它将采集到的数据存放到数据库,然后对其进行分析整理,达到条件触发告警
    * open-falcon
    open-falcon的目标是做最开放,最好用的互联网企业级监控产品
    * OWL
    OWL是TalkingData公司推出的一款开源分布式监控系统
    * LEPUS天兔
    LEPUS天兔转用于监控数据库
    * 三方监控
    * 监控宝
    * 听云
  5. 监控流程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    1.数据采集
    Zabbix通过SNMP、Agent、ICMP、SSH、IPMI等对系统进行数据采集
    2.数据存储
    Zabbix存储在MySQL上,也可以存储在其他数据库服务
    3.数据分析
    当我们事后需要复盘分析故障时,zabbix能给我们提供图形以及时间等相关信息,方面我们确定故障所在
    4.数据展示
    web界面展示,(移动APP、java_php开发一个web界面也可以)
    5.监控报警
    电话报警、邮件报警、微信报警、短信报警、报警升级机制等
    6.报警处理
    当接收到报警,我们需要根据故障的级别进行处理,比如:重要紧急,重要不紧急等.根据故障的级别,配合相关的人员进行快速处理
  6. 监控指标

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    * 硬件监控(Zabbix IPMI Interface)
    * CPU温度
    * 物理磁盘
    * 虚拟磁盘
    * 主板温度
    * 磁盘阵列
    * 系统监控(Zabbix Agent Interface)
    * CPU
    * CPU整体百分比
    * 用户态使用百分比
    * 内核态使用百分比
    * 每个CPU使用情况
    * 磁盘
    * 磁盘读/写吞吐(MBps)
    * 磁盘读/写次数(次/s)
    * 内存
    * 内存使用量
    * 内存剩余量
    * 网络
    * 网卡出/入带宽(kbps)
    * 网卡出/入包量(个/s)
    * 进程
    * 进程端口监听
    * 应用监控(Zabbix Agent UserParameter)
    * LVS、Haproxy、Docker、Nginx、PHP、Memcached、Redis、MySQL、Rabbitmq等
    * java监控(Zabbix JMX Interface)
    * 网络设备监控(Zabbix SNMP Interface)
    * 网络监控
    Smokeping是rrdtool的作者Tobi Oetiker的作品,是用Perl写的,主要是监视网络性能,www 服务器性能,dns查询性能等,使用rrdtool绘图,而且支持分布式,直接从多个agent进行数据的汇总
    * 流量分析
    google出一个叫piwik的开源分析工具
    * 日志监控
    对于日志监控来说,最见的需求就是收集,存储,查询,展示,开源社区正好有相对应的开源项目:logstash(收集) + elasticsearch(存储+搜索) + kibana(展示)
    * 安全监控
    三方厂商提供全面的漏洞库,涵盖服务,后门,数据库,配置检测,CGI,SMTP等多种类型
    全面检测主机,Web应用漏洞自主挖掘和行业共享相结合第一时间更新0day漏洞,杜绝最新安全隐患
    * API监控
    监控API接口GET、POST、PUT、DELETE、HEAD、OPTIONS的请求
    可用性、正确性、响应时间为三大重性能指标
    * 性能监控
    全面监控网页性能,DNS响应时间、HTTP建立连接时间、页面性能指数、响应时间、可用率、元素大小等
    zabbix提供URL监控:Zabbix Web 监控
    * 业务监控
    以电商为例:
    * 每分钟产生多少订单
    * 每分钟注册多少用户
    * 每天有多少活跃用户
    * 每天有多少推广活动
    * 推广活动引入多少用户
    * 推广活动引入多少流量
    * 推广活动引入多少利润
    * 今天商品打包出库多少
    * 今天退货商品有多少
    * 等等
  7. 监控报警

    1
    2
    3
    4
    5
    * 电话
    * 短信
    * 微信
    * 邮箱
    * 任意
  8. 报警处理

    1
    2
    3
    4
    * 故障自愈
    * 故障级别
    * 业务划分
    * 人员划分
  9. 面试监控

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    1.硬件监控
    通过SNMP来进行路由器交换机的监控(这些可以跟一些厂商沟通来了解如何做),服务器的温度以及其他,可以通过IPMI来实现.
    2.系统监控
    如CPU的负载,上下文切换、内存使用率、磁盘读写、磁盘使用率、磁盘inode使用率。当然这些都是需要配置触发器,因为默认太低会频繁报警。
    3.服务监控
    比如公司用的LNMP架构,nginx自带Status模块、PHP也有相关的Status、MySQL的话可以通过percona官方工具来进行监控。Redis这些通过自身的info获取信息进行过滤等。方法都类似。要么服务自带。要么通过脚本来实现想监控的内容,以及报警和图形功能。
    4.网络监控
    如果是云主机又不是跨机房,那么可以选择不监控网络。当然你说我们是跨机房以及如何如何。推荐使用smokeping来做网络相关的监控。或者直接交给你们的网络工程师来做,因为术业有专攻。
    5.安全监控
    如果是云主机可以考虑使用自带的安全防护。当然也可以使用iptables。如果是硬件,那么推荐使用硬件防火墙。使用云可以购买防DDOS,避免出现故障导致down机一天。如果是系统,那么权限、密码、备份、恢复等基础方案要做好。web同时也可以使用Nginx+Lua来实现一个web层面的防火墙。当然也可以使用集成好的openresty。
    6.Web监控
    web监控的话题其实还是很多。比如可以使用自带的web监控来监控页面相关的延迟、js响应时间、下载时间、等等。这里我推荐使用专业的商业软件,监控宝或听云来实现。毕竟人家全国各地都有机房。(如果本身是多机房那就另说了)
    7.日志监控
    如果是web的话可以使用监控Nginx的50x、40x的错误日志,PHP的ERROR日志。其实这些需求无非是,收集、存储、查询、展示,我们其实可以使用开源的ELKstack来实现。Logstash(收集)、elasticsearch(存储+搜索)、kibana(展示)
    8.业务监控
    我们上面做了那么多,其实最终还是保证业务的运行。这样我们做的监控才有意义。所以业务层面这块的监控需要和开发以及总监开会讨论,监控比较重要的业务指标,(需要开会确认)然后通过简单的脚本就可以实现,最后设置触发器即可
    9.流量分析
    平时我们分析日志都是拿awk sed xxx一堆工具来实现。这样对我们统计ip、pv、uv不是很方便。那么可以使用百度统计、google统计、商业,让开发嵌入代码即可。为了避免隐私也可以使用piwik来做相关的流量分析。
    10.可视化
    通过screen以及引入一些第三方的库来美化界面,同时我们也需要知道,订单量突然增加、突然减少。或者说突然来了一大波流量,这流量从哪儿来,是不是推广了,还是被攻击了。可以结合监控平来梳理各个系统之间的业务关系。
    11.自动化监控
    如上我们做了那么多的工作,当然不能是一台一台的来加key实现。可以通过Zabbix的主动模式以及被动模式来实现。当然最好还是通过API来实现。
    12.分布式监控
  10. 监控链接文章

  1. 监控体系图
    监控系统图 下载 密码:u1wz
    监控体系图