2013年的技术、生活展望

2012年过去了,2012年写的展望中除了Android这个东东我去实现了,其他的貌似基本上都没实现哦 2012年技术上的四个目标 ,Android的确做了一个项目,算是一个好的地方吧,给自己小赚了一笔,但是的确把自己也折腾的够呛的,Node.JS版本的Scanner,基本上没怎么编辑过这个项目,虽然一直躺在github上。

Linux方面基本上除了给大家做了一两节课的培训,读了那本电子书的一些章节,然后和大家一起分享了读这些章节的内容学到的,也算是完成了一部分,最终的结果是的确了解了线程、进程的初步的知识,但是不得不说,这本书的确还是没有啃透啊。

Hadoop嘛,没有折腾过吧,算是一个遗憾吧,也不太想去看他了,毕竟不一定能用,用得着的时候再说吧,从目前的迹象上来看基本上不会有涉及到这方面的知识。

无论如何,还是要写一下2013年的一些期望吧,虽然项目有点多,但是希望能坚持完成50%左右的内容项吧,不要虚度就好。

管理方向

  • 项目管理

    阅读项目管理方面的书籍,目前只是有想法,具体看哪些方面的资料或者书籍,有待继续思考。

  • 时间管理

    按照以前读过的《把时间当作朋友》中提到的一些内容进行一些实际的操作,将自己的时间管理起来,提升工作效率

技术方向

  • 关注大数据研究方向

    这个方向也算是一个可以去了解,可以去研究的东西吧,但是毕竟没有环境去做一些实验和研究,所以也许没啥大的进展。先写在这里好了。

  • 基础数据结构知识(数据结构、算法导论)

    可以说自从毕业以来一直逃避这个方面的东西,自己对数据结构一直觉得自己在这方面不是很擅长,如果一直这样,那永远也不会熟悉,所以补习补习吧,结合两本书呗:《数据结构(C语言版)》以及《算法导论 4》。 具体要求就是能利用C语言写一些常见数据结构的实现,如果可以最好更新到博客中。

  • Android

    继续关注Android方面的开发知识的积累吧,将大体的框架有一个基本的了解,多关注界面方面的使用和设计

  • Node.JS

    本来打算完成一个Node.JS版本的Scanner的,但是发现写了不到两次,遇到不少问题,2013年如果不想做Scanner就算了,至少把会议室管理系统做完吧,也算是给自己的一个交代,了解Node.JS常见的一些使用方法,异步编程到底如何改变

  • NoSql MonogoDB

    NoSql也算是了解过一点吧,用过MonogoDB,但是很粗浅,最好是结合Node.JS进行一个深入的了解和熟悉,将Node.JS和MonogoDB结合起来做一些在公司内部可以玩起来的小东西吧。

MakeMoney

  • 存钱还钱

    还清借款,2013年至少还清8W吧,虽然有点难度

  • 开源节流

    思路开阔,多看看别人做了哪些事情吧


写在最后,微博: @TimonWang, Twitter:@TimonWang

2012年终总结

2012年终总结

