base 杭州·蚂蚁Z空间

Q:Linux系统让服务开机自动启动的方法,至少两种?

A:1.修改/etc/rc.local2.通过chkonfig设置3.crontab设置定时任务

Q:如何制作rpm包?
A:使用rpmbuild,核心是编译Spec文件,核心内容:Version/Source/Requires等

Q:Linux修改网卡IP的方法?
A:路径/etc/sysconfig/network-scripts/ifcfg-eth0(考察能否说出完整的路径)

Q:Linux修改诸如TCP连接中本地端口范围等内核参数配置文件的路径?
A:/etc/sysctl.conf,执行sysctl–p生效。

Q:什么Linux的僵尸进程,在哪里可以看到,如何产生的?如何防止僵尸进程?
A:当子进程比父进程先结束,而父进程又没有回收子进程,此时子进程将成为一个僵尸进程,在top中看到状态为Z的即为僵尸进程。

Q:查看磁盘空间命令df和du查看空间不一致的原因?
A:主要原因文件删除后,还有运行的进程持有这个已经被删除了的文件的句柄,所以文件不会真正在磁盘中被删除。(涉及df和du的区别)

Q:centos6与centos7的区别?(至少2点)
A:centos7支持docker而6不支持;centos7的启动停止的命令是systemctlstart/stop而6是servicexx start/stop;centos7的防火墙是firewalld而6是iptables。

Q:Linux中用top命令分析cpu高的问题,若Java进程占用比较高,如何进一步处理?
A: 可以利用jdk工具jstack打印出堆栈信息以进一步分析。(考察是否了解jstack)

Q:如何实现定时清理某目录下的文件已释放磁盘空间?
A:通过crontab来实现。

Q:有哪些常见的高并发系统和服务指标可调优?
A:Linux最大打开文件数,TCP连接数优化,JVM内存回收参数,tomcat连接数等等

Q:高并发高可靠的架构?
A:主备/负载均衡(网络/服务器等),分布式(数据库,服务注册,消息中间件),性能(缓存,cdn技术)

Q:有哪些负载均衡实现的技术,有哪些的区别?单点问题如果解决?
A:nginx(7层,1.9.0版本开始也支持4层), haproxy (4层+7层),lvs(4层,性能高);单点可以通过Keepalived来解决。

Q:nginx的负载均衡是如何实现的,支持哪些负载均衡算法?是否支持按响应时间来分配?
A: 通过配置upstream来实现,支持轮询,权重(weight),ip_hash,fair,url_hash等,其中fair是按响应时间来分配(响应时间短的优先分配)

Q:lvs有哪几种工作模式,区别?具体如何配置。
A:dr(修改mac地址)/tunnel(封装/解封,性能高,不安全)/nat(nat中转,较为安全)。配置模式的命令:通过ipvsadm来指定(-g,表示定义为LVS-DR模型;-i,表示定义为LVS-TUN模型;-m,表示定义为LVS-NAT模型)

Q:缓存技术的应用场景,redis和Memcache有什么区别?
A:缓存技术主要解决热点数据的存储,减少对数据库层的压力。Redis相比Memcache:1)更多数据格式2可持久化

Q:用过哪些MQ,他们的区别是什么?
A:ActiveMQ/RabbitMQ/Kafka/RocketMQ

Q:了解哪些微服务框架,对比有哪些区别?
A:Dubbo(注册中心可基于zk/redis,基于RPC,四大模块),SpringCloud(注册中心eureka/自研,基于HTTP的REST,完整框架,更耗带宽)。

Q: CDN的全程?请简述CDN的原理?
A:CDN(ContentDelivery Network):内容分发网络,将网站的内容发布到最接近用户的网络”边缘”的节点,使用户可以就近取得所需的内容,提高用户访问网站的响应速度.

Q:ZooKeeper的实例节点数可以为2台吗,为什么?
A:不行,数目是奇数2n+1,且存活的Server的数目不得少于n+1。

Q:ZooKeeper有哪些角色,作用分别是?
A:
Leader:核心,事物请求的唯一调度和处理者;
Follower 非事物请求、转发事物请求给leader 服务器,参与Leader 选举;
Observer 角色:观察者,但不参与任何投票

Q2:交换机的Vlan听说过吗,实现什么功能?
A2:
(1)端口的分隔。即便在同一个交换机上,处于不同VLAN的端口也是不能通信的。这
样一个物理的交换机可以当作多个逻辑的交换机使用。
(2)网络的安全。不同VLAN不能直接通信,杜绝了广播信息的不安全性。
(3)灵活的管理。更改用户所属的网络不必换端口和连线,只更改软件配置就可以了。

Q3:简述一下网络OSI七层模型,IP和HTTP分别属于哪层?
A3:
下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;而上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。

IP属于网络层
HTTP属于应用层

Q4:介绍下tcp三次握手过程?
A4:
2019蚂蚁行业技术保障/解决方案部门 - 图1

Q5:TCP状态中close_wait、time_wait的状态含义?
A5:
客户端TCP状态迁移:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务器TCP状态迁移:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

CLOSE_WAIT
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭
TIME_WAIT
我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT,缺省为240秒。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。

Q6:tcp和udp的区别,各适用于哪些场景?
A6:
1.基于连接(TCP)与无连接(UDP);
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

Q2:29位的子网掩码,有几个可用IP?
A2:6个(2的3次方-2)。

Q2:有抓过报文吗(网络抓包)?如何抓包?如何解析?
A2:抓包可以通过tcpdump命令,或者通过wireshark工具抓包
抓包可以直接抓本端网卡/网口的包,也可以端口镜像抓其它网卡/网口的包。
一般建议保存为pcap文件,使用wireshark工具进行分析。

Q7:Linux内核中和TCP相关的参数有哪些?含义是什么?
A7:

  1. #对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃,不应该大于255,默认值是5,对应于180秒左右时间
  2. net.ipv4.tcp_syn_retries=2
  3. #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
  4. net.ipv4.tcp_syncookies = 1
  5. #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
  6. net.ipv4.tcp_tw_reuse = 1
  7. #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
  8. net.ipv4.tcp_tw_recycle = 1

Q8:如果一台虚拟机无法连接机构的某个URL接口,排查思路是怎样的?会用到哪些命令?需要检查哪些地方?
A8:
核心思路是分段排查:
首先摸清楚整个链路,整理出拓扑图

可能用到的命令:
使用traceroute目标接口的IP地址,看最后一跳的地址是在哪里
使用route命令查看虚机自己是否配置了默认路由
ifconfig查看虚机的网卡配置

可能检查的地方:
交换机、防火墙是否配置了ACL
虚机安全组的配置
虚机iptables的配置
虚机的网卡配置
对端是否配置了白名单

Q1:OSPF和BGP的使用场景有什么区别?
A1:
一个是自治系统内部路由-ospf
一个是自治系统间路由-bgp
这个是本质的区别。

OSPF属于IGP协议,是链路状态路由协议,一般运行在AS自治系统内部,采用SPF算法保证了在AS内部不会产生环路。由于OSPF协议时每台路由器自身计算出来的,所以过滤路由非常麻烦。
BGP属于EGP协议,是距离矢量路由协议,在设计考虑到可能形成环路问题,故此为BGP添加了许多属性保证不会产生环路,通常应用在AS之间,用于互联网选路的协议,可以通过更改BGP属性来影响路由选路问题,BGP本身不计算路由,因此依靠引路其他路由,所以过滤路由是比较方便地,而且依靠BGP属性的应用,很容易实现数据分流。

Q1:使用过哪些阿里云/其他云平台的产品?
A1:
基础设施类:ECS、RDS、SLB、OSS、VPC(必须要了解)
中间件类:redis、MQ
安全类:WAF、高防IP、安骑士
工具类:云监控、CDN

Q2:VPC有什么功能?
A2:两大功能:1、安全隔离 2.按需规划局域网(自有规划IP网段)

Q3:OSS与文件存储、块存储有什么区别?
A3:
OSS与自建存储对比的优势

对比项 对象存储OSS 自建服务器存储
可靠性
- 服务设计可用性不低于99.99%。


- 规模自动扩展,不影响对外服务。
- 数据设计持久性不低于99.999999999%。
- 数据自动多重冗余备份。
|
- 受限于硬件可靠性,易出问题,一旦出现磁盘坏道,容易出现不可逆转的数据丢失。
- 人工数据恢复困难、耗时、耗力。
| | 安全 |
- 提供企业级多层次安全防护。
- 多用户资源隔离机制,支持异地容灾机制。
- 提供多种鉴权和授权机制及白名单、防盗链、主子账号功能。
|
- 需要另外购买清洗和黑洞设备。
- 需要单独实现安全机制。
| | 成本 |
- 多线BGP骨干网络,无带宽限制,上行流量免费。
- 无需运维人员与托管费用,0成本运维。
|
- 存储受硬盘容量限制,需人工扩容。
- 单线或双线接入速度慢,有带宽限制,峰值时期需人工扩容。
- 需专人运维,成本高。
|

