运维面试题-01


PS:以下内容,网友提供 欢迎投稿 cyylog@aliyun.com

三剑客

awk

  1. 统计日志中某个时间范围的 IP 访问量,并进行排序
$ start_dt='10/May/2018:23:47:43
$ end_dt='10/May/2018:23:49:05'
$ awk -v st=${start_dt} -v ent=${end_dt} -F'[][ ]' '$5 == st,$5 == ent  {print $1}' app.log  |sort |uniq -c |sort -nr |head -n 10
     66 223.13.142.15
      6 110.183.13.212
      4 1.69.17.127
      1 113.25.94.69
      1 110.183.58.144
awk '$4>="[30/May/2020:01:08:25" && $4<="[30/May/2020:01:10:25"{a[$2]++} END {for(v in a) print v,a[v]}' access.log
awk '$4>="[29/May/2020:20:39:11" && $4<="[30/May/2020:01:08:27" {a[$1]++} END {for(v in a)print  v,a[v]}' access.log

[29/May/2020:18:53:53
[29/May/2020:18:54:23
  1. 按URL的请求数排序,出访问这些url的ip
按URL的请求数排序
awk -F\" '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -r

找出访问这些url的ip
awk -F\" '($2 ~ "/phpmyadmin/index.php"){print $1}' access.log | awk '{print $1}' | sort | uniq -c | sort -r
  1. 查看http的并发请求数与其TCP连接状态**
netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  1. uptime | awk '{print $11}' | tr -d ,

sed

  1. 关闭selinux

    sed -ri s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
    setenforce 0
  2. 将nginx.conf中的所有server_name中baidu.com替换成linkdood.cn

sed -ri s/server\_name/baidu\.com/g nginx.conf

grep

  1. 用命令如何查找/opt/目录下文件名qypay.conf的文件中是否有redis=127.0.0.1的配置
grep "redis\=127\.0\.0\.1"/opt/qypay.conf 

find

  1. 查找/data目录下5天前,大于100M的文件并删除
find /data -type -size +100M -atime +5 -exec rm -rf {} \;  
find /data -type -size +100M -atime +5|xargs -i rm -rf 

shell

  1. 写脚本找到本机的IP地址
获取当前主机ens33的ip

ifconfig ens33 | grep "inet " | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'

ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}'

ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}'
命令解释
 ifconfig -a       和window下执行此命令一样道理,返回本机所有ip信息
 grep inet                   截取包含ip的行
 grep -v 127.0.0.1      去掉本地指向的那行
 grep -v inet6             去掉包含inet6的行
 awk { print $2}         $2 表示默认以空格分割的第二组 同理 $1表示第一组​
 tr -d "addr:               删除"addr:"这个字符串
  1. 如何查看系统每个ip的连接数
netstat -tan| awk '/tcp & gt; /{ split ($5,ip,":"); count[ip[1]]++} END {for(i in count) { print i, count[i]} }'
  1. 统计80端口所有连接状态

    netstat -tn|grep ":80" |awk '{print $6}'|sort|uniq -c
  2. 编写脚本,快速找出192.168.1.0/24网段中已经使用的IP地址

#!/bin/bash/env bash
echo "-----------------------------------------"
echo "可以 ping 通的 ip 在当前目录的111.txt文件"
echo "不可以 ping 通的 ip 在当前目录的222.txt文件"
echo "-----------------------------------------"
echo > ./111.txt
echo > ./222.txt
read -p "请输入IP的第三位数字即可:" num3
i=1
IP3="192.168.$num3"
for i in {1..254}
do
        {
        ping -c1 $IP3.$i >>/dev/null
        if [ $? -eq 0 ];then
        echo "$IP3.$i" >>./111.txt
        else
        echo "$IP3.$i" >>./222.txt
        fi
        }  &
done
wait
echo "finish...ok"
  1. curl测试网页响应时间

连接时间:

curl -s -o /dev/null -w "%{time_connect}\n" https://www.cyylog.cn

传输时间:

curl -s -o /dev/null -w "%{time_starttransfer}\n" https://www.cyylog.cn

总时间:
curl -s -o /dev/null -w "%{time_total}\n" https://www.cyylog.cn



curl对网站响应时间监控:
[root@localhost script]# curl -o /dev/null -s -w "time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n" " https://www.cyylog.cn"
time_connect: 0.015
time_starttransfer: 0.394
time_total: 0.433

负载均衡

  1. HAproxy, LVS, Nginx 有何区别,工作中会怎么选择
LVS: 是基于四层的转发
HAproxy: 是基于四层和七层的转发,是专业的代理服务器
Nginx: 是WEB服务器,缓存服务器,又是反向代理服务器,可以做七层的转发

区别: LVS由于是基于四层的转发所以只能做端口的转发
而基于URL的、基于目录的这种转发LVS就做不了