2012,传说中的世界末日,趁着还没到世界末日那天,再对我这一年以来的生活和工作做一个简单的总结吧。
生活上

  1. 儿子出生了
  2. 小豆豆的出生可以说是2012年对我来说最重要的一件事情,感触也是最深的,因为怀孕的时候就查出来可能有一定的溶血的概率,所以一直到出生之前老婆一直坚持在服用中药,控制ABO溶血。豆豆快要出生的前两周老婆回家去待产了,我是提前了一周左右回家陪老婆待产,那段时间也算是我工作以来最最放松的一小段时间,每天在家里陪老婆,玩玩ipad游戏,吃完饭陪老婆出门散散步,晚上看看电视早早的就休息了。豆豆出生前以前,陪老婆去三姐家里吃饭,回家的路上,原本20分钟不用的路程足足走了接近一个小时,老婆走走停停,肚子疼得要命,我在一边上干着急看着老婆疼,走到家里之后老婆休息了一会才缓过来。晚上看电视看到10点左右,在床上玩了一会ipad上的游戏打豆豆,准备说要睡的时候,老婆突然说好像见红了,于是乎就赶紧叫老妈叫车送我们去岳阳的医院,晚上匆匆忙忙的叫了表哥的车子送我们到妇幼,才发现住院单没有给我们开,又折腾回家去拿住院单。好不容易办好了入院手续,老婆肚子一直疼,没法睡觉,老婆让我陪着一直在走廊上走动,走了半个晚上,早上才说是准备生,过程各种惊心动魄啊,宫口一直开的达不到要求,在产房里都开始吸氧,打生理盐水了,一直折腾到8点多,还是不行,羊水破了之后发现羊水有点偏黄绿色,属于羊水三度污染,说是可能小孩缺氧了,准备剖腹才可以,想想老婆都已经疼了8、9个小时了,这个时候再挨一刀多痛苦啊,于是乎和医生商量还继续尝试半个小时,如果半个小时之内还没有生出来就决定剖腹了,因为医院有熟人,我也被允许到产房陪同待产,老婆满头大汗,我心里已经完全乱了,老婆各种痛苦的叫喊,疼痛到蹲在地上,半个小时过去了还是没有任何动静,于是决定剖腹。很快被推进了手术室,10点半左右推进手术室,11点08分左右儿子抱出来了,被告知得送到新生儿科观察。一颗悬着的心才算落地了。豆豆在新生儿科待了5天,我和老婆在医院的前五天基本上在挤奶中度过,为了挤掉奶水,让儿子出院后有奶可吃,晚上通常两个人两点钟坐在床边挤奶挤一两个小时,然后白天基本上不停歇的挤奶,那一个周,累的人都快趴下了。儿子出院那一刻,高兴坏了,那种心情不亚于儿子被抱
    出手术室的那一刻。

  3. 老爸骑摩托车被的士撞了,住院一个多月
  4. 在豆豆出生前的10天左右时间里,老爸骑摩托车被的士撞了,头上缝了10针,腿上淤血充满了整个大腿,在医院里躺了一个月,因此错过了豆豆的出生,在豆豆两周多的时候爸爸赶回家参加了豆豆的满月庆典,也错过了姐夫动手术的时间。

  5. 二姐夫做了个换肾手术,恢复挺快的
  6. 二姐夫在这一年里终于联系到了肾源,换了一个肾,那是豆豆出生大概14天的时候,我恰好在家,看着姐夫从手术室里推出来的那一瞬间,真有点想感谢上帝的感觉,感觉姐夫获得了新生,应该说的确是新生,接下来就盼望着一切顺利,姐夫早日能扛住排斥反应。姐夫在后来的恢复过程中也出过一些小状况,感冒什么的,巨额的话费全部都压在姐夫老爸的身上,也把姐夫的老爸累的够呛的,每天晚上一两点出门,每日每夜的买猪,宰猪,总算把手术费和后续的保养费用扛住了。

  7. 两个哥们在这一年(2012.01.01-2012.12.30)结婚了,且都怀上了宝宝
  8. 涛哥和毛哥都结婚了,也都有了小宝宝,明年应该就出生了。实际上涛哥是年前结婚的,不过那也算是2012年了吧,毛哥十一结婚的,特地跑回家去参加了毛哥的婚礼,说实在的我是害怕孤单的人,我害怕没有这几个哥们,我一个人真的就是除了有几个亲人,没有几个铁的哥们了。

  9. 陪老爸游了杭州
  10. 老爸一直以来都在忙碌着为了我们兄弟姐妹五个的学费,生活费,我们毕业了又行情不好,赚钱赚不了那么多了,家里的生活开支还是挺大的,老爸56、7的人了还在工地上做监工,说来很是惭愧。自从豆豆接到杭州之后,老爸想念孙子的情绪就从来没有消退过,说等有时间一定过杭州来看看孙子,工地的活验收过了之后,好不容易有时间能到杭州看看孙子,结果有有变故,本来十一打算过杭州看看的,结果拖到了十月中下旬。到杭州之后,抱着孙子玩,特别的开心,也让我萌生了回长沙发展算了,钱虽然赚的不比杭州多,但是至少和亲人的距离近了,爸妈也可以经常看看孩子。爸爸不容易来一趟杭州,于是我特意请了两天假,陪老爸老妈带着儿子老婆在西湖景区和灵隐寺景区玩了一圈,老爸当然也很开心。回去之后在QQ空间里写了游玩杭州的一首小诗,当然后来还有一首表达自己想念孙子的情绪的小诗。

  11. 妈妈到杭州和老婆一起带儿子
  12. 原本打算老婆产假休完之后就带着儿子到杭州继续上班,妈妈帮我们带儿子的,结果老婆公司让老婆从调岗(一个比较吃力,比较累的岗位)和协商离职里选一条路,老婆本来就像做生意的,于是就商量了一下决定直接协商离职了,准备做生意。当然最后生意是没做起来,于是老婆和妈妈就全心全意的在家里带儿子了。

