运维面试常见问题

一.Redis的常见问题

redis面试简单总结:
1.Redis主要是用于做缓存,数据的持久化的作用,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2.Redis不仅仅支持key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。
4.性能极高 读写速度非常快– Redis能读的速度是110000次/s,写的速度是81000次/s

Redis一般应用在:
1、热点数据的缓存。
2、限时业务的运用,利用这一特性可以运用在限时的优惠活动信息、手机验证码等业务场景。
3、计数器相关问题,所以可以运用于高并发的秒杀活动、分布式序列号的生成。
4、排行榜相关问题,进行热点数据的排序。

Redis的缺点
1.缓存和数据库双写一致性问题
2.缓存雪崩问题(小企业一般不会遇见)
3.缓存击穿问题
4.缓存的并发竞争问题
Redis为什么是单线程的
因为CPU不是redis的瓶颈,redis的瓶颈最有可能是机器内存或网络带宽,而且单线程容易实现,所以就采用单线程。

Redis和数据库双写一致性问题
采取正确更新策略,强调一致性要求的数据时,一定不能放缓存。
必须先更新数据库,再删缓存。
新增,更改,删除数据库操作时同步更新redis,可以使用事务机制来保证数据的一致性
其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列。

什么是缓存穿透,怎么解决
缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库查询,造成缓存穿透。
解决方案:最简单粗暴的方式,如果一个查询返回的数据为空(不管数据存不存在还是系统故障),我们就把这个空的结果进行缓存,但它的过期时间会很短,最长不超过5分钟

Redis持久化策略
redis的数据都保存在内存中,如果断电或宕机,则内存数据将擦除,导致数据丢失。
1.RDB模式
特点:
是redis中默认的持久化策略
定期持久化,保存的是redis中的内存数据快照,持久化文件占用空间较小
可能导致内存数据丢失
命令:
前提:需要在redis的客户端中执行
save命令,立即持久化,会导致其他操作陷入阻塞
bgsave命令,开启后台运行,以异步的方式进行持久化,不会造成其他操作的阻塞
2.AOF模式
特点:
1.默认关闭,如果需要开启则需要修改配置文件
2.可以实现数据的实时持久化,记录的是用户的操作过程
3.只要开启了AOF模式,则持久化方式以AOF为主
总结:
1.如果用户允许少量数据丢失,则可选择RDB模式,效率更高
2.如果不允许数据丢失,则选用AOF模式
3.可以两种方式都选,需要搭建主从结构,主机选RDB,从机选AOF,可以保证业务允许

Redis常见的性能问题有哪些?该如何解决?
1.主服务器写内存快照,会阻塞主线程的工作,当快照较大时对性能影响是非常大的,会间断性暂停服务,所有主服务器最好不要写内存快照。
2.redis主从赋值的性能问题,为了主从复制的速度和连接的稳定性,主从库最好在同一个局域网内。
Reids集群哨兵模式的特性?
监控:每个哨兵会不断监控master和slave是否在正常工作
提醒:如果哨兵监控的redis出了问题,哨兵可以通知管理员和其它应用程序
故障转移:如果master未按预期工作,哨兵可以选举出新的master继续工作
配置程序:客户端需要先连接哨兵,哨兵会告知客户当前master节点的地址

二.Tomcat的常见问题

Tomcat部署
1)直接把Web项目放在webapps下,Tomcat会自动将其部署
2)在server.xml文件上配置节点,设置相关的属性即可
3)通过Catalina来进行配置:进入到conf\Catalina\localhost文件下,创建一个xml文件,该文件的名字就是站点的名字。
编写XML的方式来进行设置。

Tomcat工作模式?
Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
Tomcat作为独立服务器:请求来自于web浏览器;

Tomcat容器是如何创建servlet类实例?用到了什么原理?
当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。
然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(
有时候也是在第一次请求时实例化)在servlet注册时加上如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化

