面试总结

Linux三剑客

1、删除/显示1.txt文件第3行到第10行的内容?(1.txt文件内容自定义)
sed -n ‘3,10d’ 1.txt
sed -n ‘3,10p’ 1.txt
2、使用awk取出/etc/passwd第一列数据也就是取出用户名。
cat /etc/passwd | awk -F “:” ‘{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲' 3、查询file.txt以…’ file.txt
awk ‘/.abc$/{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 0}̲' file.txt sed …/p’ file.txt
4、删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
sed -r ‘/#/s@#|[ \t]+@@g’ /etc/fstab
5、使用sed命令打印出文件的第一行到第三行
sed -n ‘1,3p’ file.txt
6、把data目录及其子目录下所有以扩展名.txt结尾的文件中包含oldgirl的字符串全部替换为oldboy.
find /data -type f -name '
.txt’ | xargs sed -i ‘s/oldgirl/oldboy/g’
7、删除abc.txt文件中的空行
sed -i ‘/^$/d’ abc.txt
8、查看linux服务器ip的命令,同时只显示包含ip所在的行打印出来
ip a | awk -F “[ 😕]” ‘/inet / {print $6}’
9、用awk获取文件file.txt中第三行的倒数第二列字段
awk ‘NR == 3{print $(NF-1)}’ file.txt
10、从a.log文件中提取包含“WARNING”或“FATAL”,同时不包含“IGNOR”行,然后,提取以“:”分割的第五个字段
grep ‘WARNING|FATAL’ a.log|grep -v’IGNOR’|awk -F: ‘{print$5}’
11、使用awk分析apache或nginxd的访问日志(最后一个字段是IP,统计访问量前十的IP,并进行排序)
awk ‘{print $1}’ /var/log/nginx/access.log |sort |uniq -c |head -n 10

Shell脚本

1、解释下Shell脚本中的#!/bin/bash 的作用?

#!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是解释此脚本的shell的路径。

2、如何调试脚本?$ , , ,@,KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲,!,$*分别什么意思?

Sh -n检查语法是否正确
sh -x是显示每个命令执行时候的参数
$$
Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
$!
Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
$?
最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
∗ 所 有 参 数 列 表 。 如 " * 所有参数列表。如" "*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。
@ 所 有 参 数 列 表 。 如 " @ 所有参数列表。如" @"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。
@ 跟 @ 跟 @*类似,但是可以当作数组用
$#
添加到Shell的参数个数

2、编写 Shell 程序,实现自动删除 50 个账号的功能,账号名为stud1 至 stud50 ?
#!/bin/sh
#del users
#2021.8.25
#zahngxu
for ((i=1;i<=50;i++));do
userdel -r stud$i
done

3、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少?
#!/bin/sh
read -p “请输入ip地址” name
ping -c1 $name &> /dev/null
if [[ ? − e q 0 ] ] ; t h e n e c h o " ? -eq 0 ]];then echo " ?eq0]];thenecho"name" >> /root/online.txt
echo "在线主机: sort /root/online.txt | uniq -c"
else
echo “$name” >> offline.txt
echo “离线主机:sort /root/offline.txt | uniq -c
fi

4、编写shell脚本监控httpd的进程数,根据监控情况做相应处理,需求如下:
1.每隔10s监控httpd的进程数,若进程数大于等于500,则自动重启Apache服务并检测服务是否重启成功
2.若未成功则需要再次启动,若重启5次依旧没有成功,则向管理员发送告警邮件,并退出检测
3.如果启动成功,则等待1分钟后再次检测httpd进程数,若进程数正常,则恢复正常检测(10s一次),否则放弃重启并向管理员发送

#!/bin/bash
#定义重启Apache服务的脚本
function check_apache()
{
count=0
for i in seq 1 5
do
/usr/local/apache/bin/apachectl -k restart 2>/tmp/apache.err
#如果Apache重启不成功,则计数变量加1
if [ ? − n e 0 ] t h e n c o u n t = ? -ne 0 ] then count= ?ne0]thencount=[$count+1]
else
break
fi
done
#如果Apache重启失败5次,则发送邮件通知管理员
if [ $count -eq 5 ]
then
mail -s “Apache进程数大于500,重启失败” root@localhost.com “head -1 /tmp/apache.err
exit
fi
}

while true
do
#每10秒检测一次httpd进程数
n=pgrep -l httpd|wc -l
#如果大于500,则重启
if [ $n -ge 500 ]
then
check_apache
sleep 60
#重启1分钟后进程数仍然大于500,则通知管理员并退出脚本
n1=pgrep -l httpd|wc -l
if [ $n1 -ge 500 ]
then
mail -s “Apache重启1分钟后进程数仍然大于500,请登录服务器排查问题” root@localhost.com
exit
fi
fi
sleep 10
done

Mysql数据库

1、数据库事务是什么?事务有哪几个特性?

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
原子性:事务中的操作要么全部执行,要么全部不执行。事务不会停在某个过程当中,如果执行过程中发生错误,事务会回滚到事务执行之前,就像事务从来没有执行过一样。
隔离性:数据库允许事务并发读写和修改数据时,隔离性可以让事务并发交叉执行时不会导致数据不一致,隔离的级别有未提交、读提交、可重复读、串行化。
一致性:事务执行前和完成后不会改变数据库的完整性,写入的数据完全按照事先制定好的规则执行,包括数据的精确性和串联型,以及数据库在后续可以自发的完成预定的工作。
持久性:事务结束后对数据的修改是永久的,就算系统故障也不会丢失

2、数据死锁是怎么产生的,怎么避免或解决此问题?

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
常见的解决死锁的方法
1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率,如果业务处理不好可以用分布式事务锁或者使用乐观锁

3、请你谈谈怎么优化数据库的性能?有哪些手段或方法?

系统的吞吐量瓶颈往往出现在数据库的访问速度上
随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢
数据是存放在磁盘上的,读写速度无法和内存相比
优化原则:减少系统瓶颈,减少资源占用,增加系统的反应速度。
数据库结构优化
一个好的数据库设计方案对于数据库的性能往往会起到事半功倍的效果。
需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。
将字段很多的表分解成多个表
对于字段较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。
因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。
增加中间表
对于需要经常联合查询的表,可以建立中间表以提高查询效率。
通过建立中间表,将需要通过联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询。
增加冗余字段
设计数据表时应尽量遵循范式理论的规约,尽可能的减少冗余字段,让数据库设计看起来精致、优雅。但是,合理的加入冗余字段可以提高查询速度。
表的规范化程度越高,表和表之间的关系越多,需要连接查询的情况也就越多,性能也就越差。
注意:
冗余字段的值在一个表中修改了,就要想办法在其他表中更新,否则就会导致数据不一致的问题。

4、请阐述下数据库主从复制原理和读写分离原理?

主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。
读写分离:就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全

5、解释MySQL外连接、内连接与自连接的区别

内连接:内连接:是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。
外连接:其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。
右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。
顾名思义,把两张表的字段都查出来,没有对应的值就显示null,但是注意:mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接。
自连接:是指所有查询出的结果都是能够在连接的表中有对应记录的。

6、什么叫视图?视图的作用,视图可以更改么?

为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以储存的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。
视图使开发者只关心感兴趣的某些特定数据和所负责的特定任务,只能看到视图中所定义的数据,而不是视图所引用表中的数据,从而提高了数据库中数据的安全性。
可以修改。当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。事实上,当从视图中插入或者删除时,情况也是这样。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的

7、索引有哪些优缺点?索引有哪几种类型?

索引的优点:
可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点:
时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;
空间方面:索引需要占物理空间
主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引
可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引
普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引
可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);创建组合索引
全文索引: 是目前搜索引擎使用的一种关键技术。
可以通过ALTER TABLE table_name ADD FULLTEXT (column);创建全文索引

Redis和memcache

1、为什么要用 Redis /为什么要用缓存?Redis支持哪几种数据类型?

主要从“高性能”和“高并发”这两点来看待这个问题。
高性能:
假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!
高并发:
直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求

2、什么是Redis持久化?Redis 的持久化机制是什么?各自的优缺点?

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:
RDB:是Redis DataBase缩写快照
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
优点:
1、只有一个文件 dump.rdb,方便持久化。
2、容灾性好,一个文件可以保存到安全的磁盘。
3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
4.相对于数据集大时,比 AOF 的启动效率更高。
缺点:
1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)
2、AOF(Append-only file)持久化方式: 是指所有的命令行记录以 redis 命令请 求协议的格式完全持久化存储)保存为 aof 文件。
AOF:持久化
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
优点:
1、数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。
2、通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))
缺点:
1、AOF 文件比 RDB 文件大,且恢复速度慢。
2、数据集大的时候,比 rdb 启动效率低。
优缺点是什么?
• AOF文件比RDB更新频率高,优先使用AOF还原数据。
• AOF比RDB更安全也更大
• RDB性能比AOF好
• 如果两个都配了优先加载AOF