工作上

  1. 开始了一个叫做xWare的虚拟化项目,进入了虚拟化的这个新领域
  2. 以前学的Flex、java相关的知识终于又开始实践了,这个项目听起来很有挑战,至少有一部分东西我可以大展拳脚,做一些架构设计方面的事情了,当然后来证明也不是那么如愿,需要的背景知识太多太多,需要学习的东西也太多太多。

  3. 三个项目同时开始参与,漏扫和WebSheild项目组要做项目进度跟踪和任务安排
  4. 这个是一直以来的事情,这一年基本上每周三个周会,基本上周一都要开会开到 9:30 以后才能回家,当然也发现自己在表达方面的确是比以前要好很多了,我也会鼓舞鼓舞大家的士气,让大家能有一点气氛,也算是团队建设的一个小部分吧。

  5. 对于xWare虚拟化网络和接口相关的内容进行重构设计
  6. 这个重构设计是在儿子出生之前完成的,方案讨论到结构重构设计,到数据库表结构的确认,到回去陪老婆待产前一天刚好完成,实现就交给了另外两个同事来完成,当然后又进来了两个新同事,给力的一起做xWare。

  7. 在xWare项目中花了一个月时间对Libvirt的大体结构上的代码有了一个简单的掌握和理解
  8. 这个是所谓的工欲善其事必先利其器,对虚拟化里的这个东西的了解和理解如果没有,那么如何管理虚拟机,如何管理网络是比较难以成型的,于是整个项目组花了大概一个月的时间才完成对这个东西的代码阅读和交流,当然这让我们几个“java开发人员”对C也有了一定的了解,对Libvirt库也有了更深入的了解。

  9. 对JNA封装和调用底层的C Lib进行了一个了解
  10. 项目中使用JNA做了一个管理库的Binding操作,于是乎对这个JNA技术又进行了比较全面的掌握,虽然最后碰到了不少问题,但也都基本上有了解决方案。

  11. 对存储有了一个基本的概念
  12. 花了一两个月的时间对存储的基本概念,以及在数据中心中的常见部署结构和部署方式进行了了解和掌握,至少对存储有了一个入门级别的了解。

  13. 对Redhat和Citrix服务器虚拟化以及Citrix的桌面虚拟化的基本部署和简单的结构进行了了解
  14. 这个算是竞争对手分析吧,实际上不是竞争对手,我们目前做的还是了解服务器虚拟化和桌面虚拟化究竟有哪些具体的内容,我们的产品又需要完成那些功能,才算是基本功能完备。这个过程中大量的环境搭建,对Redhat和Cirtix的虚拟化的基本功能,以及大体的实现做了一个了解。当然为了某个原理和方案的讨论和主管经理还拌了两次嘴,也算是自己还不成熟的表现吧。

Citrix XenDesktop License Server 卸载后无法再次安装的问题

最近测试Citrix XenDesktop的基本功能,在一台Windows2008 R2的机器上安装了XenDesktop的组件,包含了一个Citrix License组件,安装完成之后使用正常。结果在网站上申请了一个使用License,导入之后,License服务直接宕机了,启动都报错,各种尝试都没有效果,还尝试过删掉原有服务重新安装,结果呢还是搞不定。
仔细看了一下Licnese文件,原来使用浏览器下载的时候出现故障,页面中包含了大量HTML的代码,所以在导入的时候出错是必然的,可是为什么引起删掉重装服务还是出错呢?看了一下存放路劲,发现原来不管你是否重新安装,那个存放License的目录不会被删掉,所以那个错误的文件一直在里头,重装之后启动服务还是再次加载那个错误的文件,最终就会导致这个错误出现从而使License服务无法启动。
如何解决呢?很简单的,删除最后导入出错的那个License,重启一下License服务就搞定了。

附:
Citrix XenDesktop License组件的默认管理密码是 域名当前服务器与帐号 密码当然就是该服务器的域帐号的密码,例如我这里的域是zch.com,在登录的时候显示域名为ZCH,那么我的登录用户名和密码就是ZCHadmin password

