pigz简介
1
pigz是一个高效的压缩工具,可以将多核CPU的每一分剩余性能都用来做压缩计算.而传统的gzip则只能用单核CPU.比如一台2个8core cpu服务器采用pigz和gzip压缩相同的数据,一般性能差距至少在7-8倍以上(一般不会达到理论的16倍,因为受限于磁盘的读写速度和内存等资源)
pigz 安装
1
[root@localhost ~]# yum -y install pigz
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 filepigz 扩展
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
- rewrite规则
- 示例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
- grok语法说明
1
2
3
4
5
6grok的语法格式为 %{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
grafana简要说明
1
2
3Grafana是Graphite和InfluxDB仪表盘和图形编辑器.
Grafana是开源的,功能齐全的度量仪表盘和图形编辑器,支持Graphite,InfluxDB和OpenTSDB
Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源;Graphite和InfluxDB 查询编辑器等等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.serviceGranfana 配置文件
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/grafanaGranfana 启动
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-serverGranfana 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-serverGranfana控制台
1
2
3open: http://{grafana}:3000 admin:admin
open: 左上角 -> plugins -> apps -> zabbix ->enableGranfana添加数据源
1
open: 左上角 -> data sources -> add data source -> zabbix ->enable
python 数据类型
python 数据类型
Python 数值类型包括:
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)的反函数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类型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是小数点后的位数Tuple类型(元组类型)
Tuple即元组,用圆括号”()”表示,不同的元素之间以逗号分隔.
Tuple比list的操作速度快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) 以指定的方式排序列表中的成员Set类型(集合类型)
set类型即集合,用于表示相互之间无序的一组对象
集合在算术上运算包括: 并集,交集,补集
python集合分为两种: 普通集合 和 不可变集合
普通集合: 在初始化后支持并集,交集,补集等运算
不可变集合: 初始化后就不能改变
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
2
3
4
5
6
7
8
9
10
11
12name = "smallasa"
print(name)
从代码角度来讲,我们把"smallasa"交给变量name保存,这个过程称为赋值
python中使用'='来表示赋值
从硬件的角度来讲,给变量赋值的过程,就是把数据存入内存的过程
a = 1
b = a + 3
print(b)
变量名直接参与运算,这是迈向抽象思维的第一步
变量提供的符号化表达方式,是实现代码复用的第一步变量的类型
1
2
3
4
5python能自由改变变量类型的特征被称为动态类型;在静态类型的语言中,变量需要事前说明好类型,特定类型的数据必须存入特定类型的变量.相比静态类型,动态类型显得更加灵活方便
计算机需要用不同的方式来存储不同的类型:整数可以直接用二进制的数字表示,浮点数确要额外记录小数点的位置
每种数据所需的存储空间也不相同.计算机存储空间以位(bit)为单位,每一位存储一个0或1的数字
为了效率和实用性,计算机在内存中必须要分类型存储
python 流程控制
python 流程控制
流程控制语句用来实现对流程的选择,循环和返回等进行控制
Python中主要的流程控制包括: if(判断),for(循环),break(跳出),continue(继续)等语句
- 理解程序块与作用域
- 程序块结构: 程序块结构是一种程序结构形式,使得程序变得清晰,便于阅读和修改
- 作用域: 作用域是按变量或函数的可见性定义的程序子集
python 将两个概念进行了结合,用一种表达式方式(缩进)同时表达’程序块’和’作用域’概念,即:
相同缩进范围内的代码在一个程序块和作用域中,且同一程序块和作用域中不能有不同的缩进
补充: Python使用pass语句来定义作用域,但不执行任何操作
判断语言
条件判断是依据指定的变量或表达式的结果,决定后续运行的程序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循环语言
循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序叫作循环体.循环语句由循环体及循环的终止条件两部分组成1
2
3
4
5
6
7
8
9
10
11
12
131. while 语句
while expression:
block_repeat
2. for 语句
for element in iterable:
block_repeat
注意: interable可以是任意sequence类型簇,集合或迭代器
3. break 和 continue
* break 在循环体中提前结束循环
* continue 在本次循环体中尚未结束时开始下一轮循环语句嵌套
python允许if,while,for等语句的嵌套使用
python library MySQLdb
python library MySQLdb
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-pythonMySQLdb常用参数
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表示还没开始查询或没有查询到数据通过 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通过 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',)通过 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通过 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通过 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通过 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
监控知识体系
监控知识体系
监控目标
1
2
3
4
5
6
7
8* 对系统不间断实时监控
实际上是对系统不间断的实时监控
* 实时反馈系统当前状态
我们监控某个硬件,或者某个系统,都是需要能实时看到当前系统的状态,是正常,异常,或者故障
* 保证服务可靠性安全性
我们监控的目的就是要保证系统,服务,业务正常运行
* 保证业务持续稳定运行
如果我们的监控做得很完善,即使出现故障,能第一时间接收到故障报警,在第一时间处理解决,从而保证业务持续性的稳定运行监控方法
1
2
3
4
5
6
7
8* 了解监控对象
我们要监控的对象你是否了解呢?比如CPU到底是如何工作的?
* 性能基准指标
我们要监控这个东西的什么属性?比如CPU的使用率,负载,用户态,内核态,上下文切换
* 报警阈值定义
怎么样才算是故障,要报警呢?比如CPU的负载到底多少算高,用户态,内核态分别跑多少算高?
* 故障处理流程
收到了故障报警,那么我们怎么处理呢?有什么更高效的处理流程吗?监控核心
1
2
3
4
5
6
7
8* 发现问题
当系统发生故障报警,我们会收到故障报警的信息
* 定位问题
故障邮件一般都会写某某主机故障,具体故障的内容,我们需要对报警内容进行分析,比如一台服务器连不上:我们就需要考虑是网络问题,还是负载太高导致长时间无法连接,又或者某开发触发了防火墙禁止的相关策略等等,我们就需要去分析故障具体原因
* 解决问题
当然我们了解到故障的原因后,就需要通过故障解决的优先级去解决该故障
* 总结问题
当我们解决完重大故障后,需要对故障原因以及防范进行总结归纳,避免以后重复出现监控工具
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天兔转用于监控数据库
* 三方监控
* 监控宝
* 听云监控流程
1
2
3
4
5
6
7
8
9
10
11
121.数据采集
Zabbix通过SNMP、Agent、ICMP、SSH、IPMI等对系统进行数据采集
2.数据存储
Zabbix存储在MySQL上,也可以存储在其他数据库服务
3.数据分析
当我们事后需要复盘分析故障时,zabbix能给我们提供图形以及时间等相关信息,方面我们确定故障所在
4.数据展示
web界面展示,(移动APP、java_php开发一个web界面也可以)
5.监控报警
电话报警、邮件报警、微信报警、短信报警、报警升级机制等
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 监控
* 业务监控
以电商为例:
* 每分钟产生多少订单
* 每分钟注册多少用户
* 每天有多少活跃用户
* 每天有多少推广活动
* 推广活动引入多少用户
* 推广活动引入多少流量
* 推广活动引入多少利润
* 今天商品打包出库多少
* 今天退货商品有多少
* 等等监控报警
1
2
3
4
5* 电话
* 短信
* 微信
* 邮箱
* 任意报警处理
1
2
3
4* 故障自愈
* 故障级别
* 业务划分
* 人员划分面试监控
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
231.硬件监控
通过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.分布式监控监控链接文章
- 监控体系图
监控系统图 下载 密码:u1wz