一、ElasticStack
1.什么是ELK?分别代表啥意思?ELK为啥更名为ElasticStack?
sh
ELK: ElasticSearch Logstash Kibana
ElasticSearch 用来存储存储日志、检索日志
ES是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心。
Logstash 数据的采集与转换
能够从多个来源采集数据,转换数据,然后将数据发送到es数据库中。
Kibana 数据的查询与可视化
ElasticStack包括Elasticsearch、Kibana、Beats和Logstash(也称为 ELK Stack)
随着elk的发展,又有新成员Beats、elastic cloud的加入,所以就形成了Elastic Stack
2.ElasticSearch监听的端口
01. 9200/http|https
es对外提供的访问端口
02. 9300/tcp
es集群内部数据传输的端口
3.ELK数据流走向是如何的?
sh
Filebeat采集日志到Logstash处理后,写入es集群,再通过kibana展示
多个业务(nginx、tomcat)-->filebeat-->logstash-->es-->kibana
业务多时,都到Logstash进行处理,导致logstash压力过大
于是改为
eflk+kafka
数据流走向: 源数据层(nginx,tomcat) ---> 数据采集(filebeat) ---> 数据缓存层(kafka)---> 转换层(Logstash) ---> 数据存储层(ElasticSearch)-->数据展示层(Kibana)
4.你们kibana都展示哪些数据呀?
展示pv,uv,IP统计,流量带宽统计,还有开发人员二次开发的数据,用户粘性,比如用户在线时间,用户画像占比,平台用户,黑名单总计,反作弊日志,鉴权日志分析等....
5.你们架构有用到kafka?
sh
了解过kafka的一些技能 消息中间件,用于缓冲数据
kafka是一个高性能、低延迟、分布式的消息传递系统,可以处理大量的实时数据。一般用作日志收集
6.logstash从kafka拉取数据延迟如何解决?
可以启动多个logstash将其加入同一个消费者组,来共同消费数据,从而解决延迟的问题
7.filebeat采集日志4-5点的时候,filebeat服务挂掉,5点之后恢复,请问如何采集到4-5点的数据呢?
找到filebeat的data目录,基于时间找到4点的offset和5点的offset,将这两个时间点offset的偏移量读出来即可。
8.elasticsearch集群颜色有几种,分别代表什么意思?
红色 代表部分主分片无法访问
黄色 代表部分副本分片无法访问
绿色 集群处于健康状态,主分片和副本分片均可以正常访问
二、docker
1.你在工作中使用过docker吗?常用命令有哪些?
使用过,docker pull
01.docker镜像管理
docker pull
docker push
docker image ls/images
docekr tag
docker save 保存镜像为tar
docker load 加载镜像
docker rm 删除镜像
docker inspect 查看镜像详细信息
02.docker容器管理
docker ps/ls/list 列出所有正在运行的容器
-l 最近一个启动的容器
-a 所有的容器
-q 列出正在运行容器的id
-s 容器产生的数据大小,多一个size字段
docker run
docker exec
docker logs
docker inspect
docker stats 查看容器运行状态
docker top 查看容器进程状态
2.你在工作中使用过dockerfile吗,简述一下你使用过的指令以及作用。
sh
dockerfile基于配置文件自动构建镜像
FROM 指定需要构建的基础镜像
RUN 在容器中运行的命令
COPY 将宿主机的文件拷贝到容器中,容器目录不存在会自动创建,不会解压tar包
ADD 将宿主机的文件拷贝到容器中,容器目录不存在会自动创建,可以解压tar包文件并删除源文件
ENV 将变量传递给容器,容器运行时会有该变量
ARG 在编译阶段生效的变量,编译结束,变量也不存在了
LABEL 为镜像打标签,基于key=value方式
CMD 容器启动时默认的命令,如果用户启动容器另外指定了command命令,则cmd命令会被覆盖。
使用docker ps -l 查看command使用的命令
ENTRYPOINT 容器启动时默认的命令,无法被替换。如果用户启动时指定了command命令,则command会作为参数传递给该指令,当CMD和ENTRYPOINT指令结合使用时,CMD将作为参数传递给ENTRYPOINT
EXPOSE 暴露端口
USER 指定容器运行的用户,不指定默认root
WORKDIR 指定容器的工作目录,当连接容器时,就会切换到该目录,不指定默认在/目录
VOLUME 将指定的路径进行持久化,会产生随机存储卷
dockerfile打包命令:
docker build -t 镜像名 Dockerfile路径
docker build -t harbor.liux.com/liux/nginx:v1 .
docker push harbor.liux.com/liux/nginx:v1
#如镜像仓库为私有,需要登录后再推送
docker打包的几种方式
01 docker commit -a 'liux' -m '修复bug' 容器id 镜像名
[root@docker01 ~]# docker commit -a 'liux' -m 'add 1' 2f877f72a2fd liux-games:v0.2
02 docker 导入导出
docker export -o nginx.tar.gz 2f877f72a2fd
docker import nginx.tar.gz nginx:1.20.1
03 docker镜像save/load
docker save -o "alpine-latest.tar.gz" alpine:latest
docker load -i alpine-latest.tar.gz
3.请简述一下dockerfile的优化思路
遵循构建的镜像尽可能小,编译速度尽可能快的原则
编译速度 充分利用缓存 使用国内镜像源 忽略无用的文件".dockerignore"
镜像体积 使用较小的基础镜像 删除无用的缓存 卸载无用的软件包
4.一个DOCKER中可以写几个FROM指令?
多个,使用多阶段构建镜像
使用多阶段构建镜像可以减小镜像大小、提高构建速度
5.docker单机的网络类型有哪些?
5种
none 只有本地回环网卡,没有其他网络,即容器不能上网
host 使用宿主机的网络名称空间,效率高,端口可能冲突
bridge 桥接网卡,相当于NAT网络,会产生一块新的网卡,生产一对设备对,一端在容器,一端在宿主机
container 和指定的容器共享网络名称空间
custom network 自定义网络
6.docker底层是如何实现的,用到了哪些linux内核特性?
底层使用linux的四个技术,chroot,namespace,cgroup,OverlayFs
chroot:改变某进程的根目录,使程序不能访问该目录之外的其他目录。
namespace:是linux系统提供的一种资源隔离机制,使容器中的进程都可以在单独的命名空间中运行,并且只可以访问当前命名空间中的资源。namespace可以隔离进程ID、用户ID、文件系统、网络名称空间和进程间通信等相关资源。
cgroup:可以限制和隔离进程的资源使用情况,比如CPU、内存、磁盘I/O、网络等。
OverlayFs:是一种堆叠文件系统,它依赖并建立在其他文件系统之上(ext4、xfs),并不直接参与磁盘空间结构划分,将原来系统文件中的文件或目录合并在一起,最后向用户展示的文件是在同一级的目录,这就是联合挂载技术。
7.docker swarm有了解过吗?
sh
了解过一点
docker swarm是docker官方轻量级集群编排工具,自docker被收购之后,中心不放在此处,而是放在kubernetes。
8.docker监控如何做的?
使用cAdvisor容器进行监控,使用prometheus采集数据,结合grafana展示数据
cAdvisor让容器用户了解容器的资源使用情况和性能特征。用于收集、聚合、处理和导出有关正在运行的容器的信息。它为每个容器保存资源隔离参数、历史资源使用情况、完整历史资源使用直方图和网络统计信息。
简而言之:对容器进行实时监控和性能数据采集,包括CPU、内存、网络、文件系统等资源的使用情况。
9.harbor仓库是如何搭建高可用的?
两种方式
第一种:多个harbor共享存储卷的方式,比如共享存储nfs,对nfs进行备份,采用keepalived配置高可用
第二种:提供复制规则,同步镜像,复制规则在harbor页面进行配置
10.docker-registry迁移到harbor是如何做的?
1.利用harbor页面配置复制规则进行迁移
2.写脚本批量推送
先拉取docker-registry中的镜像,再打标签,然后推送到harbor仓库中
注意:
docker registry打tag时,需要多打一层项目目录,否则harbor迁移docker registry时会失败!
11.docker如何控制一组容器的运行?
docker-compose 批量管理一组容器的方法
docker-compose up -d 创建并启动容器
docker-compose down -t 1 一秒后停止容器
12.docker的存储卷是如何管理的?
sh
docker volume ls 查看存储卷列表
docker volume create liux 创建存储卷
docker volume inspect liux 查看liux存储卷详细信息
docker volume prune -f 清除未使用的存储卷
docker volume rm liux 删除指定的存储卷
docker volume rm `docker volume ls -q` 删除所有存储卷
13.docker如何创建自定义网络的?
sh
docker network ls
docker network create
docker network inspect
docker network prune -f
docker network rm
docker network connect 连接到网络
docker network disconnect 断开网络
14.如果docker正常运行,在宿主机也可以正常访问,但是Windows访问不了该如何解决?端口映射没问题,也监听了端口,服务正常运行,但是就是访问不到?请说一下排查思路?
sh
先检查路由转发功能ipv4_forword参数是否为1?
检查Windows和宿主机网络是否能ping通?
检查iptables规则是否有效?
查了容器日志?
通过抓包工具(tcpdump,wireshark)观察数据是否能到达该接口?
15.docker容器和虚拟机的区别?
sh
docker是一个开源的容器化平台,它可以让开发者将应用程序和依赖打包到容器中,以实现在不同环境快速部署和运行的目标。
容器和虚拟机都提供了隔离和封装应用程序的方法,但他们也存在一些重要区别。
虚拟机是通过虚拟化技术模拟的一个完整的操作系统,而容器只是使用操作系统的内核,并添加必要的文件系统和库来运行应用程序。
容器比虚拟机更轻量级、启动更快、占用更少的资源,更易于管理。
三、kubernetes(k8s)
1.k8s常用的一些命令
sh
查看所有的资源
kubectl api-resources
查看某个资源的文档帮助信息
kubectl explain
查看某个资源的详细信息
kubectl describe
连接容器
kubectl exec
更新、创建资源
kubectl apply -f
删除资源
kubectl delete
查看资源 --show-labels
kubectl get
查看某个资源的日志信息
kubectl logs
拷贝文件
kubectl cp
声明式标签管理
kubectl label
2.k8s的资源
1.namespace 名称空间名是用来隔离K8S集群的资源
kubectl get namespaces 查看名称空间
kubectl get pods -n kube-system 查看指定名称空间的资源
kubectl get pods -A 所有名称空间的pod资源
2.ConfigMap 企业常用于配置文件的场景 比如nginx.conf挂载到容器中
3.Secret 存储敏感数据,数据都是警告base64进行编码 k8s资源登录harbor私有仓库可配置secret资源
4.存储卷
本地存储卷
emptyDir 同一个pod多个容器共享数据、临时持久化
hostPath pod访问宿主机文件
网络存储卷
nfs pod跨节点共享数据
ceph 分布式文件系统,解决单点故障
k8s资源的存储卷
cm:用于存储程序的配置文件
secret:存储敏感数据
5.pod重启策略 Pod的spec中包含一个restartPolicy字段
Always:
容器退出时,始终重启容器(即创建新容器),默认策略。
Never:
容器退出时,不重启容器(即不创建新容器)。
OnFailure:
当容器异常退出时(kill -9时容器的退出码非0,貌似是137),重启容器(即创建新容器)。
当容器正常退出(docker stop,退出码为0)不重启容器。
6.探针
启动探针(StratupProbe)优先执行,探测成功后在执行健康状态检查(livenessProbe)与 可用性检查(readinessProbe)
启动探针仅在容器启动阶段,检测容器内的应用是否已经成功启动并完成初始化。
就绪探针(readinessProbe):检测容器是否已经准备好对外提供服务。
存活探针(livenessProbe):检测容器内主进程或服务是否正常运行。
7.service 用于服务发现和负载均衡
基于labels标签关联后端得pod,以实现后端节点得动态发现,从而管理endpoints资源
负载均衡,底层借助于kube-proxy组件实现
ClusterIP:k8s集群内部访问
NodePort:k8s集群外部访问。底层是在clusterIP的基础上监听所有worker节点的端口
LoadBalancer:云环境的k8s
8.endpoints 一般用于映射k8s外部的服务
用来记录一个service对应的所有pod的访问地址,它是根据service配置文件中selector描述产生的。
service和pod之间的联系是通过endpoints实现的
每创建一个service,k8s会自动创建一个同名的 Endpoint出来
会关联一个同名的svc资源,当svc资源删除时,会删除同名的ep资源
9.deployment 用于部署服务的资源
管理RS,通过RS资源创建Pod
具有上线部署,副本设置,滚动升级,回滚等功能
提供声明式更新,即可以使用apply命令进行更新镜像版本之类的
10.daemonset
可以将每个节点都部署一个Pod,可以让每个节点有切只有一个。
11.pod调度
01 污点
PreferNoSchedule 该节点可以接受调度,只是有该污点的该节点的调度优先级降低
NoSchedule 该节点不再接收新的pod调度,但不会驱赶已经调度到该节点的pod
NoExecute 该节点不会接收新的pod调度,会立刻驱逐已经调度到该节点的pod
02 tolerations 污点容忍
如果想要把Pod调度到存在污点的节点,需要容忍该节点的所有污点
03 nodeSelector 节点选择器
给pod节点打标签,讲pod调度到指定标签的节点
04 亲和性 affinity
节点亲和性(nodeAffinity):控制pod调度到哪些worker节点,基于标签匹配
pod亲和性(podAffinity):会基于标签匹配该标签的所有拓扑域的节点 允许pod调度到同一个拓扑域
Pod反亲和性(podAntiAffinity):调度过的节点不会再调度同样的服务 不允许调度到同一个拓扑域
12.持久卷
pv 关联后端存储卷
pvc 关联pv 在pod中引用pvc
13.动态存储类 storageclasses
根据需要自动创建pv,pvc直接向sc申请pv的使用空间,pod中只需要引用sc的名称即可
14.sts
一般用于有状态服务,有序的启动pod,提供独立存储,网络的唯一标识
15.ingress 七层协议,能解析应用层的域名协议
ingress是运维人员定义的一系列访问规则,交给api-server执行,api-server会存储到etcd集群中
ingress-controller是第三方插件,去api-server中读取数据,解析ingress定义的规则,根据解析的域名关联后端的svc,svc自动关联后端的pod。ingress-controller会监听80端口
16.metric-server
从kubelet采集数据,并整理为api-Server提供的格式化数据,以供'kubectl top'和HPA使用
HPA根据cpu使用情况,自动伸缩pod个数
17.RBAC 权限访问控制
角色
Role:局部资源角色,属于某个名称空间
ClusterRole:全局资源,属于整个k8s集群
主题
User:一般作用于人,比如给某个开发者授权
ServiceAccount:一般作用于程序,提供给pod使用
Group:一般作用于组,多人协同使用
角色绑定
RoleBinding:将Role和主题进行绑定
ClusterRoleBinding:将ClusterRole和主题进行绑定
3.简述一下k8s架构?
sh
k8s是一个开源的容器编排工具,用于自动化部署、扩展和管理容器化的应用程序。
k8s是属于主从架构模型,master节点负责集群的管理、调度和运维,node节点是集群中的工作负载节点。
master节点又叫控制面板controller plane,master节点中有api-server、etcd、scheduler、controller manager。
api-server是集群的统一入口,负责接收、处理k8s的所有请求,然后提交给etcd存储。
etcd存储api-server的所有请求数据。
scheduler负责pod调度到哪个节点。
controller manager 是集群内部的管理控制中心,负责管理和运行不同的控制器,确保整个集群处于正常工作状态。实现对集群内的node、pod等所有资源的管理。当node节点运行的pod对象或者node自身发生意外或故障时,controller manager会及时发现并处理,确保整个集群处于正常工作状态。
worker node节点:kubelet、kube-proxy
kubelet是node节点的监视器,与master节点的api-server通信,上报node节点的服务状态。
kube-proxy负责pod节点的访问路由,用于服务对外提供访问。
2.k8s创建pod的工作流程
sh
(1)用户使用kubectl工具向API Server发起创建Pod资源对象的请求。
(2)API Server验证请求并将其持久保存到Etcd集群中,API Server基于Watch机制通知kube-scheduler调度器。
(3)kube-scheduler调度器根据预选和优选调度算法为Pod资源对象选择最优的节点并通知API Server。
(4)API Server将最优节点持久保存到Etcd集群中,并通知最优节点上的kubelet组件。
(5)kubelet组件在所在的节点上通过与容器进程交互创建容器,并将容器状态上报至API Server。
(6)API Server将容器状态持久保存到Etcd集群中。
3.pod的生命周期

