我为什么放弃使用cacti

May 7th, 2008 Sparkle 6 comments

本来想趁着把cacti从我的生产服务器中移除之前,把我之前的安装配置写成一篇文章,结果发现我已经无法理解cacti是怎么配置的,这也是我放弃使用它的其中一个原因。

在这里,我先说说cacti和mrtg、rrdtool之间的关系,或许还有一些朋友不是很了解。mrtg和rrdtool都是Tobi Oetiker的作品,rrdtool是一个循环式数据库工具,它只负责存储数据,而mrtg是一个采集和画图工具。经常我们能看到cacti和mrtg的对比,那是因为他们两者的功能是一致的,都是采集画图,其实cacti也是是用rrdtool来存储数据,甚至更多其他的网管软件,都是使用rrdtool来存储,我只想说,rrdtool是一个神物。绝大部分人都认为cacti比mrtg好,的确,mrtg比较久远了,功能也比较欠缺,cacti通过php和mysql的辅助提供更多的功能,也提供更直观的界面

但是,cacti太复杂了。需要php(还好),需要mysql(我真的没有的话怎的),还有那个烂鬼snmp协议(当然,mrtg也是通过snmp采集协议的)。我真的不明白,snmp是一个怎样的简单网络管理协议,我觉得一点也不简单,也不直观。或许可能是因为我没有受过正统的网管培训的缘故?说实在话,我真的不知道当初我是怎么把linux下面的snmpd的配置调出来的,基本上完全不明白每一个参数是什么意思,参数又是怎么跟网络流量,硬盘空间挂上关系。当然,如果你的对象是一些cisco设备就不一样,一般情况下他们都是预配置好暴露什么数据。但是如果你的设备是一台linux服务器,那使用snmp协议就变得很麻烦。

我需要一种agent模式的网管软件,而不是一个什么简单通用的网络协议,agent跟它的采集器之间跑什么协议我不关心,当然如果可以简单地做二次开发就更好了。其实,在linux下使用snmp来采集数据,某种程度都可以说是一种agent模式,因为我需要在linux机器上安装snmpd这个agent,只是这个agent很难配置。反正我都要在linux上面安装软件的,何不选择一个很直观的agent模式的软件呢,而且是可以直接调用shell之类的实现监控script的功能,说实在话,怎么通过snmpd然后调用script或许我需要的数据,我真的不知道。

于是,我选择了nagios,很简单明了的使用方法,和plugins编写方法,我甚至还用ruby写了一个script来监视某个进程是否还在运行的plugin。可惜nagios并不支持数据采集,它仅仅是一个监控,监视某些状态值是否正确,而没有把数据值的历史记录下来,nagios并不使用rrdtool。其实,nagios并不是跟cacti/mrtg等同的工具,我还需要一个采集画图的工具。再搜索nagios资料的时候,我发现twitter也是是用nagios的,另外他们还是用了munin。munin正是我也需要的东西,agent模式,不需要mysql,方便的插件编写。我只花了半天时间就把它使用起来了,迟点还打算写一些munin的插件。

我是没有打算把cacti的安装配置使用写下来了,迟点我把nagios和munin的一些心得写下来吧。

Categories: 互联网 Tags: , ,

并发相关

March 26th, 2008 Sparkle 1 comment

http://www.javaeye.com/post/498557

copy on write array list
ConcurrentHashMap
ReentrantLock
ReentrantReadWriteLock
CAS
我都有在用,JDK内置
一直都想写一些关于它们的文章,不过始终太松散,而且我是知道原理然后直接用API而已

我随便说一些
楼主的copy on write模式是可取的,JDK很早就引入copy on write array list来处理Listener部分,在写入非常非常少的情况下,copy on write其实是很好的。至于楼主的实现好不好就不知道了

ConcurrentHashMap用了多个锁来处理,里面有一个一个的bucket来隔离锁,默认就是16个bucket&锁。但是它也有缺点,就是不能保证数据绝对准确,例如他的size就是不准确的。但是它肯定是线程安全的

ReentrantLock是可以代替synchronized的东西,除了写起来比synchronized难稍稍。默认是non-fair模式,比synchronized快很多,如果改成fair就会下降到跟synchronized差不多

ReadWriteLock很简单,read不互斥,write互斥

CAS就是AtomicInteger之类的了,使用了CPU的交换指令,理论上比锁快,但是在高并发的环境一样会下降

你们还是看一下JDK源代码和JavaDoc好过了,你们的讨论本来就有答案的

Categories: Uncategorized Tags:

Mercurial续

March 19th, 2008 Sparkle 1 comment