QEMU/KVM查看虚拟机系统注册表

在QEMU/KVM的虚拟化环境中,如果想要操作Windows虚拟机的注册表,原来的理解是不可以的,最近查资料发现其实有工具可以做到的。

libguestfs-tools套件提供了一个基于QEMU的磁盘映像去查找这个磁盘映像中安装的Windows操作系统的具体注册表信息,甚至是进行改动(当然不安全,目前可能不成熟,可能损坏映像文件)。

这个套件目前我只在centos和redhat的虚拟化环境中找到了,具体安装方法很简单:

yum install libguestfs libguestfs-tools libguestfs-winsupport

安装完成之后,使用virt-win-reg既可以对已经安装操作系统的虚拟机映像文件进行注册表的读取操作,不过要注意的是目前只推荐在虚拟机停止状态下获取注册表的信息,如果在启动模式下获取注册表或者修改注册表信息都可能导致虚拟机映像文件损坏。

具体使用方法如下:

virt-win-reg win9-clone 'HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionUninstall'

其中win9-clone是虚拟机的名字,可以通过libvirt的virsh list –all命令查询得出,不过一定确保虚拟机已经是停止的状态,否则可能造成磁盘损坏

上面的命令最终执行的结果如下:

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall]

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallAddressBook]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallBranding]
"QuietUninstallString"=hex(1):52,00,75,00,6e,00,64,00,6c,00,6c,00,33,00,32,00,20,00,49,00,65,00,64,00,6b,00,43,00,53,00,33,00,32,00,2e,00,64,00,6c,00,6c,00,2c,00,42,00,72,00,61,00,6e,00,64,00,43,00,6c,00,65,00,61,00,6e,00,49,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,53,00,74,00,75,00,62,00,73,00,00,00
"RequiresIESysFile"=hex(1):31,00,30,00,30,00,2e,00,30,00,00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallConnection Manager]
"SystemComponent"=dword:00000001

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallDXM_Runtime]

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallDirectAnimation]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallDirectDrawEx]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallFontcore]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallICW]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallIE40]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallIE4Data]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallIE5BAKEX]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallIEData]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallMPlayer2]

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallMobileOptionPack]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallNetMeeting]
"RequiresIESysFile"=hex(1):34,00,2e,00,37,00,31,00,00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallOutlookExpress]
@=hex(1):00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallPCHealth]
"QuietUninstallString"=hex(1):72,00,75,00,6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,73,00,65,00,74,00,75,00,70,00,61,00,70,00,69,00,2e,00,64,00,6c,00,6c,00,2c,00,49,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,48,00,69,00,6e,00,66,00,53,00,65,00,63,00,74,00,69,00,6f,00,6e,00,20,00,44,00,65,00,66,00,61,00,75,00,6c,00,74,00,55,00,6e,00,69,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,20,00,31,00,33,00,32,00,20,00,43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00,57,00,53,00,5c,00,49,00,4e,00,46,00,5c,00,50,00,43,00,48,00,65,00,61,00,6c,00,74,00,68,00,2e,00,69,00,6e,00,66,00,00,00
"UninstallString"=hex(1):72,00,75,00,6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,73,00,65,00,74,00,75,00,70,00,61,00,70,00,69,00,2e,00,64,00,6c,00,6c,00,2c,00,49,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,48,00,69,00,6e,00,66,00,53,00,65,00,63,00,74,00,69,00,6f,00,6e,00,20,00,44,00,65,00,66,00,61,00,75,00,6c,00,74,00,55,00,6e,00,69,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,20,00,31,00,33,00,32,00,20,00,43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00,57,00,53,00,5c,00,49,00,4e,00,46,00,5c,00,50,00,43,00,48,00,65,00,61,00,6c,00,74,00,68,00,2e,00,69,00,6e,00,66,00,00,00

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstallSchedulingAgent]
@=hex(1):00,00

该命令的其他用法可以使用man virt-win-reg获取相关帮助信息,用法还是很多的哦

kvm可用存储类型简介

KVM的可选存储项中,包含三种:虚拟磁盘文件,基于文件系统的存储,以及基于设备的存储。

