存档

作者存档

HTTPS连接最初的若干毫秒

2009年10月23日 hashei 没有评论

写在前面:全文这么看一遍,等于把大学里的《信息安全》课程又温故了一下。理论就应该这么结合着实践来讲,早两年看到就能启发俺如何做毕业设计,不用搞的那么头痛了。

作者: Jeff Moser
译者: 马国耀
原文链接:http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser

当你在浏览了一个网站上面的商品之后,点击“继续并结帐”时会发生什么?本文即将对(浏览器)与Amazon建立安全连接的整个过程中最初的若干毫秒进行分析。当你点击继续按钮时一个新的页面将被加载:

clip_image001

在短暂的220毫秒内,发生了很多有趣的事情,Firefox修改了地址栏的颜色,并在其右下角放置了一个锁状的图标。在我最喜爱的网络工具Wireshark以及略微修改的Firefox调试版的帮助下,我们可以对正在发生的事情看个究竟。

根据RFC 2818协议的规定,Firefox明白“https”意味着它应该连接Amazon.com的443端口

clip_image002

大多数人将HTTPS和SSL(Secure Sockets Layer)联系起来,SSL是Netscape公司在90年代中期发明的。随着时间的推移这种说法就渐渐变得不准确了。由于Netscape失去了市场份额,它将SSL的维护工作移交给因特网工程任务组(IETF)。第一个后Netscape版本被重新命名为安全传输层协议(TLS),TLS1.0是在1999年1月份发布的。由于TLS诞生都10年了, 所以真正的“SSL”传输其实是几乎见不到。

阅读全文…

分类: 信息安全 标签: , , , ,

IT人应该如何学习

2009年10月20日 hashei 1 条评论

当年学习Windows知识的时候听了他不少broadcast,现在看的少了但是博客一直在订阅。这是他新开的,头一个系列的文章就很不错

07年的时候曾经讲过一节Webcast,名叫《使您成为Windows专家的一些学习习惯》。直到最近,还经常收到听众关于这一节课反馈和心得的电子邮件,可见学习方法论是大家非常关心的问题。因此,我的Blog就从讨论学习开始吧。

IT是一个需要活到老,学到老的行当。在摩尔定律的推动下,技术领域的革新和提高每天都在发生,这使得IT领域的工作者必须不断的学习,才能紧跟技术的脚步。与此同时,IT人大多都是“热爱学习”的好同志,IT的细分领域非常广泛,从CPU电路设计到PhotoShop磨皮大法,无一不是IT人感兴趣而希望学习的东西。在外部“摩尔定律”和内心“求知欲望”的双重推动下,IT人在学习之路“上下而求索”。然而,我们仍旧面临很多困惑,“学什么”、“怎么学”、“学了有什么用”,不断的陷入一些学习误区,感觉学习的非常辛苦,但是自己的水平和能力却提高的非常有限。在“IT人的学习方法论”这个Blog系列中,我会跟大家共同探讨一些技术学习方面的误区,IT知识学习的要点和建议。

IT人的学习方法论-1,讨论学习的方向

IT人的学习方法论-2,讨论学习的误区

IT人的学习方法论-3,讨论学习的方法

IT人的学习方法论-4,讨论一些重要的能力

IT人的学习方法论-5,也谈IT的创新

分类: 每周精华 标签: ,

在Windows 上利用 MSCS 创建高可用性的 DB2 集群服务

2009年10月19日 hashei 3 条评论

周末加班,事先得知是帮人建一个Windows的故障转移集群。虽说现在主要精力是在中间件上,但Windows毕竟还是深入学习过一年的嘛,更何况在WebSphere和WebLogic上都做过MSCS的集群,所以以为不过是小菜一碟,最后想不到从6点搞到了凌晨1点。

我们首先是采用Oracle在Windows下的套路:两台主机上都启用数据库实例,数据库则存放在共享存储上,通过在集群资源中添加DB2的通用服务,从而达到数据库服务的故障转移。

应该说思路没什么问题,但是实行起来有个问题,就是在有用户连接的情况下,停止db2服务会失败,第二次再去停止才能够停下来,这样手动转移集群就会有点问题。于是我们就想着法子怎么再数据库服务停止前执行一下中断所有数据库链接的命令……苦思冥想、多次尝试,弄的焦头烂额。