Tomcat的优化方法
内存优化:JAVA_OPTS=’-Xms=256m -Xmx=1024m -Xmn=512m’
并发优化:maxProcessors=2000,最大处理线程数maxSpareThreads=2000,tomcat连接器的最大空闲socket线程数
缓存优化:compressionMinSize=2048,启动压缩的输出内容大小,默认2048

Nginx常见问题

为什么要用Nginx?
跨平台、配置简单、反向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少,
而且Nginx内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
使用Nginx的话还能:
节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
稳定性高:宕机的概率非常小
接收用户请求是异步的

Nginx应用场景
http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

Nginx代理负载均衡的调度算法有哪些?具体实现时的现象是什么?
1.轮询(默认):每个请求按时间顺序逐一分配到不同的后端,如果后台某台服务器宕机,自动剔除故障系统,使用户访问不受影响,这种方式简便,成本低,但是可靠性低,负载均衡不均衡,适用于图片服务器集群和纯静态页面服务器集群。
2.weight(权重):weight的值越大分配到访问概率越高,主要用于后端每台服务器性能不均衡的情况下,或者仅仅为在主从的情况下设置不同的权值,达到合理有效的利用主机资源。
3.IP_HASH(访问IP):每个请求按访问的哈希结果分配,使来自同一个IP的访问固定一台后端服务器,并且可以有效解决动态网页存在的session的共享问题。
4.FAIR(第三方):比weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能的进行均衡负载,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。nginx本身不支持fair,如果需要这种调度算法,则需要安装upstream_fair模块。
5.URL_HASH(第三方):按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。这种调度算法需要安装nginx的hash软件包

Mysql常见问题

mysql的内连接、左连接、右连接区别
内连接关键字:inner join;左连接:left join;右连接:right join。
内连接是把匹配的关联数据显示出来;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;右连接正好相反。

mysql索引是怎么实现的
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
具体来说mysql中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是B+树实现的,B+树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所以索引的性能也是更好的。

怎么验证mysql的索引是否满足需求
使用explain查看sql是如何执行查询语句的,从而分析你的索引是否满足需求
explain语法:explain select * from table where type=1

数据库的事务隔离
数据库的事务隔离是在MYSQL.ini配置文件里添加的,在文件的最后添加:transaction-isolation = REPEATABLE-READ,可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
1.未提交读:最低隔离级别,事务未提交前,就可以被其他事务读取(会出现幻读、脏读、不可重复读)
2.提交读:一个事务提交之后才能被其他事务读取到(会造成幻读,不可重复读)
3.可重复读:默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致的,禁止读取到别的事务未提交的数据(会造成幻读)
4.序列化:代价最高最可靠的隔离界别,该隔离级别能防止脏读、不可重复读、幻读

1.脏读:表示一个事务读取到另一个事务未提交的数据
2.不可重复读:在一个事务内,多次读取同一数据,两次读取之间,有另一个事务对数据进行了修改,导致两次数据读取不一致
3.幻读:例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样。

mysql常用引擎
1.InnoDB 引擎:InnoDB 引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count() from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。
2.MyIASM 引擎:MySQL 的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(
) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。

mysql的行锁和表锁
InnoDB支持表锁和行锁,默认为行锁。MySAM只支持表锁。
1.表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突概率最高,并发量最低。
2.行级锁:开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突概率小,并发量最高。

乐观锁和悲观锁
1.乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
2.悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据时都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
数据库的乐观锁需要自己实现,在表里添加一个version字段,每次修改成功值加1,这样每次修改的时候先比对一下,自己拥有的version和数据库现在的version是否一致,如果不一致就不修改,这样就实现了乐观锁。

mysql问题排查手段
1.使用show processlist命令查看当前所有连接信息
2.使用explain命令查询SQL语句执行计划
3.开启慢查询日志,查看慢查询的sql

mysql性能优化
1.为搜索字段创建索引
2.避免使用select *
3.垂直分割分表
4.选择正确的存储引擎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值