虚拟磁盘文件
可以使用LVM(Logical Volume Manager)创建存储池来管理KVM的存储,创建一个KVM的虚拟机的时候,默认使用虚拟磁盘文件作为后端存储。如果使用这种类型的配置,虚拟机可见到的是一块实际的硬盘,但实际上使用的是一个虚拟磁盘文件所表示的一个硬盘。这里包含了一层额外的文件系统层,而且这一层文件系统层也会导致系统变慢。

当然,虚拟磁盘文件也有它的好处,虚拟磁盘文件很容易就能被其他的KVM虚拟机使用,但是如果你想优化KVM的虚拟化性能,还是需要考虑其他的KVM存储。

基于文件系统的存储
部署KVM主机的时候,你可以选择文件系统目录(dir)或者格式化的块设备(fs)作为KVM的存储。默认是使用dir,KVM会在选择的本地文件系统目录中创建磁盘映像文件。

如果使用fs选项,需要提供存储磁盘映像文件的格式化文件系统的名字。此选项和目录类型的存储最大的区别在于,格式化磁盘映像没有挂载在一个指定的路径下。

使用上述的任意一个选项,都可以使用本地文件系统或者在物理上是基于SAN的文件系统。相比于SAN,本地存储期铜不会同时被多个主机并发的访问。

另外一种基于文件的磁盘存储方式是netfs,只需要你提供一个网络文件系统的名字即可,比如说挂载的Samba文件系统。使用这个方式作为KVM的存储是比较方便的,因为这中方式能比较方便的从另外一台服务器上去访问,同样也允许你在多台主机上去访问同一个磁盘文件。

上述的各种类型的基于文件系统的KVM存储方式都存在一些缺点:文件系统。由于KVM的虚拟机对于硬盘的操作都不是直接写入到KVM的存储介质,而是在宿主主机上的文件系统。这就意味这访问文件系统的时候都需要经过一个不必要经过的中间访问层,这通常会降低性能。

所以,如果想要追求KVM虚拟化的性能,基于设备的存储可能是更好的选择。

基于设备的存储
另一种方式是使用基于设备的存储。有四种方式可以提供此类型的物理存储设备访问:disk、iSCSI、SCSI以及logical。disk允许你直接对磁盘进行读写。iSCSI和SCSI方式提供了一种替代和原有方案具有可比性的方式对磁盘进行访问。这种类型的KVM存储方式的好处在于:你可以使用持久化的命名而不依赖于宿主主机发现设备的顺序。

这些访问磁盘的方式也存在缺点:不灵活,比较僵化。如果使用此种类型的存储,那么基本上没有办法修改虚拟磁盘的大小,或者针对虚拟机进行快照功能。

LVM(Logical Volume Manager)是KVM存储方式中,提升灵活性的最佳方式。一个好处是LVM允许你使用快照功能,另外一个好处是只能作为KVM虚拟化的一个部分,否则无法使用。

LVM允许将存储放置到一个存储卷组中,基于存储卷组,可以很容易的创建一个逻辑的卷。卷组是抽象的物理磁盘设备,所以当你的可用磁盘空间不足的时候,你可以新添加一个设备到卷组中,这个操作实际上增加了可用的直接存储空间到逻辑卷。使用LVM使得设备空间分配更灵活,同时也使得更容易的添加和删除存储。

最后LVM能比较好的工作在单机场景和多主机场景中。如果需要多主机同时访问,你只需要基于SAN创建逻辑的卷即可。如果你使用LVM集群,你可以很容易的配置所有的主机同时访问逻辑卷。

KVM存储池的使用
为了方便KVM存储的管理,可以创建存储池。在主机层次创建存储池可以更容易的访问KVM存储设备。使用KVM存储池也可以将实现预备好的存储管理器来,以供访问。这种策略在大型环境中非常有用,因为存储管理员通常和虚拟机管理员不是同一个人,所以在创建虚拟机前创建一个KVM存储池是一个不错的选择。

当深入KVM虚拟化之后,在主机级别配置一个KVM存储池,并在池中提供LVM逻辑卷。

翻译自:http://searchservervirtualization.techtarget.com/tip/Keeping-up-with-the-KVM-storage-options
转载请注明出处:http://www.nohouse.net

解决Tomcat中应用调用Libvirt库进行控制时可能导致线程卡死问题