Q4:地域(华东1、华北1)和可用区(可用区A、可用区B)有什么区别?多可用区架构有哪些优点?
A4:
地域是指物理的数据中心。资源创建成功后不能更换地域。

  • 不同地域的云服务器 ECS、关系型数据库 RDS、对象存储服务 OSS 内网不互通。
  • 不同地域之间的云服务器 ECS 不能跨地域部署负载均衡,即在不同的地域购买的 ECS 实例不支持跨地域部署在同一负载均衡实例下。

可用区是指在同一地域内,电力和网络互相独立的物理区域。同一可用区内实例之间的网络延时更小。
在同一地域内可用区与可用区之间内网互通,可用区之间能做到故障隔离。是否将实例放在同一可用区内,主要取决于对容灾能力和网络延时的要求。

  • 如果应用需要较高的容灾能力,建议将实例部署在同一地域的不同可用区内。
  • 如果应用要求实例之间的网络时延较低,则建议将实例创建在同一可用区内。

Q5:VPC的专线接入,有哪些步骤,需要提前准备哪些信息?
A5:

  • 步骤一 申请物理专线接口并完成专线接入
  • 步骤二 创建边界路由器
  • 步骤三 创建对等连接
  • 步骤四 配置VPC路由
  • 步骤五 配置VBR路由
  • 步骤六 配置本地数据中心的路由

参考答案:链接

Q1:关系型数据库定义的事物要满足什么特性,分别为什么?
A1:满足ACID特性,分别为 原子性(atomicity)、一致性(consistency)、 隔离性(isolation)、持久性(durability)。
Q2:隔离性有哪四种隔离级别,分表代表什么含义?
A2:
READ UNCOMMITTED(未提交读):事务中的修改,即使没有提交,对其他事务也都是可见的。
READ COMMITTED(提交读):一个事务开始时,只能”看见”已经提交的事务所做的修改。
REPEATABLE READ(可重复读):一个事务多次多次执行,读取的结果集是一样的。
SERIALIZABLE(可串行化):强制事务串行执行,并在读取每一行数据都加锁。

Q3:MySQL中MyISAM存储引擎与InnoDB引擎的区别?
A3:
InnoDB支持事物,而MyISAM不支持事物
InnoDB支持行级锁,而MyISAM支持表级锁
InnoDB支持MVCC, 而MyISAM不支持
InnoDB支持外键,而MyISAM不支持
InnoDB为聚簇索引表,MyISAM为堆表。
Q4:MySQL有多少种日志?
A4:
错误日志:记录出错信息,也记录一些警告信息或者正确的信息。
查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。
慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。
二进制日志:记录对数据库执行更改的所有操作。
中继日志:MySQL主从复制中,从库dump主库 io线程产生的日志。
redo日志:重做日志,事物每次修改,都会把修改后的值拷贝到此日志。
undo日志:回滚日志,事物修改之前,会把相关行的前镜像拷贝到此日志。
Q5.MySQL binlog有几种日志格式,区别是什么?
A5三种日志格式:
binlog_format = mixed/statement/row
row格式:Binlog中会记录更改记录的前后值,生产环境一般用此格式。优点是可以保证主从同步一致。缺点是大事物会产生大量的binlog日志,占用空间
statement格式:在Binlog中,只记录更改的SQL语句。优点是:大事物不会产生大量binlog日志,节省空间。缺点可能会造成主从同步不一致。
mixed格式:融合了row和statement,正常情况下,binlog记录具体的SQL,在不确定情况下,记录row格式。
Q6:MySQL数据库机器cpu飙升,排查思路是什么?
A6:先登录服务器,查看机器cpu进程占用情况,如果是MySQL占用比较多,需要登录数据库,执行show processlist
查看当前会话情况,一般是慢查询,大量统计报表SQL、事物未提交,阻塞大量会话引起的,可以通过kill 会话解决。
Q7:介绍下MySQL备份工具xtrabackup的原理
A7:xtrabackup是pt的备份工具,备份开始时,会先起一个线程拷贝redo日志,接着拷贝InnoDB存储引擎文件(.ibd文件),
事务型存储引擎拷贝完成后,会执行flush table with read lock 语句(一致性备份点就是此刻),获得全局锁,接着拷贝
非事物存储引擎MyISAM(如果有)和静态文件(.frm),拷贝完成之后,通知线程停止拷贝redo,释放全局锁(unlock tables).
Q8:MySQL SQL语句优化中,explain 你最关心哪些字段?代表什么含义?
A8:
select_type:查询类型
type :联接类型
key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。
rows:显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。
Extra:额外的一些信息,比如Using filesort用到排序,Using temporary:创建临时表。
Q9:MySQL常见的慢SQL类型,以及优化措施?
A9:
全表扫描,缺少索引,根据字段区分度在对应字段上加索引解决。
字段类型隐式转换,用不到索引,修改字段的类型或调整SQL语句。
SQL语句改写,比如大表驱动小表,减少驱动次数。
热点SQL,结果集进行缓存到redis或者memcache中。
事物未提交引起,kill掉未提交的事物。
用不到索引的情况,like/regexp ‘%%’,
Q10:[SELECT *] 和[SELECT 全部字段]的2种写法有何优缺点,至少写出四点
A10:
前者要解析数据字典,后者不需要
结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序。
表字段改名,前者不需要修改,后者需要改
后者的可读性/可维护性比前者要高
Q11:MongoDB的副本集5种连接方式?
A11:
primary:默认模式,所有读从复制集primary读
primaryPreferred:优先从primary读,primary不可用,从复制集secondary读
secondary:所有读从复制集secondary读
secondaryPreferred:优先从secondary读,secondary不可用,从复制集primary读
nearest:不区分复制集primary和secondary,从网络延迟最少的读
Q12:redis默认的内存淘汰策略是?还有其他淘汰策略吗?
默认策略是volatile-lru,即超过最大内存后,在过期键中使用lru算法进行key的剔除,保证不过期数据不被删除,但是可能会出现OOM问题。
其他淘汰策略
allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。
allkeys-random:随机删除所有键,直到腾出足够空间为止。
volatile-random:随机删除过期键,直到腾出足够空间为止。
volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果没有,回退到noeviction策略。
noeviction:不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息”(error) OOM command not allowed when used memory”,此时Redis只响应读操作。

