Architecture
记录一些关于Linux服务器管理和系统架构方方面的信息。
ANT自动化压缩合并JS/CSS和更改版本号
Jul 20th
最近做到了前端优化的一些工作,涉及到了自动化部署的问题。前端优化无非是雅虎的优化法则,不过如果想把优化法则加到自动化部署中去的话,下面的几种方法可以帮助你。
1、JS/CSS压缩脚本
<!-- 压缩JS,CSS -->
<target name="compress">
<apply executable="java" parallel="false" failonerror="true">
<fileset dir="${html-js}" includes="**/*.js" />
<arg line="-jar" />
<arg path="${yui-compressor}" />
<arg line="--charset utf-8" />
<srcfile />
<arg line="-o" />
<mapper type="glob" from="*.js" to="${webhtml-js}/*-min.js" />
<targetfile />
</apply>
<apply executable="java" parallel="false" failonerror="true">
<fileset dir="${html-css}" includes="**/*.css" />
<arg line="-jar" />
<arg path="${yui-compressor}" />
<arg line="--charset utf-8" />
<srcfile />
<arg line="-o" />
<mapper type="glob" from="*.css" to="${webhtml-css}/*-min.css" />
<targetfile />
</apply>
</target>
2、更新JSS/CSS版本号
<!-- 更新静态文件的版本号 -->
<target name="version">
<tstamp>
<format property="TIMESTAMP" pattern="yyyyMMddHHmmss" locale="en" />
</tstamp>
<loadfile property="svn.version" srcFile="./.svn/entries">
<filterchain>
<headfilter lines="1" skip="3" />
<deletecharacters chars="\n" />
</filterchain>
</loadfile>
<delete file="${webinf-ftl}/config.ftl"/>
<copy file="${ftl-app}/config.ftl" tofile="${webinf-ftl}/config.ftl" />
<replace file="${webinf-ftl}/config.ftl" token="$version$" value="${svn.version}" />
</target>
接下来就是合并JS/CSS文件
<!-- 合并静态文件 -->
<target name="js-concat">
<concat destfile="${webhtml-js}/jquery.js" encoding="utf-8" append="false">
<path path="${webhtml-js}/jquery.core-min.js" />
<path path="${webhtml-js}/jquery.cookie-min.js" />
<path path="${webhtml-js}/jquery.timeago-min.js" />
<path path="${webhtml-js}/jquery.utils-min.js" />
<path path="${webhtml-js}/jquery.watermarkinput-min.js" />
</concat>
</target>
海量数据迁移
May 11th
#按照文件的行数拆分文件
split -l 5000 large_file.txt new_file_prefix
#批量重命名文件夹里的文件
find -name 'x*' -printf %f\\n|awk -F'.' '{print $1}'|xargs -i{} mv {} {}.txt
这次迁移Exif信息,数据有4亿的数据,为了不影响另外一个系统,采用单节点数据文件迁移(具体还有很多因素)。
首先是拆分数据文件为小文件,即使程序错误或者其它中断,也只影响少量数据,重新迁移的话,只有少量数据是空转。
当然使用小文件还有个原因是考虑到要记录没有处理的数据,所以这些文件数据是要读到内存中去的。
还有就是可以做到多进程多线程迁移数据,只有你的数据库足够强大,抗得住压力。
此过程中可以以文件为单位,采用多线程操作,可以提高速度。
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(15, 100, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), new ThreadPoolExecutor.DiscardOldestPolicy());
这个线程池当处理不过来时,会丢弃任务,所以我是采用这样的方式解决这个问题的。
while (threadPool.getPoolSize() > 80) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
得到Java进程的PID
String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
迁移的效率还是比较高,导致数据库扛不住了,必须在白天放慢迁移速度。
写在项目下线后
Apr 22nd
最近两年前开发的那个项目下线了,回想起两年来对这个项目做出的努力和从这个项目所获得的收获,感到无比的庆幸。
刚毕业后找了个小工作,自己摸爬滚打了好一整子,一顿瞎搞,虽然也有点小成,但总觉得想学到很多,想施展更多。
在这样的一个情况下,我加入了这个项目,虽然有件事情来得太突然,自己都没有预料到,但总归一切变好,自己始终没有放弃,一直低调的坚持下来,所以我很感谢当时在我身边的每一个人的关怀。
完整的经历了整个项目,虽然这个项目只有两年,但足以让我全盘把握,了解了并掌握了整个项目的开发,受益匪浅,估计还可以使用好几年:)
其实项目本身好无价值,贵在我们在项目上所花费的心血,所赋予的期望和所得到的回报,所以这是我人生的一个转折点,我踏进了项目开发的大门。
下面会分小块来讲解我的感悟:
解读Nginx的Memcached Module
Dec 1st
发现SyntaxHighlighter这个代码高亮插件有点问题,所以还是发个文件地址吧。
ng_http_memcached_module.c
当负载过高时重启Apache
Nov 23rd
最近半年碰到了几次,由于“蜘蛛”导致机器挂掉了,所以想出了这个方法,等系统负载过高的情况下,直接重启Apache。这就是Twitter提倡的那样,等进程杀死你之前,你先杀死他(原话不记得了)。其实这种方法早就在业界使用了。
来吧,看看我写的脚本。
checkload.sh
#!/bin/sh
TOP_SYS_LOAD_NUM=5
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
echo "##" $(date +"%y-%m-%d %H:%M:%S") "pkill httpd" `ps -ef | grep httpd | wc -l`
pkill httpd
sleep 10
for i in 1 2 3
do
if [ `pgrep httpd | wc -l` -le 0 ]
then
/home/app/httpd/bin/apachectl start
sleep 30
echo "##" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
done
else
if [ `pgrep httpd | wc -l` -le 0 ]
then
/home/app/httpd/bin/apachectl start
sleep 30
echo "##" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
fi
然后在crontab里增加定时执行的命令
*/2 * * * * (/root/checkload.sh >>/root/checkload.log)
每两分钟检查一次系统负载。
key/value数据库
Nov 12th
QDBM:
NDBM : New DBM written by BSD
SDBM : Substitute DBM written by Ozan S. Yigit
GDBM : GNU Database Manager written by Philip A. Nelson et al
TDB : Trivial Database written by Andrew Tridgell et al
TinyCDB : Constant Database written by Michael Tokarev
Berkeley DB : Berkeley DB written by Sleepycat Software
程序架构
Nov 4th
大家都听过系统架构,软件架构,程序也要架构吗?
当然需求,我们不是常说“三层架构”吗?表现层,业务层,数据层。只有充分理解了三层架构的含义,才能更好的和其它人一起开发,使组内成员达成一致,能使程序路径清晰,明确任务分工和协作人员,提高了开发效率。
在此之前还想解释一个名词,程序设计,
所以,我想把程序架构解释成:对整个代码结构和规范的一个蓝图,有待补充。
下面是我做的拍拍项目的程序架构,由Raymond主持的项目,当时我是等Raymond架构好了业务层和数据层后加入项目的。也正是由于良好的程序架构,使得我很快的熟悉了代码,很容易的就理解了思想和需求,这不是就把方法的注释写到方法名里,把产品的需求写到程序架构里吗?
其实这个规范主要是遵循了一个达成共识,会让大多数人习惯。
表示层:按页面来分,比如:上传控制器,组图列表控制器。
业务层:按业务的需求来分,比如:图片管理器(组图,单图),用户管理器(用户信息,用户权限)。
数据层:这个是最好分的了,一般也不会有什么大的标新立异,直接和表一一对应。
所以说,经历了这个项目,培养了一种思维方式。
什么是反向代理
Nov 4th
Reverse Proxy 反向代理
反向代理指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端。
Windows环境下的项目环境搭建(Tomcat+Apache+Memcached+ActiveMQ+MySQL)
Jul 26th
首先到 http://labs.xiaonei.com/apache-mirror/ 下载相关的软件。
http://labs.xiaonei.com/apache-mirror/activemq/apache-activemq/5.2.0/apache-activemq-5.2.0-bin.zip 这个软件现在不用,不过以
后会用的。
http://labs.xiaonei.com/apache-mirror/httpd/binaries/win32/apache_2.2.11-win32-x86-no_ssl.msi
http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.exe
http://labs.xiaonei.com/apache-mirror/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.28/mod_jk-1.2.28-httpd-2.2.3.so
http://www.splinedancer.com/memcached-win32/memcached-1.2.4-Win32-Preview-20080309_bin.zip 这个软件以后也会用
现在这几个软件被安装在以下目录
D:\Program Files\Apache Software Foundation\Tomcat 6.0
D:\Program Files\Apache Software Foundation\Apache2.2
D:\Program Files\Apache Software Foundation\apache-activemq-5.2.0
首先把mod_jk-1.2.28-httpd-2.2.3.so文件复制到
D:\Program Files\Apache Software Foundation\Apache2.2\modules
改名为mod_jk.so
再在
D:\Program Files\Apache Software Foundation\Apache2.2\conf
创建文件
workers.properties
内容为
workers.tomcat_home=D:\Program Files\Apache Software Foundation\Tomcat 6.0
workers.java_home=D:\Program Files\Java\jdk
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1
然后在文件D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf 找到
LoadModule rewrite_module modules/mod_rewrite.so
去掉前面的#号
再添加
LoadModule jk_module modules/mod_jk.so
在文件的最后添加
JkWorkersFile “D:\Program Files\Apache Software Foundation\Apache2.2\conf\workers.properties”
JkLogFile “D:\Program Files\Apache Software Foundation\Apache2.2\logs\mod_jk2.log”
JkLogLevel inf
<VirtualHost *:80> DocumentRoot "D:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\iguoer" ServerName www.iguoer.com DirectoryIndex index.html index.htm index.jsp ErrorLog logs/shsc-error_log.txt CustomLog logs/shsc-access_log.txt common JkMount /dwr/* ajp13 JkMount /*.jsp ajp13 JkMount /*.do ajp13 </VirtualHost>
现在去配置Tomcat
找到文件
D:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\server.xml
如果你安装的Tomcat和我的版本是一样的话,在文件的最后面应该可以找到
<Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host> </Engine>
我修改为
<Engine name="Catalina" defaultHost="www.iguoer.com"> <Host name="www.iguoer.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="iguoer" reloadable="true" /> </Host> </Engine>
修改这段后,此时Tomcat的根目录为
D:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\iguoer
这样用Eclipse的插件,就能启动项目为根目录启动了。
当然还可以配置不同域名访问不同目录
<Engine name="Catalina" defaultHost="www.iguoer.com"> <Host name="www.iguoer.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="iguoer" reloadable="true" /> </Host> <Host name="img.iguoer.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="D:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\iguoer" reloadable="true" /> </Host> </Engine>
当然不要忘记修改你的C:\Windows\System32\drivers\etc\hosts
127.0.0.1 www.iguoer.com
127.0.0.1 img.iguoer.com
127.0.0.1 memcached.iguoer.com
127.0.0.1 mysql.iguoer.com
127.0.0.1 mq.igueor.com
