> 往期专题请移步www.zhaibibei.cn

> 这是一个坚持Oracle,Python原创内容的公众号,欢迎关



[TOC]

----

这节是关于我的监控系统的整体功能


具体进度可关注我的公众号


[image:245 size:orig]



------



##1.开发这套系统的初衷


###1.1 快速了解一套数据库

大家有没这种感觉,不论甲方还是乙方,拿到一套数据库我们很难快速的知道他的配置,数据库状态以及性能状态


虽然我们手里有很多运维的脚本,但是无法有效的统一起来


###1.2 提前定位性能瓶颈

如果你对一套系统不了解,在运维过程中我们往往是迷茫的,心里没有底的

特别是性能问题

###1.3 多套数据库统一管理


虽然Oracle有他的统一管理工具,但是我想大多数还是不用的吧

###1.4 练手Python

正好对于Python使用也有一段时间了,而工作上也有这种需求,所以才萌发了这个想法,根据自己实际运维中的需求来开发一套系统

---------

在开始今天的正式想说的是这套系统只是辅助我们日常的运维,对于Oracle本身的一些工具,如awr和statpack,ash等工具我们还是需要熟练掌握的
 
 这次的分享是对上次分享的一些改进,增加了一些新的功能
 
 首先先列出来使用到的一些环境:
 
**开发环境**

操作系统:CentOS 7.4

Python版本 :3.6

Django版本: 1.10.5

操作系统用户:oms

linux/unix模块:paramiko

Oracle模块:cx_Oracle

SQL Server模块:pymssql

数据分析:pandas

前台展示:highcharts

数据存储:MySQL,redis

----------

##2.Django介绍

###2.1 Django介绍

熟悉Python的人对于Python的主流Web框架肯定有所了解,各有各的好处,Django可以说是其中最为强大和流行的一个,其官方文档非常详细,网上也有不少中文的文档,大家可现行了解

官方网站:

https://www.djangoproject.com/

###2.2 ORM框架

Django采用ORM模型处理数据库关系

对象-关系映射(Object-Relational Mapping,简称ORM),简单来说就是通过面向对象的方法来映射后端数据库

它通过 类(class)的方式定义关系型数据库的表结构

###2.3 Django特性

Django 作为Web框架提供了一些非常有用的能够提升开发效率的特性

- ORM模型简化和数据库层面的沟通,如表的建立及修改

- 强大的模板(template)功能,简化前端开发难度

- form表单管理简化表单操作

- 集成了可视化管理数据库工具(admin),免去了安装插件等动作

### 2.4 Django Web请求过程

接下来简单介绍一下Django如何处理用户的Web请求,以及一些常用的文件的说明 

[image:246 size:orig]

1. 首先用户输入url后,django会查找urls.py文件,找到与之对应的函数

2. urls.py对应的函数在views.py会有明确的定义,views相当于后端

3. views.py可能会调用template(模板)文件,用户在前端显示

4. model.py即前面所说的ORM模型,将数据库表定义写在该文件中

5. form.py为表单文件,Django同样提供了一套管理表单的方法

6. settings.py为配置文件,里面包含IP访问控制,插件配置以及数据库连接配置等信息

[image:247 size:orig]

[image:248 size:orig]

[image:249 size:orig]

-----

##3.监控数据的获取

###3.1 Linux/hp-unix

**获取的内容**

这里我们通过Python获取

1. Linux/HP-Unix服务器的CPU(每五分钟)
2. Linux/HP-Unix服务器的内存使用率(每五分钟)
3. Linux/HP-Unix服务器磁盘分区使用率的信息(每一小时)

------

**获取方式**

这里通过**paramiko**模块连接linux服务器

分别使用如下命令获取:
1. sar/sar
2. free/swapinfo 
3. df /bdf

具体可参考如下链接:

> http://www.zhaibibei.cn/python/3.1/


--------

###3.2 Oracle数据库数据

**获取的内容**

这里我们通过Python获取

1. TOP SQL语句(每小时)
2. 系统状态数据 如物理读等 (每小时)
3. 等待事件(每小时)
4. 命中率信息(每小时)
5. 表空间使用情况(每天)
6. Job执行情况(每小时)

---------

**获取方式**

这里通过**cx_Oracle**模块连接Oracle服务器