上次谈到一些Mercurial的事情,后来因为忙别的事情没有继续写下去。中途跟cyfdecyf通过几次email讨论Mercurial。总体来说,我对Mercurial和分布式版本管理的理解还是比较松散的,比较难形成文章,但还是很希望把我所知道的写出来。

我对分布式版本管理的理解很简单。首先这里假设你有一般版本管理软件的概念(CVS或者SVN)。假设你在家里装了一个SVN服务器,你在家里编写的代码都提交上去。在公司也装了一个SVN,你在公司编写的代码也都提交上去。这里就有两个完全独立的SVN服务器了。分布式版本管理,就是这两个SVN服务器之间可以互相提交,其操作就像你提交上其中一台SVN那样,SVN之间互相提交就会将多个changeset同时提交。而且这两个SVN服务器没有主次之分,这样处理是很容易混乱的,实际上,我们会架设另一个SVN服务器,作为两个SVN的父,两个SVN向父提交changeset。这个行为仅仅是方便我们管理的一个比较好的参考做法,并没有强制。另外,当然SVN服务器是不支持互相提交的,于是我们需要一个分布式版本管理软件。

个人觉得,一台SVN就好像一台MySQL,我们只有一个数据库。而分布式版本管理就好像Master-Master MySQL集群。有经验的朋友就会知道,在集群中使用自增字段是不可取的,就像SVN的changeset id是自增的不能适应分布一样。做MySQL集群很经常会用UUID作为主键,分布式版本管理也使用了类似的机制来保证多个库之间的changeset有唯一的ID不会冲突。这个已经是比较细节的处理问题。这里暂时不打算细节研究具体的机制或者使用方法,先有一个大概的概念,看软件的refrence很快会上手的。

再待续

预告:
权限问题
Mercurial目前的情况
远程模式
在Dreamhost上使用Mercurial
Mercurial基本使用

Categories: Uncategorized Tags:

在Linux命令行下发送带附件的邮件

March 10th, 2008 Sparkle 5 comments

购买的虚拟主机没有备份服务(另外收费),但是很好地有SSH权限和Cron权限,于是写了一个简单的shell脚本备份打包mysql的数据,然后email到我的邮箱。但是Linux的mail命令并不能发送附件,于是自己写了一个小程序来发送附件。由于我比较熟悉Ruby,于是就用Ruby来实现,当然你也可以用Python或者Perl来实现

to_mail = ARGV[0]
backup_name = ARGV[1]
backup_attach = ARGV[2]
 
require 'net/smtp'
require 'rubygems'
require 'mailfactory'
 
mail = MailFactory.new
mail.to = to_mail
mail.from = "backup@weavesky.com"
mail.subject = "#{backup_name} backup"
mail.text = "no content"
mail.attach backup_attach
 
Net::SMTP.start("localhost") do |smtp|
  smtp.send_message mail.to_s, mail.from, mail.to
end

后来我找到一些更简单的做法

uuencode file.txt file.txt | mail email@address.com

不过这种做法是不会产生附件的,仅仅将文件内容编码之后当content发送

如果你的机器上有装mutt的话,就更简单了

echo "no content" | mutt -s "subject" -a file.txt email@address.com

我现在就是用这种做法

Categories: Linux Tags:

在Dreamhost上安装Trac(2)

March 6th, 2008 Sparkle No comments

前文说明了如何在Dreamhost安装Trac。安装完了怎么开始使用呢

因为Dreamhost是一个虚拟主机,因此我们不能使用tracd来启动,我们对外的唯一途径就是80端口的web server,也就是apache。而且我们不能自行安装apache的mod,于是也不能使用mod_python或者mod_wsgi的模式,也就是说只能用cgi或者fastcgi的模式,而本文只介绍fastcgi的做法

首先假设我们的站点的目录是~/mysite,而trac的目录在~/mytrac,而且我们已经初始化了一份trac

这里我把站点的目录和trac的目录分开,这样方便管理,而且站点其实需要很少文件的。我们只需要一个index.fcgi和一个.htaccess

这里是index.fcgi的内容

#!/bin/bash
 
export TRAC_ENV="${HOME}/mytrac"
 
export LD_LIBRARY_PATH=${HOME}/python/lib:${LD_LIBRARY_PATH}
export LD_RUN_PATH=${HOME}/python/lib:${LD_RUN_PATH}
export PATH=${HOME}/python/bin:$PATH
 
exec ${HOME}/python/bin/python ${HOME}/python/share/trac/cgi-bin/trac.fcgi

