我为什么放弃使用cacti
Posted on May 7, 2008 - Filed Under Uncategorized
本来想趁着把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的一些心得写下来吧。
并发相关
Posted on March 26, 2008 - Filed Under Uncategorized
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好过了,你们的讨论本来就有答案的
Mercurial续
Posted on March 19, 2008 - Filed Under Uncategorized
上次谈到一些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基本使用
在Linux命令行下发送带附件的邮件
Posted on March 10, 2008 - Filed Under Linux
购买的虚拟主机没有备份服务(另外收费),但是很好地有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
我现在就是用这种做法
在Dreamhost上安装Trac(2)
Posted on March 6, 2008 - Filed Under Uncategorized
前文说明了如何在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
在Dreamhost上安装Trac
Posted on March 6, 2008 - Filed Under Uncategorized
在公司使用了一段时间的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已经可以开始使用了
待续
令你的Mac Term更好用
Posted on February 29, 2008 - Filed Under 苹果
一直都认为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来查看
给《程序员》写的MINA文章已经出刊了
Posted on February 26, 2008 - Filed Under Uncategorized
第一次给杂志写文章,没什么经验,行文一般般,呵呵。不过也是能顺利出刊。
对文章有任何意见和建议,或者讨论MINA,可以在这里留言
迟点我再写一些MINA的心得
在CentOS4上安装JMagick
Posted on February 21, 2008 - Filed Under 互联网
用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”
测试成功
SSH over proxy
Posted on February 18, 2008 - Filed Under 互联网
一直都是用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加入
keep looking »ProxyCommand connect -S x.x.x.x:x %h %p