最后上IBM developerworks找文档,才知道原来根本不用这么麻烦,实例只需一份,而且DB2早就给你准备好了db2msce工具,只要写一份db2mscs.cfg的配置文件:

DB2_INSTANCE=DB2                     //指定需要转换的实例名称
DB2_LOGON_USERNAME=dbdomain/db2admin //指定登录实例的域用户账号
DB2_LOGON_PASSWORD=0000              //指定登录实例域用户账号的密码
CLUSTER_NAME=MYCLUSTER		     //指定群集的名称

GROUP_NAME=DB2 Group A		    //指定用于该实例的组名称
DB2NODE=0                           //指定该组资源对应的 DB2 节点号
IP_NAME= MscsA                      //指定用于该实例的 IP 地址资源的名称
IP_ADDRESS=192.168.192.31	    //指定 IP 地址资源的IP地址属性
IP_SUBNET=255.255.255.0		    //指定 IP 地址资源的子网掩码
IP_NETWORK=Public Network         //指定 IP 地址资源绑定的网络连接
NETNAME_NAME = MscsAName	   //指定网络名资源的名称
NETNAME_VALUE = DataCenter         //指定网络名资源的机器名属性
NETNAME_DEPENDENCY = MscsA        //指定该网络资源名对应的 IP 地址

资源的名称

DISK_NAME=DISK E:		   //指定该节点需要使用的磁盘资源
INSTPROF_DISK=E:                  //指定该节点目录所在的磁盘资源

上述配置文件中的NAME选项都可以随便填写,以简单明了为主,IP_ADDRESS是DB2服务的浮动IP,IP_NETWORK应该写提供集群外网服务的那块网卡名称,NETNAME的那三个选项可以不填,不影响使用(因为都是用IP连接的)。

然后运行db2mscs -f:db2mscs.cfg命令(注意F不是指盘符,将db2mscs.cfg放于db2mscs同一个目录下),你就会看到集群服务中自动添加了一个资源组:DB2 Group A,添加了一个名为DB2的DB2类型服务,而这个服务类型之前是没有的。

除了这种Hot-Standby的配置方式,还有互备(Mutual Takeover)的模式。可以见这篇文章《在MSCS环境下实现DB2分区服务器群集实例》

附一份官方文档Implementing IBM DB2 Universal Database Workgroup Server Edition V8.2 with Microsoft Cluster Server,关于DB2数据库的准备工作,以及配置文档的各参数详细解释,以及管理工具的设置,可以参考这篇文章。

IBM developerworks上的两篇文章,虽然是win2000环境下,但过程一样,而且作者遇到的问题可以给我们借鉴。

http://www.ibm.com/developerworks/cn/data/library/techarticles/0305sunqin/0305sunqin1.html

http://www.ibm.com/developerworks/cn/data/library/techarticles/0305sunqin/0305sunqin2.html

最后得出个结论,以后工作前,做功课必不可少。

分类: Windows 2003 标签: , ,

创造学习的需求

2009年10月13日 hashei 没有评论

国庆一别,不知不觉已两周没有更新,惰性一起,只怕又要一暴十寒,所以今天来总结一下近两周的“学习”情况。

学习其实是件蛮“痛苦”的事,特别是自我学习。从小到大一直是围绕着教棒转,身后有着高考的鞭笞才一路“勤奋”下来。进了大学突然开始提倡自我学习,转变之难可想而知,特别是面对如今“丰富”的校园生活、多样的娱乐手段,能抵抗住诱惑实属不易,还要面对学习方法的考验、艾宾·浩斯遗忘曲线的折磨,从小到大念叨着的铁杵磨针、滴水穿石的我们能坚持下来的就能被称为“牛人”了。

我虽然是从事系统集成工作,个人介绍里也写了会那么一点点linux知识,但所知完全是皮毛。可我从高二接触RedHat,到大学还系统的学习如何搭建DNS、Ftp、Mail服务器,接触时间不能说不长。浅尝辄止的原因之一正如我前面所说,还有一点就是现在流行的理论:“不值得定理”,对着个虚拟机敲敲打打一直没有深入学习的动力,配置完成后的满足感也很少。