由于我们的python是安装在用户目录的,因此需要更多的预设环境变量
其实你也可以直接copy trac.fcgi过来在头部加上配置,但是我更喜欢自己些一个文件然后exec默认的fcgi文件
而且我exec的时候,可以直接指定使用的python的路径,而在trac.fcgi头部标注路径的做法似乎不太生效

接下来就是.htaccess文件

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [L]
RewriteRule ^$ index.fcgi
 
AuthType Basic
AuthName "Trac"
AuthUserFile ${HOME}/mytrac/trac.htpasswd
Require valid-user

首先就是rewrite了,把所有的请求都rewrite给index.fcgi
然后就是认证。非常可惜,Dreamhost并不支持在.htaccess里面使用Location指令,因此我不得不把整个site都加入验证了,因此我的site变得完全private了,本来应该只是针对/login做验证。我尝试了很久都没有解决方案

so it’s done

Categories: 互联网 Tags: ,

在Dreamhost上安装Trac

March 6th, 2008 Sparkle No comments

在公司使用了一段时间的Trac,觉得很不错,于是想在Dreamhost上安装一个Trac,方便记录自己的一些想法,也可以用作跟朋友一起做一些小项目。本文就是介绍如何在Dreamhost上安装Trac

Dreamhost的wiki里面也有提及如何安装Trac,但是相应的版本比较旧了,而且感觉也不是很完整,在参考wiki来安装的时候也碰到不少问题。最后还是决定安装目前最新版的Trac 0.11。之前介绍的在公司安装的是0.10,一来在windows下0.10一来的包都有二进制版本,二来那个时候0.11还没有很成熟。现在Trac官方网站已经把0.11的安装说明作为默认的了,看来0.11很快就要发布了。另外也因为在linux下安装本身就没有现成的二进制包,而0.11依赖的包更少,更容易安装。

Dreamhost上的python版本是2.3.5,另外因为没有办法使用根用户,所以索性在自己的用户底下安装最新的python2.5.1,更加容易处理。

从python网站下载Python-2.5.1.tgz,然后参看Dreamhost的wiki安装

cd
mkdir python
tar -zxvf Python-2.5.1.tgz
cd Python-2.5.1
./configure --prefix ~/python/ --enable-shared
make
make install
install -c -m 644 ./libpython2.5.a ~/python/lib/
install -c -m 755 ./libpython2.5.so ~/python/lib/
install -c -m 755 ./libpython2.5.so.1.0 ~/python/lib/

我把它安装在我的用户目录的python/下,有几个lib在用户模式下安装并不会copy到正确的位置,因此需要自己处理一下

然后就可以通过

~/python/bin/python

来测试是否正常工作

接着修改我们的.bashrc

export LD_LIBRARY_PATH=${HOME}/python/lib:${LD_LIBRARY_PATH}
export LD_RUN_PATH=${HOME}/python/lib:${LD_RUN_PATH}
export PATH=${HOME}/python/bin:$PATH

再测试一次正常工作

. ~/.bashrc
python

剩下来的工作,主要就是参看Trac官方提供的Install手册

先安装easy install

wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py

接着用easy install安装Trac和依赖的包

easy_install Pygments
easy_install Genshi
easy_install Trac

运行

tracadmin

成功,现在Trac已经可以开始使用了

待续

Categories: 互联网 Tags: ,

令你的Mac Term更好用

February 29th, 2008 Sparkle 2 comments

一直都认为Mac的Term很难用,包括内置的,还有很多人推荐的iTerm
我一直都在用iTerm,但是有很多问题,显示不了中文,输入不了中文,在VI或者一些软件下面不能用方向键(甚至我ssh到一台linux主机都不能用)

在windows平台的时候,使用putty或者securecrt等term软件,都有一大堆设置可以使用.而iTerm不停出新版本,也不见有多少个设置.就算用Linux,也没有那么多问题.还真的有狠心把MacBook装成Linux算了的想法

网上没有任何这方面的资料,还到一些blog里面留言询问别人的心得,也没有结果

研究了很久,终于知道怎么处理了

首先是方向键问题,我突然想想有可能emacs的键位可以使用,结果真的可以.^N ^P ^B ^F分别代表上下左右,这样用了一段时间
后来突然想起我在securecrt在设置把TERM改成Linux,改不会是有影响
于是在~/.profile加入

export TERM=linux

果然,方向键都有效了,整个操作变得跟Linux一样.原来securecrt的设置只是主动传给shell,而并不是它自己的设置.而且ssh到linux主机也正常了.后来研究发现,TERM会跟随ssh传递到远端shell,当然你可以自己再修改一次.

然后就是中文问题了,经过研究发现,我的Linux系统里面有一个文件/etc/inputrc
里面有一些关于meta的设置,而MacOS下面并没有这个文件
于是我在~/.inputrc加入一样的meta设置

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

