目录
第一章.网络协议
1.OSI七层模型 (TCP/IP五层 四层)
1)七层(物数网传会表应)
2)五层(物数网传应)
3)四层(网络接口层、网络层、传输层、应用层)
2.TCP三次握手四次断开 (11种状态的转换)
3.UDP和TCP区别:
UDP传输效率高,包小,头部长度8,TCP安全可靠,包大,头部长度20
第二章.系统管理
1.命令
kill scp ps lsof top等
2.用户
/etc/passwd 密码 /etc/shadow 用户信息
3.RAID
–> 笔试多 比较RAID级别
1)0-6种级别
2)RAID0:条带模式
3)RAID1:镜像模式
4)RAID5:分布式奇偶校验
5)RAID10:RAID0+RAID1
6)Mdadm -Cv /dev/md5 -l5 -n3 -x1 /dev/sd[b-e] 格式化 挂载 自动挂载
4.LVM
–> 1.创建逻辑卷的流程 2.扩展逻辑卷的流程
1)特点:动态调整大小,弹性伸缩
2)Scan、display、create、remove、extend、reduce
5.权限
chmod chown umask(默认权限)
umask root默认022 --> 文件 644 目录 755
chattr lsattr i 不能修改 a 只能追加
6.计划任务
at 一次性
crontab 周期性 --> 分时日月周
每天两点执行一次 0 2 * * *
7.任务管理
& jobs ctrl+z bg fg
8.进程
ps:
当前时间,上线时间,用户,平均负载(1min,5min,15min的平均负载,单双核)
任务总数,运行数,休眠数,停止的,僵尸进程
cpu总核数(按1显示全部核数),user、system、nice、idle、IO-wait、hi(硬中断)、si(软中断)、st(虚拟化磁盘节省)
kb单位内存,空闲,已用的,缓存
kb单位交换分区,空闲,已用,可用空间。
top
进程状态:
S R N T D Z X + < l s
kill /killall /pkill
kill和kill -9有什么区别?
kill -9可以强制杀死进程,原因在于kill与kill -9 向进程发送的信号不同;
尽量避免使用kill -9,kill -9可能会出现孤儿进程
什么是僵尸进程?
子进程死掉,父进程没有正常回收子进程,一直占用pid号,不能有新的进程运行。
Top ps -elf | grep -Z
杀死父进程,自动清理僵尸进程。
重启系统。
9.网络命令
ping 测试网络连通性
netstat/ss
tcpdump 抓包 笔试题
-i 指定网络接口
-n 以数字显示,不显示域名
-w 把内容保存到文件
-vv 详细信息
-c 接受数据包的数量
host 指定要抓取的主机IP
tcpdump -i ens33 src/dst host IP
端口 或协议的数据
tcpdump tcp port 端口号
tcpdump tcp port 端口号 and host IP地址
第三章.网络服务
1.FTP -->三种用户 端口号 20 21
1)匿名用户、本地用户、虚拟用户
2)主动:客户机打开端口,等待服务器发送数据。(tcp20、21)
3)被动:服务器打开端口,等待客户发送数据。(tcp20、未知高级端口)
2.DHCP
–>DHCP分配IP的流程 DHCP中继(跨网段)
1)discover、offer、request、ack
3.DNS
–>host/nslookup/dig
DNS解析流程:浏览器,宿主机host,域名服务器,根域,二级域。
主从
端口 TCP/UDP 53
解析时主要使用UDP 53,当域名过长时,使用TCP 53 ,还有主从复制使用TCP 53 (面向连接,安全可靠)
4.ssh
–> 22 scp命令的使用 ssh命令使用
免密登录(秘钥登录)
5.shell脚本
–>背两个脚本
1.检测主机存活
检测主机存活:
#!/bin/bash
i=0
for IP in 192.168.20.{1..3}
do
ping -c 2 -i 0.1 -w 1 $IP &>/dev/null
if [ $? -eq 0 ];then
echo "$IP is up."
let i++
else
echo "$IP is down."
fi
done
echo "total ${i} IP is up."
2.自动备份MySQL
3.Keepalived+nginx检测是否开启
#!/bin/bash
while :;do
pidof nginx &> /dev/null
if [ $? -ne 0 ];then
/usr/local/nginx/sbin/nginx &> /dev/null
pidof nginx $> /dev/null
if [ $? -ne 0 ];then
/usr/bin/systemctl stop keepalived
else
pidof keepalived &> /dev/null
if [ $? -ne 0 ];then
/usr/bin/systemctl start keepalived
fi
else
pidof keepalived &> /dev/null
if [ $? -ne 0 ];then
/usr/bin/systemctl start keepalived
fi
fi
fi
sleep 3
Done
检测LVS后端真实服务器
#!/bin/bash
VIP=192.168.153.188
rs=(192.168.153.136 192.168.153.137)
while :
do
for i in ${rs[*]}
do
exist_num=$(ipvsadm -Ln | grep -c $i)
status_code=$(curl -sI -o /dev/null -w %{http_code} http://$i/index.html)
if [ $status_code -ne 200 -a $exist_num -eq 1 ];then
echo "正在将$i从调度表中删除"
ipvsadm -d -t $VIP:80 -r $i:80
elif [ $status_code -eq 200 -a $exist_num -eq 0 ];then
echo "正在添加 $i 到调度表中"
ipvsadm -a -t $VIP:80 -r $i:80 -g
fi
done
sleep 1
done
$? $* $@ $# $0 $$
read / $1-$9
if/case
while/for
6.grep sed awk
awk默认分割符 空格和tab -F NR NF $1
sort cut uniq paste xargs split join tr tee
第四章.web
1.访问网站的流程
DNS解析流程 三次握手 WEB流程
2.nginx
版本号 1.6
3.nginx优化:
1).防盗链 rewrite
2).调整并发连接数 woker_connections 20480;
3).隐藏版本号 配置文件在http段内添加server_tokens off;
4).压缩
gzip on;
gzip_min_lengh 1k;压缩页面最小字节
gzip_buffers 4 16k;缓冲4块,单位16k
gizp_http_version 1.1; 压缩版本
gzip_comp_level 2;压缩等级
5).会话保持
6).日志轮割
7).自定义错误页面
8).设定用户和用户组 配置文件user nginx nginx;或者编译./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
9).绑定CPU
10).设置连接超时时间 keepalive_timeout 60;
11).设置缓存 在location中添加expires 3650d;
12).使用epoll的IO模型 -->select epoll 对比
13).访问控制
14).调整进程数
woker_processes 4;几核写成几(top 1 查看或/proc/cpuinfo看processor)
4.同步异步模式
select 同步阻塞 线性轮询 1024
epoll 异步非阻塞
5.select,epoll比较
select模型是同步阻塞式,同时采用线性轮询的方式,只能监听1024个文件描述符,效率比较低。而epoll是异步非阻塞,采用的是定期轮询,对监听文件描述符没有限制。
epoll在Linux内核版本2.6+开始支持
6.nginx常用模块?
ngx_http_access_module模块
ngx_http_auth_basic_module模块
ngx_http_stub_status_module模块
ngx_http_log_module模块
ngx_http_gzip_module模块
ngx_http_ssl_module模块
ngx_http_rewrite_module模块
ngx_http_referer_module模块
ngx_http_headers_module模块
7.rewrite模块
–>重写
1).防盗链
2).URL重写
3).域名镜像
4).跳转301
8.rewrite标志位
last 本条规则匹配后,继续匹配下一条
break 匹配成功后,就终止
redirect 返回302临时重定向
permanent 返回301永久跳转
9.location 匹配
1).动静分离
2).UA分离 -->
3).域名
= 普通字符精准匹配
^~ 不支持正则,普通字符串匹配
~* 正则匹配,不区分大小写
~ 正则匹配,区分大小写
/匹配内容/ 匹配普通字符串,如果有正则 先匹配正则
! 取反
10.nginx与Apache对比?
nginx的并发量 5万
公司的并发量 七八百 PV量 几万 数据量 100多兆
11.tomcat
–版本 8.5
JVM -->内存模型 调整内存大小 catalina.sh
tomcat 优化
1).压缩
2).并发
3).版本号
4).线程池
5).禁止DNS解析
端口 8080
连接器运行模式 -->BIO NIO NIO2 APR
多实例
第五章MySQL
1.版本号
MySQL 5.5 5.6 5.7
2.查询语句
SQL语句 -->select 内连接 外连接 全连接 子查询
order by ; limit ; group by
3.where与having区别 ?
where用在聚合前 having用在聚合后
如果条件允许,多用where,这样聚合后的数据量小
4.delete与drop区别?
drop是删除库或表的;
delete删除表里的数据;
用户信息和权限存放mysql.user
5.MySQL忘记root用户密码如何解决?
关闭数据库:systemctl stop mariadb
mysqld_safe --skip-grant-tables &
update mysql.user set password=password(‘新密码’) where user='root’and host=‘localhost’;
杀数据库进程,重新启动
6.索引类型
索引: 普通索引 唯一性索引 主键 全文索引
日志: 错误日志 查询日志 慢查询日志 二进制日志 中继日志
7.主从复制:
1.主从复制原理;
主库开启二进制日志,并且对从库进行授权;
从库连接主库后,执行start slave命令,开始IO线程和SQL线程;
IO线程通过主库的binlog dump线程获取二进制日志的内容并写入中继日志,SQL线程负责执行中继日志中的内容
2.主从分类
按架构分:
一主一从(多从) 互为主从 级联复制 同源复制(多主一从)
按复制方式分:
传统复制 基于GTID复制 并行复制
按同步方式分:
默认是异步 半同步复制 增强半同步
8.为什么要做读写分离?
主库负责写,从库负责读,减轻IO压力
避免在从库上写
9.mysql数据库的优化;
第六章 集群
1.LVS–>四层
2.工作模式
DR NAT TUN ENAT FullNAT
DR的工作原理
调度算法: 一共有11种,常用rr wrr lc wlc
3.nginx -->主要在七层
通过模块实现四层负载(stream)
调度算法:
轮询 加权轮询 哈希(ip_hash,url_hash) fair(根据RS响应时间)
4.正向代理与反向代理?
4.nginx如果实现负载均衡?
5.LVS与nginx负载对比优缺点?
LVS的负载能力强,因为其工作方式逻辑非常简单,仅进行请求分发,而且工作在网络的第4层,没有流量,所以其效率不需要有过多的忧虑。
LVS基本能支持所有应用,因为工作在第4层,所以LVS可以对几乎所有应用进行负载均衡,包括Web、数据库等。
Nginx工作在网路第7层,所以可以对HTTP应用实施分流策略,比如域名、结构等。相比之下,LVS并不具备这样的功能,所以Nginx可使用的场合远多于LVS。并且Nginx对网络的依赖比较小,理论上只要Ping得通,网页访问正常就能连通。LVS比较依赖网络环境。只有使用DR模式且服务器在同一网段内分流,效果才能得到保证。
6.keepalived -->功能 健康检查 故障转移
协议 VRRP
keepalived+nginx 需要脚本监控nginx状态
第七章redis
1.支持数据类型
字符串string (512M) 列表list(2^32-1) 集合set(2^32-1) 有序集合sroted(2^32-1) 哈希hash(2^32-1)
2.redis单线程?
1.Redis是否真的是单线程?
Redis在处理客户端的请求时,包括获取(socket读)、解析、执行、内容返回(socket写)等都由一个顺序
行的主线程处理,这就是所谓的“单线程”。但如果严格来讲从Redis4.0之后并不是单线程,除了主线程外,
也有后台线程在处理一些较为缓慢的操作,例如清理脏数据、无用连接的释放、大key的删除等等。
2.为什么Redis设计为单线程?
官方回应:使用Redis时,几乎不存在CPU成为瓶颈的情况,Redis主要受限于内存和网络。例如在一个普通的Linux系统上,Redis通过使用pipelining每秒可以处理100万个请求,所以如果应用程序主要使用O(N)或O(log(N))的命令,它几乎不会占用太多CPU。
使用了单线程后,可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。Redis通过AE事件模型以及IO多路复用等技术,处理性能非常高,因此没有必要使用多线程。单线程机制使得Redis内部实现的复杂度大大降低,Hash的惰性Rehash、Lpush等等“线程不安全”的命令都可以无锁进行。
3.Redis6.0中为什么要引入多线程?
从Redis自身角度来说,因为读写网络的read/write系统调用占用了Redis执行期间大部分CPU时间,瓶颈主要在于网络的IO消耗,优化主要有两个方向:
•提高网络IO性能,典型的实现比如使用DPDK来替代内核网络栈的方式
•使用多线程充分利用多核,典型的实现比如Memcached。
协议栈优化的这种方式跟Redis关系不大,支持多线程是一种最有效最便捷的操作方式。所以总结起来,redis支持多线程主要就是两个原因:
•可以充分利用服务器CPU资源,目前主线程只能利用一个核
•多线程任务可以分摊Redis同步IO读写负荷
4.Redis6.0中如何设置多线程?
Redis6.0的多线程默认是禁用的,只使用主线程。如需开启需要修改redis.conf配置文件:
io-threads-do-reads yes
开启多线程后,还需要设置线程数,否则是不生效的。同样修改redis.conf配置文件:io-threads 4;
关于线程数的设置,官方有一个建议:4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数。还需要注意的是,线程数并不是越大越好,官方认为超过了8个基本就没什么意义了。
3.redis吞吐量
单点TPS 8万/S
QPS 10万/s
4.redis优势:
1).纯内存性速度快
2).支持数据持久化
3).支持数据类型丰富
4).功能比较多
5).支持主从,哨兵,集群等架构
5.redis与memcached对比
1).memcached只能支持字符串,而redis可以支持多种数据类型
2).memcached是纯内存型,不支持数据持久化,redis支持数据持久化
3).Reids支持主从,哨兵,集群等架构
6.redis持久化
RDB -->快照模式,保存某一时间点的数据集
AOF -->类似于mysql的二进制日志,记录执行的语句
AOF 三种策略:
Always everysec no
7.redis集群
Hash槽数量 16384(0-16383)
作用:当集群中需要存放一个键值对,根据CRC%16384的值,决定这个键值对放那个槽
8.应用场景
1)session共享
2)消息队列
3)排行榜或计数器
9.缓存穿透
查询一个key,缓存与数据源都没有,频繁查询数据源。
解决:1)返回空值给redis,key=null,避免恶意攻击,设置有效时间,短 期有效。
2)布隆过滤器(redis自身具备)
10.缓存击穿
查询一个key(热点数据),数据源中有,但redis中过期。
问题:热点数据缓存过期,导致大量并发,数据库io压力增大。
解决:互斥锁,不存在返回1,读取数据库中数据,再次访问返回0.
11.缓存雪崩
当缓存服务器重启或大量的缓存失效时,频繁查询数据库。
解决:1)缓存层高可用
2)消息队列削峰
第八章zabbix 5.0
1.监控怎么做的?
利用监控了哪些内容
硬件:温度 风扇 -->IPMI
网络设备: 路由 交换 -->SNMP
系统:CPU 内存 硬盘 网络
应用:redis(使用内存大小) mysql(端口号、主从复制) nginx(访问情况) php
业务:访问量
tomcat–>JMX -->zabbix-java-gateway 10052
2.单机监控命令
iostat
df /du
mpstat
vmstat
r 等待执行的任务数,如果超过CPU个数,说明CPU有瓶颈
b 等IO的任务数
system:
in:每秒中断数
cs:每秒上下文切换
这两个值越大,表示内核消耗的CPU资源越多
free
https://blog.csdn.net/qq_39109226/article/details/114928613
3.端口号
zabbix-server 10051 zabbix-agent 10050
4.zabbix模式
主动模式:客户端主动向服务端上报信息
被动模式:默认,服务端主动向客户端获取信息
zabbix-proxy:实现分布式,同样监听10051端口,没有web,只有数据库
5.报警:邮件,钉钉,微信(通过脚本实现)
6.自动救援
通常当服务下线或宕机,重启服务时使用,在动作中可以实现
7.自动发现
可以通过扫描的方式添加客户端
8.自动注册
当客户端启动,主动添加
9.LLD
低级别自动发现–>通过脚本实现,可以自动添加监控项
10.优化
LAMP
1.mysql
通过配置项
2.php
调整php的进程数
3.zabbix
删除不用的监控项
调整数据的缓存周期
11.添加监控项流程
1.取值
2.配置
3.测试
4.添加
特殊的监控项:
web检测 -->步骤和场景
第九章 ansible
ansible:
常用模块: copy yum service file shell command(默认) corn
templete
1.copy和templete区别?
copy直接上传文件,而template模块能识别变量,通常推送的是jinja2模板
2.主机清单:
主机地址 跟变量(用户名,密码)
3.playbook -->剧本
触发器 notify和handler
变量定义
变量注册 register:变量名 + debug模块–>msg: {{变量名}}
facts变量
流程控制语句: 判断:when 循环with_items
通过playbook实现过什么?
编写playbook部署zabbix-agent
4.使用过roles吗?
没有,了解过,roles规范化了playbook,使playbook结构清晰,实现解耦。可以通过ansible-galaxy管理roles
第十章 docker
docker
docker中如何实现资源隔离?
namespace --> pid uts ipc user mount network
docker中如何实现资源限制的?
cgroup
镜像 容器 仓库
docker基础命令
docker run -->通过镜像启动容器
=pull create start
1.当docker服务重启后,容器会显示exit状态,如何解决?
–restart=always
容器分为两种:
交互式容器 系统
守护进程式容器 应用
2.如果进入启动容器?
attach
exec 使用多
3.如果不退出容器,只退出终端?
ctrl+pq
4.镜像制作两种方式?
1.通过容器commit提交
2.dockerfile
1.FROM 指定基础镜像
2.RUN 运行命令 ,每一RUN指令会生成一个镜像层
3.COPY 传输文件
ADD 支持解压缩,原路径可以是远程路径,此时不解压缩
4.CMD 指定在docker run时运行的命令
ENTRYPOINT 与CMD类似,但是不会被docker run指定的命令覆盖
5.ENV 设置环境变量
6.ARG 传参,与ENV类似,作用范围不同,ARG仅对Dockerfile生效
7.VOLIME 匿名数据卷,启动容器时如果没有指定,默认挂载
8.EXPOSE 暴露端口
5.docker的数据持久化:
1.数据卷
2.数据卷容器
6.docker网络模式
host --net=host 容器与宿主机共用Network
container --net=container:容器或ID
容器与另外一个容器共用一个网络
none --net=none 容器独立的Network
bridge --net=bridge 默认的网络模式
第十一章CICD
1.CSV:代码版本管理系统
svn,git
Git 与 SVN 区别
Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。
2.Git 与 SVN 区别点:
1、git,svn区别
Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。Git 与 SVN 区别
Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。
。
3.代码上线流程
产品经理—>项目管理系统—>开发—>本地测试—>gitlab合并分支—>gitlab合并master—>jenkins做持续集成
jinkens持续集成过程:
jenkins手动或自动(webhook脚本)拉去代码—>maven打包,解决依赖—>sanar代码质量检测—>利用脚本rsync,ansible进行分发到测试服务器—>类生产环境—>生产环境
4.代码发布策略
1)蓝绿发布
两组服务器,通过负载调度器把新版本分发到一组服务器中,另一组保留原样。用户使用一组服务器。
特点:
如果代码出现问题,一组服务器不可用。
成本比较高,需要一组一摸一样的服务器。
用户无感,平滑过渡。
升级,回滚速度快。
2)滚动发布
每次只升级一个或多个服务器,不断执行这个过程,到升级完成。
特点:
节约资源。
用户无感,平滑过渡。
部署时间慢。
发布策略复杂。
不易回滚。
3)灰度发布(金丝雀发布)使用较多
升级部分服务器,一部分用户使用老版本,一部分用户使用新版本。逐步扩建,直到完成。使用权重值实现分流策略。
特点:
保证整个系统稳定性,在初始灰度发布时发现,解决问题,影响范围可控。
新功能逐渐评估性能,稳定性,健康状况,如果出问题,影响范围小。
用户无感,平滑过渡。
自动化需求高,同时并存两个版本。
面试题:
https://www.cnblogs.com/mydba-j/articles/10296084.html
https://blog.51cto.com/ganbing/2057482
https://mp.weixin.qq.com/s?__biz=MzIzODIzNzE0NQ==&mid=2654428912&idx=1&sn=09da648acb4bfe2bbc0527d5ee4652f8&chksm=f2ff9a46c588135097df1de7a30c75ee88d683652826ec72923ed89c033219a869b9686bd701&mpshare=1&srcid=0821l5E5Iv4sngSY0v0MRIAy&sharer_sharetime=1614221667213&sharer_shareid=1ae456ef992b5c82668272c6fede9ac5&from=groupmessage&scene=1&subscene=10000&clicktime=1614221749&enterid=1614221749&ascene=1&devicetype=android-29&version=28000159&nettype=3gnet&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=Aav3Z3vNa%2BgdyWRmFWoulYg%3D&pass_ticket=uvAffQBJTs3DSoZTBIUmNN3Rs7kZXjOGbfk4BCSRJxNihNiYq2%2FY2ADhqNIrSqiK&wx_header=1
https://blog.51cto.com/ganbing/2059541