Tag Archive for '运维'

MongoDB日志回滚

# kill -SIGUSR1 `cat /var/run/mongodb.pid`

用在shell脚本里时,命令要改成这样: kill -USR1 `cat /var/run/mongodb.pid`

参考:http://www.mongodb.org/display/DOCS/Logging#Logging-Rotatingthelogfiles

RHEL5下编译MongoDB

很多人都说自己编译的稳定好用,我也来试试:

1. 参考官方文档,手工编译Spider Monkey

# curl -O ftp://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz
# tar zxvf js-1.7.0.tar.gz
# cd js/src
# export CFLAGS="-DJS_C_STRINGS_ARE_UTF8"
# make -f Makefile.ref
# JS_DIST=/usr make -f Makefile.ref export

2. 安装scons,用官网的rpm包就行。

3. 重新编译pcre。自带的编译时没带–enable-unicode-properties参数,mongdb启动时会提示:warning: some regex utf8 things will not work. pcre build doesn’t have –enable-unicode-properties. RPMS包是在这里找到的。

# rpm -ivh pcre-6.6-2.el5_1.7.src.rpm
# vi /usr/src/redhat/SPECS/pcre.spec
%configure --enable-utf8
修改成
%configure --enable-utf8 --enable-unicode-properties
# rpmbuild -ba /usr/src/redhat/SPECS/pcre.spec
# rpm -Uvh /usr/src/redhat/RPMS/x86_64/pcre*.rpm

4. 安装1.41版本的boost库。这里可以找到编译好的boost库的RPM包。因为后面要编译成静态库,还需要安装boost141-static-1.41.0-2.el5.i386.rpm

5. 开始编译MongoDB

# cd mongodb-src-r1.8.1
# scons --libpath=/usr/lib64/boost141/ \
   --cpppath=/usr/include/boost141/ \
   --release --64 --static all

如果你没有–release和–static选项,可能会看见下面这样的消息
*** notice: no readline library, mongo shell will not have nice interactive line editing ***
解决方法是加上–extralib=ncurses。

6. 安装

# cd mongodb-src-r1.8.1
# scons --libpath=/usr/lib64/boost141/ \
   --cpppath=/usr/include/boost141/ \
   --release --64 --static --prefix=/opt/mongo-1.8.1 install

参考:
1. http://www.mongodb.org/display/DOCS/Building+for+Linux
2. http://hi.baidu.com/farmerluo/blog/item/37364623f35ba55e9922ed2f.html

nrpe使用一例

NRPE的作用是在远程主机上运行Nagios插件,以便监控远程主机。

Ubuntu Server下安装NRPE很方便:

$ sudo apt-get install nagios-nrpe-server nagios-plugins

默认的几个检查命令(check_users, check_load等)都已经在/etc/naigos/nrpe.cfg和/etc/nagios/nrpe_local.cfg配置好了。在Nagios里配置监控服务使用类似如下的监控命令就可以了:

check_command                   check_nrpe!check_load

如果需要自定义监控命令,只需在/etc/nagios/nrpe_local.cfg里设置,重启NRPE服务,再在Nagios里配置监控服务即可。比如,要添加一个监控TCP各种状态的命令,步骤如下:

@remotehost
$ cd /usr/lib/nagios/plugins
$ sudo wget http://www.tuschy.com/nagios/plugins/check_tcp_count
$ sudo chmod +x check_tcp_count
$ cd /etc/nagios
$ sudo vi nrpe_local.cfg
command[check_tcp_count]=/usr/lib/nagios/plugins/check_tcp_count
$ sudo service nagios-nrpe-server restart

@nagioshost
$ sudo vi remotehost.cfg
define service{
        use                                  generic-service
        host_name                      remotehostname
        service_description        Tcp count
        check_command            check_nrpe!check_tcp_count
}

使用Cacti监控JVM

Cacti官方论坛里有几个监控JVM的模板:

导入到Cacti后,需要启用JVM的SNMP Agent,方法如下:
1. 启动JVM的参数里加入-Dcom.sun.management.snmp.port=9998 这个是指定SNMP Agent的监听端口。
2. 设置访问权限

$ sudo cp $JRE_HOME/lib/management/snmp.acl.template $JRE_HOME/lib/management/snmp.acl
$ sudo vi $JRE_HOME/lib/management/snmp.acl

acl = {
  {
    communities = public, private
    access = read-only
    managers = localhost
  }
}

trap = {
  {
    trap-community = public
    hosts = localhost
  }
}

3. 设置配置文件的权限,必须只能为启用JVM的用户只读,否则不能工作。(management.properties不用修改,使用默认配置即可)

$ sudo chmod 600 management.properties snmp.acl
$ sudo chown jetty management.properties snmp.acl

4. 重启JVM,用netstat命令检查9998端口是否已被监听或用snmpwalk命令检查。

$ sudo netstat -tlunp |grep 9998
$ snmpwalk -v 2c -c public localhost:9998 .1.3.6.1.4.1.42

5. 为了让远程的Cacti主机可以访问,可使用snmpd的proxy功能将请求转发到localhost的JVM SNMP Agent上。修改snmpd的配置文件,添加
proxy -v 2c -c public localhost:9998 .1.3.6.1.4.1.42
然后重启snmpd服务。在Cacti主机上以snmpwalk命令检查,应该能得到与上一步中snmpwalk命令一样的输出。snmpwalk -v 2c -c public remotehost .1.3.6.1.4.1.42
6. 至此,可以在Cacti里为JVM主机添加监控图表了,注意Device的SNMP Options配置里SNMP Version要选择Version 2。

参考:

npc安装问题解决一例

CactiNagios都是好用的运维监控软件,NPC(Nagios Plugin for Cacti)是一个Cacti插件,安装后可以在Cacti界面里使用Nagios的功能。官方安装文档在这里

我的安装环境是这样的:

PHP必须安装PDO 和 JSON扩展。由于NPC使用了Ext JS,如果没有JSON扩展,NPC的界面不会出来,只能看到一个空白页面。Ubuntu 6.06下安装PDO可以参考这里

按照官方文档安装配置好后,遇到了没有显示任何数据的问题,host, hostgroup, service, servicegroup等等都看不到。

检查了NPC的数据库表,有数据,说明NDOUtils已经工作。没有出现在界面上,说明是NPC从数据库读出来到界面显示过程中出现的问题。

用Firebug找出NPC界面为了获取显示数据的Ajax请求(比如/cacti/plugins/npc/npc.php?module=servicegroups&action=getHostStatusPortlet),直接在浏览器里访问,可以看到出了异常:Fatal error: Uncaught exception ‘Doctrine_Exception’ with message ‘Couldn’t find class NpcServicegroups’ 。显然是Doctrine没有加载到NPC定义的领域类。

经过一番对Doctrine的调试,发现原因在Doctrine类的loadModels方法(Line 516 in Doctrine.php)

$e = explode('.', $file->getFileName());

这里getFileName返回了带绝对路径的文件名,导致autoload函数失败。改成下面这样就解决了。

$e = explode('.', basename($file->getFileName()));

不过还是不明白为什么getFileName返回的是带绝对路径的文件名,是跟我的系统环境有关系吗?有熟悉PHP的朋友能解释一下就好了。




This work by wolfg is licensed under a Attribution-Noncommercial-Share Alike 2.5 China Mainland.