一、简单型
1.你平时在公司主要做什么?
日常监控维护业务,
服务器巡检,调优,
写一些日常使用的脚本,日常工作形成文档化,
服务优化:nginx优化,tomcat优化,系统优化
2.你们原来公司的网站架构是怎么样的?
搭的LNMP架构,Nginx做了集群,做了反向代理负载均衡,
mycat读写分离,数据库做的一主两从,并且做了MHA高可用
3.你对哪一块比较熟练或者精通?
对企业自动化交付CICD方面做得比较熟练,
缓存服务memcached,squid,redis这种缓存服务器,
还有lvs,keealived这种负载均衡集群软件
容器docker,k8s方面
mysql数据库
4.介绍一下负载均衡?
负载均衡我用过lvs和nginx 和阿里云SLB
nginx 负载均衡:工作在网络第7层 ,支持http应用进行分流
lvs:抗负载能力很强,工作4层,配置简单,很稳定,不产生流量
5.lvs内部原理?
LVS的内部原理涉及以下几个主要组件和步骤:
1).调度器(Scheduler):调度器是LVS的核心组件,负责根据一定的调度算法(如轮询、加权轮询、最小连接数等)选择合适的后端服务器来处理传入的请求。调度器根据客户端请求的IP地址和端口号,将流量分发到后端服务器上。
2).IPVS模块:IPVS(IP Virtual Server)是Linux内核中的模块,实现了LVS的核心功能。它拦截传入的网络流量,根据预先配置的规则将请求分发给不同的后端服务器。
后端服务器池:后端服务器池是一组提供相同服务的服务器,它们由负载均衡器统一管理。负载均衡器将请求分发给这些服务器,以实现负载均衡和高可用性。
3).监控与健康检查:LVS可以定期检查后端服务器的健康状态,以确保只将流量分发给正常工作的服务器。如果某个服务器出现故障或不可用,负载均衡器会自动将其排除在服务范围之外,确保客户端请求不会被发送到有问题的服务器上。
4).网络地址转换(NAT):LVS通常使用NAT技术修改传入和传出流量的IP地址,以隐藏后端服务器的真实IP地址。这有助于保护服务器的安全性并简化网络配置。
总体来说,LVS的内部原理涵盖了负载均衡调度、IPVS内核模块、后端服务器管理、健康检查和网络地址转换等关键方面。通过这些机制,LVS能够实现高效的负载均衡和故障恢复,为网络服务提供更高的可靠性和性能。注意,LVS的具体实现和配置可能会因版本和使用情况而有所不同。
6.nginx lvs haproxy 三个有什么区别
lvs优势:抗负载能力很强、工作稳定、不占什么流量、pv超过1000万可用lvs
nginx:nginx工作第7层,支持http应用本身分流,lvs没有这个功能
nginx 对网络依赖很小,nginx安装简单也稳定,流量日pv <=1000万nginx足以能撑住,一般不是特别大的公司都达不到lvs使用级别。官方说并发50000都没什么问题,测试过并发1-2万根本没什么问题
haproxy:
1).haproxy是支持虚拟主机的,可以工作在4、7层(支持多网段)
2).haproxy的优点能够补充nginx的一些缺点,比如支持session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
3).haproxy跟lvs类似,本身就只是一款负载均衡软件;单纯从效率上来讲haproxy会比nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
4).haroxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡。
7.lvs主要3种工作模式原理
1).NAT模式(NAT)
原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客户端IP地址即可,负载均衡器再返回给客户端。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。
优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。
缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
2).IP隧道模式(TUN)
原理:首先要知道,互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项
优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
3).直接路由模式(DR)
原理:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,也就是客户端发送请求给lvs的DR模式,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。
8.lvs工作原理,算法,工作模式?
lvs:实现负载均衡集群部署的软件,有一台或多台调度器组成,通过加载lvs内核模块并且生成虚拟ip,通过虚拟ip接收客户端的请求,再根据自身配置的调度算法,实现对请求的转发
算法:大概有10种,主要的有下面几种:
静态算法: 只是根据算法进行调度并不考虑后端REALSERVER的实际连接情况
rr:轮询算法: 按照节点顺序一个一个来,均等地对待每一台服务器,不管服务器上的实际连接数和系统负载。
wrr:加权轮询算法:根据节点权重以及节点顺序分发请求,调度器可以自动问询真实服务器的负载情况,并动态调整权值。
sh:源地址散列调度算法:匹配客户端最近一次访问的服务节点,并将请求交给这个服务节点,根据源地址散列算法进行静态分配固定的服务器资源。或者说: 负载均衡器选择响应时间最短的后端服务器来处理请求。这可以确保请求被发送到响应速度最快的服务器上。
dh:目标地址散列算法:根据目标ip地址进行哈希计算,得到散列值,匹配客户端最近一次访问的服务节点,并将请求交给这个服务节点,根据目标ip地址通过散列函数将目标ip与服务器建立影射关系,出现服务器不可用或负载过高的情况下,发往该目标ip的请求会固定发给该服务器。
动态算法:
lc:最少连接数算法:动态地将网络请求调度到已建立的连接数最少的服务器上。
wlc:加权最少连接数算法:调度器可以自动问询真实服务器的负载情况,并动态调整权值。
lblc:基于局部的最少连接数调度算法: 先根据请求的目标ip地址寻找最近的该目标ip地址所有使用的服务器,如果这台服务器依然可用,并有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其他可行的服务器,即:
如果服务节点因为自身故障暂时无法接收请求,则调度器在服务器集群中找出一台连接量最少的节点来处理请求。
lblcr:带复制的基于局部的最少连接算法:记录的不是要给目标ip与一台服务器之间的连接记录,它会维护一个目标ip到一组服务器之间的影射关系,防止单点服务器负载过高。
工作模式:主要模式有3种
1).DR模式:(也是默认模式,直接路由模式)
客户端访问负载均衡器的vip,此时在集群中负载均衡器和后端的realserver都具有vip,所以负载局衡器通过vip进行转发是不实际的。那么只能通过二层协议,修改数据包二层的目标mac地址来进行转发,后端服务器处理后,通过本机的lo网卡上的vip直接返回数据包。
a).环境,为了模拟生产环境,我们将dip rip 设置为同一个网段,dr和rs上面的虚拟ip均为vip(生产环境中的公网ip)。
b).注意,arp静默需要开启,后端服务器不接受请求,只处理
2).NAT模式:
客户端访问负载均衡器的vip,负载均衡器通过转换目标ip地址的方式,实现负载均衡,将本该发送给负载均衡器的数据包的目标地址,修改成后端real server的ip地址,然后又rs进行处理并返回,返回过程中,经过负载均衡器,负载均衡器将源地址转换为vip,完成本次请求。
a).环境,为了模拟生产环境,我们使用 一台centos7服务器作为负载均衡器,配置两块网卡,一块设置vip(桥接,生产中是公网ip),一块设置dip(nat或仅主机模式,生产中是内网ip),后端设置rip(nat或仅主机模式,于dip同一网段)
b).注意,负载均衡器需要开启路由转发,所有服务器均关闭防火墙,selinux。如果测试环境中,使用的是于后端服务器同一网段的客户端访问,则会丢弃数据包,超时连接,这种情况需要在后端real-server添加路由规则,route add -host cip gw dip 则可以访问
3).TUN模式(隧道模式):
客户端访问负载均衡器的vip,这种模式,可以跨区域进行负载均衡,vip和rip均为公网ip,dip将请求发送给rip的过程中是加密的,后端rs上的vip直接将请求进行回复,不经过dr负载均衡器。
a).环境,需要两个公网ip
b).添加vip在隧道网卡。
9.mysql用的哪个版本,你们的数据库怎么备份,什么时间备份,备份数据量多大
用的5.7 逻辑备份 每天全量备份 500G 后面改用xbk备份。
10.memcached工作原理(内存管理机制)
memcached是一种内存缓存软件,在工作中经常用来缓存数据库的查询数据,数据被缓存在事先预分配的memcached管理的内存中,可以通过API或命令的方式存取内存中缓存的这些数据,memcached服务内存中缓存的数据就像一张巨大的HASH表,每条数据都是以key-value对的形式存在。每个被缓存的对象或数据都有唯一的标识符key,存取操作通过这个key进行。保存到Memcached中的对象或数据放置在内存中,并不会作为文件存储在磁盘上,所以存取速度非常快。由于没有对这些对象进行持久性存储,因此在服务器端的服务重启之后存储在内存中的这些数据就会消失。而且当存储的容量达到启动时设定的值时,就自动使用LRU算法删除不用的缓存。
11.nginx状态码499、401、404、400是什么意思
499:服务端处理时间过长,客户端主动关闭了连接
401:权限验证错误,一般是用户名和密码错误等
404:访问文件不存在
400: web服务器遇到不完整的http请求头,一般是请求头或cookie信息过大,调整nginx相关参数调大即可。
12.nginx状态码 500、502 、504、503错误可能的原因有哪些?
500:大多数是代码问题或者sql报错或连接不上数据库、磁盘空间不够,系统文件句柄数设置太小
502:一般就是后端问题,服务挂了或者进程不够用了大并发时候处理不过来,增加后台服务器
504:网关超时,nginx里配置了超时时间,在配置的时间内没处理过来,导致超时,后台服务不一定是挂了
503:服务临时不可用,一般是临时服务器维护或者过载,临时的,过段时间会恢复
13.nginx状态码301、302、304 ,200分别表示什么意思
301状态: 永久重定向
302状态: 临时重定向
304状态: 客户端有缓存情况下服务端的一种响应,访问的文件还没过期
200状态: 访问正常
14.维护网站过程中遇到的问题,处理过什么故障?(状态码:413、 504的意思)
web服务报错413,查阅后发现是客户端请求的数据量太大,超过了配置的最大值,我没有指定http请求最大大小,配置文件修改增大了client_max_body_size 的值完全解决(如果上传文件大小超过client_max_body_size时,会报413 entity too large的错误)。
504错误:请求后端服务的时候,后端服务很长时间才响应,查看错误日志后修改增大了proxy_read_timeout 和 proxy_read_time 的值后完美解决。
15.FTP主动和被动的区别(指的是服务器端的主动和被动)?
主动:
FTP客户端向服务器的FTP控制端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路;当需要传送数据时,客户端告诉服务器我开放了某>1024的大端口,你过来连接我。于是服务器从20端口向客户端的大端口发送连接请求,建立一条数据链路来传送数据。在数据链路建立过程中是服务器主动请求,所以称为主动模式。
被动:
FTP客户端向服务器的FTP控制端口(默认21)发送连接请求,服务器接受连接,建立一条命令链路;当需要传送数据时,服务器告诉客户端,我打开了某端口(>1024的大端口),你过来连我。于是客户端从>1024的大端口向服务器的该大端口发送连接请求,建立一条数据链路来传送数据。在数据链路建立的过程中是服务器被动等待客户机的请求,所以称被动模式。
16.apache三种工作模式区别及优化?
apache的三种工作模式
1).prefork:预派生多进程,当apache启动时,启动一个主进程,并根据配置由该主进程派生多个子进程,这些子进程等待客户端发送来的请求并处理,由于已经有预先派生好的进程,所以在处理客户端请求时效率比较高,如果客户端的请求数量超过预派生的进程数量,则该主机会派生新的进程来处理后来的请求,支持的并发量低,就是说不能同时处理客户端发来的请求,但是稳定
2)worker:预派生多线程,当apache启动时,启动一个主进程,并根据配置由该主进程派生多个子进程,每个子进程又派生出多个线程,这些线程等待客户端发送来的请求并处理由于已经有预先派生好的线程所以在处理客户端的请求时效率比较高,如果客户端的请求数量超过预派生的线程,则每个子进程会派生出新的线程来处理后来的请求,支持的并发量相较于prefork模式要多,但是没有prefork模式稳定 , 但是在长链接的模式下,线程在连接时间范围内会一直等待客户端发来的请求,线程利用率不高
3).event:worker的升级版,通过管理线程,可以对处理长连接请求的线程进行调度,当客户端暂时没有请求发来时,则该处理长连接的线程可以接受别的请求提高了线程的利用率
优化:控制maxclients最大连接数的设置,避免服务器产生太多子进程而发生交换
选择更好的cpu 内存 硬盘
hostnamelookups设置为off 尽量减少dns查询的次数
修改apache最大并发连接数
17.mysql主从原理?如果主库不同步报错了怎么恢复?
原理:
主库:需要开启二进制日志文件,并且对数据库进行授权,允许从库访问,例如主库使用的二进制文件名是Mysql-bin.01,授权的用户密码分别是slave,123.com
从库:需要指定自己的主库是谁,一个从库只能有一个主库,一个主库可以有多个从库,指定主库时需要得信息是master_host主库的主机地址,master_user访问主库时使用的用户,master_log_file同步主库哪个二进制日志文件的操作,master_Log_pos从二进制日志哪个位置的操作开始同步,从库还需要开启中继日志来记录从主库获取的日志信息
当主从部署完成之后,从节点会派生出两个线程分别是I/O线程(用来连接主库并将主库二进制日志获取到的信息写入到中继日志),SQL线程(从中继日志中提取sql语句并执行,实现从节点与主节点的数据同步),主节点会派生DUMP线程,当主库数据更新时,主节点的DUMP线程会通知从节点的I/O线程,I/O线程通过slave用户和密码123.com连接到主节点之后会告诉DUMP线程自己要从二进制日志文件Mysql-bin.01中指定的位置读取数据,获取到数据之后写入到自己的中继日志中,I/O线程任务完成,SQL线程检测到中继日志更新之后会从中继日志中提取SQL语句并执行这些语句完成数据同步
主库不同步的原因有很多:
网络的延迟? 主从两台机器负载不一致? max_allowed_packet设置不一致? 自增键不一致?
最大的问题就是io线程和sql线程不同步
Io线程不同步: 一般是网络问题或授权不正确,确认主从网络联通情况和授权
Sql线程不同步:一般是主从表结构不一致,可以先进主库锁表,再数据备份,把备份文件传到从库,在停止从库的主从状态,从库在导入书数据备份,设置从库同步,重新开启从同步即可。
18.如何备份大数据mysql数据文件,mysql都优化哪些?
xtrabackup热备份, xtrabackup备份时候是热备,不会锁表。
mysql优化: 主要有两个主要方面:安全、性能、参数、架构、sql语句
安全方面:可以把默认端口3306改为其他的,对用户降权,以比普通用户运行mysql即可,开启二进制日志文件,最好在禁止一下root账户远程访问
性能方面:可以给主机选择合理的cpu,内存调大,硬盘,可以对Linux系统内核参数优化,数据库优化的话可以对执行计划,索引,sql改写等等优化
参数优化: innodb的buffer参数调大,连接数调大,缓存的参数优化
架构优化: 主从,读写分离,一主多从,架构调整。
sql语句优化: 协助开发优化,开启慢查询sql,是否没有索引,是否需要借助redis缓存,es等。
19.你在上家公司用的什么监控软件(zabbix)?都监控些什么?怎么增加模板?
zabbix 对系统层监控和应用层监控
系统层:如cpu、内存、硬盘、磁盘i/0、流量、连接数
应用层:进程、mysql主从状态、tomcat性能监控、mysql性能监控
网站状态
zabbix+grafana监控可视化
故障报警,预警,邮件或微信
自动注册,自动安装客户端
20.nagios,cacti维护过吗,平时都监控什么?
系统层监控: 用阿里云对 cpu 、内存、硬盘、带宽、磁盘i./0
应用层监控: 各种进程监控、应用性能监控、mysql主从监控、并发连接监控
21.一台web服务器应该监控哪些指标
网站状态 cpu 内存 磁盘i0 连接数
22.zabbix监控数据库监控哪些参数
主从状态 进程 性能指标比如 查询吞吐量 查询执行性能 连接情况 缓冲池情况,模板导入监控
23.zabbix有哪些监控项
模板自带监控项
自定义监控项
24.监控一台服务器时,你觉得应该监控服务器的哪些资源
系统层: cpu 内存 硬盘 磁盘i/0 连接数
应用层:进程状态、服务性能状态、主从同步状态
对称加密和非对称加密的区别
25.你们监控的时候日志平台会监控吗?
只监控日志监控平台服务器性能监控,并实现预警 ,其他就没有做
26.你们会监控数据库的性能吗,会定标准码?有实际遇到过吗,如何解决?
数据库监控我们采用zabbix进行监控,监控mysql进程、各种配置参数监控、性能、主从监控
27.写shell脚本监控mysql主从的思路
判断io和sql线程是否为yes,
28.写shell脚本监控所有IP是否存活的思路
使用ping命令+for循环,循环ping所有ip的列表,能通的就是在线,不能通的就是离线
29.公司出口带宽?每天网站pv? uv?
带宽:100M
pv:100W
uv:5W
30.你们公司的网站出口带宽是多少?网站访问量是多少?是怎么计算的?
我们对外服务器带宽100M 每天pv 100万 UV大概2万
31.你们公司是什么架构?都有哪些网上业务?详细说一下?
前端使用SLB负载均衡 负载3台应用服务器 缓存层使用redis 数据库层 mysql主从架构
32.你们公司备份策略是什么?数据量多大?备份周期?备份工具?备份方式?是否做数据恢复备份演练?
我们线上服务器数据库采用数据库逻辑备份mysqldump 每天进行全量备份,binlog日志保留7天
我们线上服务器异地也有一套环境就是做灾备用和故障演练用的,xbk备份或逻辑备份,数据量 500G大小。
33.你在工作中是怎么做日志分析的?例如:访问日志、错误日志等
我们公司使用ELK日志分析系统做的,日志进行可视化,服务器日志每周备份一次进行日志切割
34.你们公司日志多久清理一次?
定期删除一个月之前的日志。
35.你们公司运维部门有多少人?多少服务器?基本优化项目?
我们现在就我一个人 ,测试环境和生产环境一起是20台服务器 日常系统内核优化
36.你在上家公司针对防攻击、扩容、容灾等问题是怎么制定和优化解决方案的?
防攻击我们公司使用脚本做的实时探测异常ip多次请求,拉黑机制
扩容制作运维扩充方法,发送邮件通知有关人员知悉,先写文档,在测试环境测试好后,再正式环境再做
容灾我们公司没有做,我们架构基本都是有高可用。
37.你们公司如何自动化代码上线?
我们公司代码上线使用jenkins+mave自动构建编译打包推送到应用服务器
如果是手动方法:我们有制定手动代码上线流程
根据流程上线:如果测试环境测试没有问题时候,使用灰度方法发布上线
38.你们公司都有哪些应用集群?
我们公司集群只有tomcat,redis集群,k8s集群等
39.你们公司用的是物理服务器还是云服务?
阿里云服务器,物理机也有
40.你们公司安全方面怎么我做的?监控体系结构是怎样的?
1).服务器有外网ip 全部去掉,采用内网通信除了对外服务器必须对外,只有nginx对外开放外网ip
2).关闭密码认证登录服务器,采用秘钥认证登录服务器
3).服务器权限不对外开放
4).利用防火墙和阿里云安全组关闭没必要的对外端口
5).jumpserver跳板机使用
6).更改ssh端口
41.如何查看Linux系统当前的状态,cpu内存的使用情况及负载
top free -h uptime
42.写出你所了解的门户网站的服务架构,可用什么方式实现的高可用、负载均衡?
lvs+keepalived
nginx+keepalived
nginx +tomcat nginx负责转发和处理静态资源 tomcat负责动态
43.nginx日志的路径为opt/logs/access.logs,假设日志不能自动分割,写脚本让日志每天能够定时自动分割
cp access.logs /tmp/"%Y%m%d".access.logs
echo > access.log
44.写一个脚本,查找15天前以png结尾的文件并删除
#!/bin/bash
find /picture/.png -type f -mtime +15 -exec rm {} ;
fiind /mnt -type f -mtime +15 -name *.png -exec rm {} ;
45.你们为什么使用redis?
答:面试官好,我们的数据库主要用的是MySQL,目前的业务发展设计到高并发场景下的库存扣减,网站首页访问流量高峰等等,数据库已经支撑不住如此高的并发,于是我们引入了缓存中间件,市面上的中间件redis和memcached我们有在用。我在使用过程中对reids和memcached做了下对比:
1). redis相比memcached来说用拥有更多的数据结构和支持更丰富的数据操作。 所以像我们公司设计复杂的结构和操作,我们选择了redis
2).在内存使用效率上做了下对比,单纯使用key-value 存储的话,memcached的内存利用率更高,但redis采用hash结构来做key-value 存储,由于其组合式的压缩,让内存的利用率高于了memcached
3).在性能上,redis只使用单核,而memcached可以使用多核,所以平均每一个核上的redis在存储小数据时比memcached性能要高。在使用过程中,有时候也设计到100K以上的数据,这个时候,redis的性能就稍逊于memcached
4).在数据持久化支持上,redis提供了两种持久化策略,分别是RDB快照和AOF日志,而memcached 不支持数据持久化操作。所以综合下来我们选择了redis。
46.redis有哪些数据类型
答:关于redis的数据类型,我知道的有这么几个: 字符串string,字典hash,列表list,集合set , 有序集合 SortedSet,因为公司涉及到高并发,所以还接触过Bloom Filter,以及支持全文搜索的RediSearch等。
47.redis是怎么做持久化的?
答:持久化有两种方式RDB和AOF,RDB做镜像全量持久化,AOF做增量持久化。我们公司一般RDB和AOF会配合起来使用。在redis实例重启的时候,会使用RDB持久化文件重构内存,再使用AOF存放近期的操作指令来恢复重启前的状态。当然reids的机制是AOF开启且存在AOF文件时候,优先加载AOF文件。 AOF关闭或者AOF文件不存在的时候,加载RDB文件。
大流量的时候不要开AOF,开RDB即可。
如果服务器突然断电,可以使用AOF恢复,AOF日志有sync属性配置,在高性能场景下使用定时sync,比如1s1次,这样即使断电最多丢失1s的数据。
48.redis集群你们怎么做的?
答:redis集群我接触过的有这么几种,
1).主从模式,一主多从。虽然redis单机的qps可以达到10W+,但是在某些高访问场景下依然不够用,一般通过读写分离来增加slave,减少主机压力。
这种方式需要用户自行开发主从切换功能,也就是使用哨兵去探测每个实例的健康状况,然后通过指令进行集群状态的改变。 当集群规模变大可以加入类似zk的主动通知功能,降低风险。一般可以维护几千个redis节点。
2).主从+哨兵模式, 主从只能做到redis的数据备份,当主故障时候没法进行故障切换,加上哨兵,可以让哨兵监控主从redis,当主宕机后,可以将从redis提升为主,自动实现主从故障切换。
3).redis cluster是社区提供的亲生集群方案,官方当前推荐的方案,主要特点是去中心化,不需要proxy代理。主要的用途是实现数据分片(Data Sharding),同样可以实现HA。
redis cluster 采用了hash槽的概念,集群会预先分配16384个槽,并将这些槽分配给具体的服务节点,通过Key进行CRC16(KEY)%16384 运算得到对应的槽是哪一个,从而将读写操作转发到该槽对应的服务节点。当有新的节点加入或者一处的时候,再来迁移这些槽以及对应的数据。更方便的动态扩容和缩容。
- redis有哪些应用场景
1).存储json类型的对象
2).排行榜,计数器
3).优酷视频的点赞
4).朋友圈点赞
5).会话缓存
redis能支持10万并发等
50.一个字符串类型的值能存储的最大容量是多少?
512M(官网数据)
51.linux日常命令操作
ls ,pwd, chown,find, iftop top, ps, atop sed
52.日常工作服务搭建
nginx, nfs, ftp, apache, nginx动静分离,nginx+keepalived ,lvs+keepalived
mysql主从搭建,mysql主从加mha故障切换,tomcat,zabbix,redis等 docker, k8s等。
53.shell编程常用哪些脚本
自动备份,lnmp一键安装,for循环,case语句,if判断,数据库自动备份脚本,日常日志切割,自动化安装lnmp,安装nginx,redis,tomcat,自动化一键安装,远程部署脚本,自动化发布脚本,批量处理,批量建站,故障探测脚本
54.写出Linux实时查看日志变化的命令?
#tail -f *.log
55.写出Linux输出查找到某一个服务(如Java相关的服务),是否运行的命令
#ps -ef | grep tomcat
56.自动化部署,自动化运维熟悉哪些?
自动化运维工具 熟悉jenkins 、gitlab、salt 、ansible
57.简单列出如何做容灾与恢复,保证数据安全?
容灾我们在异地也部署一套模拟真实环境,数据库每天进行全量备份,推送异地服务器上,以便于恢复使用
可以从三个层面入手:操作系统;应用系统;数据库;比较常用的是:应用系统和数据库层面的安全保障措施
操作系统的设置,防火墙使用
应用系统层次:比如密码设置不能使用明文、登录权限分配、
数据库层面:权限控制
58.公司是什么样的环境,Java的还是PHP
java php 都有
59.做过集群,MySQL主从之类的吗?
我们公司数据库架构
1主2从,开启mha高可用
或者1主2从,用mycat进行读写分离,开启1写2台负责读
60.源码用的是git还是SVN?
代码是git: 文件资料管理:svn
61.你们公司做什么业务,有多少服务器,并发多少,怎么分工的,你负责多少服务器
20台服务器 pv 200万 UV3万
62.工作中部署的mysql主从架构,mysql全备的数据量有多少?
这个没有工作的经验的说几十个G就行,说太大了不好。或者说500G内
63.TCP/IP三次握手和四次挥手原理
三次握手原理:
三次握手的本质是确认通信双方收发数据的能力
首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了我的发件能力和他的收件能力是可以的。
于是他给我回信,我若收到了,我便知我的发件能力和他的收件能力是可以的,并且他的发件能力和我的收件能力是可以。
然而此时他还不知道他的发件能力和我的收件能力到底可不可以,于是我最后回馈一次,他若收到了,他便清楚了他的发件能力和我的收件能力是可以的。这就是三次握手
所以有三次情况:
第一次: 我给他发消息
第二次: 他给我回复确认他收到了
第三次: 我收到确认后再给他回个确认消息,我告知他确认一下我收到了他的邮件
第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SEND状态,等待Server确认。
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查确认收到回复后ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。
四次挥手原理:
所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
64.squid缓存服务器维护过吗?squid缓存代理的里是什么?缓存命中率怎么查看及清空缓存?
squid优化过:cache_mem 缓存占内存大小
Maximum_object_size 最大缓存块
Reply_body_max_size 限定过下载文件大小
Access_log /var/log/squid/access.log 指定一下日志存放文件
squid缓存代理:高性能的web缓存服务器,数据缓存在硬盘,缓存静态数据,接收客户端的请求,并先在本地存储查找有没有客户端请求的数据,如果有,则直接响应给客户端,如果没有,则由squid代理服务器向服务端发送请求,请求的数据为客户端需要的数据,服务端响应代理服务器后,代理服务器将数据缓存到本地后响应给客户端
正向代理:面向客户端,接收客户端发送给服务器的数据,并响应给客户端,可以节省客户端的网络带宽,提高响应速度
反向代理:面向服务端,代理服务节点接收客户端的请求并响应给客户端,可以缓解服务器节点压力,提高服务端的安全性
squid查看缓存命中率: # squidclient -p 3128 mgr:info
squid清空缓存 # squidclient -h 主机名 -p 3128 -m PURGE 域名或url地址
域名或url:即为需要删除的缓存
例如:删除本机上百度的缓存可如下操作:
squidclient -h 192.168.0.1 -p 3128 -m PURGE http://www.baidu.com/
补充:nginx可开启缓存模块做缓存。
65.mysql sleep线程过多如何解决?
1).什么是sleep线程?
sleep线程:长时间保持客户端与服务端的连接状态
导致sleep过多的原因:
1).使用太多持久连接(高并发系统中 不适合使用持久连接)
2).程序中没有及时关闭MySQL连接
3).数据库优化不完善,导致执行sql语句过慢
2).解决方法:
wait_timeout和interactive_timeout的参数应该调整小一点。
1).wait_timeout: 服务器关闭非交互连接之前等待活动的秒数。参数默认值:28800秒(8小时)
2).interactive_timeout: 服务器关闭交互式连接前等待活动的秒数。参数默认值:28800秒(8小时)
想当时就生效利用直接在数据库里设置:
set global wait_timeout = 120 #临时全局生效
set wait_timeout = 120 #临时生效
永久生效:vim /etc/my.cnf 配置文件里进行配置
【mysqld】
interactive_timeout = 120 #设置服务器关闭交互式连接前等待活动的秒数.系统默认是8小时
wait_timeout = 120 #设置服务器关闭非交互连接之前等待活动的秒数.系统默认是8小时
说明:
mysql服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到mysql-server处理完相应的操作后,应该断开连接并释放占用的内存。如果你的mysql-server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到mysql-server的连接上限数,这会报’too many connections’的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,可以进行适当的调整小些。
66.写shell脚本防范ddos攻击的思路
日志获取异常ip 然后使用防火墙拉入黑名单,也能用nginx限制ip的并发连接数,防止ddos攻击
67.你在工作中都遇到过哪些故障?怎么解决的?日常工作中处理频率最多的是哪方面问题?怎么高效解决的?
网站访问慢排查故障:
1).首先要确定是用户端还是服务端的问题。当接到用户反馈访问慢,自己立即访问网站看看,如果自己这边访问快,基本断定是用户端问题,就需要耐心跟客户解释,协助客户解决问题。
2).如果自己访问也慢,那么可以利用浏览器的调试功能,看看加载那一项数据消耗时间过多,是图片加载慢,还是某些数据加载慢。排查静态资源问题还是动态某些数据加载慢问题。
3).针对服务器负载情况。查看服务器硬件(网络、CPU、内存)的消耗情况。如果是购买的云主机,比如阿里云,可以登录阿里云平台提供各方面的监控,比如 CPU、内存、带宽的使用情况。 有无异常进程,有无攻击等。
4).如果发现硬件资源消耗都不高,那么就需要通过查日志,比如看看 MySQL慢查询的日志,看看是不是某条 sql语句查询慢,导致网站访问慢。
怎么去解决:
1).如果是出口带宽问题,那么就申请加大出口带宽。
2).如果慢查询比较多,那么就要开发人员或 DBA 协助进行 SQL 语句的优化。
3).如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等等。然后也可以搭建MySQL 主从和读写分离,一台 MySQL 服务器负责写,其他几台从数据库负责读。
4).申请购买 CDN 服务,加载用户的访问。
5).如果访问还比较慢,那就需要从整体架构上进行优化。做到专角色专用,多台服务器提供同一个服务。
68.tomcat多实例怎么配置?
tomcat多实例:可以不同端口号,多虚拟主机,自定义web应用访问位置 想要多实例 在编译安装一次tomcat就行,只不过和第一个tomcat的路径不同,端口不同
69.请说出这些符号的含义< << >> > 2> 2>> 2>&1 &&
< 或 << #标准输入
, >>, 1> 或 1>> #标准输出
#标准输出追加在后面
#标准输出覆盖添加
2> 或2>> #标准错误输出
2>&1 #将标准错误输出重定向到标准输出
&& #一个表达式不成立的话,后面的表达式不运算,前面执行成功,后面才执行
70.http协议通信原理
1).web浏览器请求DNS服务器把域名www.etiantian.org解析成web服务器的IP地址,此处就是DNS解析过程。
2).web浏览器通过解析后的IP地址及端口号与web服务器之间建立一条TCP连接。
3).建立连接后浏览器向web服务器发送一条HTTP报文请求,web服务器读取浏览器的请求信息,并返回一条HTTP响应.
4).客户端接收服务器返回的信息通过浏览器显示在用户显示屏上,然后客户机与服务器断开http连接,断开TCP连接。
71.你们的数据量多大,平时怎么备份的
现在500G 还是逻辑备份 准备使用 xbk备份,节约备份时间。
72.日志分析怎么做的,都关注哪些参数
答:efk搜集:nginx,tomcat,redis,docker等日志。
73.MySQL你都负责维护哪些内容
1).权限管理
2).mysql慢日常抓取协助开发分析
3).mysql优化
74.shell熟悉吗,写过哪些shell脚本
答:mysql备份脚本、tomcat故障自愈脚本、nginx日志切割脚本、自动化安装环境脚本、自动发布项目脚本、批量建站脚本、远程部署服务、一键安装
75.docker在公司的应用是啥
跑java 应用
76.在工作中遇到过什么棘手的问题,怎么解决的,学到了啥
tomcat 内存溢出
临时解决:写脚本实时探测如果发现内存快要溢出时候就重启tomcat
永久解决:分析原因,通过监控和分析日志,找到到底什么问题造成,我们当时经过分析是
有几个原因1).系统内核需要优化 2). tomcat需要优化 3). 2台tomcat处理不过来 4).开发代码也有问题,最好借助消息队列使用MQ
77.你最熟悉的项目是哪个,什么时间做的,做了多久,几个人,你主要在项目当中负责啥
gitlab+jenkins自动发布项目 我一个人慢慢改进 脚本改进的
78.有没有做过数据库升级,怎么做的
先测试环境升级,并写升级文档,
正式环境,做好系统快照和备份 然后根据写的升级文档升级,
docker运行的mysql升级到高版本,先备份数据目录,再换成高版本镜像重新运行
79.mysql用的哪个版本,nginx哪个版本
答:mysql 5.7.29 nginx 1.16.1
80.如果网站出现500错误,你的解决思路是?
网站报500错误一般数据库出现问题
检查下为啥连接不上数据库,端口不通还是账号和密码问题,防火墙问题,数据库慢查询是否太多,有无锁表,数据库是否挂了
81.读写分离用的什么工具,原理是啥
mycat
原理:MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端
82.mysql主从原理是啥
答:mysql主从同步就是异步复制过程,主库开启i/0线程,从库开启i/0线程和sql线程
主库,增、删、改 生成二进制日志
从库i/0线程去请求主库binlog日志,并把主库binLog日志复制到从库,然后写到中继日志里面,SQL线程会读取relay log文件中的日志,进行sql语句回放操作,来实现主从的操作一致,而最终数据一致。
83.DNS原理是啥
访问网站过程(以访问百度为例)
答案:假定想访问www.baidu.com。下面是的几个查询步骤:
主机先查询本地DNS缓存及hosts文件是否有域名对应IP地址,如果有,就先调用这个IP地址映射,完成域名解析。
如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性;如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
如果本地DNS服务器本地区域文件与缓存解析都失效,也就是如果没有结果,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责.com域名解析的顶级域名服务器的一个IP。
这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个负责.baidu.com域名解析的权限DNS服务器地址给本地DNS服务器
本地域名服务器然后向权限域名服务器dns.baidu.com进行查询。权限域名服务器dns.baidu.com告诉本地域名服务器所查询的域名的IP地址。本地域名服务器最后把查询结果告诉本地主机。完成访问过程
84.当前数据库服务处理速度慢,你认为可能是什么原因导致的,并阐述一下对应的解决办法
1).硬件配置低 、网络带宽窄、
2).网络架构不合理 (数据包的进出有瓶颈,是否有读写分离,是不是读写都在一台扛不住,是不是一主两从)
3).程序代码有问题 (开起慢查询日志查看)
4).是否有缓存redis了
服务软件版本低 show variables; show status;
软件优化:打开最大文件数…,是不是参数连接数需要调大,keybuffer参数是否合理,存储引擎是否合适(myisam或innodb)。
key_buffer_size 指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页,就开始变慢了。
参考:对于内存在4GB左右的服务器该参数可设置为384M或512M
85.说一下你知道的存储引擎,建表时如何决定表使用存储引擎
innodb myisam
区别:
1、InnoDB支持事务,MyISAM不支持;
2、InnoDB支持外键,而MyISAM不支持;
3、InnoDB支持表、行级锁,而MyISAM支持表级锁;
3、InnoDB是聚集索引,而MyISAM是非聚集索引;
4、Innodb不支持全文索引,而MyISAM支持全文索引;
5、InnoDB表必须有唯一索引,而Myisam可以没有;
7、存储文件不同。
86.单张表过大有什么缺点,如何解决
缺点:查询会很慢
对表进行分区、分表、分库
实在太大了 只能上大数据库 hoodoop家族、hbase
87.给你50台服务器,阐述一下你的拓扑结构如何设计
前端使用2台nginx+keepalived(主备方式)做反向代理
基础服务:内部dns服务器2台主备,做内网域名解析
中间:使用20台服务器做后台应用服务器
中间件: redis集群6台
kafka集群:6台
db层 :3台mycat 3台数据库(一主两从)+2台mha服务器做高可用切换
图片存储服务器2台:nfs+rsync
数据库备份服务器:2台,供存储数据库备份文件,防止数据库故障后数据丢失
日志收集系统:elk 3台
监控1台
代码仓库1台
Cicd(jenkins部署) 1台
88.如果你是数据库管理员,阐述一下你如何给服务器添加授权用户
用户设置ip授权 和 读取权限,不同账号对不同库有不同的权限,做到账号权限分离
89.若你是数据库管理员,阐述一下你如何对数据做备份
数据量小时候使用逻辑备份(mysqldump全量备份和binlog增量备份),数据库大时候使用xbk,比较快,不会锁表
90.目前常见的数据库软件有哪些,搭建数据库集群的时候,你如何选择使用哪种软件
mgr集群或者mha
91.配置mysql主从同步前,如何保证主库与从库的数据一致
1).从库配置高于主库,因为从库压力可能比较大,而且还得及时将主库的数据同步过来。
2).开启多线程复制,提高复制效率
3).或者架构调整,增加从库或使用MGR集群模式使用组复制或使用galera集群
92如何获知一台主机上的网站服务是否在运行
#ps -ef | grep 进程 或 #netstat -anput |grep 端口
93.如何让系统的普通用户拥有root权限,什么情况下需要这么做
visudo 里面授权
#www ALL=(ALL) ALL
www ALL= (root) NOPASSWD: /sbin/mount, (root) NOPASSWD: /bin/umount, (root) NOPASSWD: /bin/touch, (root) NOPASSWD: /bin/rm, (root) NOPASSWD: /usr/bin/make, (root) NOPASSWD: /bin/ln, (root) NOPASSWD: /bin/sh, (root) NOPASSWD: /bin/mv, (root) NOPASSWD: /bin/chown, (root) NOPASSWD: /bin/chgrp, (root) NOPASSWD: /bin/cp, (root)
94.杀死进程的命令有哪些?
#kill -9 进程号或名
95.ELK分别表示什么?
E:搜索分析引擎,es
L:数据收集管道,收集日志用的,logstash
K:可视化组件,kibana
96.elasticsearch的特点是什么
一种分布式,基于json的数据搜索引擎,具有水平扩展、高可用、易维护
97.kibana的特点和作用是什么
用户通过kibana查看索引在es的数据,并过web页面展示
98.logstash的特点和作用是什么
日志收集组件
99.ELK能做什么?
日志收集
100.ELK在你使用的过程中主要用来做什么?
日志收集然后通过kibana实时展示日志情况
101.elasticsearch中的分片是什么?
Elasticsearch中的"分片"(Shard)是数据存储和数据搜索的基本单元。它们是用来水平分割数据的,以便在多个节点上分布数据和负载。分片在Elasticsearch中起到了关键的作用,使得Elasticsearch能够处理大量数据并提供高可用性。简单来讲就是咱们在es中所有数据的文件块,也是数据的最小单元块,整个es集群的核心就是对所有分片的
分布、索引、负载、路由、搜索等达到惊人的速度
102.es的bulk一次最大的处理数据量是多少
bulk api作用:可以在单个请求中一次执行多个索引或者删除操作,使用这种方式可以极大的提升索引性能。
bulk会把将要处理的数据载入内存中,所以数据量是有限制的,最佳的数据量不是一个确定的数值,它取决于你的硬件(内存、资源、网络等),你的文档大小以及搜索的复杂性,你的索引以及搜索的负载。一般建议是1000-5000个文档
103.es的优化
1).硬件和基础设施优化:
确保服务器硬件足够强大,包括CPU、内存和磁盘速度。
现代服务器上,磁盘往往是系统的最大瓶颈,使用SSD硬盘,以提高读写速度,SSD相对机械磁盘具有超高的读写速度和稳定性。
确保网络带宽足够,以减少节点之间的数据传输延迟。
2).分片策略:
选择合适的主分片和复制分片数量,以平衡性能和可用性。
考虑数据量和查询负载来确定分片策略。
避免创建过多的分片,因为它们会导致过度的资源消耗。
3).索引设计:
使用合适的分析器来处理文本数据,以确保有效的全文搜索。
使用合适的字段数据类型来节省存储空间。
4).分配足够的堆内存给Elasticsearch进程,以确保足够的缓存和操作内存:
监控内存使用情况,避免内存泄漏问题。
5).使用监控工具(如Elasticsearch的监控插件或Prometheus)来监控集群性能:
定期查看日志以识别潜在的问题和错误。
6).定期升级Elasticsearch版本,以获得性能改进和安全性修复。
104.nginx优化怎么做的
1).隐藏版本信息
2).使用epoll模型,效率会提高
3).配置提高进程数、打开连接数
4).启用gzip压缩传输
5).为静态文件启用缓存
6).timeouts设置,长连接设置
6).防盗链设置,设置非法域名不能访问
7).防爬虫设置
8).防止ddoc攻击
9).日志切割
105.用ansible playbook编写过什么哪些
1).使用playbook部署源码nginx、二进制的tomcat、rpm包的httpd等服务
2).批量初始化centos系统配置
106.python你用过哪些模块
os模块 #用作系统bai级别的工作
sys模块 #提供解释器相关操作
hashlib模块 #用于加密相关的操作
json和pickle模块 #用于序列化数据
shuit模块 #文件的复制移动
logging模块 #格式化记录日志
random模块 #用于取随机数
time datetime #模块时间模块
re模块 #正则匹配
107.用docker部署过哪些项目
部署我们公司java项目,把单独服务封装成容器 使用docker-compose统一管理
108.docker常用的基础命令写15个
docker ps
docker ps -aq
docker pull
docker push
docker rmi
docker stop id
docker run -d -p --name mynginx nginx
docker -exec -it id /bin/bash
docker log id
docker images
docekr rm id
docker run -it id /bin/bash
109.docker的网络模式有哪些?
host模式 container模式 就是容器模式
none模式 bridge模式 就是桥接模式
110.docker跟虚拟机有什么区别
虚拟机是:在物理机模拟整台机器包含硬件,每台虚拟机就是自己的操作系统,虚拟机一旦开启,预分配的资源全部占用.
docker是:容器,和我们宿主机共享硬件和操作系统实现资源动态分配,容器包含所有的依赖包都与其他容器共享内核
111.传统的上线流程是怎样的?
1).使用shell脚本自动化发布到测试环境,测试人员测试没问题
2).使用shell脚本自动发布推送正式环境
现在代码上线:gitlab+Jenkins+ansible
112.redis持久化你们用的哪种方式, 两种方式有什么区别
RDB和AOF 都开启了 (RDB内存快照和AOF实时快照,方便快速恢复)
RDB 1分钟之后 1000个key就发生变化就内存快照
RDB 5分钟之后 10个key发生变化就内存快照
RDB 15分钟之后 1个key发生变化就内存快照
每次数据修改都会写入AOF文件
区别:
RDB是快照方式存储,每隔一段时间会定期做一个快照进行持久化存储到硬盘
AOF类似mysql的binlog日志,将写入的命令持久化到硬盘的AOF的日志文件中,进行的持久化存储。
113.redis集群你用的哪种方式,几台服务器
方式就是:cluster集群模式,6台做的 使用redis自带组件命令 做的3主3从
114.keepalived是基于什么协议做的
VRRP协议
VRRP 是一种网络协议,用于实现在多个路由器之间共享虚拟IP地址的高可用性。.keepalived 使用 VRRP 协议来协调多个服务器上的虚拟IP地址的分配和故障切换。
115.错误码301和302有什么区别
301:永久重定向, 被请求的资源已永久移动到新位置
302:临时重定向, 请求的资源现在临时从不同的URI响应请求
仅仅对搜索引擎有影响,使用永久重定向,搜索引擎就会以为之前的地址废弃了,将相关信息永久带入到新的地址,但对用户无任何影响。
116.错误码502是什么情况,有什么解决方案
502 一般就是后端问题
1).后端项目挂了,重启后端服务
2).大并发业务量后端处理不过来导致502
3).如果php项目一般就是php-cgi进程不够用、执行时间太长、进程挂了
117.MySQL主从原理是什么?
主库开启i/0线程
从库生成2个线程,一个i/0线程,一个SQL线程
主从同步就是异步复制过程,主库曾、删、改时候生成二进制日志
从库i/0线程去请求主库binLog日志,并把binlog日志写到relaylog中继日志
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog
SQL线程会读取relay log文件中的日志并解析成重做操作,将sql语句写入从库来实现主从的操作一致,而最终数据一致
118.MySQL数据备份怎么实现的
之前逻辑备份, 后面采用xbk备份
119.备份的数据量有多大
500G
120.gitlab更新到什么版本了
12.3
121.centos系统调优怎么做的
CentOS系统调优涉及多个方面,包括硬件、内核参数、服务配置和性能监控。以下是一些通用的CentOS系统调优步骤:
1).更新系统和内核:
确保你的CentOS系统已安装最新的安全补丁和内核版本,使用以下命令来更新系统: # yum update
2).关闭不必要的服务:
禁用或停止不需要的系统服务,以减少资源占用。可以使用systemctl命令来管理服务。
systemctl disable <service_name>
systemctl stop <service_name>
3).内存优化:
监控内存使用情况,确保系统没有内存泄漏或过度使用内存的进程。
考虑调整Linux内核参数,如vm.swappiness,以优化内存管理。
4).磁盘性能:
使用iostat等工具监控磁盘性能,查找瓶颈。
考虑使用RAID配置来提高数据冗余和性能。
5).文件系统优化和文件句柄数设置调大:
使用适当的文件系统(如XFS用于大容量存储,EXT4用于一般用途)。
考虑启用文件系统特性,如ext4的日志选项和XFS的延迟日志。
文件句柄数,默认:1024,调整为65535
6).网络性能:
优化网络参数,如TCP窗口大小和最大连接数。
使用FirewallD或iptables来配置防火墙规则,确保网络安全。
考虑使用网络负载均衡器来提高可用性和性能。
7).安全性:
定期更新系统上的所有软件和应用程序,以修复已知的安全漏洞。
启用SELinux或AppArmor来增强系统安全性。
确保只有授权的用户能够访问系统。
8).监控和日志:
使用监控工具如Nagios、Prometheus、Zabbix等来监视系统性能。
配置和定期审查系统日志,以及时识别和解决问题。
9).资源限制:
使用ulimit和cgroups等工具来限制单个用户或进程的资源使用,以防止资源耗尽问题。
10).备份和恢复:
定期创建系统备份,以便在灾难恢复时恢复数据。
测试恢复过程,确保备份是可用的。
11).优化应用程序:
优化你的应用程序代码和配置,以减少资源消耗和提高性能。
122.DNS轮询的作用?
就是一个域名添加多个A记录解析,这样就完成了 简单的说就是负载均衡
DNS轮询(DNS Round Robin)是一种DNS负载均衡技术,它用于分发网络流量到多个服务器或主机,以实现高可用性和分布式服务。DNS轮询的作用包括以下几个方面:
1).负载均衡:DNS轮询可以将请求均匀地分发到多个服务器上。这有助于分摊服务器的负载,防止某一台服务器过度负载,从而提高系统的性能和可用性。
2).高可用性:通过将多个服务器的IP地址列入DNS记录中,如果其中一台服务器不可用,DNS服务器会继续将流量分发给其他可用的服务器,从而提高服务的可用性和容错能力。
3).故障恢复:当某个服务器出现故障时,管理员可以通过将其从DNS记录中删除或暂时禁用,以确保流量不再路由到受影响的服务器。一旦问题得到解决,可以重新将服务器添加到DNS记录中。
123.递归查询和迭代查询分别是什么意思?
递归查询: 递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
迭代查询: DNS 服务器会向客户机提供其他能够解析查询请求的DNS服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果为止。
124.在当前目录及子目录中,查找大写字母开头的文件
ls | grep ‘1’
125.搜索最近七天内被访问过的所有文件
#find /tmp -type f -mtime -7
126.搜索超过七天被访问的文件
#find /tmp -type f -mtime +7
127.nginx与apache比有什么优点
nginx适合处理静态请求,动态请求很弱
nginx轻量级,占用资源少
nginx处理请求异步非阻塞,apache阻塞型
nginx并发很强 apache 弱点
nginx做动静分离,apache不行
128.nginx是如何处理请求的
nginx首先选定由哪一个虚拟主机来处理请求。让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始,找到相应的server,匹配location,匹配到相应的进行处理。
129.nginx的正向代理和反向代理分别表示什么意思
反向代理: 代理服务器,可以理解为服务器在对应地区开的代理点,方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器。
正向代理:代理客户端,去访问服务器,也可以理解为现在流行的海外代购,那些海外代购的人就是帮我们的正向代理
130.nginx 查看配置文件是否正确怎么查看
#nginx -t
131.nginx重新加载配置文件的命令
nginx -s reload
132.fastcgi和cgi有什么区别
cgi: web服务器接受到请求,然后根据内容,fork一个新进程,这个进程会把处理完的数据返回给web服务器
fastcgi: web服务器收到一个请求时,他不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退出),web服务器直接把内容传递给这个进程,这个进程收到请求后进行处理,把结果返回给web服务器,最后自己接着等待下一个请求的到来,而不是退出。
133.nginx负载均衡的算法有哪些?
轮询、权重、Iphash
134.nginx使用中,session不同步怎么办?
使用iphash均衡或使用redis使用会话保持。
135.nginx如何实现防盗链
根据refer阻挡来源非法的域名请求
136.为什么要做动静分离?apache能做动静分离吗?nginx怎么做动静分离?
为什么做动静分离?
nginx处理静态资源比较强悍,但是动态处理能力不足
tomcat/php 处理动态请求,这样效率提高和性能提高。如果让tomcat/php既处理静态,又处理动态,会扛不住。
apache能做动静分离吗?
apache不能做动静分离
nginx怎么做动静分离?
动静分离的原理很简单,通过location对请求url进行匹配即可,在/Users/Hao/Desktop/Test(任意目录)下创建 /static/imgs 配置如下:
nginx动静分离时候nginx.conf的配置如下:
###静态资源访问
server {
listen 80;
server_name static.haoworld.com;
location /static/imgs {
root /Users/Hao/Desktop/Test;
index index.html index.htm;
}
}
###动态资源访问
server {
listen 80;
server_name www.haoworld.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
137.mysql慢查询怎么设置
my.conf 配置里面开启slow慢查询日志
138.简述MySQL 的常见两种引擎的区别
myisam:
myisam 读操作多于写操作 并且不需要事务 就胜于innod引擎
myisam不提供事务的支持,也不支持行级锁和外键,只能进行表锁
innodb:
Innodb 支持事务、提供行级锁、数据更新频繁场景
139.mysql主从一致性校验是怎么做的(重要)
MySQL主从一致性校验是一种确保主数据库(Master)和从数据库(Slave)之间数据一致性的重要机制。一致性校验通常通过以下方式来实现:
1).复制协议和机制:MySQL使用复制协议(如二进制日志复制)将主数据库的更改传播到从数据库。在主数据库上执行的每个事务都会记录在二进制日志中,并且从数据库会定期拉取并应用这些更改。主从数据库之间的一致性校验依赖于这个复制机制的正确性和可靠性。
2).同步复制和异步复制:MySQL复制可以配置为同步或异步模式。在同步复制中,主数据库在提交事务之前要等待所有从数据库都确认已经接收到并应用了相同的更改。这可以确保主从数据库之间的数据一致性,但可能会对性能产生一定的影响。在异步复制中,主数据库提交事务后立即返回,而从数据库会尽快异步地应用更改。在这种情况下,主从数据库之间可能存在短暂的不一致性,但通常会在很短的时间内解决。
3).监控和报警系统:为了确保主从数据库之间的一致性,可以使用监控和报警系统来实时监测数据库的状态。这些系统可以检测到复制延迟、复制错误、主数据库故障等问题,并发送警报通知管理员。
4).校验工具:MySQL提供了一些工具和命令,用于检查主从数据库之间的一致性。其中包括SHOW SLAVE STATUS命令,它可以用于查看从数据库的复制状态信息,包括复制延迟和错误。此外,还有一些第三方工具可以帮助进行数据校验和一致性检查。
5).第三方pt工具校验:
使用pt工具来监测MySQL主从数据一致性:
pt-table-checksum: 它在主数据库上创建一个特殊的表用于存储校验和数据,然后在主从数据库上执行相同的查询以比较数据。这个命令将在主从数据库上执行相同的查询来比较数据,然后报告任何不一致之处。
pt-table-sync: 如果 pt-table-checksum 发现了不一致,使用 pt-table-sync 来修复主从不一致的数据。这个命令将尝试修复从数据库上的不一致数据,使其与主数据库保持一致。
6).数据校验和验证:在某些情况下,可以编写自定义脚本或应用程序来定期校验主从数据库之间的数据一致性。这可以包括比较表的数据、校验索引、计算数据哈希值等操作,以确保数据没有丢失或损坏。
140.truncate delete drop 的区别
delete truncate 删除数据
drop 删除表
delete 一行一行的执行删除 慢点 好处可以回滚
truncate能够快速清空一个表。并且重置auto_increment的值,无法找回
141.你们公司的redis架构
redis 主从、主从+哨兵机制或redis集群
142.shell脚本中$?的用途是做什么
答:上一步执行情况,如果为0表示成功执行成功,如果非0表示执行失败
143.mysql不同步的处理方法
看下什么线程变为no,大概可以判断主库和从库问题,观察报错信息分别去解决
如果io线程为no,一般是网络或授权问题,需要查看网络状态或者重新授权
如果sql线程为no,一般是表结构不一致,需要重新备份恢复后,重新做主从,如果允许数据差异,可以配置参数,跳过一些数据同步,使得某些数据不一致,保证后面新的数据一致即可。
144.如何修改Linux的最大文件句柄的限制
#ulimit -n 1000 临时修改
也可修改配置文件,永久修改。
/etc/security/limits.conf
-
hard nofile 65535
-
soft nofile 65535
145.如何验证批量主机的在线情况?
使用for循环批量ping是否存活
146.说说你在工作中最自豪的一件事情
就是我们项目一直出现内存溢出折腾半个月才彻底解决
当时一直排查不出问题,就临时解决,写脚本故障自愈,如内存快要溢出时候就重启tomcat、进程挂了、访问状态不是200状态累计3次也重启
彻底解决:
不懂优化系统内核和jvm 不断抓取dump堆包 让开发分析,负载均衡加加点 都没有解决
最终互相扯皮还是被java 开发老大解决了 ,原因就是代码写的有问题导致内存很容易溢出,应用程序处理完任务之后,不再需要内存时未能及时释放该内存,导致内存资源不断累积。如果内存泄漏发生在循环中,内存使用会不断增加,最终导致内存耗尽。
147.说下你在工作中遇到的三个最棘手的事情
a).mysql主从同步延时问题
如何解决:
解决这个问题首先要知道什么原因导致的,
是主库原因还是从库原因 不断分析
是主库:有的没有开启ddll快速执行
从库是否:负载太高、配置不行、参数是否优化、sql语句
b).tomcat 内存溢出:开发问题优化代码,开发优化不了 一般就是写故障自愈脚本和增加节点
c).服务器被攻击:使用nginx 限制单ip并发请求和写脚本抓取异常ip拉黑
148.你们的服务器在什么地方?
阿里云 也有测试的机房
149.阿里云用过哪些产品
SLB CDN RDS OSS ECS
150.SLB是基于几层的负载均衡
4层
151.为什么要做日志切割
日志太大,不方便管理 不方便分析日志,每天设置了定时任务,凌晨0点做日志切割
152.nginx有几种工作模式,都是哪几种
有两种:master-worker模式、单进程模式两种模式
master-worker模式:有一个master进程和至少一个的worker进程,
单进程模式: 顾名思义只有一个进程。
他们各自有自己的特点:
master-worker模式下: nginx启动成功后,会有一个master进程和至少一个的worker进程,worker进程数量建议等于cpu总核心数。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式。
单进程模式下: nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。
153.tomcat的版本用的啥
tomcat 8.5
154.redis在你们公司用来缓存什么数据
热点数据 比如用户在线率 访问频繁的数据等等
155.公司产品是什么,注册数有多少
小说阅读系统、用户100万,电子印章系统,用户10万,医疗系统,用户50万
156.你平时都有学习什么新的技术
docker k8s helm管理k8s容器集群 elk日志系统 jenkins+cicd Prometheus监控 ceph glusterfs分布式存储 等
157.你们公司的存储用的什么
nfs、或大的分布式存储ceph/glusterfs
158.nginx日志切割怎么做的
使用shell做日志切割+crontab定时任务
159.nginx做了哪些优化
隐藏nginx版本信息
线程数增大
使用epoll模型异步非阻塞
压缩传输设置
缓存设置
增加连接超时时间设置
非法域名访问,防盗链设置
防爬虫配置
优雅页面展示
防止DDOC攻击,日志分析异常访问的ip,调用防火墙封掉
Nging日志切割
160.刚装好的系统做了哪些优化
一般都有系统初始化脚本
如常优化的项目 系统内核优化 、升级系统内核、安装常见插件、关闭不必要的服务、增大文件句柄数、做时间同步等
161.数据库查询很慢排查
开启慢查询日志分析sql语句,抓取慢的语句进行分析。是不是没有索引。或者查看有没有缓存,缓存是不是生效。
162.mysql数据被误删除后,你尝试过使用哪些方法或者手段来挽回数据
实现全量+增量恢复(binlog日志转换成sql进行恢复)
163.一主多从的环境,从库宕机,请问你如何恢复?
先修复启动,看是否可以主从同步,如果不能同步,使用xbk全量备份,主库恢复到从库,重新做下同步,然后开启主从同步
164.mysql集群和高可用方案有哪些,你在公司用过哪些方案?
MHA高可用
165.日常巡检都做什么?
系统层巡检:看下每个服务器负载情况
应用层巡检:日志情况
使用监控系统巡检: zabbix、Prometheus
166.raid10 raid5 raid1 区别是啥,有什么优势
raid0就是把多个硬盘合并成1个逻辑盘使用,读写速度快,但没冗余,至少1块磁盘
raid1就是同时对2个硬盘读写,强调数据的安全性,读写速度慢,但有冗余,只能2块磁盘
raid5也是把多个硬盘合并成1个逻辑盘使用,坏一个没问题,性能在0和1之间,至少3块磁盘,第3块磁盘可校验
raid10就是将raid0和raid1组合起来,同时拥有raid0和raid1的功能,速度快并且有冗余,成本高,至少4块
167.请简述软连接和硬链接的区别
软链接类似于windows中的快捷方式,软链删了,源文件不受影响
硬链接和原来的文件没有什么区别,硬连接删了,源文件还有的,也是不受影响的
默认不带参数情况下,ln命令创建的是硬链接,带-s参数创建的是软链接。
区别如下:
硬链接文件与源文件的inode节点号相同,而软链接文件的inode节点号与源文件不同。
不能对目录创建硬链接,但可以创建软链接。
软链接可以跨文件系统,硬链接不可以跨文件系统。
168.inode 和 block是什么东西,请简述解释
创建一个文件后,会同时创建一个inode和一个block,inode存放的是文件的属性信息,但是不包括文件名,并存放所对应数据所在的block块的地址的指针;block存放文件的数据,每个block最多存放一个文件,而当一个block存放不下的情况下,会占用下一个block。
169.sed 命令的 -n -r 参数均表示什么意思
-n 只打印
-r 正则
170.如果采购了一块硬盘,需要做哪些处理,才能正常使用磁盘
分区 格式化 挂载
171.运维人员的标准工作流程
答: 操作前检查,操作前备份,进行操作过程,操作后确认,操作文档编写
- 301 和302跳转的区别
301:永久重定向,被请求的资源已永久移动到新位置
302 :临时重定向,请求的资源现在临时从不同的URI响应请求
173.上一家公司是做什么的?
医疗系统, 电子印章系统
174.数据库增长量是多少
10M或50M
175.上家公司你主要负责哪些工作和职责
部署实施系统
负责平台稳定运行,架构调整和优化
日常工作脚本编写 监控实施做到监控可视化和故障预警
日常代码上线,日常故障处理
176.你处理过印象最深刻的故障是什么
tomcat 内存溢出
mysql主从延时
网站很卡,cpu占用较高,最终通过慢查询,查到sql语句,和开发配合加索引后解决
app异常
网站攻击故障优化
177.你最擅长的技术是什么
Docker k8s helm elk Prometheus监控 mysql优化和mha高可用 高并发架构设计和实施 等等
178.如何查看当前的Linux服务器的运行级别?
答: ‘who -r’ 和 ‘runlevel’ 命令可以用来查看当前的Linux服务器的运行级别。
[root@localhost ~]# who -r
run-level 5 2023-10-07 00:03
[root@localhost ~]# runlevel
N 5
179.如何查看Linux的默认网关?
答: 用 “route -n” 和 “netstat -nr” 命令,我们可以查看默认网关。
除了默认的网关信息,这两个命令还可以显示当前的路由表。
[root@localhost ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.171.2 0.0.0.0 UG 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.171.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
[root@localhost ~]# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.171.2 0.0.0.0 UG 0 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.171.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
180.如何识别Linux系统中指定文件( 如:/etc/fstab)的关联包?
答: # rpm -qf /etc/fstab
以上命令能列出提供"/etc/fstab"这个文件的包。
[root@localhost ~]# rpm -qf /etc/fstab
setup-2.8.71-11.el7.noarch
[root@localhost ~]# rpm -qf /usr/bin
filesystem-3.2-25.el7.x86_64
[root@localhost ~]# rpm -qf /usr/bin/wget
wget-1.14-18.el7_6.1.x86_64
181.Linux系统中的/proc文件系统有什么用?
答: /proc文件系统是一个基于内存的文件系统,其维护着关于当前正在运行的内核状态信息,其中包括CPU、内存、分区划分、I/O地址、直接内存访问通道和正在运行的进程。这个文件系统所代表的并不是各种实际存储信息的文件,它们指向的是内存里的信息。/proc文件系统是由系统自动维护的。
182.如何在/usr目录下找出大小超过10MB的文件?
答: #find /usr -size +10M
183.如何在/home目录下找出120天之前被修改过的文件?
答: #find /home -mtime +120
184.如何在/var目录下找出90天之内未被访问过的文件?
答:#find /var ! -atime -90
185.在整个目录树下查找文件"core",如发现则无需提示直接删除它们。
答: #find / -name core -exec rm {} ;
186.linux中的at命令有什么用?
答: at命令用来安排一个程序在未来的做一次一次性执行。
所有提交的任务都被放在 /var/spool/at目录下并且到了执行时间的时候通过atd守护进程来执行。
187.固态硬盘和传统硬盘有什么区别,并说明它们的优点和缺点。
答:固态的优点:抗震性强,机械故障点小。噪声小。发热量小,体积小。读写速度快。
固态的缺点:容量小,价格贵。数据恢复能力差。
188.多核CPU和单核CPU的优点和缺点,是否所有程序在多核CPU上运行速度都快?为什么?
答:不是。
不是所有程序都会在多核CPU上表现得更快。程序的性能在多核CPU上是否能够得到提升取决于程序本身的性质以及如何编写和优化程序和硬件资源。
1).并行性方面:如果程序可以分解成多个独立的任务或线程,并且这些任务可以在多个核心上并行执行,那么在多核CPU上可能会表现得更快。这种情况下,程序可以充分利用多核心的计算能力。
2).线程和进程管理: 程序必须正确地管理线程和进程,以确保它们能够有效地在多核心上运行。如果线程之间存在竞争条件或者需要协调和同步,那么多核CPU上的性能可能不会有很大提升。
3).硬件限制方面:多核CPU的性能提升受到硬件限制的制约。如果程序的性能瓶颈不是在CPU方面,而是在内存、存储或其他硬件组件上,那么多核CPU可能无法显著提高性能
4).单线程性能方面: 某些程序可能是单线程性能密集型的,这意味着它们依赖于单个核心的高性能,而不是多核心的并行性。在这种情况下,多核CPU并不会明显提高程序的性能。
189.有一web服务器,某天某用户投诉上某个网站速度很慢, 你如何查找原因。
答:
1).首先检测服务器状态,排除硬件故障和系统故障 排除机器故障
2).检查底层网络状态(包括互联情况,PING包延迟、流量情况)排除网络故障和网卡等设备故障。
3).检查web服务器软件运行情况(并发连接、服务软件配置情况、数据库连接情况等)排除应用服务故障。
4).检查服务器资源使用情况,是否资源吃紧导致的的,确保系统资源方面故障。
5).根据需要检查是否使用了cdn,以及cdn加速是否正常。
6).检查数据库机器资源负载情况,以及相关慢日志,查询慢sql语句,是否需要增加索引等
190.删除/tmp/下除passwd以外的其他文件
find /tmp/* -not -name passwd |xargs rm -rf *
191.请打印/etc/passwd文件中的第2-5行(不低于三种方法)
awk ‘NR2,NR5 {print }’ /etc/passwd
sed -n ‘2,+3p’ /etc/passwd
sed -n ‘2,5p’ /etc/passwd
192.把/data目录及其子目录下所有以扩展名.txt结尾的文件中包含old的字符串全部替换为new
find /data -name *.txt |xargs sed -i ‘s#old#new#g’
193.查找/var/log/下所有7天以前以log结尾的大于1M的文件移动/tmp下
find /var/log/ -type f -name “*.log” -size +1M -mtime +7 -exec mv {} /tmp ;
194什么是linux的运行级别,请描述linux的运行级别不同数字的含义?
0 关机
1 单用户模式
2 多用户,但是没有NFS,没有网络
3 多用户命令行模式
4 预留
5 图形界面
6 重启
195.请描述buffer和cache的区别?
buffer 数据写入到内存的空间,叫做缓冲区
cache 数据从内存读取的空间,叫做缓存区
196.nginx配合php工作的FastCGI工作原理
nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如:端口或者文件socket。当nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给nginx,最后,nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。
197.keepalived高可用服务工作原理
keepalived高可用对之间是通过VRRP协议通信的,VRRP协议是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会获得所有的资源,备节点处于等待状态,当主挂了时候,备节点接管主节点的资源,然后顶替主节点对外提供服务。
VRRP协议是通过IP多播包的方式发送的。在keepalived之间,只有作为主的服务器会一直发送VRRP广播包,告诉备他还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度可以小于1秒。
198.CDN工作原理
内容分发网络(也叫CDN)是一种用于提高网站和应用性能的技术,它通过将内容分发到全球各地的服务器上,以减少用户访问网站时的延迟和提高可用性。
以下是CDN的工作原理:cdn有一下作用,根据下面作用进行工作
1).内容复制:CDN提供商会将您的网站或应用的静态资源(如图片、视频、CSS和JavaScript文件)复制到位于全球各地的服务器上,这些服务器通常称为边缘节点或缓存节点。
2).DNS解析:当用户访问您的网站或应用时,他们的浏览器首先会发送一个DNS请求来解析您的域名(如www.example.com)。这个DNS请求会被CDN的全局负载均衡器接收。
3).负载均衡: CDN的全局负载均衡器会根据用户的位置和其他因素选择最近或最优的边缘节点来提供服务。这个选择通常基于一些算法,例如基于地理位置的负载均衡或最少连接数。
4).内容缓存: 一旦CDN选择了一个边缘节点,该节点会检查是否已经缓存了用户所请求的内容。如果有,它将立即返回缓存的内容,从而减少了请求的延迟时间。如果没有缓存或缓存已经过期,边缘节点将从原始服务器请求内容。
5).内容传输: 如果边缘节点需要从原始服务器获取内容,它会建立与原始服务器的连接,并将内容传输到自己的缓存中。一旦内容被缓存,边缘节点将返回内容给用户的浏览器。
6).缓存更新: CDN会定期检查原始服务器上的内容是否发生了更改。如果内容发生了变化,CDN会更新缓存中的内容以确保用户获取到最新的版本。
199.linux启动过程
1).用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动; 简记: bios开机自检
2).Boot Loader(引导加载程序):BIOS/UEFI 在完成自检后会查找引导设备,通常是硬盘上的引导分区。
启动设备上安装的引导程序lilo或grub开始引导Linux启动; 简记: grub引导加载程序。
3).进行内核的加载; 简记: 内核加载
4).初始化根文件系统;该文件系统通常包含用于挂载真正的根文件系统所需的驱动程序和工具
5).接下来执行init程序,启动init进程,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc;
rc.sysinit 程序: 是一个 Linux 系统中的初始化脚本,通常位于 /etc/rc.d 目录中,
用于在系统引导过程中执行一些系统初始化任务
初始化进程启动后,它会执行一系列初始化脚本和任务,这些任务包括加载系统配置、启动系统服务、初始化网络、
挂载文件系统、设置主机名等
6).用户登录: 一旦系统初始化完成,通常会出现登录提示符,允许用户登录到系统。用户登录后,会进入用户的 shell 环境
这样就完成了从开机到登录的整个启动过程。
200.linux系统文件删除原理
Linux系统中的文件删除原理涉及到文件系统的管理和inode,当用户删除一个文件时,以下是大致的步骤:
1).用户发出删除命令:用户通过rm或其他删除命令发出删除文件的请求。
2).删除文件的目录项:每个文件和目录在文件系统中都有一个唯一的inode号码,这个号码用于标识它们。文件系统中的目录包含了文件名和对应文件的inode号码。删除文件的第一步是将文件的目录项从父目录中删除,这样文件就不会再在目录中可见。
3).减少inode的链接计数:
inode的链接计数指的是: 指向一个inode的硬链接的数量。硬链接是文件系统中的一个概念,允许多个文件名指向同一个inode。这意味着多个硬链接可以引用相同的文件内容,而不会占用额外的磁盘空间。每增加一个硬链接都会增加一个与inode关联的链接计数。相反,当链接计数为0时,文件系统知道没有任何链接指向该inode,因此可以释放相关的磁盘空间。
举个例子,如果你创建了一个文件file.txt,然后创建了一个硬链接link.txt,这两个文件名都指向相同的inode,因此该inode的链接计数为2。如果你删除其中一个文件,链接计数将减少到1。只有当链接计数为0时,文件系统才会真正删除该inode,释放磁盘空间。
每个文件和目录都有一个关联的inode号,当文件被删除时,与该文件相关的inode的链接计数减少1。如果该没有其他硬链接到该文件,那么该文件链接计数本来为1,又减少1后,则为0,如果链接计数降至0,文件系统会释放inode占用的磁盘空间。如果该文件被多个硬链接引用,那么删除其中一个,inode的链接计数就减少一个,直到多个硬链接文件都删除后,inode的链接计数变为0,表示文件被删除,空间释放。
所以:当我们删除一个文件时,文件系统会减少该文件的inode的链接计数。如果该inode没有其他硬链接指向它,文件系统会释放该文件占用的磁盘空间。如果有其他硬链接指向相同的inode,那么文件实际上并没有被删除,只是删除了一个链接。
4).数据块释放:如果文件使用了数据块存储内容(例如文本、图片等),这些数据块也会被标记为可回收。文件系统将释放这些数据块,使它们可供其他文件使用。
5).垃圾回收(可选):一些文件系统会定期执行垃圾回收,以回收已删除文件的磁盘空间,特别是在使用固态硬盘(SSD)时更为重要。垃圾回收有助于提高磁盘使用效率,并延长磁盘寿命。
201.linux默认文件系统介绍及选型
“什么是文件系统”。文件系统是对一个存储设备上的数据和元数据进行组织的机制。而这个过程就是格式化,格式化就是将分区划分成一格一格的block及多少个Inode可以使用,而每个block就是文件系统存取资料的最小单位,所以才可以将资料存放在这些block中,而且每多个 block 会组成一个 group。
mkfs -t ext4 /dev/sdb1 #将磁盘分区进行格式化的命令
…
81 block groups #表示这个分区被划分出了81个block group;
32768 blocks per group, 32768 fragments per group #表示每个group中有32768个block;
8096 inodes per group #表示每个group中有8096个inodes
Inode和block的含义区别和关系:
inode是文件系统的一部分,它存储有关文件或目录的元数据信息。元数据信息包括文件的权限、所有者、大小、创建时间、修改时间、指向数据块的指针等。
每个文件和目录都有一个唯一的inode,用于标识和跟踪它们。inode包含有关文件的所有元数据,但不包含实际的文件内容。
block是文件系统中的数据存储单元。文件的实际内容(文本、图片、音频等)存储在数据块中。
文件系统将数据分成小块,每个块通常有固定的大小。这些块通常以固定的大小存储在磁盘上,以便管理和访问。
inode和block之间的关系在于:
1).inode存储有关文件的元数据(如大小和指向数据块的指针),而数据块存储文件的实际内容。
2).inode中的指针指示了哪些数据块包含了文件的实际内容。
202.写出你的技术栈
文本处理:grep、 sed、awk
数据传输: scp、rsync
web服务:nginx、tomocat、apache
数据库:mysql
nosql: redis、memcached、 nongodb
消息中间件: activeMQ rabbitMQ kafka
版本管理: git svn
负载均衡:lvs nginx haproxy
高可用软件:keepalived
集中管理: saltstack ansible
虚拟化 :vmware vsphere
容器化:docker k8s
ci/cd :jenkins gitlab
mysql代理:mycat
压测:ab jemter
监控:zabbix prometheus
日志收集系统:ELK
分布式系统:ceph fastdfs
203.一台服务器由两块硬盘,一块200G,一块2T,如何分区
fdisk直接分区
parted分区工具
204.分区命令有哪两个,有什么区别?
fdisk 使用ext4分区只能支持2t以下
parted分区工具分区支持大于2t分区
205.自动化工具用过哪些?
salt ansible
206.docker有哪几种网络模式
1).host模式容器和宿主机共享Network namespace
2).container模式这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
3).none模式,使用none模式,docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
4).bridge模式,当docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中
207.查找文件大小在200M以上的文件,找到并删除
#find / -type f -size +200m | xargs rm -f
208.使用什么命令可以查看系统的版本信息及当前所开放的端口号
#nmap 127.0.0.1
209.ssh的配置文件路径
#/etc/sshd
210.你常用的性能检测命令
top atop iftop
211.如何查看端口是否被占用
#netstat -tulnp 或: netstat -anput
212.tomcat的三个端口的作用
8005:关闭tomcat通信端口
8009:其他http服务器通信接口,端口是用于与前端代理服务器(如Apache HTTP Server)通信的端口
8080:建立http连接对外访问端口
213.你们公司有多少台服务器
我们生产和测试共有50台服务器
214.你们的服务器放在什么地方
阿里云 和 华为云 或 腾讯云
215.阿里云用过哪些产品
slb cdn rds oss ecs 域名解析 云监控 ack(k8s)
216.如果一个硬盘显示还有200G空间,但是无法写入内容,分析原因
使用df -ia 查看磁盘详细信息
一般磁盘的inode分配完了才会导致这样现象
解决:删除一些无用的文件或者文件夹,释放inode
217.缓存有哪些,消息队列有哪些
缓存有:redis memcached 消息队列有:activemq rabbitmq kafka
218.raid0 raid1 raid5 raid10有什么区别,使用率是多少
raid0: 读写速度快,但无冗余备份,磁盘块数>=1,
raid1: 读写速度一般,但有冗余备份,数据不容易丢失,磁盘块数=2,镜像备份作用
Raid5: 读写速度和冗余备份的性能都处于raid0和raid1之间,有校验机制,磁盘块数>=3块,其中一块是校验作用
raid10: 集中了raid1和raid0两方面的优势,既能保证读写速度快,又有冗余备份,缺点:成本高,磁盘块数>=4
219.你处理过最棘手的事情是啥
处理过mysql主从延迟问题,主要原因有以下方面:
1).复制线程延迟:主从复制中的复制线程在从服务器上执行SQL语句时可能会因为复制队列积压、网络延迟等原因而造成延迟。
2).长时间运行的事务:如果主服务器上运行了长时间的事务,从服务器可能会等待主服务器上的事务完成后才能应用更多的数据。
3).资源限制:从服务器上的资源限制,如CPU、内存或磁盘性能不足,可能导致复制延迟。
4).网络延迟:慢速或不稳定的网络连接可能导致主从延迟。
5).主服务器负载:主服务器上的高负载可以影响复制性能,因为主服务器需要处理更多的写入操作,而从服务器需要追赶。
解决方法:
1).监控和诊断:使用MySQL的复制监控工具,如SHOW SLAVE STATUS来诊断延迟问题,查看复制状态、延迟时间等。
2).优化复制线程:确保从服务器上的复制线程不会阻塞。可以增加从服务器的SQL_THREAD线程数量。
3).优化事务:确保主服务器上的事务不会长时间持有锁,可以拆分大事务或调整事务隔离级别。
4).增加资源:如果从服务器资源不足,可以考虑增加CPU、内存或磁盘性能,以提高数据应用速度。
5).网络优化:优化网络连接,确保稳定和高速的网络连接,可以使用专用网络连接或加密通信。
6).分拆读写操作:将读写分离,从服务器处理只读操作,以减轻主服务器的负担。
7).使用并行复制:在MySQL 5.6之后的版本中引入了并行复制,可以提高数据应用速度。通过设置slave_parallel_workers来控制并行复制线程的数量。
8).基于GTID的复制:使用GTID(Global Transaction Identifier)来跟踪复制的位置,这可以帮助解决复制延迟问题,尤其是在故障恢复时。
GTID用于跟踪主服务器上的事务,以便将它们复制到从服务器,从服务器通过保存已经应用的GTID来追踪它的位置,以便在断开连接后可以继续从断开的位置开始复制。
9).增加从库数量
220.读写分离怎么做的
使用mycat中间件做的
221.nfs里面存储什么样的数据
业务数据 图片
222.mysql存储什么样的数据
基础数据和业务数据
223.你们的代码是如何上线的
开发提交代码到git 通过jenkins编译打包然后推送到测试服务器,测试ok ,没有问题就推送到正式服务器
224.你们上线的周期和时间分别是啥
我们项目一般2个星期更新一次或每周上线一次
225.你们的数据量多大,如何备份
500G 现在使用 mysqldump 逻辑备份, 数据量大了也可使用xbk备份
226.消息队列的作用是啥
使用了消息队列,生产者一方,把消息往队列里一扔,就可以立马返回,响应用户,无需等待处理结果。
处理结果可以让用户稍后自己来取,如医院取化验单。也可以让生产者订阅(如:留下手机号码或让生产者实现listener接口、加入监听队列),有结果了通知。获得约定将结果放在某处,无需通知。
227.说下公司的持续集成(CICD)?开发、测试环境、是不是用同一个jenkins。人员的权限如何分配?
开发和测试用一个jenkins或分开,测试人员的权限单独账号设置单独项目管理,不同账号看到不同项目进行发布管理
228.有遇到过网络问题吗,是如何解决的?丢包问题如何解决?
出现这个问题一般服务器用的物理机很容易导致,一般导致问题可能是:
1).线路问题2).设备故障3).网络拥堵4).路由器路由错误
229.docker有用到过吗?
上家公司用过,前期用docker 单机做跑我们公司java 应用 ,使用Docker-compose编排工具进行管理
现在已经迁移到 k8s集群统一管理
230.公司服务器的配置是怎么样的?
我们公司服务器采用阿里云云服务器,根据不同跑不同业务,配置也不同
Java应用服务的配置: 16C32G 磁盘300G 10个节点, mysql数据库服务器: 40C256G 磁盘2T,数据量900G,主从
231.hadoop有接触过吗?
接触一点不是很深,搭建hadoop集群、HBase集群、kafka集群
232.你们的数据安全是怎么管理的?
主要做的就是多备份,异地灾备
如果服务器安全:
1).取消服务器密码认证登录
2).采用秘钥认证登录服务器
3).使用jumpserver跳板机管理服务器
4).使用防火墙对端口进行管理
5).去掉不需要的外网ip,全部采用内部通信,不对外暴露服务
233.从运维角度做过优化吗?
日常优化分为:系统内核优化、服务优化如nginx tomcat、mysql、架构优化调整、安全方面优化
234.自动化运维做到监控和上线,还有其他的吗?
逐步完善运维标准化、规范化、流程化、文档化
更好高效完成运维自动化
235.数据库的安全和优化有涉及过吗?
分为5个方面进行优化:
1).数据库硬件优化:如内存、cpu、硬盘
2).数据库配置参数优化:实现高并发配置,调整参数,如常见的数据库最大连接数、错误连接数、数据库连接闲置时间、innodb_buffer_pool缓存数据块
3).sql语句优化:explain 进行分析,协助开发优化
4).架构优化:架构调整入 如读写分离或者集群
5).流程和安全优化:数据库权限只对运维开发,账号设置权限管理,需要连接数据库邮件审批
236.数据库的数据量有多少?
800G
237.日志平台有弄过吗,是运维弄的还是开发弄的?
用过上家公司我采用 efk默认进行日志收集, 客户端使用filbeat收集到es 使用 kibana展示
238.如何查看/var/log目录下的文件数?
#ls /var/log/ -1R | grep “-” | wc -l
239.ps aux 中的VSZ代表什么意思,RSS代表什么意思?
VSZ:虚拟内存集,进程占用的虚拟内存空间
RSS:物理内存集,进程占用实际物理内存空间
240.如何检测并修复/dev/hda5?
fsck用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查。
了解下工具:
fsck 是一个用于检查和修复文件系统错误的命令,通常用于Unix和类Unix操作系统(如Linux)。它的主要目的是确保文件系统的数据结构和元数据保持一致性,以防止数据丢失或文件系统损坏。
fsck 命令会扫描文件系统,检查文件、目录、inode、数据块和其他文件系统元素的完整性,以确保文件系统没有损坏或出现错误。
在大多数情况下,fsck 在文件系统检查期间会修复检测到的错误,但可能需要用户干预以解决一些复杂的问题。如果文件系统检查期间发现严重的损坏或问题,用户可能需要备份数据,格式化文件系统并还原数据。
241.介绍下Linux系统的开机启动顺序
加载BIOS–>读取MBR–>Boot Loader–>加载内核–>用户层init一句inittab文件来设定系统运行的等级(一般3或者
5,3是多用户命令行,5是界面)–>init进程执行rc.syninit–>启动内核模块–>执行不同级别运行的脚本程序–>执行/etc/rc.d/rc.local(本地运行服务)–>执行/bin/login,就可以登录了。
242.符号链接与硬链接的区别
我们可以把符号链接,也就是软连接 可以当做是 windows系统里的 快捷方式。
硬链接 就好像是 又复制了一份,举例说明:
ln 3.txt 4.txt 这是硬链接,相当于复制,不可以跨分区,但修改3,4会跟着变,若删除3,4不受任何影响。
ln -s 3.txt 4.txt 这是软连接,相当于快捷方式。修改4,3也会跟着变,若删除3,4就坏掉了。不可以用了。
243.如何在文本里面进行复制、粘贴,删除行,删除全部,按行查找和按字母查找?
以下操作全部在命令行状态操作,不要在编辑状态操作。
在文本里 移动到想要复制的行 按yy 想复制到哪就移动到哪,然后按P 就黏贴了
删除行 移动到改行 按dd
删除全部 dG 这里注意G一定要大写
按行查找 :90 这样就是找到第90行
按字母查找 /path 这样就是 找到path这个单词所在的位置,文本里可能存在多个,多次查找会显示在不同的位置。
244.手动安装grub
#grub-install /dev/sda
手动安装GRUB是在计算机引导过程中的一种维护操作,通常用于修复引导记录(bootloader)或更改引导配置。
手动安装GRUB的主要目的是解决引导问题、定制引导选项或进行引导维护。
245.linux修改内核参数
#vi /etc/sysctl.conf 这里修改参数
#sysctl -p 刷新后可用
246.怎么把脚本添加到系统服务里,即用service来调用?
在脚本里加入
#!/bin/bash
chkconfig: 345 85 15
description: httpd
然后保存
chkconfig httpd –add 创建系统服务
现在就可以使用service 来 start or restart
247.如何让history命令显示具体时间?
HISTTIMEFORMAT=”%Y-%m-%d %H:%M:%S”
export HISTTIMEFORMAT
重新开机后会还原,可以写/etc/profile
248.固态硬盘和普通硬盘的区别
1).访问速度高
固态硬盘在传输速度上有很大的优势,最高可达500M/秒,其中读取速度达到400-600M每秒,写入速度同样可以高达200M每秒。对于1G的文件只需几秒就可搞定,而传统的IDE硬盘读取速度极限是无法超越200M每秒,写入速度也很难突破100M每秒,平时基本在几拾M每秒,这样对于常常需要读取大文件或处理大文件的用户来讲,使用固态硬盘是不错的选择。
2).数据安全保存
我们都清楚传统的硬盘是通过磁头读取盘片来完成数据读写的,在高速旋转过程中盘片和磁头碰撞更容易造成数据受损,还有就是运输过程中也容易造成盘片受损造成数据丢失,而固态硬盘没有盘片,所以只要其芯片不受到外形挤压产生形变,数据就能获得安全的保存,所以在数据安全方面固态硬盘和普通硬盘的区别是很大的。
3).目前价格高,以后会降低
固态更盘在速度及安全方面有很大的优势,因为是最新技术所以在价格方面相对传统硬盘来讲高了很多,固态硬盘现在的价格一般是传统硬盘的2-3倍,但是随着摩尔定律的不断发展,固态硬盘NAND闪存芯片密度会越来越大,则存储量越来越高,以后的价格也会越来越低,可以预见得到固态硬盘取代传统硬盘势在必行。
SSD固态硬盘的物理组成基本上就是闪存+主控+缓存+PCB+接口,没有机械部件,数据读写都是电子讯号,不存在马达转速这样的瓶颈因素,性能自然就上来了。
249.SYN攻击概念和检测是否遭到syn攻击?(也是一种ddos攻击)
SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。
SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:netstat -nap | grep SYN_RECV
250.修改linux的最大文件打开数(默认1024)
临时修改: #ulimit -n 65535
永久修改: #vim /etc/security/limits.conf
- soft nofile 65535
- hard nofile 65535
重启后生效
251.nginx日常优化?
调大进程数-worker数量,
gzip压缩开启,
事件模型使用高效率的epoll模型,
设置合理超时时间
隐藏版本号
防盗链
防爬虫
缓存
伪静态
日志切割
优雅显示页面
防止ddos单ip并发连接的控制
ssl优化,http请求方法
252.分布式文件存储是否有过了解和使用,了解过的有什么特性
FastDFS glusterfs ceph等 或者没使用过,只用nfs
解决了大数据量的存储和负载均衡问题,特别适合中小文件为载体的在线服务,比如在线相册,视频网站等等。 网盘社区,广告和应用下载的存储。
253.mysqldump以及xtranbackup备份方式怎么选用和区别?
1).一般来说100G内的库,可以考虑使用 mysqldump 来做,因为 mysqldump更加轻巧灵活,备份时间选在业务低峰期,可以每天进行都进行全量备份(mysqldump备份)
2).100G 以上的库,可以考虑用 xtranbackup来做,备份速度明显要比 mysqldump 要快。一般是选择一周一个全备,其
余每天进行增量备份,备份时间为业务低峰期。
mysqldump 属于逻辑备份。加入–single-transaction 选项可以进行一致性备份。
xtrabackup 属于物理备份,直接拷贝表空间文件,同时不断扫描产生的 redo 日志并保存下来。最后完成 innodb 的备份后,会做一个 flush engine logs 的操作(老版本在有 bug,在5.6 上不做此操作会丢数据),确保所有的 redo log 都已经落盘
- 500台db,在最快时间之内重启
可以使用批量 ssh 工具来对需要重启的机器执行重启命令。 也可以使用 salt(前提是客户端有安装 salt)或者 ansible( ansible 只需要 ssh 免登通了就行)等多线程工具同时操作多台服务器.
255.你是如何监控你们的数据库的?你们的慢日志都是怎么查询的?
监控的工具有很多,例如zabbix,Prometheus,,我这里用的是zabbix+Prometheus
Mysql的配置文件配置慢查询日志
256.你是否做过主从一致性校验,如果有,怎么做的,如果没有,你打算怎么做?
主从一致性校验有多种工具 例如checksum、mysqldiff、pt-table-checksum(我们用的是这个)等
MySQL主从一致性校验是一种确保主数据库(Master)和从数据库(Slave)之间数据一致性的重要机制。
一致性校验通常通过以下方式来实现:
1).复制协议和机制:MySQL使用复制协议(如二进制日志复制)将主数据库的更改传播到从数据库。在主数据库上执行的每个事务都会记录在二进制日志中,并且从数据库会定期拉取并应用这些更改。主从数据库之间的一致性校验依赖于这个复制机制的正确性和可靠性。
2).同步复制和异步复制:MySQL复制可以配置为同步或异步模式。在同步复制中,主数据库在提交事务之前要等待所有从数据库都确认已经接收到并应用了相同的更改。这可以确保主从数据库之间的数据一致性,但可能会对性能产生一定的影响。在异步复制中,主数据库提交事务后立即返回,而从数据库会尽快异步地应用更改。在这种情况下,主从数据库之间可能存在短暂的不一致性,但通常会在很短的时间内解决。
3).监控和报警系统:为了确保主从数据库之间的一致性,可以使用监控和报警系统来实时监测数据库的状态。这些系统可以检测到复制延迟、复制错误、主数据库故障等问题,并发送警报通知管理员。
4).校验工具:MySQL提供了一些工具和命令,用于检查主从数据库之间的一致性。其中包括SHOW SLAVE STATUS命令,它可以用于查看从数据库的复制状态信息,包括复制延迟和错误。此外,还有一些第三方工具可以帮助进行数据校验和一致性检查。
5).第三方pt工具校验:
使用pt工具来监测MySQL主从数据一致性:
pt-table-checksum: 它在主数据库上创建一个特殊的表用于存储校验和数据,然后在主从数据库上执行相同的查询以比较数据。这个命令将在主从数据库上执行相同的查询来比较数据,然后报告任何不一致之处。
pt-table-sync: 如果 pt-table-checksum 发现了不一致,使用 pt-table-sync 来修复主从不一致的数据。这个命令将尝试修复从数据库上的不一致数据,使其与主数据库保持一致。
6).数据校验和验证:在某些情况下,可以编写自定义脚本或应用程序来定期校验主从数据库之间的数据一致性。这可以包括比较表的数据、校验索引、计算数据哈希值等操作,以确保数据没有丢失或损坏。
257.MySQL中InnoDB引擎的行锁是通过加在什么上完成(或称实现)的?为什么是这样子的?
答:InnoDB是基于索引来完成行锁
例: select * from tab_with_index where id = 1 for update;
for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,
如果 id 不是索引键那么InnoDB将完成表锁,并发将无从谈起
258.什么是mysql多实例?
mysql多实例,简单的说,就是在一台服务器上开启多个不同的mysql服务端口(如3306,3307),运行多个mysql服务进程。这些服务进程通过不同的socket监听不同的服务端口,来提供各自的服务。
这些mysql实例共用一套mysql安装程序,使用不同的my.cnf配置文件(也可以相同)、启动程序(也可以相同)、数据文件。在提供服务时,mysql多实例在逻辑上看来是各自独立的,各个实例之间根据配置文件的设定值,来取得服务器的相关硬件资源。
259.如何配置mysql多实例?
方法一:通过多个配置文件启动多个不同进程
方法二:在同一个配置文件中,利用[mysqld1]、[mysqld2]、[mysqld3]、[mysqld4]标签实现不同实例的差异化配(不推荐,一个配置文件,不好管理)。
260.授权test用户管理bbs库所有表,127.16.10.0网段访问,密码123456
法一:grant all on bbs.* to test@‘172.16.10.%’ identified by ‘123456’;
法二:create user test@‘172.16.10.%’ identified by ‘123456’;
grant all on bbs.* to test@‘172.16.10.%’;
261.truncate和delete区别
truncate table test;速度更快。直接清空对应数据的物理文件。
delete from test;速度慢,逻辑清除,按行删。
262.mysql忘记root密码怎么解决?
mysql 单实例root忘记密码如何解决?
/etc/init.d/mysqld stop #1).首先停止mysql
mysqld_safe --skip-grant-tables --user=mysql & #2).忽略授权登录验证启动
mysql #3).空密码登录mysql
update mysql.user set password=password(‘123456’) where user=‘root’ and host=‘localhost’; 4).重置密码
flush privileges;
quit
/etc/init.d/mysqld stop 5).重启mysql
/etc/init.d/mysqld start
6).重新使用新密码登录
mysql多实例root忘记密码如何解决?
/data/3306/mysql stop
mysqld_safe --defaults-file=/data/3306/my.cnf --skip-grant-table &
mysql -uroot -S /data/3306/mysql.sock
update mysql.user set password=password(‘123456’) where user=‘root’ and host=‘localhost’;
flush privileges;
quit
/data/3306/mysql restart
263.如何从mysqldump产生的全库备份中只恢复某一个库、某一张表?
全库备份:
mysqldump -uroot -pMANAGER --single-transaction -A --master-data=2 >dump.sql
只还原erp库的内容:
mysql -uroot -pMANAGER erp --one-database <dump.sql
可以看出这里主要用到的参数是–one-database简写-o的参数,极大方便了我们的恢复灵活性
那么如何从全库备份中抽取某张表呢?
恢复某张表小库还可以,大库就很麻烦了,那我们可以利用正则表达式来进行快速抽取,具体实现方法思路如下:
a).从全库备份文件中抽取出t表的表结构:
sed -e’/./{H;$!d;}’ -e ‘x;/CREATE TABLE t/!d;q’ dump.sql
b).删除原表,重新建表:
DROP TABLE IF EXISTSt;
/*!40101 SET@saved_cs_client =@@character_set_client */;
/*!40101 SETcharacter_set_client = utf8 */;
CREATE TABLE t (
id int(10) NOT NULL AUTO_INCREMENT,
age tinyint(4) NOT NULL DEFAULT ‘0’,
name varchar(30) NOT NULL DEFAULT ‘’,
PRIMARY KEY (id)
) ENGINE=InnoDBAUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*!40101 SETcharacter_set_client = @saved_cs_client */;
c).从全库备份文件中抽取出t表的内容
[root@HE1 ~]# grep’INSERT INTO t’ dump.sql
INSERT INTO tVALUES (0,0,’’),(1,0,‘aa’),(2,0,‘bbb’),(3,25,‘helei’);
d).重新将t表数据插入
264.mysql数据库查询慢排查方法
1).没有索引或没有用到索引。
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表 的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。
2).IO吞吐量小形成了瓶颈
PS:这是从系统层来分析MYSQL是比较耗IO的。一般数据库监控也是比较关注IO。
监控命令:$iostat -d -k 1 10
参数-d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;1 10表示,数据显示每隔1秒刷新一次,共显示10次
3).内存不足
监控内存使用:vmstat [-n] [延时[次数]]
free: 空闲的物理内存
buff: 作为buffer cache的内存,对块设备的读写进行缓冲
cache: 作为page cache的内存, 对读的缓冲
4).网络速度慢
ping IP -t 查看是否有丢包。
5).一次查询的数据量过大
比如没有分页查询,一次提取上万条记录。数据库有可能卡死。
6).出现死锁
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.
解决死锁:#show innodb status检查引擎状态 ,可以看到哪些语句产生死锁。
#执行show processlist找到死锁线程号.然后kill -9 进程号
7).返回了不必要的行或列
一般查询SQL语句一定要将字段明确指定。而不要使用*进行查询
8).注意UNion和UNion all 的区别。UNION all好
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。所以union all的效率肯定要高!
265.mysql睡眠连接(sleep线程)过多,会对mysql服务器造成什么影响?
严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃。
造成睡眠连接过多的原因?
1).使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接)
2).程序中,没有及时关闭mysql连接
3).数据库查询不够优化,过度耗时。
当然,更根本的方法,还是从以上三点排查之
解决思路:
1).程序中,不使用持久链接,即使用mysql_connect而不是pconnect。
2).程序执行完毕,应该显式调用mysql_close,及时关闭mysql的连接
3).只能逐步分析系统的SQL查询,找到查询过慢的SQL,优化之
其他参考:
如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800。
wait_timeout 过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能,不过也不能把这个指设置的过小,否则你可能会遭遇到“MySQL has gone away”之类的问题,通常来说,我觉得把wait_timeout设置为10是个不错的选择,但某些情况下可能也会出问题,比如说有一个CRON脚本,其中两次SQL查询的间隔时间大于10秒的话,那么这个设置就有问题了(当然,这也不是不能解决的问题,你可以在程序里时不时mysql_ping一下,以便服务器知道你还活着,重新计算wait_timeout时间):
vi /etc/my.cnf
[mysqld]
interactive_timeout=120
wait_timeout=120
wait_timeout=120 #即设置mysql连接睡眠时间为120秒,任何sleep连接睡眠时间若超过120秒,将会被mysql服务自然终止。也可以直接在命令行
set global wait_timeout=120;
set global interactive_timeout=120;
如果查询时使用的是show variables的话,会发现设置好像并没有生效,这是因为单纯使用show variables的话就等同于使用的是show session variables,查询的是会话变量,只有使用show global variables,查询的才是全局变量。
266.key_buffer_size参数作用?如何不重启设置生效?
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。
1).单个key_buffer的大小不能超过4G
2.建议key_buffer设置为物理内存的1/4(针对MyISAM引擎),甚至是物理内存的30%~40%,如果key_buffer_size设置太大,系统就会频繁的换页,降低系统性能。因为MySQL使用操作系统的缓存来缓存数据,所以我们得为系统留够足够的内存;在很多情况下数据要比索引大得多。
3.如果机器性能优越,可以设置多个key_buffer,分别让不同的key_buffer来缓存专门的索引
不重启设置生效:
show variables like ‘key_buffer_size’; #查看
set global key_buffer_size=102400; #命令行设置
key_buffer_size = 102400K #/etc/my.cnf配置文件设置
267.主从复制的常见不同步问题
1)从mysql服务器的IO进程的出错(为no)和解决方法:
连接不上主数据服务器时(一般是网络上问题包括ping不通或授权不成功)
解决方法:
在主服务起上重新授权,并show master status;查看相关的值。
在从服务器上先stop slave,并用change master to 选项=值,……等把信息修改成和主服务器的值一致即可,并检查是否ping通。
2)从mysql服务器的SQL出错(为no)和解决方法:
从mysql数据库的库和表结构与主mysql数据库服务器的不一致。
解决方法:
把主mysql服务器上的库和表备份成sql语句文件,scp给从mysql服务器,再在从mysql服务器上恢复到从mysql服务器里,这样就表结构就一致了
268.如何脱离主从结构?
1)从mysql服务器已经和主mysql服务器已经是主从结构的,暂时脱离主从结构
在从mysql服务器上,在登录状态下:mysql> stop slave;
2)从mysql服务器和主mysql服务器已经是主从结构的,彻底脱离主从结构
在从mysql服务器上,rm -rf 前面的四个文件
master.info 记录主数据库服务器的信息
pc205-relay-bin.00000X 中继binlog日志
pc205-relay-bin.index 记录已有的中继binlog日志
relay-log.info 记录中继日志信息
再service mysqld start 即可。
269.判断主从复制到哪一步,参考查看主从同步情况(了解)
查看主库和从库的IO线程和SQL线程状态,可判断主从复制到哪一步,不同步时可以考虑从这里查看下情况。
mysql>show processlist; #主库和从库都可用该命令查看
如:主库不停时候,需要将从库提升为主库,这是就需要首先登录主库,查看IO状态,看是否已经将binlog日志全部发送给从库,如果已经全部发给了从库,并且在登录到从上查看状态,看是否已经将binlog日志全部拉过来了,若都已经拉过来了,并且下面的线程已经都写入从库里了,这时候,可以锁表主库,然后将从库切换为主库。否则如果主库状态还没有全部将binlog日志发给从库,或者从库状态还没有都将binlog日志拉过来,这时还不能切库。
270.mysql服务器的主从配置
主mysql服务器上配置:
1)必须启用binlog日志
2)必须指定自己的server_id值
3)授权一个连接用户可以在从服务器上来连接主服务器有拷贝数据的权限
4)主mysql服务器和从mysql服务器的表结构要一致(内容可以不同)
5)根据情况决定是否开启级联复制功能
从mysql服务器上配置:
1)必须指定server_id值
2)启用binlog日志(可以不启用,但一般也启用)
3)主mysql服务器和从mysql服务器的表结构要一致(内容可以不同)
4)根据情况决定是否开启级联复制功能
注意:如果表结构不一致,可以通过在主服务器上把数据完全备份后,再传给从服务器,再在从服务器上把传过来的文件恢复到从服务器的数据库中,表结构就一致了。
271.通过read-only参数防止数据库写从库的方法(仅该方法也可,也可配合授权限制为最佳)
除了上面在从库上仅做select的授权外,还可以在slave服务器启动选项增加参数或者在my.cnf配置文件中的[mysqld]模块下加read-only参数来确保从库只读,当然授权用户和read-only参数二者同时操作效果最佳。
read-only参数可以让slave只允许来自slave服务器线程或具有super权限的用户的更新。可以确保slave服务器不接受来自普通用户的更新,slave服务器启动选项增加–read-only也是同样功能。(不允许普通用户,但允许super用户)
注意:
1)my.cnf里加入read-only参数后,重启服务使参数生效。
2)对用户授权时不能指定有super或all privileges权限,否则read-only无效果。
272.主从同步因从库数据冲突导致同步停止的解决方法
主从同步时,如果在从库上创建了一个库如:ku_test,此时再在主库上也创建一个库:ku_test,虽然能创建成功,但是导致主从同步破坏,在从库上查看show slave status;查看sql线程处不是yes,是no,但是io线程处是yes的,
此时的解决方法有两种:(在从库上操作)
方法1:
mysql>stop slave;
mysql>set global sql_slave_skip_counter=1; #将指针向下走一个,也可是2,3,…值越大数据丢的越多
mysql>start slave;
然后再:show slave status,就能查看到sql线程为yes状态
方法2:根据错误号跳过指定的错误,一般可以忽略的错误号有:1032,1062,1007
在从库的配置文件my.cnf的[mysqld]模块中添加参数:slave-skip-errors = 1007,重启从库即可。
一般可以设置为:slave-skip-errors = 1032,1062,1007。
注意:slave-skip-errors=all也可使用,但是一般不这么用,范围太大,可能数据不一致了,不这么用。
273.一主多从的mysql,当主库宕机,将其他的某个从库提升为主的方法步骤(主库故障切换,验证完毕,没毛病)
如:一主三从:m-s1,s2,s3
1)登录各从库查看两个线程IO和sql的更新状态,确保所有relay log全部更新完毕,
mysql>show processlist\G
IO的状态为: wating for master to send event
SQL的状态为: has read all relay log,waiting for the slave I/O thread to update it
说明:从库和主库是同步的,从库是主库最新的binlog日志。主库的binlog日志没丢。
一般也可分别查看各个从库的master.info文件中的binlog日志名和位置点,对比哪一个从库的值最大,最大表示binlog日志最新,和主库的数据一致性就更接近,丢的数据就越少。
如:cat /data/3306/data/master.info 或cat /data/3307/data/master.info文件中的位置点。
[root@mysql ~]# sed -n “2,3p” /data/3307/data/master.info # 选择这个从库作为新主库
mysql-bin.000010
633
[root@mysql ~]# sed -n “2,3p” /data/3308/data/master.info
mysql-bin.000010
631
2)登录选择好要提升为主库的从库,停止从库,重置为主库
mysql>stop slave; #停止从库
3)进入提升为主库的从库的数据库目录,删除master.info,relay-log.info
rm -f /路径/…/master.info /路径/…/relay-log.info
检查授权表,类似read-only等参数。
4).将提升为主库的从库的配置文件my.cnf中的log-bin开启,如果配置文件里存在log-slave-updates或read-only等参数,一定要注释掉。然后重启该从库
然后登录新主库
mysql>reset master; #重置为主库
mysql>grant replication slave on . to ‘repl’@’%’ identified by ‘repl’;flush privileges; #授权
mysql>show master status; #查看binlog日志名和位置点,供另一个从库同步使用
到此从库提升主库完毕。
5)如果主库服务器没宕机,需要从主库拉取binlog日志,补全提升主库的从库。
6)其他从库的操作:
mysql>stop slave;
mysql>change master to master_host=‘新主库ip’,master_port=3306,master_user=‘repl’,master_password=‘repl’,master_log_file=‘新主库’,master_log_pos=新主库pos;
mysql>start slave;
mysql>show slave staus;
7)修改程序的配置文件,从原来是主库IP地址指向新的主库ip地址,平时访问用域名时,则直接可以修改hosts解析。
8)修理损坏的原主库,修理完成后,作为从库。
274.一主多从,主库正常,但有计划的切换从库为主库时候的处理(主库没故障,有计划的切换,验证完毕,没毛病)
一主两从:mysql5.7.27
主库:192.168.171.128
从库1: 192.168.171.129
从库2: 192.168.171.130
1).主库操作:(锁表)
mysql> flush tables with read lock;
mysql> show processlist;
±—±-----±----------------------±-----±------------±-----±--------------------------------------------------------------±-----------------+
| Id | User | Host | db | Command | Time | State | Info |
±—±-----±----------------------±-----±------------±-----±--------------------------------------------------------------±-----------------+
| 7 | rep | 192.168.171.129:58410 | NULL | Binlog Dump | 346 | Master has sent all binlog to slave; waiting for more updates | NULL |
| 8 | rep | 192.168.171.130:34288 | NULL | Binlog Dump | 323 | Master has sent all binlog to slave; waiting for more updates | NULL |
| 9 | root | localhost | NULL | Query | 0 | starting | show processlist |
±—±-----±----------------------±-----±------------±-----±--------------------------------------------------------------±-----------------+
2).登录各从库分别查看 master.info,选择post最大值的从库作为新的主库
post值越大,表示从主库上同步过来的数据更多,更接近主库的数据
[root@localhost ~]# cat /data/mysql/data/master.info 171.129上(post值大,作为新主库)
25
mysql-bin.000003
1237
192.168.171.128
[root@localhost ~]# cat /data/mysql/data/master.info 171.130上
25
mysql-bin.000003
1236
192.168.171.128
3).登录到新主库上:(提升为主库,授权,和查找位置点)
mysql> show processlist;
±—±------------±----------±-----±--------±--------±-------------------------------------------------------±-----------------+
| Id | User | Host | db | Command | Time | State | Info |
±—±------------±----------±-----±--------±--------±-------------------------------------------------------±-----------------+
| 3 | system user | | NULL | Connect | 3281881 | Waiting for master to send event | NULL |
| 4 | system user | | NULL | Connect | 3281569 | Slave has read all relay log; waiting for more updates | NULL |
| 6 | root | localhost | NULL | Query | 0 | starting | show processlist |
±—±------------±----------±-----±--------±--------±-------------------------------------------------------±-----------------+
mysql> show slave status\G;
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> show master status; #先查看下提升为主库前的位置点,该位置点只是看看,提升为主后会变化,以提升为主的为准
±-----------------±---------±-------------±-----------------±------------------------------------------------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------------------------------------------------------------------------+
| mysql-bin.000003 | 1229 | | | 494c61b8-fff6-11ea-8547-000c290eaf1a:6-10,
544e187c-fff7-11ea-a9d8-000c29514dbc:1-5 |
±-----------------±---------±-------------±-----------------±------------------------------------------------------------------------------------+
mysql> stop slave; #停止之前的主从同步
mysql> reset master; #提升为主库
mysql> reset slave all; #相当于用rm命令删除数据目录下的master.info和relay-log.info,也可使用rm -f master.info和relay-log.info,不删除还会以从库启动
mysql> show master status; #为了给另一个从库重新做主从同步找位置点。
±-----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------+
| mysql-bin.000001 | 154 | | | |
±-----------------±---------±-------------±-----------------±------------------+
mysql> grant replication slave on . to ‘rep2’@‘192.168.171.%’ identified by ‘567’;
mysql> flush privileges;
4).另一个从库和之前主库上以新主库重新做主从同步:
另一个从库上:(192.168.171.130)
mysql> stop slave;
mysql> change master to master_host=‘192.168.171.129’,master_port=3306,master_user=‘rep2’,master_password=‘567’,master_log_file=‘mysql-bin.000001’,master_log_pos=154;
mysql> start slave;
mysql> show slave status\G
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.171.129
Master_User: rep2
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
原主库上:(192.168.171.128)
mysql> show master status;
±-----------------±---------±-------------±-----------------±------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------------------------------+
| mysql-bin.000003 | 1236 | | | 494c61b8-fff6-11ea-8547-000c290eaf1a:1-10 |
±-----------------±---------±-------------±-----------------±------------------------------------------+
mysql> reset master;
mysql> show master status;
±-----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------+
| mysql-bin.000001 | 154 | | | |
±-----------------±---------±-------------±-----------------±------------------+
mysql> change master to master_host=‘192.168.171.129’,master_port=3306,master_user=‘rep2’,master_password=‘567’,master_log_file=‘mysql-bin.000001’,master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
Master_Host: 192.168.171.129
Master_User: rep2
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> unlock tables; #之前主库切换前锁表了,切换完后需要解锁
5).切换完成后,新主库上增加数据,原主库和另一个从库上数据跟着同步变化。
二、复杂的命令型
1.如何使用iptables将本地80端口的请求转发到8080端口,
当前主机IP为192.168.16.1,其中本地网卡eth0:
#iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to 192.168.16.1:8080
2.限制apache/nginx每秒新建连接数为1,峰值为3 (防火墙限制)
每秒新建连接数 一般都是由防火墙来做,apache本身好像无法设置每秒新建连接数,只能设置最大连接:
#iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m limit --limit 1/second -j ACCEPT
3.统计apache访问日志中登录服务器次数最多的前5个IP
#cat access_log | awk ‘{print $1}’ | sort | sort -n -r | uniq -c | head -5
#注意: uniq -c是去重,sort -n 是按照整个数字排序,sort -r 是倒序排序, sort -nr 是数字倒序排序
cat a.txt
1
2
2
8
5
5
9
10
15
16
7
cat a.txt | sort | sort -n -r |uniq -c
1 16
1 15
1 10
1 9
1 8
1 7
2 5
2 2
1 1
[root@zhonghe-10-100-4-42][~]
cat a.txt | sort | sort -n |uniq -c
1 1
2 2
2 5
1 7
1 8
1 9
1 10
1 15
1 16
4.统计出apache的access.log中访问量最多的5个ip
cat nginx.log
192.168.1.1 16/Jun/2020 10:00:00
192.168.1.1 16/Jun/2020 10:05:00
192.168.1.5 16/Jun/2020 11:00:00
192.168.1.5 16/Jun/2020 11:01:00
192.168.1.5 16/Jun/2020 11:05:00
192.168.1.3 16/Jun/2020 12:00:00
192.168.1.2 16/Jun/2020 13:00:00
cat nginx.log | awk ‘{print $1}’ | sort | uniq -c | sort -n -r | head -5
3 192.168.1.5
2 192.168.1.1
1 192.168.1.3
1 192.168.1.2
5.如何查看Linux系统每个ip的连接数? (3,4,5本质上差不多)
netstat -n | awk ‘/^tcp/{print $5}’
10.100.4.42:49995
10.100.4.46:55571
10.100.4.46:16380
10.100.4.62:25000
…
netstat -n | awk ‘/^tcp/{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -rn
61 10.100.4.46
60 10.100.4.62
47 10.100.4.42
7 127.0.0.1
3 10.100.4.35
2 10.11.13.146
1 10.100.4.41
6.如何查看http的并发请求数与其TCP连接状态?
netstat -n | awk ‘/^tcp/ {++b[$NF]} END {for(a in b) print a,b[a]}’
ESTABLISHED 181
TIME_WAIT 2
7.使用netstat和awk命令统计下网络连接数(6和7本质是一样)
netstat -an | awk ‘/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}’
LISTEN 40
ESTABLISHED 179
TIME_WAIT 2
8.nginx 日志过滤10点到12点之间访问IP排名和统计
cat nginx.log
192.168.1.1 16/Jun/2020 10:00:00
192.168.1.1 16/Jun/2020 10:05:00
192.168.1.5 16/Jun/2020 11:00:00
192.168.1.5 16/Jun/2020 11:01:00
192.168.1.5 16/Jun/2020 11:05:00
192.168.1.3 16/Jun/2020 12:00:00
192.168.1.2 16/Jun/2020 13:00:00
cat nginx.log | grep “16/Jun/2020” |sed -n ‘/10:00:00/,/12:00:00/p’|awk ‘{print $1}’ | sort | uniq -c | sort -nr
3 192.168.1.5
2 192.168.1.1
1 192.168.1.3
9.显示a.txt中包含了:一个数字: (即两个冒号中间一个数字)的行
cat a.txt
aaaa
aaa:8:xxx
aaa:12:xxx
bbb
grep “:[0-9]{1}:” a.txt
aaa:8:xxx
10.shell下生成32位随机密码
cat /dev/urandom | head -1 | md5sum | head -c 32 >> /tmp/pass
cat /tmp/pass
ddd6d85c388c294e8923324e95a3ef8b
11.在11月份内,每天的早上6点到12点,每隔2小时执行一次usr/bin/httpd.sh怎么实现
#crontab -e
- 6-12/2 * 11 * /usr/bin/httpd.sh
三、非技术型
1.你的离职原因是什么
1).公司比较小,没有什么发展前途,学不到核心的东西,成长空间不大——表明自己有上进心的一面
2).疫情期间公司,公司倒闭了,或者经营不景气,倒闭了——这种表明是没有办法的一面
3).业务缩减,节约成本,批量裁员或者说虽然没裁员到自己,但是感觉人心惶惶的,感觉工作不稳定等等。
注意: 一定不要说公司的各种坏处,虽然大部分离职都是因为公司的各种问题,但是不能说。
2.你对加班怎么看的
1).我现在单身,目前时间也比较多,愿意加班,可以学到更多东西,但是同时我也会注重工作效率,避免无效加班。
2).由于个人原因导致无法在工作时间完成工作,一定要加班的。我一般会注重工作效率,这样留出更多时间陪自己家
人
我个人认为,既然投身于我的公司,就要像我的家一样,没有什么这多这少的比较,我深知,只有公司有了好的发展,我才能更进一点的实现自己的理想,所以,我觉得,加班,不是问题.
3.你是如何理解运维这个岗位的
日常的服务部署和上线,运维主要就是负责平台7*24小时稳定运行,保障用户数据安全,提升用户体验
4.作为运维工程师,你对该职位的认识和理解有哪些,日常工作中应该怎么做
负责服务的稳定性,确保服务可以7*24H不间断地为用户提供服务,保障用户数据安全、提升用户体验
通过技术手段优化服务器和架构,降低公司成本
5.你对出差怎么看
如果公司需要,愿意出差
6.你们的薪资构成是咋样的,或者问你的当前薪资和期望薪资是多少?
能不说就不要说,说出就被动,说少了吃亏 说对了也不行,如果非要说,可参考下面回答
问薪资构成:不要说的太清楚,就说自己也不太懂这个是怎么计算的,应该就是那种标准的计算方式
问当前月薪或期望薪资:
虽然一般也都会问到,不得不说,但是也不要直接就说出来。
可以反问:你们这个岗位给的工资是多少呢?或者问:根据面试情况,你们能给到我多少呢?
如果不得不说了,可以根据自己的情况,说下自己的当前薪资或偏高一点,期望薪资高出5%——10%,并且期望薪资在招聘公司范围内。
比如:公司范围: 15-20,可以期望18或19,取中上点儿。
7.如果让你入职,你打算怎么开展你的工作
1).首先对部分同事熟悉
2).根据自己理解整理公司服务器架构图
3).熟悉服务器每个服务作用,并整理文档
4).测试环境搭建环境发布线上项目
5).服务器架构和线上业务熟悉后,根据公司业务情况分别开始开展
8.你对未来有什么职业规划
中级运维——高级运维 运维经理、运维开发、运维架构、容器化/k8s 然后帮助更多的人学习linux,以后把所学的知识分享给更多人,让他们少走弯路,帮助更多热爱linux行业同学
9.你觉得linux工程师的职责?
负责公司业务系统7*24稳定运行,快速响应,数据安全和备份,优化和架构调整。
10.未来5-10年的规划?
我希望在技术领域能有所作为,不单单只是一名 普通的运维工程师,能把自己所掌握的带给更多的人,能帮助更多人
11.你们公司有什么规章制度?比如运维要完成某项任务,有什么规范的流程?
工作基本都是文档化,做任何工作都是先写文档方法流程,然后根据流程实施,
12.在工作中应该做什么?
1).监控,报警,线上部署
2).脚本自动化,工具自动化
3).故障处理,数据备份,自动化安装部署
13.先做下自我介绍
面试官好,我叫xxx 毕业3年了,从事运维3年,有1份工作经历
公司日常做的事情:
1).内部测试环境搭建,使用虚拟化VMware vsphere搭建内网环境
2).服务器巡检
3).对系统层和业务层进行监控
4).优化系统和服务
5).平台架构调整优化
6).日常工作shell脚本和自动化运维脚本编写
7).测试环境使用jenkins+gitlab完成自动编译打包发布到应用
主要用到技术:nginx、tomcat、mysql、redis、zabbix 、docker/k8s
我现在擅长:服务器架构规划、mysql主从搭建维护、MHA高可用,mycat读写分离配置,业务负载均衡配置
14.你在公司中主要负责那一部分
1).服务器巡检
2).环境搭建、和架构设计实施和优化
3).服务上线发布和数据库常用操作
4).监控完善,做到监控可视化和故障预警和故障处理
15.你最擅长的是哪一部分
我现在擅长mysql优化、nginx优化、高并发架构、docker/k8s容器化平台部署
16.你的学历是统招吗,学信网可查吗
是
17.你们的操作系统是6还是7,内核多少
centos 7
18.你工作三年最大的收获是什么
技术得到了实践,技能得到很大提高,沟通能力也得到提高,感谢我的领导和公司提供的环境
19.你找工作最关注的是什么
我比较现实 侧重于能否成长和薪资
20.你还有什么想问我的?
如果直接说“没有”,也会显得自己很low,而且也会被面试官认为求职者对应聘的工作岗位已经没有太大的兴趣,从而产生误解,影响之后对于薪资的洽谈,可以参考下面的回答:
1).进入公司以后我做什么工作或负责哪方面工作?
2).公司的服务架构是什么样的?即使不录用也学习了
3).公司都用到了哪些技术栈?比如:Java/php或用到的其他什么技术,方便进入公司前提前有个知识准备。
4).公司的服务器多少台?部署方式是什么,传统部署或doker/k8s部署?方便快速了解工作内容
5).公司主营业做什么的
6).能否简单介绍下公司未来的发展方向?
7).我想了解下公司的企业文化是什么?
21.你是如何接触并学习Linux的
大学接触到的或者说朋友介绍的,自己也感觉挺有兴趣的
四、k8s专题型
1.什么是kubernetes?
答:kubernetes,也叫k8s,是一个开源容器管理工具,负责容器部署,容器扩缩容以及负载平衡。作为Google的创意之作,它提供了出色的社区,并与所有云提供商合作。因此,我们可以说Kubernetes不是一个容器化平台,而是一个多容器管理的解决方案。
2.Kubernetes与Docker有什么关系?
Docker是容器技术的实现:Docker是一种开源的容器化平台,它使开发人员能够将应用程序及其依赖项打包到容器中,使用容器运行服务。可以是单个容器提供服务,也可以是多个容器提供服务。
Kubernetes是容器编排平台:Kubernetes是一个开源的容器编排和容器管理平台,旨在自动化容器的部署、扩展、管理和维护。Kubernetes可以管理多个Docker容器,确保它们按照定义的规则和配置在集群中运行,以实现高可用性、负载均衡和自动恢复等功能,确保它们在集群中高效、可靠地运行。
3.在主机和容器上部署应用程序有什么区别?
1).部署单位:
主机:在主机上部署应用程序通常意味着将整个应用程序和其所有依赖项(库、运行时环境等)直接安装在物理或虚拟服务器上。每个应用程序通常独占一个主机或虚拟机。
容器:在容器中部署应用程序意味着将应用程序及其依赖项打包成一个独立的容器运行。同一主机上可以运行多个容器,多个容器共享主机的操作系统内核。
2).隔离性:
主机:主机上运行的应用程序之间的隔离性通常较差,一个应用程序的问题可能会影响整个主机。
容器:容器提供了更强的隔离性。每个容器都有自己的文件系统、进程空间和网络空间,这样可以避免应用程序之间的冲突和互相影响。
3).灵活性:
主机:在主机上部署应用程序通常需要手动管理依赖项、配置和升级和回滚,这可能比较繁琐。
容器:容器提供了更大的灵活性。容器镜像包含了应用程序及其依赖项的全部信息,可以轻松部署、复制和迁移容器,也更容易进行升级和回滚。
4.Kubernetes主节点后节点的不同组件有哪些?
Kubernetes Architecture主要有两个组件 - 主节点和工作节点。master和worker节点中包含许多内置组件。
主节点具有kube-controller-manager,kube-apiserver,kube-scheduler等。
而工作节点具有在每个节点上运行的kubelet和kube-proxy。
5.Kube-proxy有什么功能?
kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件; kube-proxy负责为Pod创建代理服务,从apiserver获取所有server信息,并根据server信息创建代理服务,通过创建service代理服务,通过label标签匹配到后端pod,实现server到Pod的请求路由和转发和负载均衡,从而实现K8s层级的虚拟转发网络。
6.kube-apiserver和kube-scheduler的作用是什么?
Kube-apiserver:
它充当了 Kubernetes 集群的 API 入口,为集群内外的用户和组件提供了对集群的访问和管理接口。
Kube-scheduler:
根据一定的算法计算(如:资源情况、标签选择器、pod亲和性等),调度pod,负责决定将容器化的应用程序(Pods)调度到集群中的节点上,以满足资源需求、容错性和性能要求。
7.什么是ETCD?
答:etcd是用go编程语言编写的,是一个分布式键值存储,用于协调分布式工作。因此,etcd存储Kubernetes集群的配置数据,表示在任何给定时间点的集群状态。
8.你对Kubernetes的负载均衡器有什么了解?
Kubernetes 中的负载均衡器是用于分发网络流量到多个容器或 Pod 的组件,以提高应用程序的可用性、扩展性和容错性。负载均衡器通常用于将流量均匀分发到多个容器实例或节点上,以确保应用程序能够处理大量请求,同时提供高度可用的服务。
在 Kubernetes 中,有几种方式可以实现负载均衡:
1).Service 负载均衡: 创建一个service资源,Service 通过标签选择器进行标签匹配,将流量路由到匹配标签的 Pod 上,实现负载均衡。通过创建一个 Service,Kubernetes 可以自动设置负载均衡,将流量分发到相关 Pod,无需手动配置负载均衡器。
2).Ingress 资源: Ingress 是Kubernetes 的资源类型。Ingress 资源可以与不同的后端服务关联,以根据域名、路径或其他条件将流量分发到不同的服务中。如:创建一个ingress资源,前面匹配相应的域名,后面匹配到相应的service_name名称,进而将流量分发给后面的pod服务上。
3).外部负载均衡器: 如果集群部署在云服务提供商上,例如 AWS、阿里云、华为云等,这些云平台通常提供外部负载均衡器服务,以在集群前端分发流量。Kubernetes 可以与这些云服务提供商的负载均衡器集成,从而实现外部负载均衡。
4).自定义负载均衡器: 在某些情况下,用户可以选择使用自定义负载均衡器,如NGINX、HAProxy等,将其部署在 Kubernetes 集群之外,并手动配置以分发流量到集群内的服务或 Pod。这需要一些额外的操作和维护。
总的来说,Kubernetes 提供了多种方式来实现负载均衡,以满足不同场景下的需求。选择适当的负载均衡方式通常取决于应用程序的特性、部署环境和性能要求。无论使用哪种方式,负载均衡是确保应用程序高可用性和性能的关键组件之一。
9.什么是Ingress网络,它是如何工作的?
答:ingress网络是一组规则,提供kubernetes集群的服务的一种访问入口点。这允许入站连接,可以将其配置为通过可访问的URL,前端匹配域名,后端匹配相应的service名,最终调度到相应的pod服务,进而访问系统,同时他也是做到了负载均衡方式的访问,ingress是k8s暴露服务访问的最有效方式。
10.ReplicaSet 和 Replication Controller之间有什么区别?
ReplicaSet 和 Replication Controller几乎完全相同。它们都确保在任何给定时间运行指定数量的pod副本。不同之处:在于复制pod使用的选择器。ReplicaSet使用基于集合的选择器,可以使用标签选择器来匹配需要复制的 Pod,而Replication Controller使用基于权限的选择器,使用的是等值(equality-based)选择器,只能使用等号运算符来匹配标签。。
11.什么是Headless Service?
Headless Service类似于“普通”服务,但没有集群IP。此服务使您可以直接访问pod,而无需通过代理访问它。
12.如何看待公司从单一服务转向微服务并部署其容器服务?
从单一应用程序转向微服务或容器服务,需要从多方面看待问题:
好处:
1).弹性和可伸缩性: 微服务架构允许应用程序的不同部分独立部署和扩展,这意味着可以根据需求增加或减少资源,提高了应用程序的弹性。
2).独立开发和部署: 微服务使团队可以独立开发、测试和部署服务,不会影响其他服务的开发进程,从而提高了开发速度和灵活性。
3).技术多样性: 可以选择适合每个微服务的最佳技术栈,而不受单一技术堆栈的限制。
4).更好的故障隔离: 单个微服务出现故障时,不会影响整个应用程序,提高了可用性。
5).快速部署和回滚: 容器化部署允许快速部署新版本和快速回滚问题版本,减少了风险。
6).资源利用: 容器可以更有效地利用资源,减少资源浪费。
挑战和考虑因素:
1).复杂性: 微服务架构和容器化部署会增加系统的复杂性,需要管理大量微服务和容器。
2).部署和自动化: 需要投资时间和资源来建立适当的自动化和部署管道。
3).网络和安全: 微服务可能需要复杂的网络架构和安全策略,以确保服务之间的通信和数据保护。
4).文档和沟通: 深入了解每个微服务的功能和接口,并确保团队之间的沟通和文档记录。
5).文化变革: 公司文化可能需要适应微服务和容器化的方式,包括更多的协作和开发团队的自治。
6).成本: 微服务和容器化部署可能需要额外的资源和成本,包括培训、工具和基础设施等。
13.公司希望通过采用新技术来优化其工作负载的分配,如何有效实现?
这个问题的解决方案就是Kubernetes。Kubernetes确保资源得到有效优化,并且只使用特定应用程序所需的那些资源。因此,通过使用最佳容器编排工具,公司可以有效地实现资源分配。
14.Kubernetes集群数据存储在以下哪个位置?
答:etcd中
15.Kubernetes控制器有哪些?
答:ReplicaSet、Deployment、StatefulSet、DaemonSet、Job 和 CronJob
16.k8s各节点的组件和作用?
Master:
kube-apiserver: 提供api接口,是一切与etcd交互的枢纽(访问k8s集群的入口api,etcd只能通过api来操作读写数据)
Kube-controller-manager: 管理和控制中心,管理所有资源对象。
Kube-scheduler: 负责资源调度,pod调度到哪个节点上。
Node:
Kubelet: 管理和运行pod和镜像(接收并执行master发来的指令,管理pod和容器,定期向master汇报资源使用情况)
Kube-proxy: 提供网络代理及负载均衡(service),实现pod能访问service,同时为service提供服务发现和负载均衡。
公共的:
Etcd集群: 存储数据的
Flannel网络或calico网络: 都是属于overlay网络,flannel网络基于隧道,calico网络基于路由(效率高)
17.k8s中的证书和私钥种类?
1).etcd集群内部相关证书和私钥
2).apiserver和etcd间通信验证的证书和私钥
3).其他和apiserver间通信验证的证书和私钥
18.k8s中镜像下载策略(3种)
Always: 每次都下载(默认)
Never: 从不下载,只用本地镜像
IfnotPresent: 只有当本地没有的时候才下载镜像
19.k8s中pod故时的重启策略(3种)
Always: 不停的总是重启(默认)
Never: 从不重启
OnFailure: 故障时重启,但只重启5次,起不来就不启动了
20.pv的几种访问模式?
ReadWriteOnce: 只允许一个节点读写
ReadOnlyMany: 可以同时被多个节点去读
ReadWriteMany: 同时被多个节点读写
21.pv,pvc的作用?
容器永久存储,pod关联pvc(通过pvc的名字)——pvc通过容量和访问模式关联pv——pv关联底层无理存储(nfs,host、ceph等共享存储)、
22.客户端访问资源需要经过几关?
1).验证通过(合法性验证),验证后不一定有权限访问
2).权限授权(一般基于角色,角色和用户绑定方式)
3).资源限制(有的设置了资源限制)
————————————————
版权声明:本文为优快云博主「m0_72767167」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/m0_72767167/article/details/146262954
A-Z ↩︎

被折叠的 条评论
为什么被折叠?



