目录
1.自我介绍
2.项目介绍
3.Python装饰器
4.Python学了多久 DJango学了多久
5.Load的性能指标 怎么检测
6.负载指标
7.Buff cache区别
8.用什么查看磁盘io性能
9.三次握手的过程
10.第一次握手 服务端没有响应 客户端会做什么
11.502 504 500
12.Http1.0 http1.1 的区别
13.Dns劫持
14.智能dns
15.$*
16.Apache 和nginx区别
17.Nginx的调优
18.运维开发 运维的工作职责
19.最近在学什么东西
20.开发这块在学什么
21.手撕代码
1.自我介绍
2.项目介绍
一.CMDB自动化资产扫描
项目目的:
实现Web形式的自动化运维系统,远程控制服务器, 提高运维工程师的工作质量和效率。
项目步骤:

1.配置settings.py 定义数据库的信息(配置mysql数据库,其中数据库名字,用户密码,其中都需要提前主机中创建好)
2.models.py定义数据库的结构并生成迁移脚本并写入数据库:python3 manage.py makemigrations python3 manage.py migrate
3.建立admin.py管理登录用户
4.建立views.py(保存函数或者类的视图文件)完成视图层的创建
nmap扫描存活主机;telnetlib判断ssh服务是否开启,即是否为linux服务器;paramiko实现远程登录。
5.前段html文件配置
6.路由文件配置(主路由调用admin,子路由调用views)
项目中遇到的难点:
1.Linux中使用mysql需要mysqlclient模块,需安装mysql-devel这个依赖项才可使用。
SQLITE功能简约,小型化,追求最大磁盘效率;MYSQL功能全面,综合化,追求最大并发效率。如果只是单机上用的,数据量不是很大,需要方便移植或者需要频繁读/写磁盘文件的话,就用SQLite比较合适;如果是要满足多用户同时访问,或者是网站访问量比较大是使用MYSQL比较合适。
2.各个模块的探索,以及,views编写的困难,utils的分离
二. lvs+keepalived
项目目的 : 随着企业信息化的不断发展,需要面对越来越复杂的业务和越来越多样化的用户需求,例如 单点故障问题、负载均衡问题。而 LVS+keepalived 构建的高可用负载均衡集群则完美解决了这些问 题,提高了运维服务质量。 项目步骤: 1.为调度节点VS与其备份安装keepalived,并修改其配置文件(master、backup, 调度主机工作模式为 DR,调度算法为 rr,加入后端RS) 2. 在真实主机中通过 arptables 将 RS 对 VIP 的响应屏蔽,此时可实现负载均衡,服务配置完毕 3.此时若真实主机故障,keepalived 的健康监测会探测到并以邮件形式通知调度主机;若调度主机失 效,备份的调度主机会自动被调用,且服务端不会察觉到变化 项目难点: RS中屏蔽服务端的直接访问(arptable)
三.nginx+jdk+tomcat+memcache实现会话保持
项目目的
在交易类的电子商务网站,需要有购物车记录用户的购买信息,用户每次购买请求都是向购物车中增加商品;在社交类的网站中,需要记录用户的当前登录状态、最新发布的消息及好友状态等,用户每次刷新页面都需要更新这些信息。而基于nginx+tomcat+memcache实现的会话保持则完美解决了这些问题,提升了客户体验与运维服务质量。
项目步骤
1.调度节点安装nginx,编译时需加入sticky模块;服务端安装tomcat、memcache、jdk。
2.激活调度节点的粘滞模块sticky,使得登录页面不会来回跳转
3.配置服务端tomcat的测试登录页面,并开启tomcat
4.配置服务端的session管理器,实现交叉缓存
5.此时多次登录仍会保存之前的登录信息,且当一个服务端挂掉时,另一个服务端会接管并保存之前的登录信息在页面中。
项目难点
3.讲一下Python装饰器
装饰器其实就是一个闭包,把一个函数当作参数然后返回一个替代版函数。
在不改动函数代码的基础上无限制扩展函数功能的一种机制,本质上讲,装饰器是一个返回函数的高阶函数
-装饰器的使用: 使用@语法, 即在每次要扩展到函数定义前使用@+函数名
python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。
4.Python学了多久 DJango学了多久
5.Load的性能指标 怎么监控
average load :在过去的1分钟的平均负载
cpu utilization: cpu的使用率 disk traffic: disk传输率
paging rate:每秒从磁盘读到物理内存,或者从物理内存写到页面文件的内存页数
Swap-in rate:每秒交换到内存的进程数
Swap-out rate:每秒从内存交换出来的进程 (如果发现服务器重启后不能监控了,可以手动重启rpc.rstatd)
6.average load负载指标达到多少需要注意
假设系统是 1 个 CPU 单核
如果负载为 0.7, 并且长时间大于 0.7(观察前 5 分钟、 15 分钟数据), 那么需要去调查一下原因, 以免进一步恶化
如果负载为 1, 并且长时间大于 1, 需要立刻发现问题并修复它
如果负载为 5, 并且长时间大于 5, 整个系统会慢下来, 页面加载不出来, 等严重问题出现
如果是多 CPU 多核, 依此类推, 当 load average 达到总核数的时候, SA(System Administration)应该会提示报警, 研发人员就要去定位问题, 解决问题。
7.Buffer cache区别
- Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。
- Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。
- 假定以后存储器访问变得跟CPU做计算一样快,cache就可以消失,但是buffer依然存在。比如从网络上下载东西,瞬时速率可能会有较大变化,但从长期来看却是稳定的,这样就能通过引入一个buffer使得OS接收数据的速率更稳定,进一步减少对磁盘的伤害。
8.用什么查看磁盘io性能
iostat命令主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息,
9.三次握手的过程
10.第一次握手 服务端没有响应 客户端会做什么
一直重发syn
11.502 504 500
500 – 内部服务器错误。
501 - 服务器还是不具有请求功能
502 - 服务器网关错误
503 - 服务器不可用
504 - 服务器网关超时
12.Http1.0 http1.1 的区别
1.1 长连接(Persistent Connection)
HTTP1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启长连接keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。HTTP1.0需要使用keep-alive参数来告知服务器端要建立一个长连接。
1.2 节约带宽
HTTP1.0中存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,客户端接收到100才开始把请求body发送到服务器;如果返回401,客户端就可以不用发送请求body了节约了带宽。
1.3 HOST域
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname),HTTP1.0没有host域。随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都支持host域,且请求消息中如果没有host域会报告一个错误(400 Bad Request)。
1.4缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
1.5错误通知的管理
在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
13.Dns劫持
DNS劫持 就是通过劫持了 DNS 服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原 IP 地址转入到修改后的指定 IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。DNS劫持 通过篡改 DNS 服务器上的数据返回给用户一个错误的查询结果来实现的。
DNS劫持 症状:某些地区的用户在成功连接宽带后,首次打开任何页面都指向 ISP 提供的“电信互联星空”、“网通黄页广告”等内容页面。还有就是曾经出现过用户访问 Google 域名的时候出现了百度的网站。这些都属于 DNS劫持。
对于 DNS劫持,可以通过手动更换 DNS 服务器为 公共DNS 解决。
14.智能dns
智能NDS又称为解析切割,是对请求DNS解析的IP地址进行判断,将域名解析成不同的IP地址
一般智能DNS应用常见的场景就是CDN,中国特色的网络结构,就是联通和电信,二者通过在北京的机房的100G的宽带相连,这就导致了电信访问联通的会非常慢,所以CDN的原理就在智能DNS基础上进行web反向代理缓存实现的,通过不同地域的请求解析到对应的缓存服务器上,然后缓存服务器对主服务器进行数据请求,最终返回给客户,这对静态网页的网站非常有用
15.$*
$0: 脚本本身文件名称
$1: 命令行第一个参数,$2为第二个,以此类推
$*: 所有参数列表
$@: 所有参数列表
$#: 参数个数
$$: 脚本运行时的PID
$?: 脚本退出码
20200820美团运维SRE一面面经(问题+答案)
16.Apache 和nginx区别
Nginx相对于Apache的优势:
1.轻量级,采用C进行编写,同样的web服务,会占用更少的内存及资源
2.抗并发,nginx以epoll and kqueue作为开发模型,处理请求是异步非阻塞的,多个连接对应一个进程,负载能力比apache高很多,
而apache则是同步多进程模型,只能一个连接对应一个进程,当压力过大时,它是会被阻塞型的。
在高并发下nginx能保持低资源低消耗高性能 ,而apache在PHP处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
3.设计高度模块化,编写模块相对简单
4.配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
5.一般用于处理静态文件,静态处理性能比apache高三倍以上
6.作为负载均衡服务器,支持7层负载均衡
7.本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
8.nginx启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,
支持热部署,比如:实现不间断服务的情况下进行软件版本的升级与版本的回退
9.社区活跃,各种高性能模块出品迅速
Apache相对于Nginx的优势:
1.apache的rewrite比nginx强大,在rewrite频繁的情况下,用apache
2.apache发展到现在,模块超多,基本想到的都可以找到
3.apache更为成熟,少bug ,nginx的bug相对较多
4.apache超稳定,一个进程死掉时,会影响到多个用户的使用,稳定性差
5.apache对PHP支持比较简单,nginx需要配合其他后端用
6.apache在处理动态请求有优势,nginx在这方面是鸡肋,一般动态请求要apache去做,nginx适合静态和反向。
7.apache仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
总结:
两者最核心的区别在于:
Apache是同步多进程模型,一个连接对应一个进程,而Nginx是异步的,多个连接(万级别)可以对应一个进程。
17.Nginx的调优
1.worker_processes的进程数,数量要与CPU数量一致,通过lscpu查看
worker_processes 1;
2.worker process打开文件数的优化
worker_rlimit_nofile 65535;
2.1 优化了nginx的worker进程最多打开数量的参数之后,还需要优化系统内核参数(允许打开最多文件的参数)
临时配置:
ulimit -Hn 100000
ulimit -Sn 100000
永久配置:
vim /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000
3.单个进程最大连接数的优化
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
4.隐藏版本信息的优化
server_tokens off;
5.高效文件传输模式的
sendfile on;
tcp_nopush on;
tcp_nodelay on;
6.访问日志关闭的优化
access_log off;
7.超时时间的优化
keepalive_timeout 10; //设置客户端保持活动状态的超时时间
client_header_timeout 10; //客户端请求头读取超时时间
client_body_timeout 10; //客户端请求体读取超时时间
reset_timedout_connection on; //在客户端停止响应之后,允许服务器关闭连接,释放socket关联的内存
send_timeout 10; //指定客户端的超时时间,如果在10s内客户端没有任何响应,nginx会自动断开连接
8.gzip的优化
gzip on;//开启压缩
gzip_min_length 1000;//小文件不压缩
gzip_comp_level 6;//压缩比例
gzip_types text/plain text/css application/json application/x-javascript text/xml
application/xml application/xml+rss text/javascript;//对指定文件类型进行压缩
9.缓存静态页面的优化 (文件句柄是打开文件的唯一标示)
open_file_cache max=100000 inactive=20s; //设置服务器最大缓存10万个文件句柄,关闭20s内无请求的句柄
open_file_cache_valid 30s;//文件句柄的有效期为30s
open_file_cache_min_uses 2;//最少打开2次才会被缓存
open_file_cache_errors on;
18.运维开发 运维的工作职责
运维工程师的工作职责
1 负责日常系统维护,及监控,提供IT软硬件方面的服务和支持,保证系统的稳定。
2 参与设计、审核、优化公司IT系统以及各应用系统的体系架构;
3 全面负责公司运维项目的系统升级、扩容需求与资源落实,配合开发需求,测试、调整运维平台;
4 负责网络以及服务器的网络设置、维护和优化、网络的安全监控、系统性能管理和优化、网络性能管理和优化;
5 建立面向开发部门,业务部门的服务流程和服务标准;
6 负责IT运维相关流程的规划、设计、推行、实施和持续改进;
7 负责内部分派下发,对实施结果负责。
8 负责日常网络及各子系统管理维护。
9 负责设计并部署相关应用平台,并提出平台的实施、运行报告。
10 负责配合开发搭建测试平台,协助开发设计、推行、实施和持续改进。
11 负责相关故障、疑难问题排查处理,编制汇总故障、问题,定期提交汇总报告。
12 负责网络监控和应急反应,以确保网络系统有7*24小时的持续运作能力。