于是撑着做网站的机会,购买了一台VPS,512M内存比我第一次接触linux时翻了4倍,更重要的是有了不得不学习的压力。搭建平台参考了LEMP构建高性能WEB服务器(第三版)和张宴的Nginx 0.7.x + PHP 5.2.8(FastCGI)搭建胜过Apache十倍的Web服务器(第4版),编译php、安装mysql+phpmyadmin、配置nginx,忙的不亦乐乎,特别是版本升级带来某些安装上的陷阱(比如MySql5.1.39需要libtool2.2.6版本,而用centos的yum自动安装的还是1的版本)。但当忙活了三天的站点正常运行时,一切也就值得了,满足感远远超过之前用虚拟主机搭建JQ公会所能带来的。

接下来的几天对于日志分析参考了利用Awstats分析网站日志,今后随着网站访问量的提高,性能监测、Cache优化也会不断提上工作日程,也正好是对前五篇Linux下性能调优的一个实践。

建设网站离不开对访问来源和浏览页面的分析,虽然使用Google Analystic也很久,但一直也就关心个访问量,网站分析在中国则让我开了眼界,Mars Opinion为学习网站的宣传打下基础(虽说如今还是个小众站点,但也要有做大的心嘛)。

而对于之前已建立了3月的JQ公会,为了学习如何发展SNS类网站,我关注了SocialBeta 互联网的那点事两个博客,SEO的方面则是SEOmoz Daily SEO Blog。这些文章给我带来的好处近看也许还不如admin5上一些用QQ群发器、购买链接所宣传的效果,但是聚沙成塔,后劲不可小觑。

一边上班,一边准备GCT考试,一边考虑网站的建设,还要时时记录学习的心得,忙虽然忙,但乐趣很多,至少将来不会穷忙吧。

分类: 生活感想 标签: , ,

WebSphere简单故障排查

2009年9月25日 hashei 没有评论

工作中经常遇到这样那样的或有迹可循、或“灵异”的情况:WebSphere在某次停止后无法启动了,部署在集群上的应用无法通过IHS访问,应用更新后重启服务器发送回滚……出现问题当然都可以联系专门的中间件管理员来解决,但等管理员赶到现场,也许时间已过去半天,问题也许很简单,几分钟就能解决,所以如果你会一些基本的排查技巧和诊断方法,那么这些小问题就可以自己迎刃而解了。

下面我就介绍几种常见的简单错误,希望对于现场人员能有所帮助:

应用无法访问

下面是一张常见的由IBM HTTP SERVER(IHS)转发到后端AppCluster上的拓扑结构:

nd topo

应用无法访问,问题可以出现在HTTP Server上,或者App Server上,更可能发生在数据库上,所以第一步需要缩小范围,确定问题发生的点。

我在这里假设IHS的应用地址为http://192.168.1.51/yingyong

DMGR的访问地址是http://192.168.1.51:9060/admin

APP SERVER的应用地址为http://192.168.2.50:9080/yingyong和 http://192.168.2.51:9080/yingyong

 

1. 找不到服务器或404错误

访问http://192.168.1.51,确定IHS是否正常,如果页面无法显示,那么去“服务”中尝试重启“IBM HTTP SERVER V6.x”。服务启动失败的话,“服务”只会提示你一句服务无法启动或者启动后又因为致命错误停止。所以你要到IBM\HTTPServer\bin目录下运行apache –k start或者httpd –k start,失败的话会有详细信息供参考。一般是端口被占用或者config目录下的httpd.conf格式出错(它会提示你出错的行数)。

如果IHS访问完好,那么尝试分别访问http://192.168.2.50(51):9080/yingyong,如果访问正常,那么是IHS转发失败。

ihs转发

可以在管理控制台http://192.168.1.51:9060/admin中的“服务器”——“Web服务器”中勾选相应的webserver,“生成插件”并且“传播插件”。

 

 

很多IHS转发失败是因为应用发布过程中没有选则发布到webserver上,或在传播插件的过程中,由于目录访问控制等原因传播失败。你可以在“应用程序”中找到自己的应用,点击“管理模块”,确定是否正确的发布到app server上和webserver上了,注意首先在第一个框中选择要发布到集群和服务器,然后勾选模块前的勾,最后一定要点“应用”,而不是直接确定。

application deployment