然后把iTerm的Encoding改成UTF-8

另外还在~/.profile加入

alias ls="ls -wG"

现在ls终于能看见中文,而且输入中文也正常.不过delete文字不太正常,还没找到解决方法.

Mac默认就是按照UTF-8存储中文的,如果连上Linux并不是用UTF-8而是用GBK的话,可以临时修改iTerm的Encoding来查看

Categories: 苹果 Tags:

给《程序员》写的MINA文章已经出刊了

February 26th, 2008 Sparkle 5 comments

第一次给杂志写文章,没什么经验,行文一般般,呵呵。不过也是能顺利出刊。

对文章有任何意见和建议,或者讨论MINA,可以在这里留言

迟点我再写一些MINA的心得

Categories: Uncategorized Tags:

在CentOS4上安装JMagick

February 21st, 2008 Sparkle No comments

用Java做网站经常要处理用户上传的图片,例如生成缩略图等等。虽然Java可以使用Java2D进行一些图片操作,但是功能和效率实在太差了。目前比较好的是用JMagick来进行图像处理,不过JMagick是通过JNI调用ImageMagick的,对平台有一定依赖。本篇文章就是在CentOS4上安装JMagick。

版本问题
CentOS4内置的软件版本一直都比较低,ImageMagick就只有6.0.7。另外JMagick也很久没有更新了,最新版是6.2.6-0,对应使用ImageMagick 6.2.6。而ImageMagick官方网站上只有6.3.8。情况有点混乱,最后决定使用最新版的ImageMagick和最新版的JMagick,似乎工作正常。

从ImageMagick官方ftp上下载最新版的ImageMagick和JMagick(是的,这里也有下载),分别解开。进入ImageMagick目录,运行

./configure –prefix=/usr/local/ImageMagick
make
make install

因为我不想跟系统的ImageMagick相冲,于是安装到独立的目录里面了

然后进入JMagick的目录,运行

./configure –prefix=/usr/local/jmagick \
–with-magick-home=/usr/local/ImageMagick \
–with-java-home=/opt/jdk
make all
make install

因为我的jdk是自己安装的,所以直接指定了。如果你遇到找不到java的错误,检查一下你是否配置了JAVA_HOME环境变量等,实在不行,就加上这个

export PATH=/opt/jdk/bin:$PATH

如果提示找不到ImageMagick相关资源,就加上这个

export PATH=/usr/local/ImageMagick/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/ImageMagick/lib

安装成功之后,就是在tomcat里面使用的问题了,我不习惯在整个系统里面增加环境变量的做法,一般来说,我会在具体的引用启动脚本里面加上环境变量的配置

打开tomcat/bin/catalina.sh,在顶部加入

LD_LIBRARY_PATH=/usr/local/ImageMagick/lib
CATALINA_OPTS=”-Djava.library.path=/usr/local/jmagick/lib”

测试成功

Categories: 互联网 Tags:

SSH over proxy

February 18th, 2008 Sparkle 1 comment

一直都是用SecureCRT连接ssh服务器
由于我们的网络环境比较特殊,服务器在电信,但是我们办公的出口是网通
于是我用了一个在双通机房的sock服务器来proxy
SecureCRT很简单就可以设置使用代理了

今天在研究rsync,打算over ssh来使用
用cygwin装了rsync和openssh
但是直接用ssh连接实在太慢了
研究了半天,终于搞定ssh的proxy配置

这里得知,通过在~/.ssh/config加入ProxyCommand来实现
但是我试过几个版本的netcat,都没有-X -x的参数
而connect-proxy根本不知道在哪里能找到

有一个朋友说可以用Corkscrew,但是它只支持http proxy

还有一个connect.c,不过网站挂了

最后终于被我找到这个,似乎就是connect.c的新网站,使用方法都一模一样

Features of connect.c are:
* Supports SOCKS (version 4/4a/5) and https CONNECT method.
* Supports NO-AUTH and USERPASS authentication of SOCKS
* Partially supports telnet proxy (experimental).
* You can input password from tty, ssh-askpass or environment variable.
* Run on UNIX or Windows platform.
* You can compile with various C compiler (cc, gcc, Visual C, Borland C. etc.)
* Simple and general program independent from OpenSSH.
* You can also relay local socket stream instead of standard I/O.

因为我是在windows下使用cygwin,懒得用gcc编译了
下载了connect.exe,放在c:\windows
然后在~/.ssh/config加入

ProxyCommand connect -S x.x.x.x:x %h %p

Categories: 互联网 Tags: