2022最新15K面试题

在linux系统中句柄指的是文件标识符(FD),文件描述符是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。在linux当中,每个进程会在进程控制块(PCB)当中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表都有
一个指向已经打开文件的指针。

每个linux进程都应该有三个标准的文件描述符,对应三个标准流。
整数值名称(unistd.h)符号常量(stdio.h)文件流
0 Standard input STDIN_FILENO stdin
1 Standard
output STDOUT_FILENO stdout
2 Standard error STDERR_FILENO stderr

crond 计划任务
sshd 远程工具
firewalld 防火墙
chrony 时间同步
network.service网络服务
NetworkManager.service网卡守护进程
rsyslog.service日志服务
selinux 进程安全增强服务

修改sshd配置文件 /etc/ssh/sshd_config
PasswordAuthentication no
然后使用密钥的方式登录

iptables forward参数: 表示的含义是通过本机的数据包
主要用途是在将服务器当做路由器使用时可以通过该参数屏蔽接入的ip或ip段,或者允许一些数据包通过,做一些访问控制策略

用法:
iptables -A FORWARD -s 192.168.0.1 -j DROP#阻止来源地址为192.168.80.39的数据包通过本机
iptables -A FORWARD -m mac --mac-source 11:22:33:44:55:66 -j DROP #阻止来自某MAC地址的数据包通过本机
iptables -A FORWARD -d www.163.com -j DROP #阻止防问域名www.163.com的数据包通过本机
iptables -A FORWARD -p tcp --dport 80 -j DROP #阻止访问80端口的数据通过本机
或者:
iptables -A FORWARD -p tcp --dport xxx -j ACCEPT
iptables -A FORWARD -p tcp --dport yyy:zzz -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -jACCEPT
iptables -P FORWARD DROP

vim /etc/chrony.conf 添加
server cn.ntp.org.cn iburst
然后
systemctl restart chronyd.service
timedatectl set-ntp true 开启时间同步
chronyc sources -v 查看

nginx.conf

worker_processes 1; #修改worker进程数量
keepalive_timeout 3000s; # 适当的减少可以节省服务器的性能
worker_rlimit_nofile 1024; #指定进程最多打开文件数量
client_header_buffer_size 4k; #客户端请求头部的缓冲区大小
open_file_cache max=65535 inactive=60s; #为打开文件指定缓存时间
#客户端、服务端设置
server_names_hash_bucket_size 128;
server_names_hash_max_size 512;

长连接超时配置

keepalive_timeout 65;
client_header_timeout 15s;
client_body_timeout 15s;
send_timeout 60s;

#代理设置
#与后端服务器建立连接的超时时间。注意这个一般不能大于75秒
proxy_connect_timeout 30s;
proxy_send_timeout 120s;
#从后端服务器读取响应的超时
proxy_read_timeout 120s;

#开启gzip,减少我们发送的数据量
gzip on;
#允许压缩的最小字节数
gzip_min_length 1k;
#4个单位为16k的内存作为压缩结果流缓存
gzip_buffers 4 16k;
#设置识别HTTP协议版本,默认是1.1
gzip_http_version 1.1;
#gzip压缩比,可在1~9中设置,1压缩比最小,速度最快,9压缩比最大,速度最慢,消耗CPU
gzip_comp_level 4;
#压缩的类型
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
#给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
gzip_vary on;
#禁用IE6以下的gzip压缩,IE6的某些版本对gzip的压缩支持很不好
gzip_disable “MSIE [1-6].”;

#访问限流

#限制用户连接数来预防DOS攻击
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
#限制同一客户端ip最大并发连接数
limit_conn perip 2;
#限制同一server最大并发连接数
limit_conn perserver 20;
#限制下载速度,根据自身服务器带宽配置
limit_rate 300k;

#高效数据传输配置
#开启文件的高效传输模式。tcp_nopush和tcp_nodelay可防止网络及磁盘i/o阻塞,提升nginx工作效率;
sendfile on;
#数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。
tcp_nopush on;
#只要有数据包产生,不管大小多少,就尽快传输
tcp_nodelay on;

部署在非洲,因为agent和proxy离得近,可以更方便准确的收集数据

1)GIT是分布式的,SVN不是。 自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交。svn只能联网提交

2)GIT把内容按元数据方式存储,而SVN是按文件
所有的资源控 制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因 为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。

3)GIT分支和SVN的分支不同
分支在SVN中一点不特别,就是版本库中的另外的一个目录。如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svn propget svn:mergeinfo,来确认代码是否被合并。
然而,处理GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。