Q1:日常有过压测和限流场景吗?介绍一下

A1:数据库压测一般用sysbench/ycsb,应用压测一般用jmeter/loadrunner,压测关注指标qps/tps,95%rt,99%rt等,多轮压测完,拿到应用/数据库的摸高值,限流根据摸高值的70%-80%进行限流。也可以使用消息队列进行削峰填谷,抗住大流量。视负载情况进行扩容。

Q2:访问tomcat部署的应用,出现404,排查步骤?
A2:404表示当前请求的页面不可用,需要根据tomcat日志进一步排查,是请求页面错误还是其他原因。

Q3:tomcat 配置文件中经常修改的参数是哪些?
A3:在tomcat配置文件server.xml中的配置中,和连接数相关的参数有:
minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75
acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100
enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数,应同时加大这两个参数。

Q4:nginx的作用?
A4:Http代理,反向代理
负载均衡:负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略为自定义策略
web缓存

Q5:nginx的优点有哪些?
A5:跨平台、配置简单 、非阻塞、高并发连接、内存消耗小、内置健康检查功能、节省宽带、 稳定性高。

Q6:为什么Nginx性能这么高?
A6:得益于它的事件处理机制:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决

Q7:为什么不使用多线程?
A7:Apache: 创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会榨干服务器资源。
Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量)(epoll),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。

Q8:日常运维过程中,碰到过什么映象深刻的故障?怎么解决的
A8:考察大故障解决能力和故障排查思路,自由发挥。

Q9:日常工作中有用到zk吗?zookeeper是如何保证事务的顺序一致性的 ?
A9:zookeeper采用了递增的事务Id来标识,所有的proposal都在被提出的时候加上了zxid,zxid实际上是一个64位的数字,高32位是epoch用来标识leader是否发生改变,如果有新的leader产生出来,epoch会自增,低32位用来递增计数。当新产生proposal的时候,会依据数据库的两阶段过程,首先会向其他的server发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行

Q10:zk和etcd的区别?
A10:协议不同,zookeeper是基于paxos的简化版zab协议,etcd 集群的工作原理基于 raft 共识算法 (The Raft Consensus Algorithm)实现。etcd是go语言编写,go本身就是一种多线程编程语言。zk是java语言编写。

Shell:

Q: 编写shell程序,实现自动删除50个账号的功能。账号名为 ta1至 ta50。(主要考察思路)
A: 一句话思路:找出规律,循环解决
for((i=1;i<51;i++));do userdel -r ta$i ;done
知识点:for循环,当然是用while循环也是可以的,until也行。

Q: 写一条shell查找最后创建时间是三天前,后缀是 *.log的文件并删除.
A:

find .-ctime +3 -name '*.log' | rm -rf

Q: 如何调试bash脚本?
A:
1. 命令行提供参数,比如 -n (读一遍脚本中的命令但不执行,用于检查脚本中的语法错误) -v (一边执行脚本,一边将执行过的脚本命令打印到标准错误输出) -x (提供跟踪执行信息,将执行的每一条命令和结果依次打印出来)

  1. 脚本开头提供参数 ,比如 # /bin/sh -x
  2. 在脚本中用set命令启用或禁用参数, set -x和set +x分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试。
    #! /bin/sh
    if [ -z "$1" ]; then
    set -x
    echo "ERROR: Insufficient Args."
    exit 1
    set +x
    fi
    

Q: 写一个脚本解决DOS攻击生产案例,有什么思路吗?
A: 可以根据web日志或者网络连接数,监控当某个IP并发连接数或短时内PV达到100,即调用防火墙命令来封掉IP,监控频率可以设置为每隔三分钟。

Q: 用过shell中的特殊变量吗?举几个例子
A:

内建变量    解释
$0    命令行中的脚本名字
$1    第一个命令行参数
$2    第二个命令行参数
...   ....
$9    第九个命令行参数
$#    命令行参数的数量
$*    所有命令行参数,以空格隔开
$?    前台最近命令的结束状态

Q: 如何用shell打印出文件中的第二列?
A: 最简单的就是用awk

cat xx.txt | awk '{print $2}'

Q: 假如文件中每行第一个元素是 xxx,如何获取第二个元素?
A:

awk'{ if ($1 == "xxx") print $2}'

Python:
Q: 有写过多线程吗? 多线程/多进程 程序同时访问相同的资源(例如:同时向一个文件里写数据)需要注意些什么?
A: 至少注意文件锁,读锁与写锁

Q: python怎么获取字典中所有key的列表?
A: 使用 keys() 获取字典中的所有键

>>> trdict={'a':1,'b':2,'c':3,'e':5}
>>> trdict.keys()
dict_keys(['a', 'b', 'c', 'e'])

Q: 假如我一个包里有三个模块,mod1.py, mod2.py, mod3.py, 使用 from demopack import * 导入模块时,如何保证只有 mod1 和 mod3 被导入了。 (考核候选人对于python包管理知识)
A: 增加 init.py 文件,在文件中增加代码:

__all__ = ['mod1', 'mod3']

Q: python中装饰器有什么作用和功能?
A: 1. 引入日志 2. 函数执行时间统计 3. 执行函数前预备处理 4.执行函数后的清理功能 5.权限校验等场景 6.缓存

