V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dream4ever
V2EX  ›  服务器

如何避免服务器挂掉 & 服务器挂掉之后如何应急处理?

  •  
  •   dream4ever · 136 天前 · 1461 次点击
    这是一个创建于 136 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前情提要:2020 年年底的时候,公司购买的阿里云服务器突然出故障。服务器装的操作系统是 Windows 2012 R2 ,故障表现为 IIS 无法正常提供服务,上网搜索了报错信息也没找到有用的解决方案。

    想着重启服务器试试,结果重启之后没法通过远程桌面连接登录服务器了,接着通过阿里云管理控制台的 Web 端 VNC 方式登录到服务器上,发现系统卡在开机后与进入 Windows 前的一个蓝色界面,只能选择“恢复或初始化电脑,或者使用高级工具”,要不就是只能关闭电脑。

    当时看到这个界面之后更加不敢乱动了,给阿里云提交了工单,结果阿里云的工程师捣鼓了半天也搞不定。虽然公司购买了快照服务,但当时只保留了最近 7 天的云盘快照,用这几个快照尝试恢复系统,结果发现每个快照在恢复完成并开机后,服务器依然处在那个故障状态,也就是说服务器出故障是在 7 天之前了,所以快照都没有派上用场。

    还好系统盘只是装了一些软件,服务器上各网站的代码、资源文件、数据库还有各种其他文件都在非系统盘,最后花了一天时间重装系统 + 安装配置软件,总算把服务器恢复正常了。

    比较闹心的是,虽然服务器重新跑起来了,但是出现这个问题的原因当时并没有找到。这台服务器我和另一个同事都有权限操作,两个人负责各自的业务,因此也就会安装各自所需的软件,并根据需要对系统进行配置,比如同事配置他的 PHP + MySQL 环境,我配置我的 Node.js + MongoDB 环境。加上服务器上安装的操作系统版本是 Windows 2012 R2 ,而这台服务器本身就是虚拟化的,2012 R2 不支持在虚拟化的机器中使用 Docker ,得 Windows 2016 及更高版本才行。所以服务器从 2016 年运行到 2020 年底,这几年的时间我和另一个同事对系统、软件等各个方面做过太多的改动,后来想想出现崩溃也是在所难免。

    在经历过这次事故之后,自己把服务器运维工作进行了一些规范:

    1. 所有云盘保留最近 30 天自动创建的快照。
    2. 如果安装了软件或者系统补丁,在安装之前会给所有云盘创建手动快照,这样的手动快照会保留最近的 3 份。
    3. 每周二凌晨重启服务器。
    4. 记录自己对服务器系统、软件、阿里云等各个方面所做过的操作或改动。

    上面的 4 点规范中,第 1 、3 两点是通过阿里云提供的服务自动实现的,第 2 点的频率很低,所以能够保证做到。而第 4 点最头疼,虽然专门在本机建了一个文档,用来记录自己对服务器所做的所有操作,但是时不时地还是会忘记做记录。

    而且就像前面所说的,这台服务器自己和另一个同事都有操作权限,即使记录了自己的所有操作,但另一个同事所做的操作自己是无法得知的,所以依然无法保证能够记录下对服务器的所有操作。

    因此,我想就这台服务器的运维工作咨询大家的意见:

    1. 有什么办法能够记录对服务器的所有操作?或者说这个需求是否有意义?能够自动记录操作最好,现在越来越发现,靠人工手动方式来做的事,总是容易出岔子。
    2. 要想减少对服务器系统的改动或操作,是否有必要上 Docker ?
    3. 是否需要将 Windows 升级到支持 Docker 的更高版本?或者将 Windows 系统更换成 CentOS 或 Ubuntu ?这样能否给业务开发、服务器运维带来更多便利?
    4. 如何对服务器的操作进行限制、规范?比如软件只能安装在指定目录,只有拥有特定权限的用户才能安装软件。网站代码及静态文件等也只能存放在指定目录之类的。
    5. 以上操作能否尽量避免服务器挂掉?为了达成这个目标,还有哪些重要的点我遗漏掉了?

    以及如果服务器有一天还是挂掉了,该怎么做才能尽快将服务器上的所有业务恢复?我的想法是,一旦服务器发生崩溃,说明是之前对服务器所做的各种操作积累起来导致了这种情况。在这种情况下,当务之急是先让服务器上的业务恢复运行。

    要想实现这个目的,一方面要用历史快照尝试恢复服务器到正常状态。另一方面,如果尝试了所有快照都无法将系统恢复到正常状态,这个时候又该如何处理?

    欢迎大家给出各种意见和建议,谢谢先~

    24 条回复    2022-01-12 10:47:20 +08:00
    tomczhen
        1
    tomczhen  
       136 天前 via Android
    想想除了装了你说的这些之外还装了别的什么。

    至少有个额外浏览器吧,解压软件总要有一个吧,默认输入法不顺手是不是要再装个?还得来个文本编辑器啥的吧。

    所以服务器崩溃就是因为只是装了这些运行环境吗?
    semoon
        2
    semoon  
       136 天前
    你们这个最简单的方法不是多准备一台,做个负载均衡么...

    理论上两台服务器同时挂的概率很低很低~
    dream4ever
        3
    dream4ever  
    OP
       136 天前
    @tomczhen 上面没有说得那么详细,各种软件其实都装了,Chrome ,WinRAR ,VSCode ,装了很多杂七杂八的软件。

    对服务器的操作不只是装了软件,还有对系统和软件所做的各种配置,东西很多很杂,所以当时就搞不清楚到底是什么原因导致的服务器崩溃。
    dream4ever
        4
    dream4ever  
    OP
       136 天前
    @semoon 一方面要如何保证两台服务器完全一样咧?包括系统设置、软件机器设置、代码、数据库、各类文件。

    另一方面,如果不知道是什么操作弄挂了服务器,从这个角度来说的话,两台服务器同时挂掉的概率好像和一台服务器挂掉的概率也差不多 @_@
    yaoyao1128
        5
    yaoyao1128  
       136 天前 via iPhone
    1. 做手动镜像给配置好的环境 这样排查问题的时候可以用镜像启动
    2. windows 的日志其实挺详细的
    3. 操作限制需要 uac 和 ntfs 的权限管理 可以针对用户设置指定权限
    yaoyao1128
        6
    yaoyao1128  
       136 天前 via iPhone
    @dream4ever 服务器就当作服务器用 我感觉除了 chrome 和 7z 可能就没什么非服务性质的工具需要了
    semoon
        7
    semoon  
       136 天前
    @dream4ever 你们这个完全是管理问题了,如果生产服务器上搞这么多非生产文件、软件,那迟早要掉坑的,如果一定要照这个管理方式,只能定期做版本基线镜像,维护一个可用的“稳定版”。
    ch2
        8
    ch2  
       136 天前   ❤️ 2
    1. 鸡蛋不要放在一个篮子里,所有服务全开在一台服务器里等哪天炸了你就 sb 了。后端服务能拆解尽量拆解,上云函数,上容器托管等,降低业务代码把系统带崩的可能性
    2. 上云了你就得充分利用云,静态数据存到对象存储、NAS 里,而不是放在系统盘本地,防止哪天炸了你压根取不出来这些数据
    3. 数据库等动态存储的重要的数据,你要单独买或者让数据库独占一台服务器,而且要定时备份数据库的数据,而不是依赖系统级别的快照,那个很不靠谱
    4. 保证即使这个台服务器炸了,你也能立刻在另一台新开的服务器上重建,而不是指望这台服务器能跑一辈子。这一条是建立在前几条的基础上的,核心思想是把重要的资产单独保存,而不是用粗粒度的保护办法
    cjpjxjx
        9
    cjpjxjx  
       136 天前
    如何避免服务器挂掉 👉 招一个运维
    服务器挂掉之后如何应急处理? 👉 招一个运维背锅
    dream4ever
        10
    dream4ever  
    OP
       136 天前
    @semoon 现在到年底了,也是打算对服务器做规范化的管理,所以 VSCode 、WinRAR 什么的都是可以卸载的。
    dream4ever
        11
    dream4ever  
    OP
       136 天前
    @ch2 成本和人力限制,决定了只能把所有东西都放在一个服务器里……
    ch2
        12
    ch2  
       136 天前
    @dream4ever #11 那你至少可以做细粒度备份吧,比如挂载一个 oss 存储桶,把数据库的 data 目录 mklink 进去,粗粒度备份可用度很低的
    dream4ever
        13
    dream4ever  
    OP
       136 天前
    @yaoyao1128 一边需要开发业务,同时还需要学习运维知识,感觉有些忙不过来了 >_<
    dream4ever
        14
    dream4ever  
    OP
       136 天前
    @ch2 多谢建议,我研究研究去
    hgc81538
        15
    hgc81538  
       135 天前
    一人一台服务器😁
    IvanLi127
        16
    IvanLi127  
       135 天前 via Android
    最简单的办法,就是跑两台,一主一备。平常用主,软件检测到挂掉或者人工检测到挂掉,拿备用服务器顶上。流量是通过改 dns 切还是其他方式切就看你们怎么玩了
    mhycy
        17
    mhycy  
       135 天前
    windows 服务器真心不好运维
    lm930129
        18
    lm930129  
       135 天前
    如果成本允许,可以建议自己在本地搞个小型的超融合:
    一个 20U 左右的服务器机柜,3 台 2U 的服务器,V4 的服务器 U 的服务器成本在 4000 左右一台,一台千兆交换机。这加起来的成本是 700+4000*3+1000,然后用 VMware 组个超融合,开虚拟机的时候,VMware 会自动给你创建三个,其中 2 个是备份,这样硬件坏了一台不要紧。备份的话,可以用群辉或者威联通来做 VMware 的快照,这些 NAS 都是支持快照功能的,成本是 3000 左右。

    你可以核算下这个成本和你上云的成本,看看是是否划算,其实自身买这个设备呢,就是定制度更高了,快照保留时间可能就更长了。但是运维起来,可能就前期是有点麻烦的,后期基本很少维护的。云服务器的维护其实很有限,虽然说什么云厂商的工程师牛逼,但是遇到的问题形形色色,他们也有没遇到过的,就解决不了。
    h82258652
        19
    h82258652  
       135 天前
    MySQL 、MongoDB 、Redis 、OSS 这种直接买服务,你现在买一台云服务器再在上面装个就是假上云(跟我司一样),一个是备份不好弄,像阿里云 MySQL 那种都是有异地备份的,另一个是像 redis 这种在 win 上是不建议跑生产的。

    另外可以搞个宝塔之类监控,你这个 7 天之前都挂了,但没发现,搞个监控挂了也能及时接到通知。
    iBugOne
        20
    iBugOne  
       135 天前 via Android
    用 Linux ,各种破事比 Windows 少
    dream4ever
        21
    dream4ever  
    OP
       135 天前
    @lm930129 对我要求太高了,本地还得上商业宽带,事情太多,钱可能也不少,这个方案不考虑了,不过依然谢谢您的建议。
    dream4ever
        22
    dream4ever  
    OP
       135 天前
    @h82258652 7 天之前并没有挂,服务器崩溃那天,同事发现各网站无法访问,登录服务器后 IIS 报错,按照报错信息搜索也没能解决。于是尝试重启大法,结果重启后进不去服务器了。

    数据库什么的考虑过买服务,但我们公司是传统公司,IT 部门只花钱不赚钱,所以成本必须得考虑,数据库什么的目前是没法买云服务的,很无奈。
    dream4ever
        23
    dream4ever  
    OP
       135 天前
    @IvanLi127 备机要怎么做?用主的磁盘快照生成?还是通过别的什么方式和主机同步?
    ishalla
        24
    ishalla  
       135 天前
    有什么办法能够记录对服务器的所有操作?或者说这个需求是否有意义?能够自动记录操作最好,现在越来越发现,靠人工手动方式来做的事,总是容易出岔子。
    A:其实 Windows Server 的 Event View 里就有,所有操作都有日志

    要想减少对服务器系统的改动或操作,是否有必要上 Docker ?
    A:docker 在 Windows Server 上似乎也不是特别稳定,也会跑跑挂掉,Windows Server 的性能和不稳定问题很难解决。

    是否需要将 Windows 升级到支持 Docker 的更高版本?或者将 Windows 系统更换成 CentOS 或 Ubuntu ?这样能否给业务开发、服务器运维带来更多便利?
    A:换成 Linux 会好。

    如何对服务器的操作进行限制、规范?比如软件只能安装在指定目录,只有拥有特定权限的用户才能安装软件。网站代码及静态文件等也只能存放在指定目录之类的。
    A:不要开放服务器登陆权限,只有管理员有权限,弄一个跳板机更安全。

    以上操作能否尽量避免服务器挂掉?为了达成这个目标,还有哪些重要的点我遗漏掉了?
    A:其实都已经上云了,如果业务比较重要,建议 Serverless ,拆分成各种服务,虽然不便宜,但稳定性要好多了吧。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2771 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:58 · PVG 20:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.