最近的项目中有用到libvirt的java包进行libvirt的远程命令调用,进行kvm的管理。我们的测试人员一个偶然的机会下测试出来,在控制连接状态的时候,可能存在一个严重的bug,由于界面上的flex应用在每次点击虚拟机节点的时候,会导致对后台的remote service进行大约3-4次的调用,而这些remote service中会利用libvirt的结构进行结果的获取,我们为了提高效率,将libvirt的链接进行了保持,而不是每次都进行重连,以减少性能的损耗。

存在这样的情况,当网络正常的时候,建立起来的connection,一直在内存中驻留,此时如果拔掉网线,这个链接也不会断开,由于内存中这个connection的值也不为空,无法判断链接是否断开,所以在此点击界面的时候,一点调用了libvirt的接口,就会一直卡住界面多点击几次后,tomcat的所有可服务线程就都卡住了,导致整个界面无法使用。

解决方法为:启动一个线程由于实时的检测主机的断开连接状态,当状态不正常的时候,在获取connection的方法中直接抛出异常,阻止后续的逻辑的执行。但是这样只能解决状态问题,不能解决在这个状态获取的间隙中的界面点击问题,查找到资料发现tomcat的线程池模型也许可以帮忙,于是将线程池用上了,测试过后,终于发现可以了。

据说tomcat7可以检测哪个线程被卡死了,但是由于条件显示没有将产品中的tomcat6环境升级为tomcat7,所以这个也就不可用了。

具体修改方法:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/&gt
取消掉这段的注释,然后可以修改maxThreads和minSpareThreads两个参数为你想要的值,maxThreads比较简单允许的最多线程数
通常150应该足够了,后面的这个参数呢,表示最小的驻留服务线程数,也就是说这些线程会一直等待服务。

<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000" maxTreads="500" minSpareThreads="30" maxSpareThreads="50"
      URIEncoding="UTF-8" keepAliveTimeout="15000"
      redirectPort="8443" />

修改Connector节点,增加executor="tomcatThreadPool",maxThreads,minSpareThreads,maxSpareThreads,keepAliveTimeout等参数的配置
这样就基本上解决了问题,参数具体含义呢,其中两个和上面提到的意义是一样的,executor表示对上面的那个Executor节点的引用,所有这个配置的线程都会在那个池中。
keepAliveTimeout表示每个线程能被卡住的最长时间,也就是能存活的最长时间。

有了上述修改后,我们的tomcat就再也不会被libvirt线程卡住了,一旦卡住,也只是15秒的一个线程,除非能同时请求操过500个线程,否则tomcat都能正常的提供服务了,只是上述参数没经过调优,性能各方面都没有测试,只是临时解决,具体数值的大小,还是需要按照实际情况,经过多组数据的测试对比后然后确定一个值。

通过mysqladmin远程管理mysql

在一些特殊场景下,想要远程重启mysql,以便让某些修改能及时的生效,但是mysql并没有提供远程重启的功能,唯一能做的就是远程关闭mysql服务。

在本地安装mysql的服务端,打开cmd,cd到mysql安装目录下的bin目录,bin目录中可以看到多个可执行文件,其中mysqladmin就是可以用于远程关闭mysql服务的。

mysqladmin的参数如下:

