在不幸中,我们学会珍惜幸福。在故障中,我们学会维护稳定。
    本来一次架构puma系统的故障,引发了业务开发人员满腔怒火和些许愤恨(搞毛搞啊,就不能稳定点,商户和销售的投诉让人头大的很啊,压力大,你们懂吗),也让这次故障背后的同学感到了压力(看来平时事情做好了,关键时候压力才会少)。
对待每一次业务的故障,我们都应该理性,严肃的思考,分析我们的不足以及列出后期的改进措施。
     为了不给相应的同学造成二次心理伤害,我并不打算把这封邮件搞成故障总结报告,还是用点轻松的语气和词语来分享相关话题吧,虽然感觉有点不合时宜,但是让更多人的明白才会有更多的人理解
     “虚拟机起来后写入数据使得镜像文件达到预分配的额定值,磁盘分配时没有给宿主机预留一部分空间导致kvm进程因为磁盘撑满而启动不了”,这句话怎么理解呢?
    形象点讲就是 我们假设孩子吃得不多,然后把孕妇的口粮多分配了写给孩子。不曾料到这孩子吃得太猛了,孕妇没得吃了。给孩子吃太多(吃了还吐)了,把孕妇给饿找了,孕妇饿晕了,孩子也就出问题了.....
     这时候就有聪明的同学提问了,那虚拟机删除点东西,宿主机不就可以有空间,这样不就可有正常启动了么。
      如果真是这样,那就简单多了,好吧,我们的科普工作开始了。
      为什么虚拟机磁盘镜像文件就不能像妹子一样可胖可?妹子表打我,我胖你不胖。
      这里面涉及了两个问题:1.linux下一切皆文件,包括虚拟机的磁盘  2.linux文件的删除不是真正的删除,而只是简单的做了标记,这样删除文件会很迅速,只有当用到这些空间时才重新写入新的数据
     就是一个物理机器(看得见摸得着的机器,花毛爷爷买来的机器)上,创建了虚拟机(看得见摸不着,虚拟出来的机器),在创建虚拟机磁盘镜像文件时,我们会在宿主机上对虚拟机磁盘文件大小进行分配,虚拟机运行一段时间由于不断写入数据(删除也是一种写操作),虚拟机的磁盘镜像文件就增长到了预设值。由于创建虚拟机的时候未给宿主机(我们前面说的物理机器)预留足够的空间(未考虑到虚拟机的写入数据量(每日500G的数据量,删除后再写入500G,对于宿主机而言就是1T的数据写入),虚拟机磁盘镜像文件基本上是一次分配大小,动态增长,写入的数据占用多少就是多少(数据随机写入,空间数据会被碎片化,虚拟机中看到的占用空间和宿主机看到的磁盘镜像文件大小会严重不一致),不会因为在虚拟机里面进行了删除操作而减小占用的空间),导致这个物理机器上管理虚拟机的进程无法启动,宿主机器上的虚拟机无法正常工作了。
有图有真相,这样才好理解:
虚拟机与宿主机关系


wKiom1Mw_hTD-stMAAEJxqbwED4249.jpg


虚拟机空间占用好比是被石头充满的空间,对虚拟机而言还是会有未使用的空间(被旧数据占据)

对于宿主机而言,虚拟机的磁盘文件是一个整体,所以所占空间只会从“瘦”往“胖”了涨,而不会自动自行压缩变得更瘦。


wKiom1Mw_hTyeW8_AAGH4RXydgs017.jpg


     那虚拟机磁盘文件已经增长到一定程度,那如何才能让虚拟机磁盘文件再次变瘦,瘦得和虚拟机看到的使用空间一样大小呢?
      新建磁盘镜像文件,将现有磁盘文件中的数据复制到新的磁盘镜像文件中
      针对vmware虚拟机,vmware提供了专门的工具可有对虚拟机磁盘镜像文件像整理磁盘碎片文件一样进行整理,然后压缩磁盘镜像文件使用空间,有一定条件限制,压缩不当会造成虚拟机无法工作,就此报废。
     针对kvm实现的虚拟机,qcow2格式的磁盘镜像文件可以在关闭虚拟机的情况下使用0填充未使用的虚拟机磁盘空间,qemu-img convert对虚拟机磁盘镜像文件进行转换,转换后的空间基本可保证是虚拟机真实使用的空间,从而实现了虚拟机磁盘镜像文件压缩的目的。
   如果给虚拟机磁盘镜像分配了过大的空间,是否可以调整?可以的,问题是调整后的虚拟机磁盘需要重新使用分区工具进行分区操作,原有的数据就必须先备份好。
     妹子胖了可以再瘦,虚拟机胖起来那就不好瘦了。
友情提示:
如果文字中有让你感到不舒服的用词或者语句,请自行忽略或者进行替换.....因为我经常用词不当,而且很多时候是故意的。