3、redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
(2) redis的速度比memcached快很多
(3) redis可以持久化其数据
(4)Redis支持数据的备份,即master-slave模式的数据备份。
(5) 使用底层模型不同,它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
(6)value大小:redis最大可以达到1GB,而memcache只有1MB

4、Memcache与Redis的区别都有哪些?

两者都是非关系型内存键值数据库,现在公司一般都是用 Redis 来实现缓存,而且 Redis 自身也越来越强大了!Redis 与 Memcached 主要有以下不同:

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
(2) redis的速度比memcached快很多
(3) redis可以持久化其数据

5、Redis的主从架构常见有哪几种?

单机的 redis,能够承载的 QPS 大概就在上万到几万不等。对于缓存来说,一般都是用来支撑读高并发的。因此架构做成主从(master-slave)架构,一主多从,主负责写,并且将数据复制到其它的 slave 节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发。
redis replication -> 主从架构 -> 读写分离 -> 水平扩容支撑读高并发

6、一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。如何避免缓存穿透?

缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案
接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力
附加

7、当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力,导致系统崩溃。叫做缓存雪崩。如何避免缓存雪崩?

缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

LVS

1、简述LVS三种模式及报文流转是怎样的?

Nat模式:基于数据包的转换。client访问目标服务器的vip当prerouting链发现是自己的ip就传给input链,ipvs会判断是否为集群服务,若是集群服务就会将vip地址换为后端真实服务器的rip,当postrouting链传出数据后,后端真实服务器会判断是否为自己ip,若是就会构建响应报文返回给目标服务器,经过postoutng、forward、prerouting返回到客户端,当报文到达prerouting链时会将rip转化为vip返回给客户端。
Dr模式:基于mac地址的转换。客户访问目标服务器,prerouting链判断是否为自己ip,若是将报文发送到iput链,ipvs判断是否为集群服务,若是则将vip的mac地址换为dip的mac地址将vip的mac地址换为rip的mac地址,通过posting链后会将报文转发到真实服务器上,当真实服务器判断为自己mac地址时将通过回环网卡向发出此时源ip为vip目标ip为cip
Tun模式:客户端访问目标服务器,当prerouting判断为自己ip时将报文发送到input链上,ipvs判断是否为集群服务,若是则在其上面封装一层ip,封装源ip为dip,目标ip为rip发送给postrouting链,当真实服务器确定是自己的IP后接收报文,拆除外层ip后发现目标地址为自己的lo地址,此时rs处理服务,将数据由lo网卡发出,此时源ip为vip目标ip为cip。

2、LVS目前实现的几种调度算法有哪些?

rr 轮询算法,它将请求依次分配给不同的rs节点,也就是RS节点中均摊分配。这种算法简单,但只适合于RS节点处理性能差不多的情况
wrr 加权轮训调度,它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。
Wlc 加权最小连接数调度,假设各台RS的全职依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的RS作为下一个分配的RS
Dh 目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得需要的RS
SH 源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS
Lc 最小连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS.
Lblc 基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。

Keepalived

1. 简单讲述一下运维中集群技术的应用、如负载均衡、高可用、分布式

高可用
高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。它通常是指,通过设计减少系统不能提供服务的时间。
负载均衡
负载均衡(Load Balance)含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
分布式
分布式是指将一个业务拆分成多个子系统,部署在不同的服务器上。
将一个大任务划分为若干个小任务。一个或多个人(或机器)完成同一任务中的不同部分。被分解后的小任务互相之间具有独立性,节点之间只管接收和传递信息。
分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式的。

2、简述Keepalived及其工作原理?

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
keepalived主要有三个模块,分别是core、check和vrrp。
core模块
为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
check
负责健康检查,包括常见的各种检查方式。
vrrp模块
是来实现VRRP协议的。
在虚拟路由中,只有作为主master的路由器去发送vrrp通告消息,而从backup不能发送,只能接受,出去安全考虑的话,会进行加密,而backup不会争抢master,因为有优先级权重的限制,当主master发生故障宕机时,也就是从backup收不到vrrp通告消息的时候,多个backup中优先级最高的会成为新的master,时间非常迅速,小于1s,保证整个服务的连续性

3、简述Keepalived如何通过健康检查来保证高可用?

• TCP_CHECK:工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。
• HTTP_GET:工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。
• SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL连接
• MISC_CHECK:用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:
0) 检测成功
1) 检测失败,将从服务器池中移除
2-255)检测成功;如果有设置misc_dynamic,权重自动调整为 退出码-2,如退出码为200,权重自动调整为198=200-2。
• SMTP_CHECK:用来检测邮件服务的smtp的
• 也可编写vrrp_script在track_check力调用脚本进行监控

Nginx

1、简述下四层负载lvs和七层负载nginx的区别?

四层负载,说的是基于IP+端口的负载均衡; 七层负载,说的是基于WEB请求,URL等应用信息的负载均衡。 四层负载就是通过虚机的IP+端口接收请求,然后再分配到真实的服务器; 七层负载就是通过虚机主机名或者URL接收请求,再根据一些规则分配到真实的服务器,常见的应用是nginx。

2、简述LVS、Nginx、HAProxy各自优缺点?

Nginx优缺点: 优点:开源软件,简单易部署;功能强大,七层负载基本可以满足所有需求。 缺点:仅支持http,https,Email协议;对后端服务器的检测,仅通过IP+端口来检查,不可以通过URL来检查;不支持会话session保持的一致行,但可以通过IP+HASH来解决。 LVS优缺点: 优点:工作在4层,仅做分发作用,没有流量产生,因此。负载性能最强,对内存和cpu消耗率更低; 缺点:不支持正则表达式,不支持动静分离。 Haproxy优缺点: 优点:支持session会话保持一致,四层和七层都支持;支持通过URL来检测后端服务器的状态。 缺点:
在七层转发支持上,不如nginx强大。
不支持POP/SMTP协议
不支持SPDY协议
不支持HTTP cache功能。现在不少开源的lb项目,都或多或少具备HTTP cache功能。
重载配置的功能需要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好。
多进程模式支持不够好

3、请问当用户反馈网站访问慢,你会如何处理?有哪些方面的因素会导致网站网站访问慢?

1、服务器出口带宽不够用
本身服务器购买的出口带宽比较小。一旦并发量大的话,就会造成分给每个用户的出口带宽就小,访问速度自然就会慢。
跨运营商网络导致带宽缩减。例如,公司网站放在电信的网络上,那么客户这边对接是长城宽带或联通,这也可能导致带宽的缩减。
2、服务器负载过大,导致响应不过来
可以从两个方面入手分析:
分析系统负载,使用 w 命令或者 uptime 命令查看系统负载。如果负载很高,则使用 top 命令查看 CPU ,MEM 等占用情况,要么是 CPU 繁忙,要么是内存不够。
如果这二者都正常,再去使用 sar 命令分析网卡流量,分析是不是遭到了攻击。一旦分析出问题的原因,采取对应的措施解决,如决定要不要杀死一些进程,或者禁止一些访问等。
3、数据库瓶颈
如果慢查询比较多。那么就要开发人员或 DBA 协助进行 SQL 语句的优化
如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等。然后,也可以搭建 MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。
4、网站开发代码没有优化好
例如 SQL 语句没有优化,导致数据库读写相当耗时。
针对网站访问慢,怎么去排查?
1、首先要确定是用户端还是服务端的问题。当接到用户反馈访问慢,那边自己立即访问网站看看,如果自己这边访问快,基本断定是用户端问题,就需要耐心跟客户解释,协助客户解决问题。
不要上来就看服务端的问题。一定要从源头开始,逐步逐步往下。
2、如果访问也慢,那么可以利用浏览器的调试功能,看看加载那一项数据消耗时间过多,是图片加载慢,还是某些数据加载慢。
3、针对服务器负载情况。查看服务器硬件(网络、CPU、内存)的消耗情况。如果是购买的云主机,比如阿里云,可以登录阿里云平台提供各方面的监控,比如 CPU、内存、带宽的使用情况。
4、如果发现硬件资源消耗都不高,那么就需要通过查日志,比如看看 MySQL慢查询的日志,看看是不是某条 SQL 语句查询慢,导致网站访问慢。
怎么去解决?
1、如果是出口带宽问题,那么久申请加大出口带宽。
2、如果慢查询比较多,那么就要开发人员或 DBA 协助进行 SQL 语句的优化。
3、如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等等。然后也可以搭建MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。
4、申请购买 CDN 服务,加载用户的访问。
5、如果访问还比较慢,那就需要从整体架构上进行优化咯。做到专角色专用,多台服务器提供同一个服务。