mysqladmin Ver 8.42 Distrib 5.5.2-m2, for Win32 on ia32
Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Administration program for the mysqld daemon.
Usage: mysqladmin [OPTIONS] command command….
-c, –count=# Number of iterations to make. This works with -i
(–sleep) only.
–debug-check Check memory and open file usage at exit .
–debug-info Print some debug info at exit.
-f, –force Don’t ask for confirmation on drop database; with
multiple commands, continue even if an error occurs.
-C, –compress Use compression in server/client protocol.
–character-sets-dir=name
Directory where character sets are.
–default-character-set=name
Set the default character set.
-?, –help Display this help and exit.
-h, –host=name Connect to host.
-b, –no-beep Turn off beep on error.
-p, –password[=name]
Password to use when connecting to server. If password is
not given it’s asked from the tty.
-W, –pipe Use named pipes to connect to server.
-P, –port=# Port number to use for connection or 0 for default to, in
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/services, built-in default (3306).
–protocol=name The protocol of connection (tcp,socket,pipe,memory).
-r, –relative Show difference between current and previous values when
used with -i. Currently works only with extended-status.
-O, –set-variable=name
Change the value of a variable. Please note that this
option is deprecated; you can set variables directly with
–variable-name=value.
–shared-memory-base-name=name
Base name of shared memory.
-s, –silent Silently exit if one can’t connect to server.
-S, –socket=name Socket file to use for connection.
-i, –sleep=# Execute commands again and again with a sleep between.
–ssl Enable SSL for connection (automatically enabled with
other flags). Disable with –skip-ssl.
–ssl-ca=name CA file in PEM format (check OpenSSL docs, implies
–ssl).
–ssl-capath=name CA directory (check OpenSSL docs, implies –ssl).
–ssl-cert=name X509 cert in PEM format (implies –ssl).
–ssl-cipher=name SSL cipher to use (implies –ssl).
–ssl-key=name X509 key in PEM format (implies –ssl).
–ssl-verify-server-cert
Verify server’s “Common Name” in its cert against
hostname used when connecting. This option is disabled by
default.
-u, –user=name User for login if not current user.
-v, –verbose Write more information.
-V, –version Output version information and exit.
-E, –vertical Print output vertically. Is similar to –relative, but
prints output vertically.
-w, –wait[=#] Wait and retry if connection is down.
–connect_timeout=#
–shutdown_timeout=#

Variables (–variable-name=value)
and boolean options {FALSE|TRUE} Value (after reading options)
——————————— —————————–
count 0
debug-check FALSE
debug-info FALSE
force FALSE
compress FALSE
character-sets-dir (No default value)
default-character-set auto
host (No default value)
no-beep FALSE
port 3306
relative FALSE
shared-memory-base-name (No default value)
socket (No default value)
sleep 0
ssl FALSE
ssl-ca (No default value)
ssl-capath (No default value)
ssl-cert (No default value)
ssl-cipher (No default value)
ssl-key (No default value)
ssl-verify-server-cert FALSE
user (No default value)
verbose FALSE
vertical FALSE
connect_timeout 43200
shutdown_timeout 3600

Default options are read from the following files in the given order:
C:WINDOWSmy.ini C:WINDOWSmy.cnf C:my.ini C:my.cnf F:MySQLmy.ini F:MySQLmy.cnf
The following groups are read: mysqladmin client
The following options may be given as the first argument:
–print-defaults Print the program argument list and exit
–no-defaults Don’t read default options from any options file
–defaults-file=# Only read default options from the given file #
–defaults-extra-file=# Read this file after the global files are read

Where command is a one or more of: (Commands may be shortened)
create databasename Create a new database
debug Instruct server to write debug information to log
drop databasename Delete a database and all its tables
extended-status Gives an extended status message from the server
flush-hosts Flush all cached hosts
flush-logs Flush all logs
flush-status Clear status variables
flush-tables Flush all tables
flush-threads Flush the thread cache
flush-privileges Reload grant tables (same as reload)
kill id,id,… Kill mysql threads
password new-password Change old password to new-password, MySQL 4.1 hashing.
old-password new-password Change old password to new-password in old format.

ping Check if mysqld is alive
processlist Show list of active threads in server
reload Reload grant tables
refresh Flush all tables and close and open logfiles
shutdown Take server down
status Gives a short status message from the server
start-slave Start slave
stop-slave Stop slave
variables Prints variables available
version Get version info from server

这里我们只需要其中的-h 参数指定远端主机,-u指定远端登录用户,-p指定需要使用密码认证 最后的命令部分,使用shutdown即可
完整命令如下:
mysqladmin -h10.101.0.1 -uroot -p123456 shutdown

当然同理,可以远程执行ping processlist reload refresh shutdown status start-slave stop-slave variables version等命令

Table '%s' is marked as crashed and last (automatic) repair failed修复方案

Table ‘%s’ is marked as crashed and last (automatic) repair failed

错误编号:144
问题分析:
数据表损坏造成的。
解决方法:
1、通过论坛的 tool 工具进行修复
下载地址和使用说明见:http://www.discuz.net/thread-982699-1-1.html
2、myisamchk 修复
myisamchk 命令的格式如下:
1)myisamchk –recover tbl_name
2)myisamchk –recover /path/tbl_name
这种方法要指定数据表在磁盘上的位置。
3、使用 phpMyAdmin 修复数据的方法
进入论坛数据库,然后选择要修复的表,在页脚下拉框选择“修复”即可。
注意:如果需要修复数据库,修复前一定要做好备份。