转发失败的原因很多,不过最快的解决方法是手动复制文件。生成插件后控制台会提示文件生成的位置,直接拿到然后复制到传播插件失败的位置就可以了。

不过我也遇到过很蹊跷的情况,明明部署正确,传播正确,确依旧无法访问。这时候你要看一下生成的plugin-cfg.xml文件

<UriGroup Name="default_host_server1_xzh-hasheiNode01_Cluster_URIs">
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/snoop/*"/>
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/hello"/>
      <Uri AffinityCookie="JSESSIONID" AffinityURLIdentifier="jsessionid" Name="/hitcount"/>

       是否有你的应用url那行存在,不存在的话手动添加一下即可,不过记得下次生成插件后注意再修改。

       最后要确定app server是否已经启动,是否遇到错误退出了,这点在下面一部分细说。

2. 505 Internal Error

505内部错误有三种情况,一是程序出错,不是本文讨论的重点。二是AppServer或应用程序没有正常启动,三是数据库连接失败。

AppServer是否运行可以通过访问管理控制台,查看JAVA进程确定。在profiles\AppSrv01\logs\server1目录下会有一个pid文件,此文件记录的PID号即为进程号。Windows下在“任务管理器”点击“查看”—“选择列”,勾选PID-进程标识符即可显示。Unix/linux下运行ps –ef | grep PID或者ps –ef | grep java,查看该app的进程和所有的JAVA进程。注意:在安装DM profile的节点上,一般至少有DM、Node agent、app server三个java进程,注意区分。

确定服务器没有运行或者想重启时,在profiles\AppSrv01\bin下运行startServer.sh(bat)即可启动服务器,观察启动状况,直到出现“为电子商务开放服务器 server1”,即为启动成功。如果失败,那就要打开logs下的SystemOut.log,查看最新的日志,查找error信息。

一般启动失败无外乎端口冲突权限不够

端口冲突

端口出错在SystemOut.log中的信息如下:

TCPC0003E: TCP 通道 TCP_2 初始化失败。主机 * 和端口 9081 的套接字绑定失败。端口可能已在使用。

这时你可以用netstat –an 命令查看监听端口信息,然后用tcpview或者icesword等工具查看占用端口的进程,linux/unix下可以用netstat –an | grep LISTEN(或端口号)直接查看,然后使用lsof -i :端口号或者rmsock来查看占用端口的进程。

这时候你也许才恍然想起某个不经意的操作将websphere的端口占用了,怎么办?如果要WebSphere作出让步,那么可以修改profile_path\config\cells\cell_name\nodes\node_name目录中serverindex.xml文件:

specialEndpoints xmi:id="NamedEndPoint_1243228596786" endPointName="WC_adminhost">
<endPoint xmi:id="EndPoint_1243228596786" host="*" port="9060"/>
</specialEndpoints>
<specialEndpoints xmi:id="NamedEndPoint_1243228596787" endPointName="WC_defaulthost">
……

看到端口号了么?不过要注意WC_adminhost、WC_defaulthost、WC_adminhost_secure、WC_defaulthost_secure,也就是常用的管理端口、应用访问端口和它们各自的SSL端口,被修改后需要到profile_path\config\cells\cell_name再修改virtualhosts.xml文件中的相应端口(添加亦可),否则出现虚拟主机未定义的错误可别怪我没提醒。(我遇到过很多说用IHS可以访问,但是直接访问端口出错的情况,原因就是没有添加相应的虚拟主机,在管理控制台——虚拟主机——default host里添加改动后的端口就可以了)。

权限不足

权限不足一般发生在Unix/Linux下,比较常见的是安装websphere时新建了一个单独的用户和组,但是开发阶段权限管理不严导致开发人员也有root权限,启停没有su到was用户,等到权限回收之后发现无法启动服务了。这时候只要用root权限chown username/groupname 整个安装 目录即可。

还有一种情况是修改的端口<1024,在Unix/Linux下只能用root来起了。

其它情况

还要注意文件系统的情况,见过几次access.log和dump文件把文件系统撑满的。

应用更新失败

应用更新了,修改的文件直接上传到目录,重启应用程序,测试正常。等等!为何重启app server或者集群下重启dm后又变回修改前了呢?

这应该是dm的同步机制在捣鬼,你有没有注意到profiles\AppSrv01\config\cells\cell_name\applications目录下也有你的程序,打开可以看到并不是程序所有的内容都在此,而是web.xml和WEB-INF等重要内容。所以如果你更新的文件在config目录下也存在,那么你需要这里也更新一份。集群环境下还要注意profiles\Dmgr的config目录下还有一份等着你呢。

3. 确定数据库无故障

这个很简单,只要用sqlplus连接数据库正常且能查询即可。

4. 日志文件很重要

日志文件是排查的依赖。我见过不少项目,因为处于试运行修改阶段,log4j中输出日志信息极多,每条sql语句都丝毫不差的打出来,导致1m大小的SystemOut.log文件十几分钟就写满,10个SystemOut.log存档也顶不过几小时的日志量(单个文件1~2M,总共10~20个存档是一般设置),等我赶到时案发现场已经荡然无存。(这种情况一般是重启能暂时解决问题,但是故障原因没有找到)

所以即时保存当时日志是很重要的,logs\server1下的SystemOut.log、SystemErr.log一定要保存一份,并记下故障发生的时间。

WebSphere不像Weblogic,可以在console窗口后一直看到运行的日志,在unix/linux下,你可以用tail –f SystemOut.log来达到这个效果,windows下也有一个tail工具,后跟文件名运行就可以了。

tail tool tail tool

结束语

暂时能想到的简单排错就这些,这些都比较容易被开发人员遇到,所以还是很有必要了解一下的。

Investigating Out of Memory/Memory Leak Problems

2009年9月22日 hashei 6 条评论

本文原文地址为http://support.bea.com/support_news/product_troubleshooting/Investigating_Out_of_Memory_Memory_Leak_Pattern.html

但现在这个网址已经无法访问,我在Metalink找到这篇文章并与大家分享。文章发表的较早,但是OOM发生的原理和解决的方法不变。文中提到的/3GB参数和垃圾回收日志分析的方法我在《JAVA性能优化—IBM JDK JVM参数设置》和《JAVA性能优化-GC日志分析》都提到过。如果英文的看起来比较麻烦,我google到台湾人做的一份翻译JavaAPsvr_A_200411_MemoryLeak,不过我看着“记忆体”觉得更别扭。

Problem Description

Out Of Memory (OOM) – An application displays Out of Memory errors due to memory exhaustion, either in java heap or native memory.

Memory Leak – Constant memory growth in either java heap or native memory, which will eventually end up in out of memory situation. The techniques to debug the memory leak situations are the same as the out of memory situations.

Problem Troubleshooting

Please note that not all of the following items would need to be done. Some issues can be solved by only following a few of the items.

Quick Links:

Java heap This is the memory that the JVM uses to allocate java objects. The maximum value of java heap memory is specified using �Xmx flag in the java command line. If the maximum heap size is not specified, then the limit is decided by the JVM considering factors like the amount of physical memory in the machine and the amount of free memory available at that moment. It is always recommended to specify the max java heap value.

Native memory This is the memory that the JVM uses for its own internal operations. The amount of native memory heap that will be used by the JVM depends on the amount of code generated, threads created, memory used during GC for keeping java object information and temporary space used during code generation, optimization etc.

If there is a third party native module, it could also use the native memory. For example, native JDBC drivers allocate native memory.

The max amount of native memory is limited by the virtual process size limitation on any given OS and the amount of memory already committed for the java heap with -Xmx flag. For example, if the application can allocate a total of 3 GB and if the max java heap is 1 GB, then the max possible native memory is approximately 2 GB.

Process size Process size will be the sum of the java heap, native memory and the memory occupied by the loaded executables and libraries. On 32 bit operating systems, the virtual address space of a process can go up to 4 GB. Out of this 4 GB, the OS kernel reserves some part for itself (typically 1 ~ 2 GB). The remaining is available for the application.

Windows :By default, 2 GB is available for the application and 2 GB is reserved for Kernel’s use. However, on some variants of Windows, there is a /3GB switch which can be used to change this ratio such that the application gets 3 GB. More details on the /3GB switch can be found at:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/4gt_ram_tuning.asp

RH Linux AS 2.1 : 3 GB is available for the application.

For other operating systems, please refer to the OS documentation for your configuration.

Top of Page

阅读全文…