分别使用如下命令获取:
1. v$sqlarea
2. v$sysstat
3. v$system_event
4. v$librarycache等
5. .....


###3.3 SQL Server数据获取


**获取的内容**

这里我们通过Python获取

1. 数据文件使用率
2. 备份情况


**获取方式**

这里通过**pymssql**模块连接SQL Server 服务器

分别使用如下命令获取:

1. sp_spaceused
2. msdb.dbo.backupset




##4. 监控系统的功能

###4.1 Linux/Unix监控

我们要判断一个系统是否正常,可以先从其CPU,内存来入手,这里我们获取到了服务器的数据后,可以进行分析

#### 4.1.2 CPU趋势


[image:250 size:orig]


#### 4.1.3 内存趋势

[image:251 size:orig]

----------

###4.2  Oracle监控

####4.2.1 数据库巡检程序

这里我每天发送2封邮件给我,主要检查:

- 每小时redo log的产生量
- 每小时数据库的CPUTime
- 数据库每秒的硬解析次数
- 表空间的使用率
- 磁盘排序次数

[image:252 size:orig]


####4.2.2 数据库的等待事件

这里检查每日数据库各非空闲等待事件的平均等待事件,超过一定数值则报警

[image:253 size:orig]


通过上面两个程序并结合CPU,内存使用率我们大体可以知道一套数据库的性能情况

接下来我们可以根据上面的问题点进行分析

####4.2.3 数据库等待事件检查

这里我们可以看到等待实践的趋势图

可以根据每天

[image:254 size:orig]

也可以根据每小时

[image:255 size:orig]

这样就可以对数据库的等待事件有所了解


#### 4.2.4 数据库性能检查

这里我们针对常见的性能指标来画出趋势图,有:

- Physical Reads
- Logical Reads
- DB Time
- CPU Time
- Hard Parse
- Total Parse
- User Commits
- User Rollbacks
- Logons
- Redo Size

等等

这里也分每天的趋势图和每小时的趋势图

[image:256 size:orig]

[image:257 size:orig]

所有状态一目了然

#### 4.2.5 数据库TOPSQL检查

通过上面的检查我们可以定位到某小时某个指标较高,这时我们可以查询这个时间段的TOP SQL,主要有:

- diskreads
- buffergets
- elapsedtime
- cputime

[image:258 size:orig]

#### 4.2.6 数据库命中率查询

这个功能还在评估要不要加入,暂无打算


#### 4.2.7 数据库基线设置

可以设置数据库某个指标的某天趋势为基线方便对比


#### 4.2.8 数据库常用命令执行

这里还有个功能就是对于我们日常用到的一些运维脚本集成到网页上方便执行

- 检查数据文件创建时间
- 检查表的分析时间
- 查看数据库段的大小
- 查看进程对应的SQL语句
- 查看会话对应的进程号
- 查看SQL的执行计划
- 检查临时表空间使用率
- 检查执行次数等于一的语句
- 检查未绑定语句

[image:259 size:orig]








###4.3 SQL Server监控

由于我也负责SQL Server,就也写了写它的脚本,本人了解不太深,没写太多,后续完善

主要功能有:

1. 备份监控:msdb.dbo.backupset
2. 数据文件空间管理:sp_spaceused



##5. 监控程序的调用

目前用的是crontab在调用,正在学Celery + Redis,还是没有时间研究。。


##6. 异常处理

我所有程序都写了异常处理模块,并重定向了标准错误输出到文件以确保所以程序异常得到及时处理



##7. 监控报警机制

数据获取之后我们需要根据实际需求来进行分析然后发现问题并报警,

指标先紧后送,持续更改

主要有以下方面

1. 连通性测试:每次的数据获取如有异常则报警
2. CPU/内存:连续5次大于设定阈值则报警
3. 分区使用率:大于90%则报警
4. 表空间使用率:大于90%则报警
5. Job执行情况:执行失败或超过2小时报警
6. 备份情况监控:备份失败则报警
7. DataGuard 监控:DataGuard是否同步
8. Oracle alert日志有错误报警
9. 等待事件平均等待时间超过30ms报警
10. redo log 每小时超过12个报警
11. 硬解析每秒超过30次报警
12. 磁盘排序每小时超过5次报警
13. ....


好了今天的介绍就到这了,欢迎大家提问


[image:260 size:orig]