Architecture
记录一些关于Linux服务器管理和系统架构方方面的信息。
如何得到每天某时刻的时间戳
Nov 1st
public static long getDaybreakTime() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTimeInMillis();
}
其实代码是比较简单的,相信这段代码还是有很多用处的。
可以使用到的场景有:
- 设置在某一时刻之前,必须更新缓存里的数据;
- 在Quartz中,统计和分析昨天的数据;
- 合并某一天内发生的动态;
- ……
2010系统架构师大会
Sep 1st
2010年8月27、28日,由IT168、ChinaUnix、ITPUB、IXPUB共同主办的SACC2010系统架构师大会在北京永泰福朋·喜来登大酒店成功举行。两天的盛会以七个技术专场为平台,内容涵盖从系统架构、网络、安全、存储、数据库、移动互联、云计算等与架构师相关的方方面面。
相关地址:
http://sacc.it168.com/
部分PPT下载地址:
1、架构师大会-架构设计专场
http://linux.chinaunix.net/SACC2010/topic1.zip
2、架构师大会-架构设计与存储管理专场
http://linux.chinaunix.net/SACC2010/topic2.zip
3、架构师大会-应用系统优化与流量管理
http://linux.chinaunix.net/SACC2010/topic3.zip
4、架构师大会-可扩展数据库架构
http://linux.chinaunix.net/SACC2010/topic4.zip
5、架构师大会-移动互联网产品架构设计
http://linux.chinaunix.net/SACC2010/topic5.zip
6、架构师大会-系统安全与服务监控
http://linux.chinaunix.net/SACC2010/topic6.zip
7、架构师大会-云计算分布式应用实践
http://linux.chinaunix.net/SACC2010/topic7.zip
ThreadPoolExecutor策略
Aug 27th
ThreadPoolExecutor的策略策略有四种
CallerRunsPolicy【重要的任务】
当异步线程池满了时,使用阻塞式,丢弃异步的方式执行,此策略比较保守,不丢弃,不放弃。
AbortPolicy【不太重要,但需要监控的任务】
中止任务,并抛出异常。
DiscardPolicy【满足最先请求的任务】
丢弃当前线程,也就是新来的任务丢弃掉。
DiscarOldestPolicy【满足最后请求的任务】
丢弃任务列队里最老的线程。
对于ThreadPoolExecutor来说,还有关注的地方是,他有3种列队。
- SynchronousQueue
- LinkedBlockingQueue
- ArrayBlockingQueue
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