导读:收集常见架构技术点,作为项目经理了解这些知识点以及解决具体场景是很有必要的。技术要服务业务,技术跟业务具体结合才能发挥技术的价值。
目录
1. 宕机
宕机,一般情况下指的就是计算机主机出现意外故障而死机。其次,一些服务器例如数据库死锁也可以称为宕机,一些服务器的某些服务挂掉了,就可以这么说。网站是不能访问的,也就是说服务器出了问题。
1、由操作员意向操作的重启——用于维护或更新服务器、部署机房或特殊情况等等。
2、非操作员本身意愿造成的重启——如供电(欠压,过载,波动)、震动、硬件质量(热稳定性(热敏度)和抗干扰能力)、资源冲突、DirectX文件的损坏、系统不完善或瓶颈问题、病毒、灰尘、散热不良……等等原因而造成重启。
3.、由于用户访问量过大,造成资源耗尽,或者你网站的数据超出你的空间限制范围大小也会出现宕机。
处理:
重启服务器的好处:
一般来说,如果是正常的重启是没有什么坏处,相反,对于操作系统而言反而有好处。重启服务器可以清除内存碎片,重新优化软件调用级别,中断无用的网络端口等。
1、重启服务器对服务器的保养有一定的作用,释放内存,缓解CPU压力。服务器运行时间长,会造成很多冗余的DLL程序,导致系统运行速度较慢。系统重启会使电脑恢复到默认加载状态,也就是说在还未重启时的很多应用程序进程都驻留在内存中,会使电脑变慢,重启后它们就没了。
2、还有就是有的一些对电脑的配置要重新启动后才能生效。
3、重启服务器可以使有些程序可以得到更新。
重启服务器的危害:
1、正在进行写硬盘操作时,即硬盘灯在不停地闪动时,断电或者强制重启,对硬盘的伤害最大。
2、热启动(CTRL+ALT+DEL),对硬件上不会有损伤(软件上有时会发生程序非法中止导致数据丢失的问题);如果是冷启动(直接开关电源),就会对硬件尤其是硬盘造成伤害。除非无法正常关机可以考虑热启动。
3、重启的突然来电会有大量电流涌入电源,反复进行会使机器寿命大大降低,而且在硬盘正在读写的时候突然地断电也非常容易引起硬盘出现坏道从而损失数据。
4.非正常重启的危害:首先,这样轻则会使硬盘掉数据,造成逻辑坏道,重则造成物理的坏道,损坏硬盘磁头伺服电路。还有,这也会造成主板的二度伤害,主板在一通一断当中对电路部分的冲击是比较大的。再则也会对电源造成一定的损害。
2. coredump
程序崩溃时的内存快照。当程序出错而异常中断时,OS会把程序工作的当前状态存储成一个coredunmp文件。操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个文件里。
3. 缓存穿透/击穿/雪崩
缓存穿透:缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。
缓存击穿:缓存击穿是指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。
缓存雪崩:缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。
与缓存击穿不同的是:存击穿是热点key失效,缓存雪崩是大量的key同时失效。
4. 500/501/502/503/504/505
4.1 500
Internal Server Error:内部服务错误,一般是服务器遇到意外情况,而无法完成请求。可能原因:
-
1、程序错误,例如:ASP或者PHP语法错误;
-
2、高并发导致,系统资源限制不能打开过多的文件所致。
4.2 501
Not implemented:服务器不理解或不支持请求的HTTP请求。
502 Bad Gateway:WEB服务器故障,可能是由于程序进程不够,请求的php-fpm已经执行,但是由于某种原因而没有执行完毕,最终导致php-fpm进程终止。可能原因:
-
1、Nginx服务器,php-cgi进程数不够用;
-
2、PHP执行时间过长;
-
3、php-cgi进程死掉;
4.3 503
Service Unavailable:服务器目前无法使用。系统维护服务器暂时的无法处理客户端的请求,这只是暂时状态。可以联系下服务器提供商。
4.4 504
Gateway Timeout:服务器504错误表示超时,是指客户端所发出的请求没有到达网关,请求没有到可以执行的php-fpm,一般是与nginx.conf的配置有关。
4.5 505
HTTP Version Not Supported:服务器不支持请求中所用的 HTTP 协议版本。(HTTP 版本不受支持)
除了500错误可能是程序语言错误,其余的报错,都大概可以理解为服务器或者服务器配置出现问题。
5. 内存溢出/内存泄漏
内存溢出:内存溢出(Out Of Memory)指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。
一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
(1)内存溢出原因:
- 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
- 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
- 代码中存在死循环或循环产生过多重复的对象实体;
- 使用的第三方软件中的BUG;
- 启动参数内存值设定的过小
(2)内存溢出的解决方案:
- 第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
- 第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
- 第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。(Jprofiler工具)
- 第四步,使用内存查看工具动态查看内存使用情况
内存泄漏:内存泄漏(Memory Leak)指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
扩展:内存泄露与内存溢出_内存泄漏和内存溢出_一只野良猫w的博客-CSDN博客
6. 句柄泄漏
句柄泄漏是进程在调用系统文件之后,没有释放已经打开的文件句柄。一般句柄泄漏后的现象是,机器变慢,CPU飙升,出现句柄泄漏的cgi或server的CPU使用率增加。
在 Linux 平台上运行的进程都会从系统资源申请一定数量的句柄,而且系统控制了进程能够申请的最大句柄数量。用户程序如果不及时释放无用的句柄,将会引起句柄泄露,从而可能造成申请资源失败,导致系统文件句柄用光连接不能建立。
句柄可以映射到唯一的对象,它是处理对象的一个接口,对于所涉及的对象,可以通过相应的句柄来操作它。句柄的引入主要是操作系统为了避免应用程序直接对某个对象的数据结构进行操作为目的,用操作句柄来代替操作对象。
在 Linux 环境中,任何事物都是用文件来表示,设备是文件,目录是文件,socket 也是文件。用来表示所处理对象的接口和唯一接口就是文件。应用程序在读 / 写一个文件时,首先需要打开这个文件,打开的过程其实质就是在进程与文件之间建立起连接,句柄的作用就是唯一标识此连接。此后对文件的读 / 写时,目标文件就由这个句柄作为代表。最后关闭文件其实就是释放这个句柄的过程,使得进程与文件之间的连接断开。
在 Linux 系统中,进程与文件之间是通过“打开文件”操作建立连接,文件系统会返回文件句柄来唯一标识进程与文件的连接。每当一个进程执行完毕之后,Linux 系统会将与进程相关的文件句柄自动释放。但是,如果进程一直处于执行状态,文件的句柄只能通过“关闭文件”操作来自我释放。与 Windows 系统的设置不同,Linux 系统对进程可以调用的文件句柄数做了限制,在默认情况下,每个进程可以调用的最大句柄数为 1024 个。超过了这个数值,进程则无法获得新的句柄。因此,句柄的泄露将会对进程的功能失效造成极大的隐患。
7. 死锁
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都抑制处于阻塞状态并无法进行下去,此时称系统处于死锁状态或系统产生了死锁。
产生死锁的必要条件:
- 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
- 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
- 环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。
预防死锁
- 资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
- 只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
- 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
- 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
8. 软中断/硬中断
硬中断:我们通常所说的中断指的是硬中断(hardirq)。主要是用来通知操作系统系统外设状态的变化。
软中断:1、通常是硬中断服务程序对内核的中断;2、为了满足实时系统的要求,中断处理应该是越快越好。
linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。
9. 毛刺
在短暂的某一刻,服务器性能指标(如流量、磁盘IO、CPU使用率等)远大于该时刻前后时间段。毛刺的出现代表这服务器资源利用不均匀,不充分,容易诱发其他更严重的问题。
10. 重放攻击
攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。它是一种攻击类型,这种攻击会不断恶意或欺诈性地重复一个有效的数据传输,重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。
11. 网络孤岛
网络孤岛指集群环境中,部分机器与整个集群失去网络连接,分裂为一个小集群并且发生数据不一致的状况。
12. 数据倾斜
对于集群系统,一般缓存是分布式的,即不同节点负责一定范围的缓存数据。我们把缓存数据分散度不够,导致大量的缓存数据集中到了一台或者几台服务节点上,称为数据倾斜。一般来说数据倾斜是由于负载均衡实施的效果不好引起的。
13. 脑裂
脑裂是指在集群系统中,部分节点之间网络不可达而引起的系统分裂,不同分裂的小集群会按照各自的状态提供服务,原本的集群会同时存在不一致的反应,造成节点之间互相争抢资源,系统混乱,数据损坏。
问题原因:
- 1.网络问题->网络异常问题造成集群发生物理分离,造成脑裂
- 2.节点负载->若master结点负载过高,可能造成master结点停止响应,从而脱离集群,集群重新选主,恢复响应后出现脑裂问题
解决措施
- 1.网络问题->网络异常问题造成集群发生物理分离,造成脑裂
- 2.节点负载->若master结点负载过高,可能造成master结点停止响应,从而脱离集群,集群重新选主,恢复响应后出现脑裂问题