转自:http://faq.comsenz.com/viewnews-152

利用命令进行简单的增量文件夹备份

这两天突然看到一个需求点,需要实现增量备份的功能,找了一些资料
记录一下如下命令,该命令可以利用命令行进行简单的增量备份功能。

Win: xcopy C:Docs D:BackupDocs /E /H /R /Y /I /D
每个参数具体的值可以参考 xcopy /? 的输出结果

Linux下可以通过强大的 rsync 命令进行,此命令还是非常强劲的,具体用法可以man一下,或者google一下。

Windows的那个Xcopy的备份命令的

mysql 无法连接问题的定位和修复过程

开发的一款网站防护产品中出现了一个客户端上安装后Mysql每隔一段时间就出现问题,这个问题是客户反馈的,所以需要去复现和定位,定位结果如下:

客户环境:
windows server 2003 r2 standard edition sp2
mysql Ver 14.12 Distrib 5.0.18, for Win32 (ia32)
apache 2.2
瑞星
webshield客户端1.08

问题已复现。可以优化,无法确定是webshield导致的。

搭建环境:
windows server 2003 r2 standard edition sp2
mysql 5.0.18 for win32
apache-2.2.21-win32-x86-no_ssl
php-5.2.17-win32-vc6-x86
瑞星23.00.50.25

搭建环境过程中遇到的几个问题:
在下载apache与php时,请注意apache与php匹配问题。
a)PHP5.3有VC6与VC9版本,应选择VC6版本。原因如下:
i. VC6版本是使用Visual Studio 6编译器编译的,如果你的PHP是用Apache来架设的,那你就选择VC6版本。
ii. VC9版本是使用Visual Studio 2008编译器编译的,如果你的PHP是用IIS来架设的,那你就选择VC9版本。
b)PHP5.3的Thread Safe和Non Thread Safe版本。Apache no_ssl版应与php Thread Safe版搭配。若与Non Thread Safe搭配,apache启动出错:“Apache is running a threaded MPM,but your PHP Modle is not compiled to be threadsafe. You need to recompile PHP.”
i. Thread Safe是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源。ISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;
ii. Non Thread Safe是非线程安全,在执行时不进行线程(Thread)安全检查。FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。
注意apache对网站及PHP的正确配置。特别注意配置文件中LoadModule, PHPIniDir,DocumentRoot,ServerRoot,Directory,DirectoryIndex,AddType application/x-httpd-php等项的配置
安装后 mysql 后(管理员账号密码:admin/admin),在PHP代码中使用admin连接数据库失败,cmd执行mysql –u root -p启用root用root可正常连接数据库。
问题复现:
PHP最长执行时间限制。
a)php最长执行时间默认为30秒,超过30秒后被中止执行,与mysql的连接也被断开。
b)尝试增大此值,修改php目录下的php.ini配置文件,将max_execution_time = 30 改为max_execution_time = 300。如果设为0,表示不限制PHP最大执行时间。
c)避免了因最长执行时间限制而导致mysql连接失败。
网站流量大导致mysql无法连接。
a)编写php脚本对mysql进行测试,发现当对mysql进行频繁的连接/断开操作时,mysql很快出现无法连接问题(错误代码:10048)。当中止所有连接,2分钟后mysql又恢复正常。若不停止连接,mysql一直无法连接。
b)尝试从两方面优化:
i. 修改windows注册表项TcpTimedWaitDelay值为30(默认为240秒),减少此条目的值允许 TCP/IP 更快地释放已关闭的连接, 为新连接提供更多资源。
ii. 修改windows注册表项MaxUserPort为53768 (该值表示从系统请求任何可用用户端口时所用最大端口数,TCP/IP 可指定的最高端口号,默认值为5000)以处理更多的请求。
c)修改完注册表项后测试,mysql情况大有改善:mysql连接错误出现的情况大有减少,出错后自我恢复的能力大有提高。
针对以上两种情况,分别对安装了webshield 1.08与未安装webshield 1.08进行了测试,两者测试结果一样。
优化:
max_execution_time的修改:
打开php目录下的php.ini文件,找到max_execution_time = 30 这行,将30修改为想要的数字。
TcpTimedWaitDelay与MaxUserPort的修改:

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters]
"TcpTimedWaitDelay"=dword:0000001e
"MaxUserPort"=dword:00008000