4、Nginx常见模块有哪些?分别有什么作用?

ngx_http_access_module 四层基于IP的访问控制,可以通过匹配客户端源IP地址进行限制
ngx_http_auth_basic_module 状态页,使用basic机制进行用户认证,在编译安装nginx的时候需要添加编译参数–withhttp_stub_status_module,否则配置完成之后监测会是提示语法错误
ngx_http_stub_status_module 状态统计模块
ngx_http_gzip_module 文件的压缩功能
ngx_http_gzip_static_module 静态压缩模块
ngx_http_ssl_module nginx 的https 功能
ngx_http_rewrite_module 重定向模块,解析和处理rewrite请求
ngx_http_referer_module 防盗链功能,基于访问安全考虑
ngx_http_proxy_module 将客户端的请求以http协议转发至指定服务器进行处理
ngx_stream_proxy_module tcp负载,将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module 将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module 将客户端对Python的请求以uwsgi协议转发至指定服务器处理
ngx_http_headers_module 可以实现对头部报文添加指定的key与值
ngx_http_upstream_module 负载均衡模块,提供服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_stream_upstream_module 后端服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_http_fastcgi_module 实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理
ngx_http_flv_module 为flv伪流媒体服务端提供支持

5、什么是反向代理,什么是正向代理,什么是http服务器?Nginx又是怎样实现这些的?

正向代理代理的对象是客户端,反向代理代理的对象是服务端
利用ngx_http_proxy_module模块将客户端的请求以http协议转发至指定服务器进行处理

6、Nginx支持的负载均衡的算法有哪些?如何实现会话保持?

轮循(默认) Nginx根据请求次数,将每个请求均匀分配到每台服务器 最少连接 将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。 IP Hash 绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。
在做Nginx的负载均衡时,可以在upstream里设置ip_hash,每个请求按访问ip的hash结果分配,映射到固定某一台的服务器,当后端服务器宕机后,session会丢失,再次发起请求时,会重新固定访问另一台正常的服务器并实现会话保持。缺点就是由于同一个IP客户端都固定访问一个后端服务器,这就可能会导致负载不均衡。
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
基于cookie的会话保持
这种方式就是将 用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在该用户的session,如果没有就先把cookie里面的sessoin存入该服务器,实现session会话保持。缺点是存入cookie有安全隐患,比如黑客可能会获取你的cookie从而获取你相关信息。使用这种方式实现会话保持保持,需要添加sticky_cookie_insert模块,与ip_hash不同之处在于,它不是基于IP来判断客户端的,而是基于cookie来判断。
总结:
Nginx会话保持一般有基于ip_hash和基于cookie两种方式,尽管Nginx的会话保持可以使某个ip客户端访问固定的后端服务器,但这可能会导致负载的不均衡。采用cookie的方式进行会话保持时,需要引入第三方模块(sticky模块)才能实现。 使用sticky_cookie_insert启用会话亲缘关系,这会导致来自同一客户端的请求被传递到一组服务器的同一台服务器,这种方法可以避免上述ip_hash中来自同一局域网的客户端和前段代理导致负载失衡的情况。 使用后端服务器自身通过相关机制保持session同步,如:使用数据库、redis、memcached 等做session复制。

7、常见的http应用的错误码有哪些?其含义是什么,该怎么解决这些错误码对应的问题?(比如404错误码)

1信息,服务器收到请求,需要请求者继续执行操作
2
成功,操作被成功接收并处理
3重定向,需要进一步的操作以完成请求
4
客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误
404表示服务器无法根据客户端的请求找到资源(网页),可能是配置的索引地址不对或者网页资源没有进行上传。

DNS

1、简述NDS进行域名解析的过程

  1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
  2. 如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。
    但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。
  3. 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。
  4. 如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析
  5. 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址
  6. 此时LDNS再发送请求给上一步返回的gTLD
  7. 接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器
  8. Name Server根据映射关系表找到目标ip,返回给LDNS
  9. LDNS缓存这个域名和对应的ip
  10. LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束

2、什么是A记录,什么是CNAME,什么是顶级域名,常见的DNS服务器地址有哪些?

A记录,即Address记录,它并不是一个IP或者一个域名,我们可以把它理解为一种指向关系:
域名 www.xx.com → 1.1.1.1
主机名 DD → 2.2.2.2
也就是当你访问这些域名或者主机名的时候,DNS服务器上会通过A记录会帮你解析出相应的IP地址,以达到后续访问目的。所以A记录是IP解析,直接将域名或主机名指向某个IP。A记录将域名指向一个ipv4地址
CNAME CNAME记录,也叫别名记录,相当于给A记录中的域名起个小名儿,比如www.xx.com的小名儿就叫www.yy.com好了,然后CNAME记录也和A记录一样,是一种指向关系,把小名儿www.yy.com指向了www.xx.com,然后通过A记录,www.xx.com又指向了对应的IP:
www.yy.com → www.xx.com → 1.1.1.1
这样一来就能通过它的小名儿直接访问1.1.1.1了。

这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名
收到DNS查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当查找的域名服务器的IP地址)。
Google Public DNS (8.8.8.8, 8.8.4.4)
国内DNS服务器地址
OneDNS (112.124.47.27)
OpenerDNS(42.120.21.30)
aliDNS (223.5.5.5, 223.6.6.6)
114DNS (114.114.114.114, 114.114.115.115)

CDN

1、CDN是什么?

CDN全称:Content Delivery Network或Content Ddistribute Network,即内容分发网络基本思路:尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

2、CDN的实现原理是什么?

CDN网络是在用户和服务器之间增加Cache层,主要是通过接管DNS实现,将用户的请求引导到Cache上获得源服务器的数据,从而降低网络的访问时间。

3、常见的CDN软件有哪些?分别有什么特点?

Varnish:是一款具有高性能的开源http加速器,具有反向代理、缓存功能。Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存。Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,所以Varnish要相对更高效,但也有缺点,内存中的缓存在服务器重启后会丢失。 varnish 如何工作: varnish主要存在两个进程,manage进程及child进程,manage 进程:更新配置,vcl 文件编译,varnish 监控,初始化 varnish 及提供 varnish 管理接口。child 进程:主要进行请求任务的处理,接受请求等。child 进程中各线程的处理任务:
accept 线程: 监听端口,接受连接;接受连接后组成 session 结构,查看是否有空闲线程,若有则分配给其处理,若无,则检查等待队列 overflow 的大小,若过大,则抛弃请求,否则加入 overflow 队列。 work 线程: 从 overflow 队列中获取任务, 走 Varnish 状态机流程处理任务,完成后通过 pipe 的线程通信,传递给 epoll 线程,等待下一个事件触发。 epoll 线程:将事件发送时对应的 session , 放入 overflow 队列,以供 work 线程从中取出继续处理。当然,在等待事件发送时,会检查该 session 是否过期。 expire 线程:对以二叉树形式组织的缓存对象,进行过期检查,对过期的对象进行处理(更新或者弃用)。

4、DDOS的含义?

分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。通常,攻击者使用一个偷窃帐号将DDoS主控程序安装在一个计算机上,在一个设定的时间主控程序将与大量代理程序通讯,代理程序已经被安装在网络上的许多计算机上。代理程序收到指令时就发动攻击。利用客户/服务器技术,主控程序能在几秒钟内激活成百上千次代理程序的运行。

Ansible

1、简述下ansible工作原理?

Ansible可以简化管理员的自动化配置管理和流程控制方式。它利用推送方式对客户系统配置,这样所有的工作都可以在主服务器上完成。
运行Ansible的服务器叫做”管理节点”,通过Ansible进行管理的服务器叫做“受控节点”
Ansible由五部分组成:
Ansible : 核心
Modules : 包括 Ansible 自带的核心模块及自定义模块
Plugins : 完成模块功能的补充,包括连接插件、邮件插件等
Playbooks : 剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行
host Inventory : 定义 Ansible 管理主机的清单

2、简述Ansible中如何保存敏感数据?

ansible-vault 功能:管理加密解密yml文件 ansible-vault [create|decrypt|edit|encrypt|rekey|view] ansible-vault encrypt hello.yml 加密 ansible-vault decrypt hello.yml 解密 ansible-vault view hello.yml 查看加密文件 ansible-vault edit hello.yml 编辑加密文件 ansible-vault rekey hello.yml 修改口令 ansible-vault create new.yml 创建新文件

3、简述Ansible适合的场景?

比如我希望在主机A、B、C上部署JDK1.7的环境,主机D、E、F上部署JDK1.8的环境,而又想在A、B上安装Nginx;C、D上部署Tomcat;E、F上部署MySQL,这时候使用Ansible工具是最佳的。对于这种情况需要新建5个roles,分别是:JDK1.7、JDK1.8、Nginx、Tomcat、MySQL。对于A、B主机,安装JDK1.7和Nginx的roles,C主机安装JDK1.7和Tomcat的roles;D主机安装JDK1.8和Tomcat的角色,E、F主机安装JDK1.8和MySQL的角色。换句话讲,Ansible就是对于各种环境的搭积木式组合,你需要什么环境,我就给你装上什么环境,对于系统管理员来讲,不必再去每一台机器上根据开发给的需求名单一个一个安装,不仅效率低、劳动成本高、而且容易出错,造成环境的不一致。而Ansible具有幂等性的特点,无论执行多少次,只要你的操作系统是同一个版本,那么安装出来的环境绝对是一样的,这样也就保证了应用所处的底层环境的一致性,而不会造成同一个版本的应用在不同的机器上运行出现不同的效果的问题。

4、简述Ansible ad-hoc和playbook的区别?

Ad-Hoc利用ansible命令直接完成管理,主要用于临时命令使用场景
playbookansible脚本,主要用于大型项目场景,需要前期的规划

5、简述Ansible角色?

角色(roles)是ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单的说,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。角色一般用于基于主机构建服务的场景中、但也可以是用于构建守护进程等场景中。

6、简述Ansible的变量都可以写在哪些文件,优先级顺序是什么?

①可以定义在主机清单中
②可以定义在剧本中
③在独立的变量YAML文件中定义
④可以使用-e指定变量
变量的优先级:命令行中的-e > playbook中定义的变量 > 主机清单中定义的变量

7、简述Ansible的主机清单作用,及如果向实现跟其他主机组的交、并、补的关系怎么实现?

主机清单作用
inventory,也就是主机清单。在大规模的配置管理工作中,特别是云服务提供商或者IDC厂家,需要管理不同业务的不同机器,这些机器的信息都存放在Ansible的inventory组件里面。在我们使用Ansible进行远程主机管理时,必须先将主机信息存放在inventory里面,这样才能使用Ansible对它进行操作。
交:(逻辑“或与”)使用‘:&’进行标识
ansible ‘webserver1:&webserver2’ -m ping #在webserver1组中并且在webserver2组中的服务器执行ping
并:(逻辑“或”)使用‘:‘进行标识
ansible ‘web1:web2’ -m ping #使用web1组和web2组中的所用服务器执行ping
补:(逻辑“或非“)使用‘:!’标识
ansible ‘web1:!web2’ -m ping #在web1中但不在web2中的主机执行ping
还可使用正则进行匹配‘~’
ansible ‘~www.(baidu|souhu).*.com.cn

8、为什么要有notify和handlers,请简述下怎么结合使用?

Notify: 触发标识,含有notify的任务需要触发处理程序才能彻底完成。此action可用于在每个play的最后被触发, 这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。
Handlers:处理程序的标识,被notify调用的处理程序的执行位置。往往放在所有任务之后执行。使用过程中,notify和handlers是通过名称匹配,所以要求notify和handlers任务名称,必须相同,才可调用。
实际上就是一个触发器 是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。
注意:
notify中的内容必须和handler中的name保持一致,这样才可以达到触发效果,否则不会生效。
某任务的状态在运行后为changed(黄色)时,可通过"notify"通知给相应的handlers

9、Ansible模块的shell模块和command模块有什么区别?

Command:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处理,在使用command模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如”<“, “>”, “|”, “;” 和 “&” 这些符号。
Shell:shell模块可以帮助我们在远程主机上执行命令,与command模块不同的是,shell模块在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理。
区别:
command模块不是调用的shell的指令,所以没有bash的环境变量,也不能使用shell的一些操作方式,其他和shell没有区别

常见运维场景题

1、网络不通有哪些解决思路?

(1)先判断是硬件还是软件的问题
软件问题解决办法:
①使用ping命令ping一个网站看是否有报文传送
②若第一步无法通,看看其报错信息,如主机不可达等问题
③查看本地dns配置是否正确,可设置为通用的dns如:114.114.114.114,8.8.8.8
④查看网卡配置文件,主要看网关、ip地址、子网掩码等设置是否正确
⑤若为虚拟机,检查windows端的虚拟网卡与虚拟机是否配置一致
硬件问题解决办法:
①查看网线是否插好,网线是否断裂

2、数据库连接报认证问题,通常有哪几种情况?

(1)认证插件不匹配
Select user,host,plugin from mysql.user; #查看认证插件
可能是认证插件的级别与其他的密码认证方式不一致造成的
Alter user ‘username’@’% identified with authentication-plugin by ‘password’
可能是用户不支持远程登陆
Update user set host=% where user=’username’;

3、端口被占用问题怎么解决?你有哪些思路?

先使用lsof命令查看当前的端口被哪个进程占用了,如必须使用次端口,可用kill命令将其杀死,在重新启用该端口,或将端口改为其他的端口进行使用。

4、yum安装软件报name or host not known怎么解决?

Yum源出现了问题,可以重新配置使用国内的镜像软件站点源。
最后yum clean all,yum makecache

5、写出常见应用的日志,比如nginx,httpd,zabbix,mysql, named,ansible等

/var/log/nginx
/var/log/httpd
/var/log/Zabbix
/var/named
/var/log/ansible.log

6、windows连接不上虚拟机怎么排查和解决?

  1. Windows 下无法ping 通本地虚拟机,本地的ftp和ssh工具也不能连接上虚拟机。
  2. 检查发现 虚拟机的ip地址 和网关不在一个网段上面。
  3. 修改虚拟机ip地址(临时),使虚拟机和 网关 ip 在同一个网段。
  4. 可以 ping通虚拟机,ftp 和 ssh 工具也可以连接上。
  5. 确保iptables 关闭, 我查看是关闭的.

6. 确保vmware 的服务时启动的,尤其是DHCP 相关的,这里我的都是开启的。

7、telnet很慢/ssh很慢怎么排查和解决?
1、在server上/etc/hosts文件中把你本机的ip和hostname加入
2、在server上/etc/ssh/sshd_config文件中修改或加入UseDNS=no
3、注释掉server上/etc/resolv.conf中所有行
4、修改server上/etc/nsswitch.conf中hosts为hosts: files

8、文件删了磁盘空间没释放怎么处理?

lsof | grep deleted
发现有大量刚刚删除文件的进程存在,kill掉进程,空间就能得到释放
一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,数据被删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中,数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除access_log文件后,空间还没释放,就是因为httpd进程还在一直向这个文件写入内容,导致虽然删除了access_log文件,但文件对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放也就不足为奇了。

9、日志或应用报too many open files错误怎么解决?

1、增大允许打开的文件数——命令方式
ulimit -n 2048
这样就可以把当前用户的最大允许打开文件数量设置为2048了,但这种设置方法在重启后会还原为默认值。
ulimit -n命令非root用户只能设置到4096。
想要设置到更大需要sudo权限或者root用户。

2、增大允许打开的文件数——修改系统配置文件
vim /etc/security/limits.conf
#在最后加入

  • soft nofile 4096
  • hard nofile 4096
    或者只加入
    • nofile 8192
      最前的 * 表示所有用户,可根据需要设置某一用户,例如
      roy soft nofile 8192
      roy hard nofile 8192
      注意”nofile”项有两个可能的限制措施。就是项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用”-“字符设定, 则hard和soft设定会同时被设定。
      3、检查程序问题
      如果你对你的程序有一定的解的话,应该对程序打开文件数(链接数)上限有一定的估算,如果感觉数字异常,请使用第一步的lsof -p 进程id > openfiles.log命令,获得当前占用句柄的全部详情进行分析
      10、有一天你突然发现你的终端无法连接你的虚拟机,之前还是好好的,怎么排查和解决?
      ①查看虚拟机的22端口是否打开
      ②查看防火墙中是否配置了阻止22端口的规则
      ③查看windows中的虚拟网卡是否打开,相关的服务是否启动。
      ④配置虚拟网卡与虚拟机上的网段是否一致。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