运维必会面试题-快速突击
⭐️运维必会面试题-快速突击
常用命令
查看上次服务器启动时间:w
查看登录系统:last
登录失败:lastb
查看跟踪经过了哪些网络节点:tracert
查看端口的网络服务运行状况:netstat、ss
查看对应的服务名/文件:lsof -i :80
查看两台服务器之间的网络是不是正常的,服务器是禁ping的可以用:telnet
查看内存:vmstat、free、sar -r(虚拟内存:vmstat)
查看CPU负载:uptime、sar -u、iostat
查看CPU信息:lscpu
查看磁盘使用情况:sar -d、
查看磁盘:iostat、lsblk、df
查看流量信息:ifconfig、iftop、sar 多个应用使用nethogs
查看文件挂载:df -h
查看二进制文件的内容:hexdump
修复文件系统:fsck
修改内核参数:/etc/sysctl.conf,刷新:sysctl -p
查看主板设备信息:dmidecode
查看路由信息:ip route show 或者 route -n 或者 netstat -nr
查看默认路由:netstat -nr 这个和下面route -n输出结果一样
查看路由表:route -n
查看当前系统加载的模块情况的命令是:lsmod
查看服务器各接口卡情况的命令是:lspci
查看进程:ps、pstree、top(P按cpu M按内存排序)
- ps -aux(显示进程信息非常详细)
- ps -elf (显示进程父进程信息)
检索进程:pgrep
杀死进程(-9强杀)kill:后台任务编号、PID
- killall:进程名
- pkill:查找条件
find:精确查找(-type -name -size -user -mtime) rsync:数据同步
-
下载:rsync -av —delete root@IP:远程目录 本地目录
-
上传:rsync -av —delete 本地目录 root@IP:远程目录
inotify:对目标文件持续监控(-m)
- q:减少屏幕输出信息
du -sh:统计文件的占用空间 tar -zcvf 归档 tar -xf 释放
- -z、-j、-J:调用 .gz、.bz2、.xz 格式工具进行处理
- -t:显示归档中的文件清单
- -C:指定释放路径 使用—exclude选项在打包时可用排除特定的目录
iostat参数说明
- %user 用户空间的CPU使用
- %nice 改变过优先级的进程的CPU使用率
- %system 内核空间的CPU使用率
- %iowait CPU等待IO的百分比
- %steal 虚拟机的虚拟机CPU使用的CPU
- %idle 空闲的CPU
常规问题
工作日常内容描述?
你之前运维都做哪些工作?
谈谈你对运维工程师的理解以及对工作的认识?
其他
linux上进程有5种状态:
-
运行(正在运行或在运行队列中等待)
-
中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
-
不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
-
僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait()系统调用后释放)
-
停止(进程收到SIGSTOP, SIGSTP, SIGTTIN, SIGTOU信号后停止运行运行)
另
-
运行(Running)状态:进程正在执行,即正在处理器上运行。
-
就绪(Ready)状态:进程已经准备好,正在等待处理器的分配。
-
阻塞(Blocked)状态:进程因为某些原因无法执行,例如等待输入/输出、等待某个事件的发生等。
-
僵死(Zombie)状态:进程已经完成执行,但是其父进程还没有调用wait()函数来获取其退出状态码。
-
停止(Stopped)状态:进程被暂停,例如收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU等信号,或者被调试器暂停。在这种状态下,进程的执行暂时被挂起。
描述Linux运行级别0-6的各自含义 0:关机模式
1:单用户模式<==破解root密码
2:无网络支持的多用户模式
3:有网络支持的多用户模式(文本模式,工作中最常用的模式)
4:保留,未使用
5:有网络支持的X-windows支持多用户模式(桌面)
6: 重新引导系统,即重启
描述Liunx系统从开机到登陆界面的启动过程
- BIOS 自检
- 启动 GRUB 2 (内核引导程序)
- 加载内核
- 执行 systemd 进程
- 初始化系统环境
- 执行/bin/login 程序
缓存相关?
- 缓存雪崩:是指在某一个时间段,缓存集中过期失效,大量的请求都跳过缓存直接到数据库中 解决:不设置超时时间,避免过期;在失效时间上加随机的过期时间,避免集中过期;有相应的限流降级策略;使用多个缓存服务器,这样即使一个服务器崩溃,其他服务器仍然可以提供服务。
- 缓存击穿:是指大量的请求集中对一个热点key进行访问,当这个key失效的瞬间,持续的大并发直接落到数据库上,就在这个key的点上击穿了缓存 解决:加互斥锁,避免大量请求同时打库;设置key不过期,更新时直接覆盖;缓存中不存在的键在被请求时应该被缓存起来,这样下一次请求相同的键时会从缓存中获取数据。
- 缓存穿透:指缓存和数据库中都没有数据,而用户不断发起请求,从而实现拒绝攻击,这会给服务器带来很大的压力 解决:把空对象存到缓存中,并设置一个较短的过期时间;如果缓存中不存在该键,则不会将请求传递给主数据库,而是直接返回响应;接口层增加校验;利用布隆过滤器(检查请求中的键是否存在于缓存中,如果不存在,则可以在缓存中添加一个伪记录。这样未经授权的请求将被过滤掉,从而避免缓存穿透的问题。)
1:熟悉LINUX系统常用命令,管理维护服务器; ls pwd cd Mkdir 创建目录 Touch 创建文件 Find 查找文件 Grep 查找字符 Mv 移动 Vim 编辑 yum或 dnf 装包
2:熟悉SHELL脚本编写,实现自动化批量部署;
优化相关
3:Nginx优化
4:Tomcat优化
5: mySql优化
6:Zabbix监控原理:
。Zabbix监控什么? 监控主要监控哪些项
7:熟悉MYSQL数据库的数据备份,主从同步,读写分离;
你是怎么备份数据的,包括数据库备份?
mysql主从原理?
如何对Mysql数据库进行备份和恢复?
socket和tcp访问mysql的区别?
mysql如何减少主从复制延迟?
8:TCP/IP原理说一下?TCP有哪几个状态,分别是什么意思?
简述TCP三次握手的过程?
为什么连接的时候是三次握手,关闭的时候却是四次握手?
我们都知道,dns既采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么时候采用udp协议?为什么要这么设计?
9:如何优化Linux系统?
10:从运维角度讲一下怎么预防cc攻击和ddos攻击
11:如果你们公司的网站访问很慢,你会如何排查?
12: 网站打不开,排查故障的思路?(网络-服务端口-流量-负载-进程-配置-抓包)
简单介绍一下您所知道的减少和加速web服务器的请求的方法?
你在工作的过程中,遇到过你印象最深的是什么故障问题,你又是如何解决?
突然发现一台Linux系统只读,应该怎么处理,请写出详细步骤?
一台Linux服务器负载高,连接慢,怎么查看?
如何判断当前服务器的80端口是否被监听,如果被监听,怎么知道被哪个进程监听?
在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU、内存、IO、网络的角度判断是谁导致的瓶颈?
网站时常出现too many connection的错误,请给出解决的方案?
Tomcat和Resin有什么区别,工作中你怎么选择?
tomcat进程出现假死的情况?
有个客户说访问不到你们的网站,但是你们自己测试内网和外网访问都没问题。你会怎么排查并解决客户的问题?
怎么查看两台服务器之间的网络是不是正常的,服务器是禁ping的?**
Linux系统中病毒怎么解决?
网站出现500,502,503,400,403,404都是什么意思,怎么排查和解决?
请简述devops是什么?
简述集中式版本控制系统与分布式版本控制系统的区别?
请简述git本地仓库有哪三大区, 中间的那个区主要有什么作用?
CI/CD流程:
请说明下面git命令的作用
请简述github与gitlab分别是什么,各自的应用场景
如何区别持续集成、持续部署和持续交付?
CI/CD流水线的13大好处
说一下你们公司怎么发版的(代码怎么发布的)?
简述raid0 raid1 raid5 三种工作模式的工作原理及特点
描述raid 0、1、5的特点和优点?
现在给你三百台服务器,你怎么对他们进行管理?
常用的Nginx模块,用来做什么?
Nginx 如何实现后端服务的健康检查?
为什么Nginx性能这么高?
Nginx怎么处理请求的?
Nginx 如何实现页面的动静分离?
nginx安全?
LVS相关:
LVS的优点是:
LVS的缺点是:
Haproxy相关:
LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
网站做了负载均衡,发现有些用户访问的时候经常需要重新登录是什么原因?
apache与nginx的区别?
docker
一、3大服务模式
IAAS基础设施服务:CPU、内存、存储、网络和其它基本的计算资源
PAAS平台服务:中间件服务,编程语言、运行环境、技术支持
SAAS软件服务:根据需求购买应用软件服务
二、容器概述
1.核心技术:
Cgroups 资源管理
SELinux 安全
NameSpace 命名空间:UTS、NETWORK、MOUNT、USER、PID、IPC
2.容器优点:
-相比于传统的虚拟化技术,容器更加简洁高效
-传统虚拟机需要安装操作系统
-容器使用共享公共库和程序
缺点:
-容器的隔离性没有虚拟化强
-共用Linux内核,安全性有先天缺陷
三、容器间通信模式
host模式,与宿主机共享网络
container模式,共享其他容器的网络命名空间
none模式,无网络模式
bridge模式,默认桥接网络
自定义网络
一、镜像命令
Docker images //查看本机镜像
Docker search 镜像名称 //查找镜像
Docker pull 镜像名称:标签 //下载镜像
Docker push 镜像名称:标签 //上传镜像
Docker save 镜像名称:标签 -o 备份镜像名称.tar //备份镜像
Docker load -i 备份镜像名称:标签 //导入镜像
Docker rmi 镜像名称:标签 //删除镜像
Docker history 镜像名称:标签 //查看镜像制作历史
Docker inspect 镜像名称:标签 //查看镜像详细信息
Docker tag 镜像名称:标签 新镜像名称:新标签 //创建新的镜像
Docker commit 容器id 镜像名称:标签 //打包镜像
二、容器命令
Docker run -itd 镜像名称:标签 启动命令 //创建启动并进入容器
Docker ps //查看容器
Docker ps -aq //查看所有容器和id
Docker rm -f //删除容器
Docker start | stop | restart 容器id //启动、停止、重启容器
Docker cp 本机文件路径 容器id:容器内路径 //拷贝本机文件到容器内
Docker cp 容器id:容器内路径 本机文件路径 //拷贝容器文件到本机内
Docker inspect 容器id //查看容器详细信息
Docker attach 容器id //进入容器,退回关闭容器
Docker exec -it 容器id 启动命令 //进入容器,退出不关闭容器
Docker top 查看容器输出
三、Dockerfile语法
FROM 基础镜像
RUN 制作镜像时执行的命令,可多个
ADD 复制文件到镜像,自动解压
COPY 复制文件到镜像,不解压
EXPOSE 开放端口
ENV 设置环境变量
WORKDIR 工作目录
CMD 容器启动时执行的命令,仅一条
创建镜像:Docker build -t 镜像名称:标签 Dockerfile所在目录
四、发布容器
Docker run -itd -p宿主机端口:容器端口 镜像名称:标签
五、容器共享卷
Docker run -itd -v 宿主机对象:容器内对象 镜像名称:标签
六、Docker私有仓库
1.仓库配置:yum -y install docker-distribution
2.客户端配置:vim /etc/docker/daemon.json
{
“exec-opts”: [“native.cgroupdriver=systemd”],
“registry-mirrors”: [“https://hub-mirror.c.163.com”],
“insecure-registries”:[“192.168.1.100:5000”, “registry:5000”]
}
3.上传镜像
docker tag myos:latest 192.168.1.100:5000/myos:latest
docker push 192.168.1.100:5000/myos:latest
附:
docker images |awk ‘$2!=“TAG”{print $1,$2}‘|while read _f _v;*do
docker tag ${_f}:${_v} 192.168.1.100:5000/${_f##*/}:${_v};
docker push 192.168.1.100:5000/${_f##*/}:${_v};
docker rmi ${_f}:${_v};
done
4.查看
curl http://仓库IP:5000/v2/_catalog
curl http://仓库IP:5000/v2/镜像名称/tags/list
16:k8s
一、核心
1.master 管理节点
apiserver(6443整个系统对外接口,供客户端和其它组件调用)
scheduler(10251负责对集群内部资源进行调度)
etcd(2380分布式键值数据库)
controllermanager(10252负责管理控制器)
2.node 计算节点
由kubelet(创建修改删除pod)、kube-proxy(k8s核心组件,实现service通信与负载均衡)、docker组成
kube-proxy代理模式:
k8s v1.0 用户空间代理模式
k8s v1.1 iptables代理模式
k8s v1.8 ipvs代理模式
3.image 镜像仓库
二、语法:kubectl [command] [type] [name] [flags]
command子命令、type资源类型、name资源名称、flags附加参数
三、系统命名空间
default 默认命名空间
kube-node-lease 高可用提供心跳监视的命名空间
kube-public 公共数据
kube-system 系统服务对象使用的命名空间
四、排错命令
1.kubectl get 查看资源状态信息
2.kubectl describe 查看资源详细信息
3.kubectl logs 查看日志(容器终端信息)
五、创建容器
kubectl run 资源名称 -it —image=私有仓库镜像:标签
六、资源控制器
1.Deployment(为RS提供滚动更新)
ReplicaSet资源控制器、创建管理POD、可以扩容和缩容
2.DaemonSet(每个node节点启动运行pod)
系统服务类型:kube-proxy、flannel
3.job(单任务控制器)
4.CronJob(多次任务控制器,保留3个pod)
5.StatefulSet(有状态相关的pod)
6.Horizontal Pod Autoscaling(自动水平扩展pod,提高资源利用率)
*污点策略
NoSchedule 不会被调度
PreferNoSchedule 尽量不调度
NoExecute 驱逐节点
设置污点标签:kubectl taint node node-0001 key=value:NoSchedule
删除污点标签:kubectl taint node node-0001 key-
查看污点标签:kubectl describe nodes | grep Taints
*资源文件
create 创建资源对象
apply 声明更新资源对象
delete 删除资源对象
7.查询资源对象文件格式(json、yaml):kubectl get 资源对象 资源名称 -o 格式
8.扩容:kubectl scale deployment.apps apache —replicas=3
9.修改配置即时生效:kubectl edit deployment.apps apache
10.集群更新与回滚:Recreate 重建式更新、rollingUpdate滚动更新
查看历史版本,回滚:
kubectl rollout history deployment myapache
kubectl rollout undo deployment myapache —to-revision=1
七、POD
概念:pod是kubernetes调度的基本单元,一个pod包涵一个或多个容器,这些容器使用相同的网络命名空间和端口号,pod是一个服务的聚合单元,支持横向扩展和复制
同一个Pod共享进程(PID)
同一个Pod共享网络IP及权限(NETWORK)
同一个Pod共享IPC通信信号(IPC)
同一个Pod共享主机名(UTS)
*POD创建过程
具体的创建步骤包括:
1、客户端通过kubectl命令行(或API Server的Restful API)提交创建Pod请求。
2、API Server处理用户请求,存储Pod数据到etcd
3、调度器通过API Server查看未绑定的Pod。尝试为Pod分配主机
4、过滤主机 (调度预选):调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉
5、主机打分(调度优选):对上一步筛选出的符合要求的主机进行打分。在主机打分阶段,调度器会考虑一些整体优化策略,使用最低负载的主机
6、选择主机:选择打分最高的主机,进行绑定操作,并将结果存储到etcd中
7、kubelet根据调度结果执行Pod创建操作: 绑定成功后,scheduler会调用APIServer的API在etcd中创建一个boundpod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步boundpod信息,一旦发现应该在该工作节点上运行的boundpod对象没有更新,则调用Docker API创建并启动pod内的容器
*Pod生命周期:创建主容器(main container)为必需操作,可选操作包括运行初始化容器(init container)、容器启动后钩子(post start hook)、容器存活性探测(liveness probe)、就绪性探测(readiness probe)、容器终止前钩子(pre stop hook)
*Pod phase(相位)
Pending 容器创建过程中,但它尚未被调度完成
Running 所有容器创建完成
Succeeded 所有容器都已经成功终止了并不会被重启
Failed Pod 所有容器中至少有一个容器退出是非0状态
Unknown 无法正常获取到Pod对象的状态信息
八、node标签管理
1.查看标签:kubectl get node --show-labels
2.设置标签:kubectl label nodes <node-name> k=v
3.删除标签: kubectl label nodes <node-name> -
九、服务发现
服务端口:
port:service暴露在cluster ip上的端口,供集群内部服务访问使用
targetPort:pod上容器服务监听的端口
17:SQL语句分类
1.数据查询语言(DQL:select)
2.数据定义语言(DDL:create、alter、drop)
3.数据操纵语言(DML:insert、update、delete)
4.数据控制语言(DCL:grant、revoke)
二、约束
1.用于限制表中的数据,保证表中数据的准确性和可靠性
2.分类:(表级pfu)primary key主键、foreigh key外键(不支持列级)、
unique唯一、not null非空、default默认值
3.表结构:字段名、类型、空、键值、默认值、额外设置
三、事务
1.数据库事务指的是一组数据操作,可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全都不执行;只有使用了innodb数据库引擎的库或表才支持事务。
2.事务必须满足的4个条件(ACID)
A原子性:事务要么都执行要么都不执行,在执行过程中发生错误会被回滚到开始的状态
C一致性:在事务的开始和结束,数据库的完整性没有被破坏
I隔离性:允许多个并发事务同时对数据进行读写和修改,防止交叉执行导致数据的不一致
D持久性:事务处理结束后,对数据的修改是永久的
3.事务控制语句:begin开始、rollback回滚、commit提交
4.事务隔离:可重复读、不可重复读、脏读、幻读
5.事务隔离级别:读未提交、读提交、可重复读(mysql默认)、串行化
隔离级别 | 出现脏读 | 出现不可重读 | 出现幻读 |
读未提交 | 可能 |可能 | 可能 |
读提交 | 不可能 |可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能 |
串行化 | 不可能 | 不可能 | 不可能 |
四、视图:视图是由数据库中的一个表或多个表导出的虚拟表,方便用户对数据的操作。可以隐藏一些数据,可以使复杂的查询易于理解和使用
五、存储过程:是可编程的函数,由一组SQL语句和控制结构组成,提高了代码的重用性,减少了编译次数和数据库的连接次数,提高了效率
六、索引(index)
1.索引是帮助mysql高效获取数据的数据结构,可以用来快速查询数据库表中的特定记录,主要有B+Tree和Hash索引
2.优点:可以大大提高Mysql的检索速度;减小服务器需要扫描的数据量;可以帮助服务器避免排序和临时表
3.缺点:降低了更新表的速度,在对表增删改时,要保存数据和索引文件;会占用磁盘空间;
4.分类:普通索引、唯一索引、全文索引、单列索引、多列索引
七、用户授权(笔记第一周的6天)
八、备份
1.备份策略:完全备份、差异备份、增量备份
2.备份命令
mysqldump -u用户名 -p密码 > 路径/文件名.sql
例:备份多个库/所有/某个库 表
mysqldump -uroot -p密码 -B/-A(—all-databases)/某库名 表名) > 路径/文件名.sql
九、Percona
1.解决了物理备份跨平台性差、备份时间长、冗余备份浪费存储空间的缺点;
解决了mysqldump备份过程中会阻塞操作、效率较低和还原速度慢、锁表的缺点
2.Percona特点:在线热备不锁表
3.组件:xtrabackup、innobackupex
4.完全备份格式
innobackupex -u用户名 -p密码 备份目录名
选项:
—no-timestamp 不用日期命名生成子目录名
—apply-log 准备恢复数据
—copy-back 恢复数据
—databases=库1 库2/库.表
5.增量备份格式(需要一个完全备份)
innobackupex -u用户名 -p密码 —incremental 完全备份 —incremental-basedir=备份目录名
选项:
—apply-log 准备恢复数据
—redo-only 日志合并
—incremental-dir=完全备份目录名
杂乱无章
一、Mysql主从同步
1.原理:当开启主从复制时,主库会生成一个logdump线程,用来给从库的I/O线程传binlog。从库会生成两个线程,一个I/O线程去请求主库的binlog并写到自己的relaylog(中继日志)文件中,另外一个SQL线程会读取relaylog文件中的日志,来实现主从操作一致,最终达到主从数据同步。
2.主服务器需要做哪些配置?
设置server_id;启用binlog日志;授权用户;查看binlog日志信息
3.从服务器需要做哪些配置?
设置server_id;确保与主库数据一致;指定主库信息;启动slave程序;查看状态信息
4.主从同步结构:一主一从、一主多从、主从从、互为主从
5.复制模式
同步复制:主库执行完一次事务后,等待所有的从库执行完该事务,才将结果返回给客户端
异步复制:主库执行完一次事务后立即将结果返回给客户端,不关心从库是否已经同步数据
半同步复制:介于同步复制和异步复制之间,主库执行完一次事务后,至少等待一台从库同步数据完成才将结果返回给客户端
4.导致从服务器 IO线程报错的原因有哪些?
答: IO线程报错的原因有两个,第一是指定主库信息时参数信息有误;第二是安全限制(firewall,selinux)
5.导致从服务器 SQL 线程报错的原因有哪些?
答:SQL 线程:执行本机中继日志文件里的 SQL 命令,把数据写进本机数据库里;
出错原因:一般是执行中继日志文件里 sql 命令用到的库或表在本机不存在;
修复 SQL线程:查看本机和主数据库服务器中的库和表使本机有主数据库服务器中的库或表
-
MySQL 主从同步延迟是怎么产生的?如何解决?
答:主从复制单线程,如果主库写并发太大,来不及传到从库,就会导致延迟;还有慢SQL语句过多,网络延迟,从库硬件较差都会导致数据同步延迟。解决:数据库前端加缓存层;使用更高版本的数据库支持多线程复制;使用多台slave来分摊读请求;提高硬件性能等
二、Mysql读写分离
1.原因:数据库的读取频率高于写入频率,单个数据库实例在写入的时候会影响性能
2.实现:主服务器负责增删改请求;从服务器负责读请求
3.工具:mysql-proxy、mycat、maxscale
三、Mysql数据分片
1.原因:关系型数据库本身比较容易成为系统瓶颈,数据切分的目的在于减少数据库的负担,缩短查询时间
2.实现:数据切分就是将数据分散存储到多个数据库中,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目地
3.方式:垂直切分;水平切分
4.Mycat(端口:8066)
1)mycat是基于java的分布式数据库系统中间件,为高并发环境的分布式存储提供解决方案,适合数据大量写入的存储需求
2)支持Mysql、Oracle、Sqlserver、Mongodb
3)分配规则:枚举法、固定分片、求模法…
4)工作过程:解析SQL命令涉及到的表,然后看对表的配置,如果有分片规则,则获取SQL命令里分片字段的值,并匹配分片函数,获得分片列表,然后将SQL命令发往对应的服务器去执行,最后收集和处理分片数据,将结果返回给客户端
四、MHA集群
1.介绍:MHA是一套优秀的实现Mysql高可用的解决方案,数据库的自动故障切换能做到在0-30s内完成,确保在故障切换过程中最大限度保证数据的一致性,以达到真正意义上的高可用
2.组成:MHA Manager管理节点、MHA Node数据节点
3.工作过程:由管理节点manager定时探测集群和总的master节点,当主节点故障时,管理节点自动将拥有最新数据的slave提升为新的主
4.MHA 集群中,配置 MySQL 主从同步时,你认为使用那种复制模式合理?
答:半同步复制;既提高了客户端的体验度,保证了至少有一个从库保存了主上的 binlog 日志文件在本机的中继日志上
五、PXC
1.介绍:是基于galera的mysql高可用集群解决方案
1.PXC 集群中有哪些端口,各种的作用是什么?
答:3306+4567 (数据库服务+集群通信)
2.PXC 集群与 MHA 相比较有哪些优点?
答:数据强一致性,无同步延迟;
多线程复制,部署使用简单;
没有主从切换操作,无需使用虚拟 VIP;
支持 INNODB 存储引擎;
支持节点自动加入,无需手动拷贝数据
六、Redis(6379)
3.关系型数据库:Mysql、MariaDB、Oracle、DB2、SQL Server
按照预先设置的组织结构,将数据存储在物理介质上,数据之间可以做关联操作
4.非关系型数据库(nosql):Redis、Memcached、MongoDB
不需要预先定义数据存储结构,每条记录可以有不同的数据类型和字段个数
5.redis是c语言开发的一个开源高性能键值对的内存数据库,是一种nosql数据库,性能优秀,数据在内存中,读写速度非常快;支持数据持久化,可以将内存中数据保存在磁盘中;可以做主从复制,哨兵,高可用
6.redis数据类型:字符串、散列(hash)、列表、集合、有序集合
7.redis数据过期处理:定期删除、惰性删除、内存淘汰机制
8.缓存雪崩:是指在某一个时间段,缓存集中过期失效,大量的请求都跳过缓存直接到数据库中 解决:不设置超时时间,避免过期;在失效时间上加随机的过期时间,避免集中过期;有相应的限流降级策略
9.缓存击穿:是指大量的请求集中对一个热点key进行访问,当这个key失效的瞬间,持续的大并发直接落到数据库上,就在这个key的点上击穿了缓存 解决:加互斥锁,避免大量请求同时打库;设置key不过期,更新时直接覆盖
10.缓存穿透:指缓存和数据库中都没有数据,而用户不断发起请求,这会给服务器带来很大的压力 解决:把空对象存到缓存中,并设置一个较短的过期时间;接口层增加校验;利用布隆过滤器
https://www.cnblogs.com/Fairy-02-11/p/6182478.html
http://blog.csdn.net/mishifangxiangdefeng/article/details/48977269
1.哨兵服务默认端口?
答:26379
2.集群通信默认端口?
答:16379
3.哨兵服务是如何工作的?
答:主库宕机后,会选举一台新的主服务器,客户端访问新的主服务器写入数据后,再重启原先宕机的主后会发现他自动成为当前新主的从服务器,并同步更新宕机后所写入的数据
4.你认为配置几台哨兵服务器比较合理,为什么?
答:通常哨兵配置数量为奇数;偶数投票表决时易出现平票,就有可能会出现双主,出现了双
主集群就崩了,所以不管怎么样只能同时有一个主存在
5.Redis 集群最低要求几主几从?为什么?
答:官方说明必须要三个 Master 节点和三个Slave节点;节点的有效性是靠会,50%的节点认为失效,就算失效。
6.简述redis集群原理和 hash 槽的作用?
答:在redis集群中,所有的redis节点彼此互联,节点内部使用二进制协议优化传输速度和带宽,当一个节点挂掉后,集群中超过半数的节点检测失效时才认为该节点失效;Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点。
-
redis集群的三种模式:
主从模式、sentine模式、cluster模式
8.什么情况下集群无法存/取数据?(默认 16 个数据库)
答:redis集群使用了主从复制模型,每个主节点都会有一个或多个从节点,在没有复制模型的情况下,如果某个主节点故障了,那么整个集群就会以为缺少某个范围的槽而不可用。
9.redis和memcached的区别
1)存储方式上:memcached把数据全部存在内存,断电即失效
2)数据类型上:memcached只支持简单的key-value,而redis支持5种数据类型
3)value大小:redis可以达到1GB,而memcached只有1MB
七、存储引擎
1.概念:数据库存储引擎是数据库底层软件组织,决定了一个数据库的性能效率
2.分类:MyISAM、InnoDB、Memory…
3.查看:show engines;
4.特点
MyISAM(5.5版本前默认):访问速度快,不支持事务和外键,适用于对事务的完整性没有要求的场景,在web、数据仓库中应用广泛
InnoDB(5.5后默认):支持事务和外键,相比于myisam,innodb写的处理效率差一点,并且会占用更多的磁盘空间来存储数据和索引,在计费系统、财务系统中应用广泛
Memory:是用保存在内存中的数据来创建表,默认使用hash索引,访问速度特别快,缺点就是数据库服务关闭,数据就会丢失,对表的大小也有限制
八、数据持久化
1.RDB:创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件;适合大规模数据恢复,对数据完整性要求不是非常高的场合;意外宕机时,丢失最后一次持久化的所有数据
2.AOF:追加方式记录写操作的文件,默认没有开启,可以灵活的设置持久化方式,意外宕机时仅可能丢失1s的数据;缺点:持久化文件的体积通常会大于RDB方式,执行fsync策略时的速度可能会比RDB慢
3.AOF写操作方式:
appendfsync always:时时记录,并完成磁盘同步
appendfsync everyses:每秒记录一次,并完成磁盘同步
appendfsync no:写入aof,,不执行磁盘同步
18:HTTP常见状态码?
500:服务器内部错误,因为服务器上的程序写的有问题,需要打开错误日志,查看日志,分析错误信息。
502:网关错误,服务器作为网关或代理,从上游服务器收到无效响应。Nginx出现最多,出现502要么是nginx配置的不对,要么是php-fpm资源不够,可以分析php-fpm的慢执行日志,优化php-fpm的执行速度。
503:服务器超载
504:网关超时,根据后端服务器实际处理情况,调整后端请求超时时间。
400:错误请求,服务器不理解请求的语法。这可能是用户发起的请求不合理,需要检查客户端的请求。
401:用户名或密码错误
403:服务器拒绝请求,禁止访问。检查服务器配置,是不是对客户端做了限制。
404:未找到请求的资源,页面不存在。检查服务器上是否存在请求的资源,看是否是配置问题。
414:请求数据包头过长
499:服务端处理时间过长,客户端主动关闭了连接,根据实际Nginx后端服务器的处理时间修改客户端超时时间。
301永久重定向 302临时重定向
nginx应用场景:
1.http服务器,可以做网页静态服务器
2.虚拟主机,可以实现在一台服务器虚拟出多个网站
3.反向代理,负载均衡
nginx中rewrite有哪几个flag标志位(last、break、redirect、permanent),说一下都什么意思?
last : 表示完成当前的rewrite规则
break : 停止执行当前虚拟主机的后续rewrite指令集
permanent : 返回301永久重定向,地址栏会显示跳转后的地址
redirect : 返回302临时重定向,地址栏会显示跳转后的地址
nginx反向代理模式(负载均衡策略)
1)轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2)权重:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3)ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4)fair(第三方):按后端服务器响应时间来分配,时间短的优先分配。
5)url_hash(第三方):按访问url的hash结果来分配请求,使同样的url定向到同一个后端服务器,后端服务器为缓存时比较有效。
常用的Nginx模块,用来做什么?
rewrite地址重写模块(缩短URL、隐藏实际路径提高安全性、易于用户记忆和输入、易于被搜索引擎收录)
access访问控制模块
ssl安全加密模块
ngx_http_gzip_module 网络传输压缩模块
ngx_http_proxy_module 代理模块
ngx_http_upstream_module定义后端服务器列表(用于定义可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来引用的服务器组)
Nginx 如何实现后端服务的健康检查?
方式一,利用 nginx 自带模块 ngx_http_proxy_module 和 ngx_http_upstream_module 对后端节点做健康检查。
方式二,利用 nginx_upstream_check_module 模块对后端节点做健康检查。
在proxy模块中你配置过哪些参数?
proxy_buffer_size 4k:设置缓冲区大小,设置的过小,可能会产生502错误
proxy_connect_timeout:设置服务器链接的超时时间,设置的太小,会报504错误
proxy_read_timeout 60配置在http,server,location,用于设置服务器读取应答内容的超时时间
为什么 Nginx 不使用多线程?
Nginx: 采用单线程来异步非阻塞处理请求(epoll),不会为每个请求分配 cpu 和内存资源,节省了大量资源消耗,同时也减少了CPU 的上下文切换。所以才使得 Nginx 支持更高的并发。
为什么Nginx性能这么高?
因为它用的是异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决请求,所以性能高
Nginx怎么处理请求的?
nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location
Nginx 如何实现页面的动静分离?
Nginx 可以使用 location匹配用户的请求,根据正则表达式(~*)判断用户访问的是静态页面还是动态页面
nginx安全?
1.修改版本信息,并隐藏具体的版本号:server_tokens off;
2.限制并发量:ngx_http_limit_req_module模块,可以有效降低DDOS攻击的风险
3.拒绝非法的请求:一般仅需要get和post
4.防止buffer溢出:
client_body_buffer_size 1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
nginx调优?
优化并发数量,设置worker_processes进程与CPU核心数一致
启用页面压缩功能,开启高效传输模式,设置连接超时时间
增加浏览器缓存机制
设计自定义报错页面
Nginx最大打开文件数,worker_rlimit_nofile 65535
Nginx采用epoll事件模型,处理效率高
fastcgi调优、内核参数优化等
lvs/nginx/haproxy优缺点
Nginx的优点是:
1、工作在网络的第7层,可以针对http应用做一些分流的策略,它的正则比HAProxy更为强大,
2、Nginx对网络稳定性的依赖非常小,安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来
3、可以承担高并发且稳定,负载度比LVS相对小些
4、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等,不过其中缺点就是不支持url来检测。
5、Nginx不仅仅是一款优秀的负载均衡器和反向代理软件,它同时也是功能强大的Web应用服务,LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好。
6、Nginx也可作为静态网页和图片服务器,还有Nginx社区非常活跃,第三方模块也很多
Nginx的缺点是:
1、Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点
2、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测,不支持Session的直接保持,但能通过ip_hash来解决
LVS:使用Linux内核集群实现一个高性能、高可用的负载均衡服务器,工作在第4层(也就是TCP/IP中的传输层),一般LVS都是位于整个集群系统的最前端,由一台或者多台负载调度器(DS)组成,分发给应用服务器(RS)。基于IP负载均衡技术的IPVS模块来实现的,它具有很好的可伸缩性、可靠性和可管理性
LVS的优点是:
1、抗负载能力强、工作在4层仅作分发用,没有流量的产生这个特点也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低,保证了均衡器IO的性能不会收到大流量的影响。
2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西所以并不需要太多接触,大大减少了人为出错的几率
3、工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案:LVS+Keepalived
4、工作在4层,应用范围较广,几乎可对所有应用做负载均衡
LVS的缺点是:
1、软件本身不支持正则表达式处理,不能做动静分离,现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在
2、如果是网站应用比较庞大的话,LVS实施起来比较复杂
HAProxy:HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
特点:
1、HAProxy也是支持虚拟主机的,HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导,同时支持通过获取指定的url来检测后端服务器的状态
2、HAProxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的
3、HAProxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡
HAProxy的负载均衡算法有4种:
①roundrobin,轮询,这个不多说,这个是负载均衡基本都具备的;
② static-rr,权重,建议关注;
③leastconn,最少连接者先处理,建议关注;
④ source,根据请求源IP
Keepalived的工作原理?
Keepalived是一个保证集群高可用的服务软件,用来防止单点故障,使用VRRP协议实现。在master和backup之间通过master主动降低自己的权值或者backup检测到master出现故障时,backup将会接管master的工作,继续服务。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式,vrrp模块是来实现VRRP协议的
LVS三种模式的工作过程?
LVS 有三种负载均衡的模式,分别是VS/NAT(nat 模式) VS/DR(路由模式) VS/TUN(隧道模式)
LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
LVS: 是基于四层的转发,只能做端口的转发
HAproxy: 是基于四层和七层的转发,是专业的代理服务器
Nginx: 是WEB服务器,缓存服务器,又是反向代理服务器,可以做七层的转发
工作选择:
HAproxy和Nginx由于可以做七层的转发,所以URL和目录的转发都可以做
在很大并发量的时候我们就要选择LVS,像中小型公司的话并发量没那么大
选择HAproxy或者Nginx足已,由于HAproxy是专业的代理服务器配置简单,所以中小型企业推荐使用HAproxy
什么是中间件?什么是jdk?
中间件是一种独立的系统软件或服务程序,是连接两个独立应用程序或独立系统的软件
分布式应用借助这种软件在不同的技术之间共享资源;jdk是Java的开发工具包
讲述一下Tomcat8005、8009、8080三个端口的含义?
8080一般应用使用
8005关闭时使用
8009为AJP端口,即容器使用,如Apache能通过AJP协议访问Tomcat的8009端口
tomcat优化?
修改tomcat最大线程连接数;tomcat内存优化,在启动时告诉JVM要多大内存
?
to mcat进程出现假死的情况
先排查假死时机器的负载,是否因为内存不足,cpu使用过高,或者磁盘问题等导致。临时解决办法是写个脚本监控tomcat进程状况和模拟用户访问web站点,当出现不正常时,重启tomcat。另外还需要写一个监控系统各个硬件状态的脚本,综合分析tomcat假死的原因,当然根据tomcat、系统相关的日志来获取一些信息也是非常有必要的。
Tomcat工作模式
Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, Nginx等;Tomcat作为独立服务器:请求来自于web浏览器;
Tomcat和Resin有什么区别,工作中你怎么选择?
区别:Tomcat用户数多,可参考文档多,Resin用户数少,可考虑文档少
最主要区别则是Tomcat是标准的java容器,不过性能方面比resin的要差一些
但稳定性和java程序的兼容性,应该是比resin的要好。工作中选择:现在大公司都是用resin,追求性能;而中小型公司都是用Tomcat,追求稳定和程序的兼容
使用nginx做负载均衡;后端一主一备;测试发现主正常的情况下,会有10%左右的流量访问备,请分析原因?
可能是nginx配置文件的max_fails(失败超过指定次数会暂停或请求转往其它服务器)太小
apache与nginx的区别?
1)nginx 轻量级,同样web 服务,比apache 占用更少的内存及资源 抗高并发能力大约是apache的10倍以上,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
2)nginx的静态处理性能力比apache强,nginx处理动态不行,一般动态请求要apache去做,nginx只适合静态和反向,
3)核心区别,apache是同步多进程,一个连接对应一个进程,nginx是异步的,很多个连接可以对应一个进程
网站做了负载均衡,发现有些用户访问的时候经常需要重新登录是什么原因?
这是因为session没有会话保持,用户登录后,他的请求被分发到了另外一台服务器上。本来已经在A服务器上保存了session,可下次访问到了B服务器,而B服务器又不存在刚才保存的session信息,所以就会显示未登录。要解决这个问题很容易,做一个会话保持。比如可以设定1小时内用户的请求固定在一台服务器上。如果是nginx也可以设置ip_hash。当然最好的解决方案是,使用redis存取session,实现session共享。
Markdown比较乱,可以先看这个word文档。