4)GIT没有一个全局的版本号,而SVN有

5)GIT的内容完整性要优于SVN

6)Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网;

动静分离是指在web服务器架构中,将静态请求与动态请求分开的架构设计方法

实现方式:一般前端使用的nginx做为网关,静态的请求直接由nginx服务返回,动态的请求通过nginx转发给tomcat、Django、php等,获取数据后再转发给客户端

将经常变化的变量放一个文件里引用
vars_files:
- “…/…/common_vars.yml”

在nginx层面上:首先找到nginx日志文件access.log,
通过 awk ‘{++IP[$1]} END {for (i in IP) {print IP[i], i }}’ nginx.log | sort -n -k 1 |tail -n 10
找到访问最高的这部分ip,
在配置文件中
server {
deny ip1;
deny ip2;
}

$remote_addr, $http_x_forwarded_for 记录客户端IP地址
$remote_user 记录客户端用户名称
$msec 日志写入时间。单位为秒,精度是毫秒。
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。

使用mysqldump逻辑备份,每周备份一次,灾备演练一季度一次,利用binlog的position定位到恢复点

首先找到主从延迟的原因是什么:登录数据库以后执行show slave satus; 检查Seconds_Behind_Master 数值大小,如果很大表示存在延迟
检查Relay_Master_Log_File和Master_Log_File 显示bin-log的编号如果相差很大表示io

MySQL数据库主从同步延迟是怎么产生的?当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。首要原因:数据库在业务上读写压力太大,CPU计算负荷大,网卡负荷大,硬盘随机IO太高次要原因:读写binlog带来的性能影响,网络传输延迟。

1)、架构方面

1.业务的持久化层的实现采用分库架构,mysql服务可平行扩展,分散压力。

2.单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库。

3.服务的基础架构在业务和mysql之间加入memcache或者redis的cache层。降低mysql的读压力。

4.不同业务的mysql物理上放在不同机器,分散压力。

5.使用比主库更好的硬件设备作为slave总结,mysql压力小,延迟自然会变小。

2)、硬件方面

1.采用好服务器,比如4u比2u性能明显好,2u比1u性能明显好。

2.存储用ssd或者盘阵或者san,提升随机写的性能。

3.主从间保证处在同一个交换机下面,并且是万兆环境。

总结,硬件强劲,延迟自然会变小。一句话,缩小延迟的解决方案就是花钱和花时间。

3)、mysql主从同步加速

1、sync_binlog在slave端设置为0

2、–logs-slave-updates 从服务器从主服务器接收到的更新不记入它的二进制日志。

3、直接禁用slave端的binlog

4、slave端,如果使用的存储引擎是innodb,innodb_flush_log_at_trx_commit =2

4)、从文件系统本身属性角度优化 

mysql redis

Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。
Docker是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间、容器与容器之间隔离的更加彻底。每个容器会有自己的权限管理,独立的网络与存储栈,及自己的资源管理能,使同一台宿主机上可以友好的共存多个容器。

Docker借助Linux的内核特性,如:控制组(Control Group)、命名空间(Namespace)等,并直接调用操作系统的系统调用接口。从而降低每个容器的系统开销,并实现降低容器复杂度、启动快、资源占用小等特征。

k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
我们用kubernetes去管理Docker集群,即可以将Docker看成Kubernetes内部使用的低级别组件。kubernetes不仅仅支持Docker,还支持Rocket。

docker常用命令
docker images -a #查看所有镜像
docker ps -a #查看容器
docker run #运行(创建同时并且启动)容器
docker exec #在容器内部执行命令
docker inspect <容器id> #查询容器详细信息
docker login #登录docker hub
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] #提交新的容器镜像
docker build #构建镜像,用于dockerfile

k8s常用命令
kubectl cluster-info #查看集群信息
kubectl get no -o wide #查看节点信息
kubectl top node [node_name] #查看node节点各资源的使用情况
kubectl get po/svc/cm/rc : 查看pod
kubectl describe po name :查看详情
kubectl delete po name :删除资源
kubectl create -f 文件名 #创建集群resource
kubectl delete -f #删除创建资源
kubectl get po -o wide --all-namespaces #查看所有命名空间的pod
kubectl get po -o wide -n kube-system #查看kube-system命名空间的pod

nginx日志切割、高可用故障转移脚本、检查服务器状态脚本(检查cpu、内存、磁盘占用、ssh暴力破解、服务状态)、使用rsync实现自动远程备份、自动屏蔽nginx异常访问ip脚本 、批量管理服务脚本 等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湫沃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值