监控与维护:Ganglia 与应用程序的管理之道
1. 利用 Ganglia 收集指标
Ganglia 是一款强大的监控工具,可用于收集系统和应用程序的各种指标。我们可以通过运行 Puppet 来创建新文件和定时任务,从而在 Ganglia 用户界面中看到新的指标选项。
1.1 现有插件的使用
通常,我们可以寻找现有的 Ganglia 插件,安装并使用它们来收集指标。例如,通过以下 Puppet 代码可以设置一个定时任务来运行 MySQL 指标收集脚本:
cron {
"ganglia_mysql_stats":
user => vagrant,
minute => "*",
command => "/etc/ganglia/gmetric/ganglia_mysql_stats.pl",
require => File["/etc/ganglia/gmetric/ganglia_mysql_stats.pl"]
}
运行 Puppet 后,新的指标将在一分钟内出现在 Ganglia 用户界面的指标选择框中。
1.2 自定义 Gmetric 插件
当没有现成的插件可用于收集特定应用程序(如 MassiveApp)的指标时,我们可以编写自定义的 Gmetric 插件。以收集 MassiveApp 中最近一小时内创建的账户数量为例,步骤如下:
1.
查询 MySQL 获取指标
:
$ mysql -uroot -proot massiveapp_production
mysql> select count(id) from accounts where created_at > (now() - interval 1 hour);
- 编写 Ruby 脚本 :
#!/usr/bin/env ruby
def recently_created_record_count
cmd = 'mysql -uroot -proot --silent '
cmd += '--skip-column-names massiveapp_production --execute '
cmd += '"select count(id) from accounts where '
cmd += 'created_at > (now() - interval 1 hour)"'
`#{cmd}`.strip
end
def publish(count)
puts "Publishing accounts = #{count}" if ARGV.include?("-v")
system("gmetric --name 'accounts' --value #{count} --type uint16")
end
publish(recently_created_record_count)
- 使用 Puppet 管理脚本和定时任务 :
class ganglia::client {
package {
"ganglia-monitor":
ensure => installed
}
service {
"ganglia-monitor":
hasrestart => true
}
file {
"/etc/ganglia/gmetric/gmetric_accounts.rb":
source => "puppet:///modules/ganglia/gmetric/gmetric_accounts.rb",
owner => root,
group => root,
mode => 755,
require => File["/etc/ganglia/gmetric"]
}
cron {
"gmetric_accounts":
user => vagrant,
minute => "*",
command => "/etc/ganglia/gmetric/gmetric_accounts.rb",
require => File["/etc/ganglia/gmetric/gmetric_accounts.rb"]
}
}
1.3 使用 Ruby 库优化指标收集
为了提高性能,我们可以使用 Ruby 库
gmetric
来发送指标。步骤如下:
1.
安装 gmetric 库
:
app $ sudo gem install gmetric
- 修改 Ruby 脚本 :
#!/usr/bin/env ruby
require 'rubygems'
require 'gmetric'
def recently_created_record_count
cmd = 'mysql -uroot -proot --silent --skip-column-names '
cmd += ' massiveapp_production --execute '
cmd += '"select count(id) from accounts where '
cmd += 'created_at > (now() - interval 1 hour)"'
`#{cmd}`.strip.to_i
end
def publish(count)
puts "Publishing accounts = #{count}" if ARGV.include?("-v")
Ganglia::GMetric.send("33.33.13.38", 8649, {
:name => "accounts",
:type => "uint16",
:value => count
})
end
publish(recently_created_record_count)
- 确保 gmetric 库安装 :
package {
"gmetric":
provider => "gem",
ensure => installed
}
2. Ganglia 与 Nagios 集成及升级
Ganglia 和 Nagios 是常用的监控工具,但它们在收集系统级指标时存在数据重复收集的问题。为了解决这个问题,有一些项目致力于实现它们之间的集成。
-
Mike Conigliaro 的 check_ganglia_metric
:使用 Nagios 插件连接到 Ganglia,并根据警告阈值触发警报。
-
Patrick Dubois 的 gmond - zmq
:接收 gmond 守护进程的 UDP 数据包,并将其发布到消息队列,以便监听器将其作为被动检查提供给 Nagios。
此外,Ganglia 的开发速度正在加快,最新版本 3.3.1 带来了 HTML 界面的改进、更好的 Graphite 集成、更新的 Nagios 脚本和各种 bug 修复。我们可以在虚拟机上尝试新版本,看是否值得在生产环境中升级。
3. 应用程序的维护
在部署和监控应用程序后,我们需要考虑应用程序的维护,包括管理日志文件、创建备份、控制操作数据和管理停机时间等。
3.1 管理日志
日志文件的管理是应用程序维护的重要部分。如果不进行适当管理,日志文件可能会占用大量磁盘空间。
Apache 日志管理
:
-
默认配置问题
:默认的 Apache 日志旋转配置会在日志旋转时重启 Apache 和所有 Passenger 进程,这会给用户带来不愉快的体验。
-
解决方案
:使用 Apache 的管道日志旋转功能,避免重启 Apache。具体操作如下:
1. 修改 Apache 配置文件
apache2.conf
:
CustomLog "|/usr/sbin/rotatelogs \
/var/log/apache2/other_vhosts_access.log 86400" vhost_combined
- 使用 Puppet 管理配置文件和删除旧的 logrotate 脚本:
class apache2 {
file {
"/etc/apache2/apache2.conf":
mode => "0644",
owner => "root",
group => "root",
source => "puppet:///modules/apache/apache2.conf",
notify => Service["apache2"],
require => Package["apache2"];
"/etc/logrotate.d/apache2":
ensure => absent;
}
}
Rails 应用程序日志管理
:
对于 Rails 应用程序,我们可以使用 logrotate 来管理日志。以下是一个自定义的 logrotate 脚本:
<%= current_path %>/log/production.log {
missingok
rotate 10
compress
delaycompress
postrotate
touch <%= current_path %>/tmp/restart.txt
endscript
}
使用 Puppet 管理该脚本:
class massiveapp {
$current_path = "/var/massiveapp/current"
file {
"/etc/logrotate.d/massiveapp.conf":
owner => root,
group => root,
mode => 755,
content => template("massiveapp/massiveapp.logrotate.conf.erb")
}
}
通过以上方法,我们可以有效地利用 Ganglia 收集指标,并对应用程序进行维护,确保应用程序的稳定运行。
以下是一个简单的流程图,展示了自定义 Gmetric 插件的创建过程:
graph LR
A[查询 MySQL 获取指标] --> B[编写 Ruby 脚本]
B --> C[使用 Puppet 管理脚本和定时任务]
下面是一个表格,总结了不同日志管理方法的特点:
| 日志类型 | 默认管理方式 | 问题 | 解决方案 |
| ---- | ---- | ---- | ---- |
| Apache 日志 | logrotate 重启 Apache | 影响用户体验 | 管道日志旋转,避免重启 |
| Rails 日志 | 无默认脚本 | 需自定义管理 | 自定义 logrotate 脚本,Puppet 管理 |
4. 备份策略
除了日志管理,备份对于应用程序的维护也至关重要。备份可以帮助我们在数据丢失或损坏时恢复数据,确保应用程序的连续性。
4.1 MySQL 数据库备份
对于 MassiveApp 所使用的 MySQL 数据库,我们可以使用
mysqldump
工具进行备份。以下是一个简单的备份脚本示例:
#!/bin/bash
# 备份目录
BACKUP_DIR="/var/backups/mysql"
# 数据库名称
DB_NAME="massiveapp_production"
# 数据库用户名
DB_USER="root"
# 数据库密码
DB_PASSWORD="root"
# 备份文件名
BACKUP_FILE="$BACKUP_DIR/$(date +%Y%m%d%H%M%S)_$DB_NAME.sql"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
mysqldump -u$DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_FILE
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "备份成功:$BACKUP_FILE"
else
echo "备份失败"
fi
我们可以将这个脚本保存为一个文件(例如
mysql_backup.sh
),并设置定时任务来定期执行备份。
# 每天凌晨 2 点执行备份
0 2 * * * /path/to/mysql_backup.sh
4.2 文件系统备份
除了数据库备份,我们还需要对应用程序的文件系统进行备份。可以使用
rsync
工具将应用程序的文件复制到另一个存储位置。以下是一个示例:
#!/bin/bash
# 源目录
SOURCE_DIR="/var/massiveapp/current"
# 目标目录
DEST_DIR="/var/backups/massiveapp"
# 创建目标目录
mkdir -p $DEST_DIR
# 执行备份
rsync -avz $SOURCE_DIR $DEST_DIR
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "文件系统备份成功"
else
echo "文件系统备份失败"
fi
同样,我们可以设置定时任务来定期执行文件系统备份。
5. 操作数据控制
随着应用程序的运行,操作数据可能会不断增长,这可能会影响应用程序的性能。因此,我们需要采取措施来控制操作数据的增长。
5.1 数据清理
对于一些不再需要的历史数据,我们可以定期进行清理。例如,对于 MassiveApp 中的用户登录记录,我们可以设置一个保留期限,超过期限的记录将被删除。以下是一个简单的 SQL 示例:
DELETE FROM login_records WHERE created_at < (CURRENT_DATE - INTERVAL 3 MONTH);
我们可以将这个 SQL 语句封装在一个脚本中,并设置定时任务来定期执行。
5.2 数据归档
对于一些重要但不经常使用的数据,我们可以将其归档到另一个存储位置。例如,将历史订单数据归档到一个单独的数据库或存储桶中。这样可以减少主数据库的负担,提高应用程序的性能。
6. 停机时间管理
无论是计划内的停机(如系统升级、维护)还是计划外的停机(如硬件故障、网络问题),我们都需要进行有效的管理,以减少对用户的影响。
6.1 计划内停机
在进行计划内停机之前,我们需要提前通知用户,并制定详细的停机计划。停机计划应包括停机时间、停机原因、预计恢复时间等信息。在停机期间,我们可以进行系统升级、维护等操作,确保应用程序在恢复运行后能够正常工作。
6.2 计划外停机
对于计划外停机,我们需要尽快响应并解决问题。可以设置监控系统,及时发现停机问题,并通过短信、邮件等方式通知管理员。管理员需要迅速定位问题并采取相应的措施进行修复,以尽快恢复应用程序的运行。
以下是一个流程图,展示了应用程序维护的主要步骤:
graph LR
A[管理日志] --> B[备份数据]
B --> C[控制操作数据]
C --> D[管理停机时间]
下面是一个表格,总结了不同维护任务的要点:
| 维护任务 | 要点 |
| ---- | ---- |
| 管理日志 | 避免日志文件占用过多磁盘空间,根据不同类型日志采用合适管理方法 |
| 备份数据 | 定期备份数据库和文件系统,确保数据可恢复 |
| 控制操作数据 | 清理历史数据,归档重要但不常用数据 |
| 管理停机时间 | 提前通知计划内停机,快速响应计划外停机 |
通过以上的监控、维护和管理策略,我们可以确保 MassiveApp 能够稳定运行,为用户提供良好的服务体验。同时,我们也可以根据实际情况不断优化这些策略,以适应应用程序的发展和变化。
超级会员免费看
2

被折叠的 条评论
为什么被折叠?



