一、持续整合
1、什么是Devops?有哪些优势
DevOps是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。下面为大家分享DevOps系列的面试问题。
优点:
- 增加部署频率
- 缩短修复时间
- 降低新版本的失败率
- 万一新版本崩溃,请有更快的平均恢复时间
DevOps有助于满足所有这些要求,从而实现无缝的软件交付。像Amazon,Etsy和Google这样的成熟组织已采用DevOps方法,从而实现了以前未知的性能水平。通过采用DevOps方法,组织可以在一天之内完成数以万计的部署。此外,这样做还可以提供一流的可靠性
、安全性
和稳定性
。
2、DevOps和Agile(敏捷)之间的根本区别
尽管DevOps与敏捷方法(这是最流行的SDLC[Software Development Life Cycle]方法之一)有一些相似之处,但两者在软件开发方面都是根本不同的方法。以下是两者之间的各种基本差异:
敏捷开发模型 | DevOps开发模型 | |
---|---|---|
实践和流程 | 敏捷Scrum和敏捷看板 | CI、CD、CT |
优先级 | 及时性 | 及时性和质量 |
发布周期 | 较小的周期 | 较小的周期并及时反馈 |
反馈源 | 依赖客户反馈 | 自身监控工具 |
工作范围 | 敏捷 | 敏捷和自动化需求 |
敏捷方法
敏捷方法适用于敏捷中的开发同时敏捷方法适用于DevOps中的开发和操作。实践和流程
敏捷涉及敏捷Scrum和敏捷看板等实践,而DevOps涉及CD(持续交付),CI(持续集成)和CT(持续测试)等流程。优先级
敏捷优先考虑及时性,而DevOps优先考虑及时性和质量。发布周期
DevOps提供较小的发布周期并提供即时反馈,而敏捷仅提供较小的发布周期而没有立即反馈。反馈源
敏捷依赖于客户的反馈,而DevOps涉及到自身(监控工具)的反馈。工作范围
对于敏捷,工作范围仅是敏捷,而对于DevOps,这是敏捷和对自动化的需求。
3、常见的DevOps工具
- Ansible/Puppet/chef/saltstack –配置管理和应用程序部署工具
- Docker –容器化工具
- Git/Gitlab –版本控制系统(VCS)工具
- Jenkins –持续集成(CI)工具
- Nexus - 制品库管理工具
- Jira –敏捷的团队协作工具
- wiki -文档管理工具
- Promtheus –连续监控工具
- Selenium/jmeter –连续测试(CT)工具
4、DevOps有一个叫做CI的东西。它是什么,目的是什么?
DevOps中的CI代表持续集成。CI是一种开发实践,开发人员可以在一天内多次将代码集成到共享存储库中。
- 开发和测试的持续集成提高了软件的质量,并减少了交付所需的总时间。
- 如果检查代码的团队成员遇到编译失败,则开发人员将终止构建。如果开发人员不将编译错误引入自己的工作空间中,那么其他的开发成员就无法与共享源代码存储库进行同步。
- 这破坏了协作和共享的开发过程。因此,一旦配置项构建中断,立即识别并纠正问题就很重要。
- 通常,持续集成(CI)流程包括一组单元、集成和回归测试,这些测试在每次编译成功时运行。如果上述任何一个测试失败,CI构建就会被认为是不稳定的(这在敏捷sprint中很常见,因为开发正在进行中),并且没有被破坏。
5、用来评估DevOps成功的几个KPI是什么?
kpi是关键绩效指标的简写形式。为了度量DevOps过程的成功,可以使用几个kpi。其中最流行的有:
- 应用性能
- 应用程序的使用和流量
- 自动测试通过率
- 可用性
- 体量的变化
- 客户的工单
- 缺陷逃逸率
- 部署频率
- 部署时间
- 错误率
- 部署失败数
- 负载时间
- 平均故障检测时间(MTTD)
- 平均故障恢复时间(MTTR)
6、DevOps自动化的主要好处是什么?
- 从CD方程式中消除人为错误的可能性(核心收益)
- 随着任务变得更加可预测和可重复,一旦出现问题,就很容易识别和纠正。因此,它产生了更可靠和健壮的系统
- 从CI管道中移除瓶颈。这会导致部署频率增加和失败的部署数量减少。它们都是重要的DevOps KPI
7、对容器了解什么?
容器是一种轻量级虚拟化形式,有助于在进程之间提供隔离。容器比chroot重,但比管理程序轻。
8、VCS有什么用途?
- 检查导致问题的最后修改是什么
- 比较随着时间的变化情况
- 识别谁在什么时间提出新的问题
- 将一个或多个文件还原到某个较早的状态
- 将整个项目还原到以前的状态
9、Git是流行的DevOps工具,如何还原已经推送并公开的提交?
有两种方法可以这样做:
- 通过创建新的提交来撤消已被推送并公开的提交所做的所有更改。执行以下命令:
git revert
- 通过修复或删除新提交中的错误文件,然后将其推送到远程存储库。对文件进行必要的更改后,使用以下命令将其提交到本地存储库再进行push操作:
git commit -m "commit message"
10、列举几个最受欢迎的DevOps工具?
- selenium
- ansible
- git/gitlab
- jenkins
- docker
11、DevOps的工作职责?
DevOps工程师与敏捷开发团队紧密合作,站在业务价值视角,拉动IT从业务需求到运营交付,确保通过高质量(JKK)的自动化测试,实现持续集成和持续交付等IT技术功能所需的环境。DevOps工程师必须经常与开发保持联系(SRE模式、丰田模式、持续交付模式、协作模式),使环境中所有需要的部分都能无缝地工作,实现高质量的增量迭代。可以扩展说说相关工具。
二、容器化和虚拟化
1、什么是容器?
-
容器化的必要性:
容器用于提供从开发人员的笔记本电脑到测试环境,从登台环境到生产的一致计算环境。
-
容器的定义:
一个容器由一个完整的运行时环境组成:一个应用程序,以及它所有的依赖项,库和其他二进制文件,以及运行它所需的配置文件,捆绑到一个包中。容纳应用程序平台及其依赖项消除了操作系统分发和底层基础架构的差异。
2、容器化相比虚拟化有哪些优势?
容器提供实时配置和可扩展性,但VM提供缓慢的配置 与VM相比,容器是轻量级的 与容器相比,VM的性能有限 与VM相比,容器具有更好的资源利用率
3、什么是Docker镜像?
Docker镜像是Docker容器的来源。换句话说,Docker镜像用于创建容器。使用build命令创建映像,并且在使用run启动时它们将生成容器。图像存储在Docker注册表中,例如registry.hub.docker.com,因为它们可能变得非常大,图像被设计为由其他图像层组成,允许在通过网络传输图像时发送最少量的数据。 提示:请注意Dockerhub以回答有关预先可用图像的问题。
4、什么是Docker容器?
Docker容器包括应用程序及其所有依赖项,但与其他容器共享内核,作为主机操作系统上用户空间中的独立进程运行。Docker容器不依赖于任何特定的基础架构:它们可以在任何计算机,任何基础架构和任何云中运行。 现在解释如何创建Docker容器,可以通过创建Docker映像然后运行它来创建Docker容器,也可以使用Dockerhub上存在的Docker映像。 Docker容器基本上是Docker镜像的运行时实例。
5、什么是Docker hub?
Docker hub是一个基于云的注册表服务,允许您链接到代码存储库,构建映像并测试它们,存储手动推送的映像以及指向Docker云的链接,以便您可以将映像部署到主机。它为整个开发流程中的容器映像发现,分发和变更管理,用户和团队协作以及工作流自动化提供了集中资源。
6、Dockerfile用于什么?
Docker可以通过读取Dockerfile中的指令自动构建图像。 现在我建议你给出一个Dockerfle的小定义。Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组合图像的所有命令。使用docker构建用户可以创建一个连续执行多个命令行指令的自动构建。
7、如何使用json而不是yaml作为我的compose文件?
可以使用json而不是yaml作为你的compose文件,使用带有compose的json文件,指定用于例如的文件名:
docker-compose -f docker-compose.json up
8、Docker容器可以扩展多远?
像谷歌和Twitter这样的大型网络部署,以及像Heroku和dotCloud这样的平台提供商都运行在容器技术上,并行运行数十万甚至数百万个容器。
9、当Docker容器退出时,会丢失数据吗?
当Dcoker容器退出时,不会丢失数据。在您明确删除容器之前,应用程序写入磁盘的任何数据都会保留在其容器中。即使容器停止,容器的文件系统仍然存在。
10、Mongodb熟悉吗,一般部署几台?
部署过,没有深入研究过,一般mongodb部署主从、或者mongodb分片集群;建议3台或5台服务器来部署。MongoDB分片的基本思想就是将集合切分成小块。这些块分散到若干片里面,每个片只负责总数据的一部分。 对于客户端来说,无需知道数据被拆分了,也无需知道服务端哪个分片对应哪些数据。数据在分片之前需要运行一个路由进程,进程名为mongos。这个路由器知道所有数据的存放位置,知道数据和片的对应关系。对客户端来说,它仅知道连接了一个普通的mongod,在请求数据的过程中,通过路由器上的数据和片的对应关系,路由到目标数据所在的片上,如果请求有了回应,路由器将其收集起来回送给客户端。
11、如何发布和回滚,用jenkins又是怎么实现?
发布:jenkins配置好代码路径(SVN或GIT),然后拉代码,打tag。需要编译就编译,编译之后推送到发布服务器(jenkins里面可以调脚本),然后从分发服务器往下分发到业务服务器上。
回滚:按照版本号到发布服务器找到对应的版本推送
12、Tomcat工作模式?
Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
Tomcat作为独立服务器:请求来自于web浏览器;
13、你是怎么备份数据的,包括数据库备份?
在生产环境下,不管是应用数据、还是数据库数据首先在部署的时候就会有主从架构、或者集群,这本身就是属于数据的热备份;其实考虑冷备份,用专门一台服务器做为备份服务器,比如可以用rsync+inotify配合计划任务来实现数据的冷备份,如果是发版的包备份,正常情况下有台发布服务器,每次发版都会保存好发版的包。
14、redis集群的原理,redis分片是怎么实现的,你们公司redis用在了哪些环境?
-
reids集群原理:
其实它的原理不是三两句话能说明白的,redis 3.0版本之前是不支持集群的,官方推荐最大的节点数量为1000,至少需要3(Master)+3(Slave)才能建立集群,是无中心的分布式存储架构,可以在多个节点之间进行数据共享,解决了Redis高可用、可扩展等问题。集群可以将数据自动切分(split)到多个节点,当集群中的某一个节点故障时,redis还可以继续处理客户端的请求。
-
redis分片:
分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包含所有键的子集。当数据量大的时候,把数据分散存入多个数据库中,减少单节点的连接压力,实现海量数据存储。分片部署方式一般分为以下三种:
(1)在客户端做分片;这种方式在客户端确定要连接的redis实例,然后直接访问相应的redis实例;
(2)在代理中做分片;这种方式中,客户端并不直接访问redis实例,它也不知道自己要访问的具体是哪个redis实例,而是由代理转发请求和结果;其工作过程为:客户端先将请求发送给代理,代理通过分片算法确定要访问的是哪个redis实例,然后将请求发送给相应的redis实例,redis实例将结果返回给代理,代理最后将结果返回给客户端。
(3)在redis服务器端做分片;这种方式被称为“查询路由”,在这种方式中客户端随机选择一个redis实例发送请求,如果所请求的内容不再当前redis实例中它会负责将请求转交给正确的redis实例,也有的实现中,redis实例不会转发请求,而是将正确redis的信息发给客户端,由客户端再去向正确的redis实例发送请求。
-
redis用在了哪些环境:
java、php环境用到了redis,主要缓存有登录用户信息数据、设备详情数据、会员签到数据等
15、mysql数据库用的是主从读写分离,主库写,从库读,假如从库无法读取了、或者从库读取特别慢,你会如何解决?
先添加从库数量,临时把问题给解决,然后抓取slow log ,分析sql语句,该优化就优化处理。慢要不就是硬件跟不上,需要升级;要不就是软件需要调试优化,等问题解决在细化。(数据库不太熟悉)
16、elk中的logstash是怎么收集日志的,在客户端的logstash配置文件主要有哪些内容?
input、output两大块配置;input中指定日志(type、path)等,output指定日志输出的目标(host、port)等。
17、你在shell脚本中用过哪些语法,case语法会用到哪些地方?
一般会用到if语句、for语句、while语句、case语句以及function函数的定义;case语句为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。最典型的case语法会用到启动服务脚本的处理。