工作选择:

HAproxy和Nginx由于可以做七层的转发,所以URL和目录的转发都可以做
在很大并发量的时候我们就要选择LVS,像中小型公司的话并发量没那么大
选择HAproxy或者Nginx足已,由于HAproxy由是专业的代理服务器
配置简单,所以中小型企业推荐使用HAproxy

灰度发布

  1. 灰度发布过程中出现问题,数据库中有脏数据怎么解决
灰度发布大部分用户都是公司中的人,少部分是外面的用户,如果出现错误,叫DBA进行数据库回滚就可以的,在灰度发布的数据中都有标记
,外面的用户只能叫DBA进行修改

Iptables

  1. 本地80端口的请求转发到8080端口,当前主机IP为192.168.2.1
iptables -t nat -A PREROUTING -d 192.168.2.1 -p tcp -dport 80 -j DNAT -to 192.168.2.1:8080 
  1. 允许本机对外连接80端口(本机能连外界服务器为80)
iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT  
  1. 禁止外界ping本服务器
iptables -A INPUT -p icmp -j DROP

MySQL

  1. 查看最近一次innodb表锁记录
show ENGINE INNODB STATUS ;
  1. 列出数据库所有线程
show full processlist
  1. MySQL 的每天的数据量,主从,mysql主库数据量大造成从库同步延迟怎么办
带宽,配置不当,性能不一致,待补充
  1. 用SQL语名查询年龄小于平均年龄的作者姓名、图书名、出版社并按姓名降序排序。 图书(图书号,图书名,作者编号,出版社,出版日期) 作者(作者姓名,作者编号,年龄,性别)
select aname,bname,pub from anthor a join book b on (a.ano = b.ano) where age < (select avg(age) from author)
  1. mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
mysql的innodb如何定位锁问题:

在使用 show engine innodb status检查引擎状态时,发现了死锁问题

在5.5中,information_schema 库中增加了三个关于锁的表(MEMORY引擎)

innodb_trx ## 当前运行的所有事务
innodb_locks ## 当前出现的锁
innodb_lock_waits ## 锁等待的对应关系


mysql如何减少主从复制延迟:

如果延迟比较大,就先确认以下几个因素:

1. 从库硬件比主库差,导致复制延迟

2. 主从复制单线程,如果主库写并发太大,来不及传送到从库

就会导致延迟。更高版本的mysql可以支持多线程复制

3. 慢SQL语句过多

4. 网络延迟

5. master负载

主库读写压力大,导致复制延迟,架构的前端要加buffer及缓存层

6. slave负载

一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器


只作为备份用,不进行其他任何操作.另外, 2个可以减少延迟的参数:

–slave-net-timeout=seconds 单位为秒 默认设置为 3600秒

#参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据

–master-connect-retry=seconds 单位为秒 默认设置为 60秒

#参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试

通常配置以上2个参数可以减少网络问题导致的主从数据同步延迟


MySQL数据库主从同步延迟解决方案

最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行

还有就是主库是写,对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit

= 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog

innodb_flushlog也可以设置为0来提高sql的执行效率。另外就是使用比主库更好的硬件设备作为slave

网络基础

  1. 从技术角度描述一下用户打开https://cyylog.netlify.app所经过的所有过程,越详细越好。 (DNS+HTTP协议)
1. 域名解析
2. 发起TCP的3次握手
3. 建立TCP连接后发起HTTP请求
4. 服务器端响应http请求,浏览器得到html代码
5. 浏览器解析html代码,并请求html代码中的资源
6. 浏览器对页面进行渲染呈现给用户
  1. tcpdump 抓本机 192.168.23.1 的80端口
tcpdump -i ens33 host 192.168.23.1 port 80

CICD

Zabbix

ELK

Redis

常用web服务器

Apache、Nginx、Tomcat

Ansible

docker

K8S

Other

Keepalived的工作原理

在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP通告信息,

BACKUP不会抢占MASTER,除非它的优先级更高。当MASTER不可用时(BACKUP收不到通告信息)

多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性

由于安全性考虑,VRRP包使用了加密协议进行加密。BACKUP不会发送通告信息,只会接收通告信息


 上一篇
Zabbix-原理 Zabbix-原理
​ 想要用好zabbix进行监控,那么我们首要需要了解下zabbix这个软件的实现原理及它的架构。建议多阅读官方文档。 官网地址:https://www.zabbix.com/documentation/4.
2020-10-24
下一篇 
Kubernetes-Pod-生命周期 Kubernetes-Pod-生命周期
Pod 的生命周期本页面讲述 Pod 的生命周期。 Pod 遵循一个预定义的生命周期,起始于 Pending 阶段,如果至少 其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以 失败状态结束而进入 Suc
2020-10-06
  目录