Q: 看你的简历使用过Django,那你简单描述下django请求的生命周期?(一个http request,Django如何处理,需要经过哪些流程?)
A:
一般是用户通过浏览器像服务器发起一个request请求,这个请求会去访问视图函数,(如果不涉及到数据条用,那么这个时候视图函数返回一个模版也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
#1.wsgi,请求封装后交给web框架 (Flask、Django)
#2.中间件,对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session -
#3.路由匹配 根据浏览器发送的不同url去匹配不同的视图函数
#4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染 -
#5.中间件,对响应的数据进行处理。
#6.wsgi,将响应的内容发送给浏览器。

Q: 谈一谈你对ORM的理解?
A: ORM是“对象-关系-映射”的简称。
MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动

Q: python中list和tuple有什么区别?
A: 列表和元组之间的区别在于列表是可变的而元组不是。元组可以被散列为例如作为字典的关键。

Q: python 怎么在list里快速去重?
A: 1.列表推导

ids = [1,2,3,4,5,6,2,3,5,7]
new_ids = []
for id in ids:
    if id not in new_ids:
        new_ids.append(id)
print(news_ids)
  1. 通过set方法
    ids = [1,2,3,4,5,6,2,3,5,7]
    print(list(set(ids)))
    

Q: 请问python中如果出现多层嵌套的if语句,怎么优化?
A:
1. “提前结束” : 在函数内使用return或raise等语句提前在分支内结束函数,当分支条件不满足时,我们直接抛出异常,结束这段代码分支。

  1. 封装那些比较复杂的逻辑判断
  2. 使用 try/while/for 中 else 分支
  3. not A or not B 等价于 not (A and B) 的思路来简化代码

Q: 怎么用python实现Switch/Case?
A:
1.用if…elif…elif…else 实现switch/case

  1. 使用字典模拟的switch/case实现
  2. 在类中可使用调度方法实现switch/case

Q1: 现在工作中监控体系详细说一下?技术栈有哪些?现在监控系统的大致水位举几个例子介绍下?

A1: 候选人根据实际业务场景简单描述下自己的监控体系以及技术栈,根据自身的系统配置情况和业务简单介绍下监控阈值是如何设置的,比如负载监控的大致水位?

Q2: 让你去选型监控系统,你怎么选?从哪些方面去考虑?
A2: 可以从采集,存储,查询,展示,告警,二次开发,高可用,水平扩展,集成性(API), 市场占用,技术支持,未来发展,监控功能,部署配置等角度来展开细说.

Q3: 你们监控都监控哪些东西呢?详细说一下,你可以从不同的方向介绍下,比如硬件监控都有哪些,系统监控都有哪些?
A1:分了几层,大致如下:
硬件监控: cpu温度,物理磁盘,主板温度,路由器交换机状态等
系统监控: CPU: cpu使用率,负载,用户态,内核态,上下文切换 DISK: 容量,IO,读写效率 内存使用率等
应用监控: 进程状态,端口状态,中间件,数据库等指标
网络监控: tcp状态,接口丢包率,网络io,带宽情况,各个机房之间的网络状态等
流量监控: 服务器input/output流量,交换机路由器流量等
日志监控: 系统日志、应用程序访问日志、错误日志,服务运行日志等
安全监控: 攻击,漏洞等
API监控:监控GET,POST, PUT等请求的可用性,正确性,响应时间等
性能监控: DNS响应时间,HTTP建立连接的时间,页面响应时间,可用率,页面资源数量, 首屏时间, 加载最慢的资源、产生阻塞的JS等
业务监控:每分钟产生多少订单?每分钟注册了多少个用户?每天有多少活跃用户?推广活动引入了多少用户,流量等

Q4: 上面说到硬件监控,你们是怎么做的呢?(如果没有硬件全都是云,直接跳过这个问题)
A4: 可以通过SNMP来进行路由器交换机的监控(这些可以跟一些厂商沟通来了解如何做),服务器的温度以及其他,可以通过IPMI来实现。

Q5: 日志监控,你们是怎么做的呢?
A5:如果是web的话可以使用监控nginx的50X,40X的错误日志,PHP的ERROR日志,其实这些需求无非就是,收集,存储,查询,展示,可以使用开源的ELKstack来实现。比如用logstash去采集,elasticsearch来做存储和搜索,kibana做展示.

Q6: 安全监控,你们是怎么做的呢?(比如iptables能帮助完成四层的安全防护,但是针对七层的Web层面怎么办呢?)
A6: 可以用Nginx + Lua编写了一个WAF,然后把相关的日志记录到了elasticsearch中,通过kibana可以图形化的展示不同的攻击类型的统计。

Q7: zabbix中的主动模式和被动模式有什么区别? 主动模式有什么优点?
A7: 主动,被动模式都是相对proxy来说的,porxy主动发送数据就是主动模式,proxy等待server的请求,再发送数据就是被动模式. 主动模式可以减轻server的压力.

Q8: zabbix的告警通知你是怎么做的? zabbix的微信告警怎么做的?
A8: 邮件、微信、短信、钉钉等,都可以与Zabbix快速的集成.
微信告警怎么做: 1. 有一个微信企业号 2. 下载并配置微信公众平台私有接口 3. 配置zabbix告警.(增加警示媒介类型,添加用户报警媒介,添加报警动作)

Q9: 你觉的一个完整的监控体系都涉及到哪些方面?
A9: 候选人可以从几个方面去阐述,大致方向是:

  1. 监控数据采集的时效与精确.
  2. 监控数据采集存储与归档.
  3. 监控数据的图形化展示.
  4. 监控数据的自动化分析与处理.
  5. 监控的告警以及故障自愈或者是自动化处理.
  6. 监控工具自身的安全控制
  7. 监控告警的响应和跟踪.

Q10: 你简历中说玩过kubernetes,那你们kubernetes上容器的监控怎么做的?
A10: 有很多中方法,介绍两种k8s提供的方案。
1. 可以通过kubernetes自带的cAdvisor,使用节点的IP加默认端口4194就可以直接访问cAdvisor的监控面板.

  1. Kubernetes还提供一个叫heapster的组件用于聚合每个node上cAdvisor采集的数据,再通过Kubedash进行展示.

Q11: zabbix自动发现是干嘛的?
A11: zabbix的自动发现,主动的对全网进行扫描,然后自动添加相关的监控服务器和引用监控模板。

Q12: 故障自愈有没有相关的思路或实际经验?(给你一个场景,一个服务挂了?)
A12:
主要看候选人有没有做过这方面的工作和自己的理解,如果没有场景可以抛出问题中的场景来讲。问题重点是故障自愈中有两个方面需要慎重考虑,一个是怎么判断挂了?怎么自愈?
怎么判断挂了?判断连接超时,多久才算超时?还是服务端口挂了,还是因为上下游依赖的服务有问题导致的?具体需要判断几次才算服务不可用? 怎么自愈,采取什么样的动作? 是重启服务器还是重启应用,还是清除缓存,还是直接kill进程,让守护程序拉起来.
没有什么标准,主要看候选人自己的理解或者有没有做过一些故障自愈的系统。

Q13:zabbix怎么开启自定义监控的?
Q13:
1.写一个脚本用于获取监控服务的一些状态信息.

  1. 在zabbix客户端的配置文件zabbix_agentd.conf中添加上自定义的“UserParameter”,目的是方便zabbix调用我们上面写的那个脚本去获取待监控服务的信息。
  2. 在zabbix服务端使用zabbix_get测试是否能够通过第二步定义的参数去获取zabbix客户端收集的数据。
  3. 在界面中新建模板,添加相对应的监控项(“键值”设置成前面配置的“UserParameter”的值)
  4. 数据显示图表(新建图形并选择上一步的监控项来生成动态图表即可).

Q14: snmp的端口号是多少?
A14: 161和162

Q:在你以往的工作经验中,你是怎么保障网络服务器的安全的?
A:写了一个运维安全层,可以关注面试者在以往的工作中有没有相应逐级的经验和自己的思考。
前端防护: WAF, 抗DDOS, CDN
权限管理: 堡垒机,流程控制,审计
开发安全: 需求,设计,开发,测试,部署,发布,运行 每个阶段
中间件: 版本管理,安全管理,补丁
数据库安全: 口令管理,权限管理,安全策略,数据备份
系统安全: 口令管理,安全策略,账号管理,端口管理,服务管理,进程管理,流程制度
网络安全: 网络区域,ACL策略,流程制度

Q: Iptables使用的表有哪些?请简要的描述iptables使用的表以及它们所支持的链。
A: 表: Nat , Mangle, Filter, Raw
Nat表 : Nat表主要用于网络地址转换。根据表中的每一条规则修改网络包的IP地址。流中的包仅遍历一遍Nat表。例如,如果一个通过某个接口的包被修饰(修改了IP地址),该流中其余的包将不再遍历这个表。通常不建议在这个表中进行过滤,由NAT表支持的链称为PREROUTING 链,POSTROUTING 链和OUTPUT 链。
Mangle表 : 正如它的名字一样,这个表用于校正网络包。它用来对特殊的包进行修改。它能够修改不同包的头部和内容。Mangle表不能用于地址伪装。支持的链包括PREROUTING 链,OUTPUT 链,Forward 链,Input 链和POSTROUTING 链。
Filter表 : Filter表是iptables中使用的默认表,它用来过滤网络包。如果没有定义任何规则,Filter表则被当作默认的表,并且基于它来过滤。支持的链有INPUT 链,OUTPUT 链,FORWARD 链。
Raw表 : Raw表在我们想要配置之前被豁免的包时被使用。它支持PREROUTING 链和OUTPUT 链。

Q: Linux系统安全加固需要做哪些方面? (很多很广,看看应聘者说哪几个方面),下面举几个例.
A: 1. 保护引导过程

echo  “sp:S:respawn:/sbin/sulogin” >> /etc/inittab 已单用户启动需要输入主机密码。
***禁用 ctrlaltdel。通过向类似这样一行(#ca::ctrlaltdel:/sbin/shutdown -t5 -rf now)添加一个井号(#)
  1. 内核参数优化
  2. 锁定系统自带的一些不常用的用户
  3. 密码口令策略修改
  4. 历史命令保留和常用服务端口修改
  5. TTL值修改

    echo  net.ipv4.ip_default_ttl = 128 >> /etc/sysctl.conf
    /sbin/sysctl –p
    
  6. 基础的iptables策略,不举例

  7. 防止暴力登录
  8. 修改ssh端口和认证方式

Q: 如何查询ssh的登录日志?
A: more /var/log/secure who /var/log/wtmp

Q: 数据库安全你是怎么做的?怎么提高mysql的安全级别?
A: 1.避免从互联网访问MySQL数据库,确保特定主机才拥有访问特权 2. 定期备份数据库 3. 禁用或限制远程访问 4. 设置root用户的口令并改变其登录名 5. 禁用LOCAL INFILE 6. 降低用户的数据库特权 7. 移除和禁用.mysql_history文件 8. 启用日志 9. 不要用root用户运行MySQL守护进程 等等

Q: 工作中有遇到过攻击吗?请列举WEB常见安全问题(不少于三项),阐述其原理、危害。
A: 1. SQL注入: 通过客户端的输入把 SQL 命令注入到一个应用的数据库中,从而得以执行恶意 SQL 语句。

  1. DDOS 分布式拒绝服务: 通过大量恶意流量占用带宽和计算资源以达到瘫痪对方网络的目的。

Q: 你平时关注的安全站点有哪些? 或是通过什么途径去了解?
A: 举几个例子

  1. twitter 2. 安全客 3. secwiki 4. FreeBuf互联网安全新媒体平台 5. 【i春秋】-专注网络安全信息安全白帽子的在线学习教育培训平台 等等。
  2. 或者加入了一些安全组织或者安全圈。

docker

   Q:docker 默认有几种网络模式?overlay网络模式基于什么协议?其与vlan的区别是什么?<br />       A:host,none,bridge,overlay;docker的overlay 基于vxlan协议;vxlan工作在udp协议上,本质是一种mac over ip的隧道技术,vlan并无对数据进行封装。

   Q:如何在运行时修改bridge模式的容器的开放端口?<br />       A:iptables -S -t nat 找到该容器对应的DNAT规则,修改该规则。

   Q:使用docker-compose是否可以在宿主机重启时控制容器的启动顺序?如果不能为什么?<br />       A:不可以,docker-compose start/up 对容器启动顺序的控制仅该次start/up命令有效。宿主机重启时,容器启动顺序由docker进程决定,是不可控的。

   Q:dockerfile 文件中 entrypoint和cmd同时存在,容器如何启动时如何运行?<br />       A:容器启动时entrypoint字段的内容先执行,CMD字段内容可以作为entryponit字段内容的入参。

   Q:目前开源方案中如何对防止单个容器占用过多宿主机磁盘空间影响其他容器?<br />       A:存储驱动使用devicemapper,并配置basesize。或存储驱动使用btrfs,基于btrfs的quota功能,针对单个容器设置磁盘配额。

   Q:简述清理docker仓库 registry的步骤(括号内为扩展内容,答出说明实际操作过)<br />       A: 1.查询接口获取镜像列表(此处实际需要调用2个查询接口分别获取镜像名和TAG)<br />           2.调用删除接口(registry删除每个接口仅能调用一次,故需要循环调用)<br />           3.修改registry配置文件,将其置于只读状态<br />           4.重启仓库,应用配置<br />           5.调用registry GC命令释放空间(未提及本项,本题判错)

   Q:docker-container-shim进程的作用<br />       A:作为容器的父进程接管孤儿进程,防止僵尸进程产生。

docker-swarm:

   Q:如何将宿主机加入docker overlay网络,使其可以和其他宿主机上运行的容器直接联通?<br />       A: 1.找到overlay中任一容器在其宿主机的PID<br />           2.宿主机执行ip ns命令将容器内eth0网卡 net namespace修改为宿主机net namespace。

k8s:

   Q:如何将一个node置于维护状态<br />       A:kubectl drain 节点名

   Q:三个master的集群最多down掉几个可以正常工作?为什么?<br />       A: 如果etcd部署在master上也是3个,master最多只能down一个,如果etcd独立部署,集群可以承受master down 2个。<br />           etcd集群基于raft协议,要求集群存活节点必须大于半数以上才能正常写入数据。

   Q:一个deployment 资源创建后迟迟没有生成对应pod,且该deployment 的 event无明显异常,该如何排查?<br />       A:从deployment资源对应的RS资源 event中查询原因(如果也没有需要查询master三组件日志)

   Q:如何跨namespeace访问service资源的域名?<br />       A:service域名.namespace名

   Q:limits值与request值区别<br />       A:limits硬限制,cpu无法超过,内存超过容器将被oom<br />          request期望值,node上pod的任意一项request值达到实际资源值上限后新的pod将无法被分配到该node。 request.cpu的值会影响容器获取cpu资源的权重,request.cpu无实际cgroup对应限制。

   Q:flanneld 有几种常用网络模式?他们的性能排序如何?<br />       A:UDP,VXLAN,HOST-GW (性能自左向右依次增强,特殊的VPC模式性能全部等同host-gw)

   Q:k8s中某一node down掉,其上pod的迁移时间默认是多少?如何单独指定某一个pod的故障迁移时间?<br />       A:5分钟,单独配置pod的tolerationSecond值。

【Devops】

Q: