监控服务器存活的脚本,用ruby写的,需要安装有action_mailer gem,
功能:检测主机的80端口是否可用
失败次数记录,超过指定次数判定主机Down掉
发送通知邮件到指定邮箱
在前面的日志中有说明怎样连接gmail来发送邮件的
require 'rubygems'
require 'action_mailer'
require 'ping'
require 'fileutils'
require 'tlsmail' #need install tlsmail gem to support TLS connect
Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
#发送通知from账户设置
ActionMailer::Base.smtp_settings = {
:address => 'smtp.gmail.com',
:port => '25',
:domain => 'gmail.com',
:user_name => 'username',
:password => 'passwd',
:authentication => :login
}
#recp: 收到通知的邮箱地址,可以填多个地址,逗号分隔
#sub: 邮件主题
#bo: 邮件内容
class SimpleMailer < ActionMailer::Base
def simple_message(recp, sub, bo)
from 'sender@gmail.com'
recipients recp
subject sub
body bo
end
end
class ServerMonitor
def initialize
#config
@hit = 5 #最大失败次数,达到后才会发送邮件,避免误报
@tmp = "/tmp/server_monitor_tmp" #计数器地址
@recp = 'mytake6@gmail.com, std8545@yahoo.com.cn' #收信的邮箱地址
@host = ['www.ccok.me', 'www.google.com'] #需要监控的主机
#do not touch these
@hosts = Struct.new(:host, :status)
@servers, @msg = [], []
@host.each { |h| @servers << @hosts.new(h, true) }
FileUtils.mkdir(@tmp) unless File.exists? @tmp
end
def run
@servers.each do |s|
num = Ping.pingecho(s.host, 5, 80) ? 0 : rf(s.host) + 1
File.open(dest(s.host), 'w') { |f| f.puts num }
end
@servers.each do |e|
if rf(e.host) == @hit
e.status = false
File.open(dest(e.host), 'w') { |f| f.puts 0 }
end
end
send_mail
end
def rf file
return 0 unless File.exist?(dest(file))
File.open(dest(file), 'r').readlines.to_s.chomp.to_i
end
def dest host
"#{@tmp}/#{host}"
end
def send_mail
@servers.each { |m| @msg << m.host unless m.status }
SimpleMailer.deliver_simple_message @recp,
"server monitor",
@msg.join(', ') + " is Down!!! " unless @msg.empty?
end
end
#go
ServerMonitor.new.run
可以放到crontab中每2分钟运行一次
__ InnoDB Buffer Pool __________________________________________________
Usage 7.97M of 8.00M %Used: 99.61
Read hit 100.00%
Pages
Free 2 %Total: 0.39
Data 499 97.46 %Drty: 0.00
Misc 11 2.15
Latched 0 0.00
Reads 101.06M 8.5/s
From file 373 0.0/s 0.00
Ahead Rnd 19 0.0/s
Ahead Sql 13 0.0/s
Writes 860.88k 0.1/s
Flushes 254.62k 0.0/s
Wait Free 0 0/s
__ InnoDB Lock _________________________________________________________
Waits 424 0.0/s
Current 0
Time acquiring
Total 254266 ms
Average 599 ms
Max 39559 ms
__ InnoDB Data, Pages, Rows ____________________________________________
Data
Reads 502 0.0/s
Writes 344.09k 0.0/s
fsync 158.03k 0.0/s
Pending
Reads 0
Writes 0
fsync 0
Pages
Created 699 0.0/s
Read 523 0.0/s
Written 254.62k 0.0/s
Rows
Deleted 4.59k 0.0/s
Inserted 74.16k 0.0/s
Read 94.67M 8.0/s
Updated 40.61k 0.0/s
Usage 7.97M of 8.00M %Used: 99.61
Read hit 100.00%
Pages
Free 2 %Total: 0.39
Data 499 97.46 %Drty: 0.00
Misc 11 2.15
Latched 0 0.00
Reads 101.06M 8.5/s
From file 373 0.0/s 0.00
Ahead Rnd 19 0.0/s
Ahead Sql 13 0.0/s
Writes 860.88k 0.1/s
Flushes 254.62k 0.0/s
Wait Free 0 0/s
Waits 424 0.0/s
Current 0
Time acquiring
Total 254266 ms
Average 599 ms
Max 39559 ms
Data
Reads 502 0.0/s
Writes 344.09k 0.0/s
fsync 158.03k 0.0/s
Pending
Reads 0
Writes 0
fsync 0
Pages
Created 699 0.0/s
Read 523 0.0/s
Written 254.62k 0.0/s
Rows
Deleted 4.59k 0.0/s
Inserted 74.16k 0.0/s
Read 94.67M 8.0/s
Updated 40.61k 0.0/s
前面一篇日志中说明了怎样安装MySQL的监控工具,这里说下如何通过监控工具得到的数据来看判断MySQL的运行状况
在MYSQL的官方网站找到了一篇这方面的文章,地址
后来找到了一篇对应的中文翻译,地址
这里列出了一些如何监视你安装的mysql性能的一些ideas。监视总是一个持续的过程。你需要知道哪种模式对你的数据库是好的,什么是问题的表象,甚至是危险的情况。
一下列出了用来去监视你的系统的主要参数:
- mysqladmin extended (绝对值)
- mysqladmin extended -i10 -r (相对值)
- mysqladmin processlist
- mysql -e "show innodb status"
- OS data. vmstat/iostat
- MySQL error log
- InnoDB tablespace info.
1) mysqladmin extended (绝对值)
重点去监视的值有:
* Slave_running:如果系统有一个从复制服务器,这个值指明了从服务器的健康度
* Threads_connected:当前客户端已连接的数量。这个值会少于预设的值,但你也能监视到这个值较大,这可保证客户端是处在活跃状态。
* Threads_running:如果数据库超负荷了,你将会得到一个正在(查询的语句持续)增长的数值。这个值也可以少于预先设定的值。这个值在很短的时间内超过限定值是没问题的。当Threads_running值超过预设值时并且该值在5秒内没有回落时, 要同时监视其他的一些值。
2)mysqladmin extended(计数器)
* Aborted_clients:客户端被异常中断的数值(因为连接到mysql服务器的客户端没有正常地断开或关闭)。对于一些应用程序是没有影响的,但对于另一些应用程序可能你要跟踪该值,因为异常中断连接可能表明了一些应用程序有问题。
* Questions:每秒钟获得的查询数量。也可以是全部查询的数量(注:可以根据你输入不同的命令会得到你想要的不同的值)。
* Handler_*:如果你想监视底层(low-level)数据库负载,这些值是值得去跟踪的。如果Handler_read_rnd_next值相对 于你认为是正常值相差悬殊,可能会告诉你需要优化或索引出问题了。Handler_rollback表明事务被回滚的查询数量。你可能想调查一下原因。
* Opened_tables:表缓存没有命中的数量。如果该值很大,你可能需要增加table_cache的数值。典型地,你可能想要这个值每秒打开的表数量少于1或2.
* Select_full_join: 没有主键(key)联合(Join)的执行。该值可能是零。这是捕获开发错误的好方法,因为一些这样的查询可能降低系统的性能。
* Select_scan:执行全表搜索查询的数量。在某些情况下是没问题的,但占总查询数量该比值应该是常量(注:Select_scan除以总查询数量商应该是常数)。如果你发现该值持续增长,说明需要优化,缺乏必要的索引或其他问题。
* Slow_queries:超过该值(--long-query-time)的查询数量,或没有使用索引查询数量。对于全部查询会有小的冲突。如果该值增长,表明系统有性能问题。
* Threads_created:该值应该是低的。较高的值可能意味着你需要增加thread_cache的数值,或你遇到了持续增加的连接,表明了潜在的问题。
3)mysqladmin processlist or "SHOW FULL PROCESSLIST"命令
你可以通过使用其他的统计信息得到已连接线程数量和正在运行线程的数量,检查正在运行 的查询花了多长时间是一个好主意。如果有一些长时间的查询(由于很差的构思或公式),管理员可以被通知。你可能也想了解多少个查询是在"Locked"的 状态—---该值作为正在运行的查询不被计算在内而是作为非活跃的。一个用户正在等待一个数据库响应。
4) "SHOW INNODB STATUS"命令
该语句产生很多信息,从中你可以得到你感兴趣的。首先你要检查的就是“从最近的XX秒计算出来的每秒的平均负载”。
* Pending normal aio reads: 该值是innodb io请求查询的大小(size)。如果该值大到超过了10—20,你可能有一些瓶颈。
* reads/s, avg bytes/read, writes/s, fsyncs/s:这些值是io统计。对于reads/writes大值意味着io子系统正在被装载。适当的值取决于你系统的配置。
* Buffer pool hit rate:这个命中率非常依赖于你的应用程序。当你觉得有问题时请检查你的命中率
* inserts/s, updates/s, deletes/s, reads/s:有一些Innodb的底层操作。你可以用这些值检查你的负载情况查看是否是期待的数值范围。
4)OS数据。查看系统状态好的工具是vmstat/iostat/mpstat,这些可以看man手册
5)MySQL错误日志-----在服务器正常完成初始化后,什么都不会写到错误日志中,因此任何在该日志中的信息都要引起管理员的注意。
6)InnoDB表空间信息。InnoDB仅有的危险情况就是表空间填满----日志不会填满。检查的最好方式就是:show table status;你可以用任何InnoDB表来监视InnoDB表的剩余空间。
只做一下说明,上面文章中提到的各种参数,其中判断最主要的数据来源总结一下主要来自:
1.mysqlreport工具
2.show innodb status;
3.show table status;
根据以上结果的输出,结合几项重要参数值来做判断
mysqltuner是一个傻瓜式的MySQL优化工具,工具的运行结果会直接给出my.cnf应做如何的参数设置和调整,也是一个不错的工具
还有就是MySQL官方的数据库管理工具MySQL Administrator也有性能监控的功能,类似于windows的任务管理器
最近在看mysql性能监控这方面,以前用过mysqltuner, 现在在关注innotop, mtop和mysqlreport, 由于这三个工具都是perl编写的, 并且都依赖于DBD::mysql模块, 所以在使用之前要先先安装DBD::mysql
DBD::mysql
由于DBD::mysql又依赖于DBI模块所以先安装DBI模块:
$perl -MCPAN -e "install DBI"
就行了
由于我系统中的mysql是从源码包编译安装的,安装的路径为/usr/local/mysql, mysql的库文件(lib)和头文件(include)不在默认的标准路径中,所以在通过CPAN安装DBD::mysql的时候会失败,这里去CPAN下载下来DBD-mysql-4.008.tar.gz文件,手动安装:
这个模块的安装不能像安装其他perl module一样执行perl Makefile.PL; make; make install, 因为它需要知道mysql的库文件和头文件位置,它在执行perl Makefile.PL时会自动去执行mysql_config(该程序随mysql发行, 位于mysql目录的bin中),得到mysql的参数,其中有cflag和lib的路径, 但是该程序的输出在编译安装的mysql中默认就是错误的,所以不能简单执行perl Makefile.PL, 必须指定mysql头文件和库文件的位置
$tar zxvf DBD-mysql-4.008.tar.gz
$export PATH=$PATH:/usr/local/mysql/bin
$perl Makefile.PL --libs='-L/usr/local/mysql/lib -lmysqlclient' --cflag='-I/usr/local/mysql/include'
$make; make install
然后再把mysql的库文件加入系统库的路径,不这样的话后面在使用innotop和mysqlreport时会报错,
$echo /usr/local/mysql/lib >> /etc/ld.so.conf
$ldconfig
Innotop
然后再安装innotop:
安装依赖的module
$perl -MCPAN -e shell
cpan>install Term::ReadKey
cpan>exit
$perl Makefile.PL; make; make install
innotop使用看help
mysqlreport
这样就行了,mysqlreport不用安装直接使用即可,
$./mysqlreport --user=NAME --password=PWD
mtop
mtop类似于系统的top, 对mysql进行即时监控
mtop依赖的module比较多, 除了上面提到的DBI和DBD::mysql外, 其他的见mtop的README, 直接用CPAN在线安装即可
使用直接:
$mtop
然后输入mysql的用户名和密码即可

just DO NOT support IE