Pod的运行过程中每个时间段会有不同的程序在运行,我们把它叫做Pod的生命周期
首先是Pause基础容器,为我们准备存储卷,网络等功能。
然后是初始化容器,做一些前置动作。
最后才是主容器,在主容器中会有两个钩子函数,一个容器启动后运行的PostStart,一个是容器终止前钩子PreStop。主容器运行过程中会有三种探测,启动探针(StratupProbe)优先执行。探测成功后在执行健康状态检查(livenessProbe)与 可用性检查(readinessProbe)。
4.影响pod调度策略有哪些?
sh
01. nodeName 直接指定节点名称
02. nodeSelector节点选择器
# 基于节点的标签进行调度,将Pod调度到包含key为type,value为ssd的节点上。
nodeSelector:
type: ssd
03. nodeAffinity 节点亲和性
与nodeSelector作用一样,但相比nodeSelector更灵活,能满足更多条件,不只是字符串的完全相等,支持的操作符有:In、Notln、Exits、DoesNotExist、Gt、Lt;
04. podAffinity pod亲和性与podAntiAffinity pod反亲和性
05. taints(污点)
给节点打污点,通常作用在worker节点上,其可以影响Pod的调度
06. tolerations(污点容忍)
容器污点,一个Pod调度到指定节点时,它必须容忍该节点的所有污点。
07. 资源限制
08. daemonset控制器
可以将每个节点都部署一个Pod,可以让每个节点有且只有一个。
DaemonSet确保全部worker节点上运行一个Pod的副本。
5.k8s外部访问pod有哪些方式?
sh
01. hostNetwork:true
注意:每次pod的IP是会变化的
02. hostPort
pod内部端口映射到部署pod的主机上,外部访问通过主机IP+端口 直接访问pod
直接将容器的端口与所调度pod的节点主机上的端口路由,外部直接用主机ip+端口访问
03. nodePort
NodePort 访问方式,集群内任意node的ip+NodePort端口号,即可访问
K8s里一个广泛应用的服务暴露方式,kube-proxy会自动将流量以轮询的方式转发给该service的每一个pod
04. LoadBalancer
只能在service上定义,是公有云提供的负载均衡器
05. ingress
ingress 生产环境建议使用,作用与nginx类似,需要部署一个ingress-controller的服务,该服务使用以上几种方式提供集群外的访问;再根据业务配置路由规则,访问集群内的其它服务
ingress controller是由K8s管理的负载均衡容器,它的镜像包含一个nginx或HAProxy负载均衡器和一个控制器守护进程
6.在k8s集群外部,突然无法访问pod,请说一下排查思路?
根据业务的数据流走向逐一排查,比如访问k8s前面的LB,先检查流量是否能够到达LB,如果LB能够正常访问且处于正常工作状态,再检查后端的ingress,若正常再检查svc,查看svc的ep资源列表是否有pod列表,如果没有,则说明可能pod处于不健康状态,检查pod的运行情况。
7.svc的类型有哪些?
sh
01. ClusterIP
默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP
02. NodePort
在ClusterIP基础上为service在每台机器上绑定一个端口,通过nodeport端口来访问服务
03. LoadBalancer
在 NodePort 的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到NodePort,用于公有云环境的服务暴露。
04. ExternalName
用于将K8S集群外部的服务映射至K8S集群内部访问,让集群内部的Pod能够通过固定的service名称访问集群外部的服务。有时候也用于将不同namespace之间的pod通过ExternalName进行访问。
# 指定外部域名 externalName: www.baidu.com
8.如何扩容和缩容k8s集群
01. 扩容
以kubeadm为例,扩容节点join命令即可。
02. 缩容
先将节点标记为cordon停止调度,drain 驱逐节点,或给节点打污点并立刻驱逐ds资源的pod,删除节点,给删除的节点重新安装操作系统。
9.Jenkins如何集成k8s?
sh
开发人员将代码推送到gitlab,Jenkins通过在触发器中设置webhook拉取gitlab代码到本地,并编译镜像推送到harbor仓库,k8s使用deployment更新镜像即可。
10.如何收集k8s集群日志?
sh
01. 业务容器直接将日志写入kafka集群,用户从kafka集群拉取数据并写入es,再通过kibana展示。
02. 部署一个边车容器(sidecar),该容器和业务容器共享网络空间和存储空间,通过共享存储将日志采集并推送到kafka集群,用户从kafka集群拉取数据写入es,通过kibana展示。
03. 使用ds资源在每个业务容器部署一个filebeat,将所有的日志采集并写入kafka集群或es,再通过kibana展示。
11.如何监控k8s?
使用prometheus的operator开源组件监控kubernetes集群。Prometheus可以收集和查询Kubernetes API服务器上的监控数据。
监控指标:Node监控、pod监控
01.node监控:内存大小、cpu、分区使用、磁盘I/O、网络流量
02.pod监控:Pod内存使用率、CPU利用率、文件系统使用量等
12.你们公司kubernetes用的是哪个版本?多少个节点?
我们公司用的是k8s1.15.12版本,20个节点。3个master复用。基于二进制的方式部署。用的网络插件式flannel,calico。
13.pod的五种状态
sh
pending api对象已被创建并保存在etcd中,但pod没有被成功调度,常见原因比如某个容器没有启动成功。
running 已经成功调度,正常运行
succeeded pod的所有容器都正常运行成功并退出了,一般一次性任务最为常见
failed 至少有一个容器以不正常的状态退出,查看日志排查原因
unknown 异常状态,pod的状态不能被集群检测到,很有可能是主从节点之间的通信出现了问题。
14.你用的flannel是哪个工作模式?flannel的底层原理如何实现数据报文转发的?
使用的是flannel的CNI组件,该组件使用的是官方默认的VXLAN模式。
CNI是一种规范,用于定义容器运行时和网络插件之间的接口,以实现容器网络的配置和管理
数据报文转发是先经由容器的网卡,流经flannel网卡,再通过宿主机网卡转发到其他主机的过程。
15.k8s集群的优化
sh
1. 内核参数调优
01 fs.file-max=1000000
# max-file 表示系统级别的能够打开的文件句柄的数量, 一般如果遇到文件句柄达到上限时,会碰到"Too many open files"或者Socket/File: Can't open so many files等错误。
02 net.ipv4.neigh.default.gc_thresh1=1024
# 配置arp cache 大小
# 存在于ARP高速缓存中的最少层数,如果少于这个数,垃圾收集器将不会运行。缺省值是128。
03 net.ipv4.neigh.default.gc_thresh2=4096
# 保存在 ARP 高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字 5秒.缺省值是 512。
net.ipv4.neigh.default.gc_thresh3=8192
# 保存在 ARP 高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行.缺省值是1024。
以上三个参数,当内核维护的arp表过于庞大时候,可以考虑优化
2. etcd优化
01 搭建高可用的etcd集群,集群规模增大时可以自动增加etcd节点。使用etcd operator来搭建集群
02 配置etcd使用ssd固态盘存储
03 增大etcd存储限制
04 配置单独的etcd集群存储kube-apiserver的event
3. api-server优化
01 实现高可用 启动多个kube-apiserver实例通过外部lb实现高可用,或者设置 --apiserver-count 和 --endpoint-reconciler-type ,可使得多个 kube-apiserver 实例加⼊到 K ubernetes Service 的 endpoints 中,从⽽实现⾼可⽤
02 控制连接数
4. pod优化
01 为每个容器设置资源限制
02 负载均衡,确保请求被均衡到不同的pod上
03 监控,使用prometheus监控pod,以便快速发现问题
四、nginx面试题
1.什么是nginx?
nginx是一个轻量级/高性能的反向代理web服务器,用于http、https、SMTP、POP3和IMAP协议.他可以实现负载均衡,可以处理2-3万的并发连接数,官方检测能支持5万并发,现在使用nginx网站用户有很多,比如:新浪、网易、腾讯等。
2.nginx有哪些优点?
sh
01. 跨平台、配置简单
02. 非阻塞、高并发连接:可以处理2-3万并发连接数
03. 内存消耗小,开启10个nginx才消耗150M内存
04. 成本低且开源
05. 稳定性高,宕机的概率非常小
06. 内置有健康检测功能
3.nginx应用场景?
01. http服务器
02. 虚拟主机:可以实现在一台服务器上虚拟出多个网站
03. 反向代理、负载均衡:搭建多台服务器集群时,可以使用nginx做反向代理,多台服务器可以平均分担负载
4.nginx反向代理
反向代理是一种代理服务器的配置模式,它代表服务器向客户端发送请求,客户端发送请求到反向代理服务器,然后反向代理服务器将请求转发到后端真实的服务器上,并将响应返回给客户端。
简单来说就是用户直接访问反向代理服务器就可以获得目标服务器的资源。
五、MySQL数据库
1.SQL语句的优化
1.1 适合临时紧急场景处理
sh
01 以间隔1秒连续执行,查找慢语句
show full processlist
mysql -uroot -p12366 -e "show full processlist |egrep -vi sleep"
02 杀死前面一些慢语句
mysql> kill id
03 使用explain检查,找到慢语句的索引执行情况
explain select * from test where name="liux"\G;
04 根据返回结果,对需要创建索引的列创建索引
alter table test add index index_name(name);
生产环境,高峰期尽量不要在大表中创建索引
05 创建索引无效,怎么处理
使用use index强制
1条长SQL无法使用索引,能不能变成两条短的SQL语句分别使用索引
子查询变为join查询
对SQL功能拆分和修改
无法使用索引的,可以考虑数据库前端增加redis
1.2 日常慢SQL语句的优化
sh
01 分析慢查询SQL语句记录到日志,然后开启定时任务分析慢查询日志
配置参数记录慢查询语句
long_query_time=2
log_queries_not_using_indexes
log_slow_queries=/data/3306/slow.log
min_examined_row_limit=1000
02 按天切割慢查询日志,并发太大可以按小时,去重分析后发给开发或dba
03 使用慢查询日志分析工具分析
mysqlsla
pt-query-digest
2.MySQL5.7和8.0 用户管理区别
sh
5.7
01 创建用户和授权可以一条命令,也可分开两条
grant all on *.* to liux@'10.0.0.%' identified by '12366';
02 也可以分两条
create user liux@'%' identified by '12366';
grant all on *.* to liux@'%' with grant option;
03 加密插件
mysql_native_password
8.0
01 创建用户和授权只能分开
create user liux@'%' identified by '12366';
grant all on *.* to liux@'%';
02 加密插件
caching_sha2_password
03 8.0兼容5.7加密插件配置
create user liux@'%' identified with mysql_native_password by '12366';
04 增加了可以锁定用户的功能
3.MySQL授权表有哪些?
sh
01 *.*级别 mysql.user存放全局授权
02 liux.*级别 mysql.db存放的是单库范围内的授权
03 liux.test mysql.tables_priv存放的是单表范围内的授权
4.MySQL忘记root本地密码怎么重置?
sh
使用 --skip-grant-tables 跳过授权表的方式启动,重置密码,然后重启数据库
5.你们公司使用多实例吗?
sh
物理机上都有用
业务量/并发量较小的业务
测试环境大量使用
多实例可以有效节约服务器资源
6.如何查看数据库当前连接情况
sh
mysql> show processlist;
mysql> show full processlist;
[root@db01 ~]# mysql -e "show full processlist;" |egrep -iv 'sleep'
[root@db01 ~]# mysqladmin processlist
7.数据库不能启动,如何排查?
sh
查看启动日志
8.简述一条select语句的执行过程
sh
01 连接器 与客户端通信,连接到服务端,接收传送的SQL语句,并进行登录权限验证,授权权限检查。
02 查询缓存 8.0已经取消,缓存没有,再到解析器,有就返回客户端。
03 解析树 对语义和语法进行检查,生成解析树,并生成执行计划,到达预处理器。
04 预处理器 对语句进行执行前的预处理,验证语义列名是否有权限,并重新生成解析树和执行计划。
05 优化器 根据多种执行计划,选择最优的方案,判断是否走索引。
06 执行器 选择最优的执行计划,调用引擎API,执行SQL语句,最终返回结果。
MySQL结构 连接层 SQL层 存储引擎层
首先与客户端进行通信,连接到服务端,接收发送的SQL语句,并进行登录权限验证。其次是对SQL语句的语义和语法进行检查,生成解析树和执行计划,到达预处理器。然后对SQL语句进行执行前的预处理,验证语义列名是否有访问表的权限,并重新生成解析树和执行计划。根据多种执行计划,选择最优的方案,判断是否走索引。最后调用引擎API,执行SQL语句,返回结果。
9.简述MySQL逻辑结构和宏观物理结构
逻辑结构
实例
库: 库名/库属性(字符集,校对规则)
表:列(列名、列属性)+行(元数据)+表属性+表名
物理结构
库对应数据库库名目录
innodb:ibd、frm、ibdata、ibtmp、undo、redo、ibd、dwb
逻辑结构包括数据库、表、数据
物理结构包括磁盘、文件、页
10.请简述段、区、叶的构成
一个表就是一个段,一个段由多个区构成
一个区由连续64个页构成,每页16k
11.你们公司用的MySQL版本,为什么选择
5722/5730 即将过时
8.20/8.22/8.26 即将主流
尽量选择 双数、GA稳定版
12.简述SQL_MODE的作用
sql_mode是对sql语法控制和校验的一套规则
13.请简述drop table 、truncate table、delete from table的区别?
drop 删除表结构和表数据,会立即释放磁盘空间,速度比truncate慢
truncate 删除表数据,不会删除表结构,会立即释放磁盘空间,速度快
delete 逐行删除、逻辑删除表数据,不会删除表结构,不立即释放磁盘空间,速度慢,可以回滚
14. 如果要你规划一个10亿的大表,你有什么好的方案?
考虑索引应用、存储问题
分区表
归档表
分布式架构按行拆分
15.如果这张10亿单表已经存在了,想要删除1000W数据如何处理?
使用pt-archiver工具分批缓慢删除
写个脚本夜里分批删除
16.MySQL为什么选择Btree查找算法
sh
btree算法擅长范围查询,innodb就是采用btree算法建立的索引
17.MySQL索引算法演变: B-tree、B+Tree、B*Tree的区别?
B-TREE 叶子节点和枝节点均无双向指针
B+TREE 叶子节点双向指针
B*TREE 枝节点双向指针
18.MySQL如何构建B+Tree
sh
01 MySQL如何构建B+Tree
叶子节点:数据排序后生成叶子节点,建立双向指针
枝节点:提取叶子节点的数据范围+指针(指向叶子节点),建立双向指针
根节点:提取枝节点的数据范围+指针(指向枝节点)
02 聚簇索引如何构建B+Tree?
叶子节点:聚簇索引在存储表数据时,已经按照主键id排序,然后有序存储数据到各个连续的数据页中,叶子节点存储的就是真实数据
枝节点:存储的是叶子节点id范围+指针信息
根节点:枝节点id范围+指针
注意:只能优化基于id作为条件的查询,索引单纯使用id列查询,很局限
03 辅助索引如何构建B+Tree?
叶子节点:从数据中取出id和辅助索引列,按照辅助索引列排序后均匀存入连续的数据页中,建立双向指针
枝节点:提取叶子节点辅助索引列数据范围+指针
根节点:提取枝节点辅助索引列数据范围+指针
注意:如果查询条件使用了辅助索引列,都会先扫描辅助索引,获得id值,再回到聚簇索引(回表),按照id列进行聚簇索引扫描,最终获取数据行。
04 联合索引 对多列创建索引 按照最左列原则,连续存储到叶子节点
19.什么是回表,如何减少回表?
sh
回表:通过辅助索引列,拿到主键值,然后回到聚簇索引树查询完整的数据过程
回表的影响:增加磁盘IO,而且是随机IO
减少回表:
建立合适的联合索引
尽量用等值查询,如果范围查询,则范围尽可能小
使用索引优化器 比如ICP索引下推,MRR多范围读取操作
20.索引有哪些自优化能力?
AHI(工作于内存中) 自适应哈希索引
change buffer 更新的辅助索引缓存
ICP 索引下推优化
在辅助索引阶段,把没有走索引的条件,推到存储引擎层过滤,获取更少的主键值,再回表减少IO。
MRR 多范围读取优化
把在辅助索引阶段获取的主键值排序,然后再回表查询
21.你在备份这块都做过哪些工作?⭐️⭐️⭐️
1. 备份策略
30G以内,按天,mysqldump备份 binlog保存3-7天
30G-200G 按天 xtrabackup物理备份 binlog保存3-7天
>200G 按周 xtrabackup物理备份+增量备份 binlog保存7-15天
主从复制备份,解决物理损坏问题的数据恢复
延迟复制备份,解决逻辑问题导致的所有数据库数据丢失的恢复
2. 写备份脚本进行定时备份
3. 定期进行备份检查
4. 定期进行备份恢复演练
5. 实际恢复
主从复制恢复最快
xtrabackup物理恢复很快
mysqldump数据恢复很慢
延迟复制恢复
6. 数据库版本升级
本地升级(inplace)
迁移升级(merging)
22.请简述mysqldump备份原理
mysqldump是逻辑备份:将建库、建表、数据插入语句导出,转存到sql文件中,来获取表的数据
mysqldump -uroot -p12366 -h10.0.0.51 -A >all_database.sql
mysqldump -uroot -pliux12366 --master-data=2 --single-transaction -A -B|gzip >/tmp/bak.sql.gz
恢复:
mysql> source /database_backup/all_database.sql;
[root@db01 ~]# mysql -uroot -p12366 -h10.0.0.51 </database_backup/all_database.sql
23.请简述 xtrabackup工具的备份原理⭐️⭐️⭐️⭐️
sh
xtrabackup是物理备份:针对数据文件进行备份(实质拷贝的是数据页)
1.兼容性检查
2.启动redo后台备份线程,监控redo log的变化,从最近一次数据页LSN的位置开始备份所有增量的redo log日志。
3.加载所有的innodb表空间,备份innodb所有表
4.全局锁表 flush tables with read lock
5.备份非innodb表
6.记录binlog当前的GTID信息
7.停止redo备份线程
8.释放锁资源,备份结束
首先会进行兼容性检查,然后开启后台备份线程,实时检测redo的变化,一旦发现有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中,之后复制innodb的数据文件一系统表空间文件ibdatax,复制结束后,将执行flush tables with readlock,然后复制.frm MYI MYD等文件,最后执行unlock tables,最终停止xtrabackup_log
备份语句:
#全备
[root@db01 ~]# xtrabackup --defaults-file=/etc/my.cnf -uroot -p12366 --host=10.0.0.51 --backup --parallel=4 --target-dir=/data/backup/full
#增量备份
[root@db01 ~]# xtrabackup --defaults-file=/etc/my.cnf -uroot -p12366 --host=10.0.0.51 --backup --parallel=4 --target-dir=/data/backup/inc --incremental-basedir=/data/backup/full
--/data/backup/full 必须是空目录,不能存在数据
--defaults-file=/etc/my.cnf 也可写为 --datadir=/data/3306/data
--incremental-basedir 指向上一次增量备份的目录
恢复语句:
#预处理,此选项--apply-log-only 阻止回滚未完成的事务
[root@db01 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full
#合并第一次增量备份到全备
[root@db01 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full --incremental-dir=/data/backup/inc
#-- 在全量和增量数据合并后,在整体做日志信息的准备;
[root@db01 ~]# xtrabackup --prepare --target-dir=/data/backup/full
#进行数据拷贝操作
[root@db01 ~]# xtrabackup --datadir=/data/3306/data --copy-back --target-dir=/data/backup/full
24.请列举数据库数据损坏场景,然后针对性的提出最佳的恢复方案
1. 物理损坏:断电、文件损坏、文件删除
解决方案:利用主从复制或高可用
2. 逻辑损坏:SQL命令删除语句
解决方案:利用延时从库 binlog2sql截取binlog
25.如何恢复一个100G库中的,一张test小表?
sh
1.mysqldump备份恢复机制:从全备中恢复test表
使用grep/awk过滤test表关键字
恢复到第三方库,然后导出需要的test表
提前分库分表
2.xtrabackup备份恢复机制:从全备中恢复test表
01 恢复准备
02 利用第三方库,表空间迁移
找一个测试库,恢复test表结构
删除test表空间 alter table test discard tablespace
拷贝恢复准备全备里面的test.ibd文件,拷贝到测试库的test.ibd的位置并授权
导入表空间 alter table test import tablespace
mysqldump导出test表
数据库宕机没有全备备份,但是有物理文件,如何恢复(5.7)?
利用表空间迁移技术
26.如何让一个运行了2年的数据库创建从库?是否需要停主库
不需要 只需要有半夜里通过mysqldump --source-data=2备份出的全备文件加上备份后到当下创建从库的所有binlog就可以
配置从库步骤:
01 调整server_id
02 主库开启binlog,建立复制用户repl
03 初始化安装从库节点
04 将夜间备份的主库数据恢复到从库
05 从库执行change master to ... 然后start slave; show slave status\G;查看主从状态
28.什么是事务的ACID?ACID是如何保证的?
sh
ACID: A原子性 C一致性 I隔离性 D持久性
如何保证:
A原子性:由undo和redo保证,undo回滚没有commit的数据,redo前滚提交了的数据
C一致性:CR故障自动恢复(undo、redo)、DWB(双写缓冲区)、MVCC、锁
I隔离性:隔离级别、MVCC、锁
D持久性:redo
原子性;整个事务是不可分割的最小单元,要么全执行成功,要么全执行失败
一致性:事务前后保持数据库的一致性状态
隔离性:多个事务并发执行时,每个事务都必须感知不可见的状态,避免并发时出现幻读等问题。
持久性:事务一旦提交,将永久保存在数据库中。
事务隔离级别类型:读未提交(RU)、读已提交(RC)、可重复读(RR)、可串行读(SR)
默认是RR级别,解决了脏读、不可重复读、幻读的问题,但是并发能力较差
29.简述mha的配置过程
1. 搭建GTID主从
2. 配置ssh互信
3. 安装mha manager和mha node
4. 配置mha
5. 检查互信
6. 检查主从
7. 启动mha管理
30.主从复制原理⭐️⭐️⭐️⭐️⭐️
sh
MySQL通过3个线程和2个日志来完成主从复制流程的。三个线程是主库的binlog dump线程和从库的IO线程、SQL线程,两个日志是主库的binlog二进制日志和从库的relay log中继日志。
1. 主从复制是异步回放机制:通过主库上的binlog将数据发送到从库;
2. 复制的时候有3个线程,主库的binlog,从库的IO和SQL线程;
3. 从库的IO读取master.info信息去主库要日志,主库发回日志;
4. 从库IO线程将接收到的binlog日志,写入到relay-log中继日志中,然后把写入的binlog位置点更新到master.info中;
5. 从库的SQL线程读取relog-log中继日志,将日志解析为sql语句发放到数据库中,同时将回放的位置记录到relay-log-info中;
6. master.info和relay-log-info在8.0以后都记录在表里。
具体流程是:
主库所有改变数据库数据的语句都存储到binlog日志中;当从库启动start slave复制时,首先会创建IO线程连接到主库,主库创建binglog dump线程读取binlog日志内容发送给从库的IO线程,IO线程获取到数据后将其存入到relay log中继日志中;从库还会创建SQL线程,实时检测relay log中继日志并执行relay log日志中新增的SQL语句,从而保持主从数据一致。
配置步骤:
主库开启binlog日志功能,创建连接用户
从库上配置和主库的连接信息:用户、密码、位置点等
从库激活主从同步功能 start slave
从库上查看同步状态,确认是否同步成功 show slave status\G
如何搭建主从:
1.在服务器上安装两台以上数据库
2.修改主库配置文件/etc/my.cnf中server_id,server_id每台需唯一,主库开启binlog二进制日志功能,创建主从数据同步的用户,授权用户有复制的权限
show variables like '%log_bin%';
create user repl@'%' identified with mysql_native_password by '12366';
grant replication slave on *.* to repl@'%'; 授予用户复制数据的权限
show master status; 记录 file和position的值,从库配置会用到
3.从库修改server_id,配置和主库连接的信息,激活数据同步功能,查看io线程和sql线程状态
mysql> CHANGE MASTER TO
MASTER_HOST='10.0.0.51',
MASTER_USER='repl',
MASTER_PASSWORD='12366',
MASTER_PORT=3307,
MASTER_LOG_FILE='binlog.000006',
MASTER_LOG_POS=659,
MASTER_CONNECT_RETRY=10;
mysql> start slave;
mysql> show slave status\G
如何切换主从:
1.主库从库设置为只读:set global read_only=ON; set global super_read_only=ON;
2.查看从库IO线程和SQL线程状态:show slave status\G
3.比较主备GTID是否一致 select @@global.gtid_executed;
4.从库停掉复制线程病清空主从信息 stop slave; reset slave all;reset master;
reset master; 清除GTID信息,主从库都执行
5.源从库开启读写模式,转为主库 set global read_only=off; set global super_read_only=off;
6.源主库设置为新从库 change master to master_host='10.0.0.51', master_user='repl',
master_password='12366', master_auto_position=1;
start slave;
show slave status\G;
7.将流量切换到新主库
31.INNODB与MYISAM的区别
sh
innodb支持事务、mvcc、行级锁、外键、聚簇索引、数据热备、CR自动故障恢复,myisam都不支持
myisam只支持表级锁、数据温备份(需要锁表)
33.什么是数据库索引?
sh
索引是一种特殊的数据结构,它可以提高数据库的查询速度。索引是数据表中某一列或多列数据进行排序的数据
结构,它可以快速访问数据表中的某一行数据。
34.MySQL如何优化?⭐️⭐️⭐️
sh
合理设计数据库表结构,避免冗余数据
建立索引,优化查询性能
尽力避免使用select * 或者子查询
将热数据缓存在内存中,避免频繁的磁盘读写
合理配置缓存和线程池等参数
实时监控系统运行状态,及时解决问题
使用分库分表等高可用方案
35.关系型数据库与非关系型数据库的区别?
关系型数据库:是指采用了关系模型来组织数据的数据库,以其行和列的形式(二维表格形式)来存储数据。
更侧重数据存储的安全性,但一定程度会降低数据存储和读取的性能
比如oracle mysql mariadb
非关系型数据库:没有具体模型的数据结构,英文NOSQL。非关系型主要是以键值对、文档的方式存储数据,数
据存储不需要有固定的表结构。非关系型数据库更侧重的是数据存储的高效性,但会降低数据存储的安全性。 memcaced 纯内存 redis 持久化缓存 mongodb 面向文档
36.MySQL多实例
sh
一台服务器上开启多个不同的服务端口,运行多个MySQL服务进程,通过不同的socket监听不同的服务端口来提
供各自的服务,便于节约服务器资源和后期架构扩展
37.如何加强MySQL安全⭐️⭐️⭐️
sh
使用强密码策略和账户管理:禁用root账户,为数据库用户配置合适的访问权限。
定期备份和恢复测试
加密敏感数据
日志记录和监控
定期进行安全审计
使用防火墙和安全软件
定期进行安全补丁和漏洞扫描
38.MySQL Sleep线程过多如何解决?
sh
减少请求连接的时间 wait_timeout 、interactive_timeout
增加MySQL的最大连接数
定期清理无效连接
定期重启MySQL
使用线程池来管理sleep线程
39.mysqldump如何实现增量备份
sh
首先会使用mysqldump获取一个全备数据,数据库开启二进制日志功能, --master-data=2 自动记录位置点 --single-transaction 来保证备份的一致性
mysqldump全量备份+mysqlbinlog二进制日志增量备份
40.主从不一致如何解决⭐️⭐️⭐️
sh
1.排查问题
主库:show master status
从库:show slave status\G
发现从库sql线程为no
2.解决方法
01 忽略错误,继续同步 适用于主从数据相差不大,或者对数据要求不严格
stop slave;
set global sql_slave_skip_counter =1; 表示跳过一步错误
start slave;
show slave status \G 发现正常了
02 重新做主从,完全同步 适用于主从库数据相差较大,或者要求数据完全统一
先进入主库锁表,防止数据写入 flush tables with read lock;
进行数据备份 mysqldump -uroot -p12366 -h10.0.0.51 >backup.sql
查看主库状态 show master status
从库恢复数据 stop slave; source backup.sql
设置从库同步信息 change master to
开启从库同步 start slave
查看从库同步状态 show slave status \G
主从数据不一致怎么办
如何排查:使用pt_table_checksum排查
解决方式:使用pt_table_syn恢复
41.在运维过程中遇到过印象最深的问题
sh
问题:系统性能瓶颈,使用top查看 监控到数据库服务器cpu使用率一直很高
排查:使用top排查发现是mysql进程cpu占用很高
使用show processlist发现有大量的慢sql语句一直在执行
使用explain sql 有些sql使用全表查询未使用索引
解决方案:
监控慢sql日志进行优化
优化sql语句,使用索引,子查询变为join查询,对SQL功能拆分和修改
六、监控
1.zabbix监控了哪些内容?
sh
1.系统监控
CPU 的负载、内存使用率、磁盘读写、磁盘使用情况
cpu、内存、磁盘、网络流量、主机、redis
2.服务监控
服务的一些端口、进程是不是可以访问,检查应用是否可用
数据库、存储、备份等
监控nginx:客户端请求数,成功处理的客户端连接数,NGINX 接受的客户端连接数,当前活跃的客户端连接数,每秒请求数,服务器错误率
监控Redis: 集群状态,客户端连接数,内存监控,主从状态,数据库中的key值总数。
监控mysql:SQL查询性能,主从状态,慢查询数量,mysql连接数,mysql事务
2.zabbix监控系统的优化
sh
1.高并发需要对MySQL进行拆分
2.zabbix-agent被动上传修改为主动上报模式
高负载环境中,被动上传模式可能产生较高的系统负载,因此需要改为主动模式上报
主动上报也就是自动注册,客户端主动去找服务端提交自己的信息
3.地区较多情况尽量使用proxy代理模式
当Zabbix服务器和被监控的主机地理位置较远时,网络延迟可能较高,影响数据采集的效率
4.系统自带监控项优化
不需要用到的一些监控项可以删除
5.进程优化
可以调整进程的启动参数、最大文件描述符数、线程数等,以提高性能和稳定性
6.缓存优化
通过适当调整缓存大小、缓存时间等参数,可以优化系统的性能;还可以使用外部缓存memcached、redis等,来存储和提供缓存数据,提高响应速度和减轻数据库负载。
3.zabbix常用功能
sh
1.自定义监控
客户端编写需要监控的对应命令/etc/zabbix/zabbix_agent2.d/web.conf ,UserParameter=web.ngx.80,ss -lntup |grep -wc 80
服务端通过zabbix_get -s 172.16.1.7 -p 10050 -k web.ngx.80测试,然后在页面创建监控项
2.zabbix创建自定义模板
对于常用常用监控项、触发器,可以创建一个通用的模板供其他主机使用
3.监控告警
开启个人邮箱 smtp功能 获取授权码
发件人配置:zabbix web页面 管理-->报警媒介类型
收件人配置:zabbix web页面 user settings-->profile-->报警媒介
发件条件: zabbix web页面 配置-->动作-->trigger actions
4.自动发现
web配置自动发现规则. web页面-->配置-->自动发现 填写名称、需要自动发现的ip段
web配置自动发现的动作 . web页面-->配置-->动作-->Discovery actions
5.自动注册 zabbix+ansible自动注册
zabbix客户端修改配置文件 /etc/zabbix/zabbix_agent2.conf
Server=172.16.1.63 #服务端地址
ServerActive=172.16.1.63 #主动模式下的服务端ip地址
HostnameItem=system.hostname #指定的键值获取主机名
HostMetadataItem=system.uname #判断存活和获取主机信息
web页面添加自动注册动作
2.Prometheus 普罗米修斯
sh
1.node_exporter 部署第三方软件在主机上,用于暴露已有的第三方服务的metrics给Prometheus,比如当前的CPU负载、系统负载、内存消耗、硬盘使用量、网络IO
2.pushgateway 用于自定义监控指标数据,用户将自定义的数据推送到pushgateway中,而后prometheus server从pushgateway组件中拉取数据,进行监控
3.altermanager 用于prometheus server的告警功能的组件,目前支持多种告警媒介,包括但不限于邮件告警,钉钉告警,企业微信告警等。
3.使用prometheus监控k8s集群
使用prometheus对K8S集群进行监控,主要包括以下几个方面:
1、对集群节点状态监控;可以在集群中每个节点运行exports实现;
2、对节点中的pod进行监控;集群各节点上的POD情况均受kubelet管理,kubelet服务内置的cadvisor可以获取pod的运行情况和资源使用情况;
3、对K8S的核心组件进行监控,API server、etcd、kubelet、controller-manager、kube-scheduler、kube-proxy等
七、CI/CD
1.版本控制
sh
用于记录和管理代码或文件版本的系统,它可以跟踪文件的修改、添加和删除,并允许多个人协同工作以及回溯历史版本。
2.git常用命令
sh
git config 配置电子邮电
git init 初始化本地仓库目录
git add file 提交数据到缓冲区(暂存区) git add .提交所有文件
git commit 把暂存区的数据提交到本地仓库 git commit -m "标记/说明"
git diff 对比两个分支的差异
git branch braname 创建分支
git branch -d name 删除分支
git checkout braname 切换分支
git merge 合并分支
git push origin master 推送到远程仓库
git pull = git fetch + git merge
git pull 将远程主机的最新内容拉下来后直接合并
git fetch 将远程主机的最新内容拉到本地,不会自动merge
git revert commitId 撤回指定的任意提交,并保留后续的提交
git revert HEAD 撤回最后一次提交
git revert HEAD^ 撤回倒数第二次提交
git reset --hard 将版本回退到之前的版本,不保留后续提交
revert会保留原始提交记录
reset会清楚该提交之后的所有提交
rebase使提交记录变得简洁,但会少记录,所以禁用,合并代码一般用merge
3.Jenkins配置流程
sh
1.开发人员将代码提交到gitlab。
2.Jenkins中创建一个maven项目,源码管理中配置与gitlab连接,构建触发器中配置gitlab webhook钩子,gitlab触发Jenkins拉取代码到本地并编译打包,然后调用shell将代码推送到web服务器,并解压重启部署服务。
4.代码冲突如何解决
sh
1.手动解决
2.使用合并工具git diff查看冲突的文件
3.提前沟通和协调,避免多个开发者同时修改同一份文件的相同部分
5.git分支管理
sh
主干分支 master:主要负责管理正在运行的生产环境代码 。永远保持与正在运行的生 产环境完全一致 。
开发分支 develop: 主要负责管理正在开发过程中的代码 。一般情况下应该是最新的代码。
bug修理分支 hotfix: 要负责管理生产环境下出现的紧急修复的代码。从主干分支分出,修理完毕并测试上线后, 并回主干分支 。并回后,视情况可以删除该分支 。
预发布版本分支 release: 较大的版本上线前,会从开发分支中分出发布版本分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后可以视情况删除 。
功能分支 feature:为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支中独立出来,开发完成后会合并到开发分支。
八、运维自动化脚本
1.服务器健康检查脚本
自动收集CPU、内存、磁盘、网络等指标并生成报告
sh
#!/bin/bash
echo "CPU使用率: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}')%"
echo "内存剩余: $(free -h | awk '/Mem/{print $4}')"
echo "磁盘使用率: $(df -h / | awk 'NR==2{print $5}')"
2.日志清理脚本
定期压缩日志、删除日志
sh
#!/bin/bash
cd /data/logs
# 定义目录
bakup="bakup"
# 检查目录是否存在
if [ ! -d "$bakup" ]; then
# 如果目录不存在,创建它
mkdir -p "$bakup"
fi
for logfile in $(find * -name "*.log" -mtime +5); do
#压缩
tar -zcvf ${bakup}/${logfile}.tar.gz ${logfile}
#删除已备份的日志
rm -rf ${logfile}
done
find /data/logs/bakup/ -type f -mtime +180 -name "*.log.tar.gz" -exec rm {} \;
#定时任务 crontab -l
0 3 * * * sh /data/logs/bakup.sh
统计ip前10
sh
awk '{print $1}' "$logfile" | sort | uniq -c | sort -nr | head -n 10
使用elk分析大日志,统计错误日志给开发优化
3.备份与恢复脚本
数据库备份脚本
SH
#!/bin/bash
backup_date=`date +%Y%m%d%H%M%S`
######backup######
/usr/local/mysql/bin/mysqldump -uroot --password='mRNy2H0!qCwk9GxFd' -S/tmp/mysql/mysql.sock --single-transaction --master-data=2 --routines --triggers --default-character-set=utf8 --all-databases > /data/mysqldump_backup/"full_backup_${backup_date}.sql"
#######gzip#####
cd /data/mysqldump_backup/
/bin/gzip -9 "full_backup_${backup_date}.sql"
#####delete####
find /data/mysqldump_backup -name "full_backup_*.sql.gz" -type f -mtime +3 -exec rm {} \;
######rsync同步到备份服务器中######
/usr/bin/rsync -avzPH --progress /data/mysqldump_backup/ jczz@172.16.130.74::jczz --password-file=/etc/rsyncd_users.db
[mysql@mysql-13 backup]$ crontab -l
55 3 * * * /data/backup/backup_db.sh &>/data/backup/backup.log
4.基线修改脚本
sh
root账户远程登录限制
设置口令生存周期小于或等于90天
设置密码复杂度策略
配置账户认证失败次数限制
禁止wheel组之外的用户su为root