记得研究手机接入LifeRay导致Log文件大量增长、内存超限导致Hang Up时,有一篇博客说的很到位。
站在巨人的肩膀上总是会很让人兴奋和增加能量。向高手学习可以快速成为高手。必要的时候花点钱可以节约大量时间。
于是今天又找到了它。这是一系列的LifeRay文章,作者:胡启稳 15925232137 QQ:68304399 。他的网站如下,名称是:IT人生录
其中30篇关于LifeRay的文章在此:
http://www.huqiwen.com/category/technology-share/liferay/
对应的付费教程如下:
今天开始研究LifeRay, 先Shutdown这个Tomcat,再重启。
用“tail -f catalina.out”来监控其过程。
一上来就遇到问题。“./ shutdown.sh” 和“shutdown.sh” 在root下都不能运行。因为第一个多了个空格,第二个找不到文件(并不是当前目录就可以运行当前目录下的文件)。然后正确运行了,花了大约10秒钟。如下:
然后又重启Tomcat,这个过程需要时间比较长,约2分钟,一直等到“Server startup in 105990ms”才算完成。如下:
再Access网站,出来了问题。很好,就是需要问题出现。
网站显示如下。说明Tomcat可以起来,而且能接受访问,但是网站启动过程中有问题。
再看BCE监控,如下,内存用量下去了:
此时,把数据库做了一个备份,同时把LifeRay的文件目录做了一个备份。都在/CDS2下面。
1.7G的大文件不好处理,把末尾部分单独写一个文件。如下文所述:
<span style="font-size:14px;">http://www.linuxdiyf.com/viewarticle.php?id=111240</span>
问题: 有个3G文本,要作处理,每次测试消耗太多资源。因此,代码测试过程中应该做小规模的运行。通常做法是从原文本中提取一部分,例如前100行。 解决方法: 利用linux下的head命令可以轻松解决问题,同时利用管道。代码如下:head filename -n 100 > newfile说明: 很容易想到,上面是取头100行,如果取尾100行,则可以用tail,利用head和tail的组合也可以取文件中的任意一段。以下是一些范例:tail filename -n 100 > newfile
尝试用Beyond Compare比较两个log文件,太大,把它终止掉。裁剪了部分Log发到我的邮箱里。然后发现网站问题更大了:
继续研究这个问题。将PostGreSQL数据库做了备份。比较正常和故障时的两个数据库备份的Plain文件,只有两处不同,而且看起来肯定不是什么问题。并且,在pdAdmin III中直接恢复数据库是不行的。估计需要删掉所有原有数据才能去恢复备份的数据(这个需要进一步研究)。
于是又开始查看LifeRay的Log文件,实际上是Tomcat的Log文件。比较正常时的和故障时的,从实质性的不同处,一开始出现如下问题:
<span style="font-size:14px;">05:28:11,938 ERROR [localhost-startStop-1][Cache:120] Unable to set localhost. This prevents creation of a GUID. Cause was: david.novalocal: david.novalocal: unknown error
java.net.UnknownHostException: david.novalocal: david.novalocal: unknown error</span>
看来是hostname的问题,网上提到去修改/etc/hosts加上不识别的名称就好。发现该文件里面已经有了一行“127.0.0.1 davidqi.novaloal”。这不是已经有了吗?于是就往里又写了一行一模一样的“127.0.0.1 davidqi.novaloal”。重新启动服务器,问题还是在那里。
那问题究竟在哪儿呢?
晚饭后,就这个问题问了我的一个同事,他让我ping一下这个hostname。我又打入hostname指令,答复是david.novalocal。然后ping david.novalocal,答复是:unknown host name. 奇怪!我明明在/etc/hosts里面写入了呀。仔细一看,原来已有和又写入的是:“127.0.0.1 davidqi.novaloal”,而需要的是:“127.0.0.1 david.novaloal”!!!相差“qi”两个字母!!!
于是修改了它。然后重启服务器。然后就好了!而且服务器使用的内存量也降下去了!
一通百通,其他的服务器景象也是同一个问题,选了一个日期最靠后的,改完/etc/hosts后,重启服务器,一切正常!
困扰我几个月的看起来非常复杂的问题,为了解决这个问题,博客写了5篇,从2015-10-09一直研究到今天(2015-10-19),历时11天,学习的PostGreSQL数据库及其备份,备份的三种文件类型,pgAdmin III,Beyong Compare文件比较软件,大量实用的Linux基础知识和一些技巧,百度云CDS的购买和挂载、使用,LifeRay的数据库的组成和结构、数据,等等。问题对应的描述错误的Log有近千行。
最后仅仅通过在/etc/hosts文件中减少两个字母就彻底解决了。错误log烟消云散!
============================================================
高兴之余,还是要研究一下问题的根源在哪里。恢复了最后的和最前的服务器镜像,都有这个问题。最早的镜像恢复后,需要手动启动数据库和LifeRay。修改/etc/hosts后,正常启动后如下:
既然最早的镜像都有问题,那怎么能一直坚持到那么长时间呢?于是检查第二个服务器镜像,这个应该是关键。
用hostname检查,答复是david。reboot之后,变成了david.novalocal,然后就出现了问题。hostname怎么会自己就变了呢?应该是未记录的更改。具体待查。
==========================
2015-10-21 记录:
catalina.out(7G)和liferay.log.2015-10-20.txt 拷贝到了./mnt下面备查。因为增长太快。需要仔细查看一下。
./shutdown.sh和./startup.sh执行了2次,每次都正确启动了LifeRay。
查看一个目录下子目录及其下属所有目录的总大小,用以下命令:
du -sh *
百度的服务器临时数据盘是RAID6的,CDS是: 云磁盘的数据采用实时多副本存储,部分存储节点、存储介质或网络交换机故障时,数据会立即迁移到其它节点,数据的访问不会受到任何影响,不会感觉到组件故障。同时支持CDS实例的随时快照备份和回滚恢复,因此云磁盘的可用性和可靠性更高。。
=================================
恢复到了auto_startup镜像以检查domainname,etc.
./etc/hosts里面没有david.novalocal,如下:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 centos6u5.x86-64
127.0.0.1 c64zcs2
127.0.0.1 c64zcs2
127.0.0.1 c64zcs1
127.0.0.1 c64zcs1
127.0.0.1 c64zcs1
127.0.0.1 davidqi
127.0.0.1 davidqi.novalocal
127.0.0.1 david
./etc/sysconfig/network里面有
NETWORKING=yes
HOSTNAME=david.novalocal
把network里面的删掉HOSTNAME=david.novalocal重启看看。重启后登录界面显示的是david。但是登录不进去,网站也无法访问。
恢复run_10days_OK, 登录界面显示的是david.novalocal,网站不能正常运行。把network里面的改成HOSTNAME=david重启看看。重启后登录界面显示的是david,网站还是可以正常运行。
以上验证过程说明:Linux服务器的hostname是由./etc/sysconfig/network文件里面的定义来确定的。但是LifeRay严重依赖./etc/hosts里面的清单来进行它的启动运行。在这个./etc/hosts文件中如果缺少和./etc/sysconfig/network文件里面的定义的hostname相同的hostname的定义,则LifeRay不能正常启动起来。
./etc/hosts文件的作用相当于本地的DNS服务器。
(/proc/sys/kernel/hostname的用途是运行时态的hostname,是实时的,可以实时修改,但是系统重启后不能持续存在。)
以下文章对hostname的解释比较全面和正确。以它作为本章博客的结束。
http://soft.chinabyte.com/os/281/11563281.shtml
部分截屏如下:
Linux操作系统的hostname是一个kernel变量,可以通过hostname命令来查看本机的hostname。也可以直接cat /proc/sys/kernel/hostname查看。
#hostname
#cat /proc/sys/kernel/hostname
上面两种输出结果相同。
修改运行时Linux系统的hostname,即不需要重启系统
hostname命令可以设置系统的hostname
#hostname newname
newname即要设置的新的hostname,运行后立即生效,但是在系统重启后会丢失所做的修改,如果要永久更改系统的hostname,就要修改相关的设置文件。
永久更改Linux的hostname
man hostname里有这么一句话,”The host name is usually set once at system startup in /etc/rc.d/rc.inet1 or /etc/init.d/boot (normally by reading the contents of a file which contains the host name, e.g. /etc/hostname).” RedHat里没有这个文件,而是由/etc/rc.d/rc.sysinit这个脚本负责设置系统的hostname,它读取/etc /sysconfig/network这个文本文件,RedHat的hostname就是在这个文件里设置。
所以,如果要永久修改RedHat的hostname,就修改/etc/sysconfig/network文件,将里面的HOSTNAME这一行修改成HOSTNAME=NEWNAME,其中NEWNAME就是你要设置的hostname。
Debian发行版的hostname的配置文件是/etc/hostname。
修该配置文件后,重启系统就会读取配置文件设置新的hostname。
hostname与/etc/hosts的关系
很过人一提到更改hostname首先就想到修改/etc/hosts文件,认为hostname的配置文件就是/etc/hosts。其实不是的。
hosts文件的作用相当如DNS,提供IP地址到hostname的对应。早期的互联网计算机少,单机hosts文件里足够存放所有联网计算机。不过随着互联网的发展,这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。具体可以man hosts。
Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件,如果里面有相应的记录,就会使用hosts里面的记录。/etc/hosts文件通常里面包含这一条记录
127.0.0.1 localhost.localdomain localhost
hosts文件格式是一行一条记录,分别是IP地址 hostname aliases,三者用空白字符分隔,aliases可选。
127.0.0.1到localhost这一条建议不要修改,因为很多应用程序会用到这个,比如sendmail,修改之后这些程序可能就无法正常运行。
修改hostname后,如果想要在本机上用newhostname来访问,就必须在/etc/hosts文件里添加一条newhostname的记录。比如我的eth0的IP是192.168.1.61,我将hosts文件修改如下:
#hostname blog.infernor.net
# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.1.61 blog.infernor.net blog
这样,我就可以通过blog或者blog.infernor.net来访问本机。
从上面这些来看,/etc/hosts于设置hostname是没直接关系的,仅仅当你要在本机上用新的hostname来访问自己的时候才会用到/etc/hosts文件。两者没有必然的联系。
RHEL还有个问题。
我开始在测试的时候,只修改/etc/hosts,里面添加 192.168.1.61 blog.infernor.net blog,而/etc/sysconfig/network维持原状,也就是里面的HOSTNAME=localhost.localdomain。我重启系统后居然发现hostname给修改成了blog.infernor.net。这样看的话,倒真觉得/etc/hosts是hostname的配置文件。后来终于在/etc/rc.d/rc.sysinit这个启动脚本里发现了问题的所在。
rc.sysinit文件里一开始就设置了hostname
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
HOSTNAME=localhost
fi
确实使用了/etc/sysconfig/network里的hostname值。不过后面还有一段关于设置hostname的
ipaddr=
if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]
; then
ipaddr=$(ip addr show to 0/0 scope global | awk '/[[:space:]]inet
/ { print gensub("/.*","","g",$2) }')
if [ -n "$ipaddr" ]; then
eval $(ipcalc -h $ipaddr 2>/dev/null)
hostname ${HOSTNAME}
fi
fi
脚本判断hostname是否为localhost或者localhost.localdomain,如果是的话,将会使用接口IP地址对应的 hostname来重新设置系统的hostname。问题就出在这里,我的/etc/sysconfig/network默认的hostname是 localhost.localdomain,eth0的IP是192.168.1.61,而/etc/hosts里有192.168.1.61的记录。于是就用192.168.1.61这条记录来替换了hostname。
估计这也是很多人将/etc/hosts误以为是hostname的配置文件的原因。
hostname带选项查询
hostname的-s -f -i等等选项都用到了/etc/hosts或者DNS系统,跟我们讨论的hostname有点远了,也容易产生误会。具体可以man hostname查看。