【云计算】云计算八股与云开发核心技术(虚拟化、分布式、容器化)
文章目录
- 一、什么是云计算?
- 1、云计算的架构(基础设施,平台,软件)
- 2、云计算的发展
- 二、如何做云计算开发?云计算的核心技术(重点)
- 1、虚拟化技术 -> 虚拟机(计算,存储,网络)
- 2、分布式技术 -> 资源池
- 3、容器化技术 -> 快速迁移
- 三、面经补充
- 1、云计算面经补充
- 2、Linux面经补充
一、什么是云计算?
1、云计算的架构(基础设施,平台,软件)
国内做公有云的主要有:腾讯云,阿里云,华为云(对外销售)
做垂直私有云的有:米哈游,字节火山,等等
云计算的三种服务模式(企业卖的东西)
- IaaS:Infrastructure(基础设施)-as-a-Service;
- PaaS:Platform(平台)-as-a-Service;
- SaaS:Software(软件)-as-a-Service。
- 基础设施在最下端,平台在中间,软件在顶端。
常见应用:块存储、对象存储及文件存储服务,虚拟专用网络服务(VPN),负载均衡服务,虚拟防火墙及安全组隔离服务,桌面云服务,IDC托管云,企业私有云,大数据分析云服务,数据库云服务,媒体云服务,电信NFV云。
关键技术:
- 超大规模资源调度算法
- 计算资源调度
- 存储资源调度
- 能耗管理最优化
- 异构硬件继承管理能力
- 异构硬件管理集成技术
- 异构Hypervisor简化管理集成技术
- 异构存储管理继承的同一简化技术
- 应用无关的可靠性保障技术
- 数据中心内的可靠性保障技术
- 跨数据中心的可靠性保障技术
- 单VM及多VM的弹性伸缩技术
- 计算近端I/O性能加速技术
- 网络虚拟化技术
- 业务应用驱动的边缘虚拟网络自动化
- 更强大、更灵活的网络安全智能策略
- 应用模块以及工作流技术
- 容器调度与编排机制混合云适配连接机制
参考:1,2,
2、云计算的发展
发展历史,参考,
物理机时代
- 云计算其实主要解决了四个方面的内容:计算,网络,存储,应用。前三者是资源层面的,最后是应用层面的。
- 计算是CPU和内存,为啥?1+1这个最简单的算法是把1放在内存里面,运行加法是CPU做的,做完了结果2又保存在内存里面。
网络就是你插根网线能上网。
存储就是你下个电影有地方放。本次讨论就是围绕这四个部分来讲的。 - 在原始社会,大家最爱用的是物理设备:
服务器用的是物理机,例如戴尔,惠普,IBM,联想等物理服务器,随着硬件设备的进步,物理服务器越来越强大了,64核128G内存都算是普通配置。
网络用的是硬件交换机和路由器,例如思科的,华为的,从1GE到10GE,现在有40GE和100GE,带宽越来越牛。
存储方面有的用普通的磁盘,也有了更快的SSD盘。容量从M,到G,连笔记本电脑都能配置到T,更何况磁盘阵列。
如果部署应用直接使用物理机,看起来很爽,总有种土豪的感觉,却又大大的缺点: - 人工运维:如果你在一台服务器上安装软件,把系统安装坏了,怎么办?只有重装。当你想配置一下交换机的参数,需要串口连上去进行配置。当你想增加一块磁盘,总要买一块插进服务器。这些都需要人工来,而且很大可能要求机房。你们公司在北五环,机房在南六环,这酸爽。
浪费资源:其实你只想部署一个小小的网站,却要用128G的内存。混着部署吧,就有隔离性的问题。
隔离性差:你把好多的应用部署在同一台物理机上,他们之间抢内存,抢cpu,一个写满了硬盘,另一个就没法用了,一个弄挂了内核,另一个也同时挂了,如果部署两个相同的应用,端口还会冲突,动不动就会出错。
于是有了第一次合久必分的过程,叫做虚拟化。所谓虚拟化,就是把实的变成虚的。
虚拟机的诞生
- 虚拟化解决了上面的问题
人工运维:虚拟机的创建和删除都可以远程操作,虚拟机被玩坏了,删了再建一个分钟级别的。虚拟网络的配置也可以远程操作,创建网卡,分配带宽都是调用接口就能搞定的。
浪费资源:虚拟化了以后,资源可以分配的很小很小,比如1个cpu,1G内存,1M带宽,1G硬盘,都可以被虚拟出来。
隔离性差:每个虚拟机有独立的cpu, 内存,硬盘,网卡,不同虚拟机的应用互不干扰。 - 但是虚拟化还有以下的缺点:
通过虚拟化软件创建虚拟机,需要人工指定放在哪台机器上,硬盘放在哪个存储设备上,网络的VLAN ID,带宽具体的配置,都需要人工指定。所以单单使用虚拟化的运维工程师往往有一个Excel表格,有多少台机器,每台机器部署了哪些虚拟机。所以,一般虚拟化的集群数目都不是特别的大。 - 在虚拟化阶段,领跑者是Vmware,可以实现基本的计算,网络,存储的虚拟化。
当然这个世界有闭源,就有开源,有windows就有linux,有apple就有andord,有Vmware,就有Xen和KVM。在开源虚拟化方面,Xen方面Citrix做的不错,后来Redhat在KVM发力不少。 - 为了解决虚拟化阶段剩余的问题,于是有了分久必合的过程。这个过程我们可以形象的称为池化。
虚拟化已经将资源分的很细了,但是对于如此细粒度的资源靠Excel去管理,成本太高,能不能打成一个大的池,当需要资源的时候,帮助用户自动的选择,而非用户指定。所以这个阶段的关键点:调度器Scheduler。
公有云和私有云的诞生(池化计算)
-
于是vmware有了自己的vcloud。
于是基于Xen和KVM的私有云平台CloudStack,后来Citrix将其收购后开源。
AWS最初就是基于Xen技术进行虚拟化的,并且最终形成了公有云平台。 -
私有云厂商和公有云厂商也拥有类似的技术,却在产品运营上呈现出完全不同的基因。
私有云厂商都是卖资源的,所以往往在卖私有云平台的时候往往伴随着卖计算,网络,存储设备。
公有云的厂商往往都是有自己的大规模应用需要部署的,所以其产品的设计,可以将常见的应用部署所需要的模块作为组件提供出来,用户可以像拼积木一样,拼接一个适用于自己应用的架构。 -
Rackspace与NASA合作创始了开源云平台OpenStack。从OpenStack的模块组成,可以看到云计算池化的方法。
计算池化模块Nova:OpenStack的计算虚拟化主要使用KVM,然而到底在那个物理机上开虚拟机呢,这要靠nova-scheduler。
网络池化模块Neutron:OpenStack的网络虚拟化主要使用Openvswitch,然而对于每一个Openvswitch的虚拟网络,虚拟网卡,VLAN,带宽的配置,不需要登录到集群上配置,Neutron可以通过SDN的方式进行配置。
存储池化模块Cinder:OpenStack的存储虚拟化,如果使用本地盘,则基于LVM,使用哪个LVM上分配的盘,也是用过scheduler来的。后来就有了将多台机器的硬盘打成一个池的方式Ceph,则调度的过程,则在Ceph层完成。 -
有了OpenStack,所有的私有云厂商都疯了,原来VMware在私有云市场实在赚的太多了,眼巴巴的看着,没有对应的平台可以和他抗衡。现在有了现成的框架,再加上自己的硬件设备,你可以想象到的所有的IT厂商的巨头,全部加入到社区里面来,将OpenStack开发为自己的产品,连同硬件设备一起,杀入私有云市场。 网易当然也没有错过这次风口,上线了自己的OpenStack集群,网易蜂巢基于OpenStack自主研发了IaaS服务,在计算虚拟化方面,通过裁剪KVM镜像,优化虚拟机启动流程等改进,实现了虚拟机的秒级别启动。在网络虚拟化方面,通过SDN和Openvswitch技术,实现了虚拟机之间的高性能互访。在存储虚拟化方面,通过优化Ceph存储,实现高性能云盘。
应用层的云计算
- 前面一直在讲IaaS层的故事,也即基础设施即服务,基本上在谈计算,网络,存储的事情。现在应该说说应用层的事情了。
- IaaS的定义比较清楚,PaaS的定义就没那么清楚了,有的把数据库,负载均衡,缓存作为PaaS服务,有的把大数据Hadoop, Spark平台作为PaaS服务,有的讲应用的安装与管理,例如Puppet, Chef, Ansible作为PaaS服务。
- 其实PaaS主要用于管理应用层的,我总结两部分:一部分是你自己的应用应当自动部署,比如Puppet, Chef, Ansible, Cloud Foundry等,可以通过脚本帮你部署,一部分是你觉得复杂的通用应用不用部署,比如数据库,缓存,大数据平台,可以在云平台上一点即得。
- 有了PaaS最大的优点,就是可以实现应用层的弹性伸缩。 比如双十一来了,10个节点要变成100个节点,如果使用物理设备,再买90台机器固然来不及,仅仅只有IaaS实现资源的弹性是不够的,再创建90台虚拟机,也是空的啊,还是需要运维人员一台一台的部署。所以有了PaaS就好了,一台虚拟机启动后,马上运行自动部署脚本,进行应用的安装,90台机器自动安装好了应用,才是真正的弹性伸缩。
- 当然这种部署方式也有一个问题, 就是无论Puppet, Chef, Ansible把安装脚本抽象的再好,说到底也是基于脚本的,然而应用所在的环境千差万别 ,文件路径的差别,文件权限的差别,依赖包的差别,应用环境的差别,Tomcat, PHP, Apache等软件版本的差别,JDK,Python等版本的差别,是否安装了一些系统软件,是否占用了哪些端口 ,都可能造成脚本执行的不成功。所以看起来是一旦脚本写好,就能够快速复制了,但是一旦环境稍有改变,就需要把脚本进行新一轮的修改,测试,联调。 例如在数据中心写好的脚本,移到AWS上就不一定直接能用,在AWS上联调好了,迁移到Google Cloud上去也可能再会出问题。
容器的诞生
-
于是容器应运而生。容器是Container,Container另一个意思是集装箱,其实容器的思想就是要变成软件交付的集装箱。集装箱的特点,一是打包,二是标准。
-
设想没有集装箱的时代,如果从A将货物运到B,中间要经过三个码头,换三次船的话,每次货物都要卸下船来,摆的七零八落,然后再换船的时候,需要重新整齐摆好,所以没有集装箱的时候,船员们都能够在岸上待几天再走。然而有了集装箱,所有的货物都打包在一起了,并且集装箱的尺寸全部一致,所以每次换船的时候,整体一个箱子搬过去就可以了,小时级别就能完成,船员再也不能上岸长时间休息了。所以设想A就是程序员,B就是用户,货物就是代码及运行环境,中间的三个码头分别是开发,测试,上线。
-
假设代码的运行环境如下:
1.Ubuntu操作系统
2.创建用户hadoop
3.下载解压缩JDK 1.7在某个目录下
4.将这个目录加入JAVA_HOME和PATH的环境变量里面
5.将环境变量的export放在hadoop用户的home目录下的.bashrc文件中
6.下载并解压缩tomcat 7
7.将war放到tomcat的webapp路径下面
8.修改tomcat的启动参数,将Java的Heap Size设为1024M -
一个简单的Java网站,就需要考虑这么多零零散散的东西,如果不打包,就需要在开发,测试,生产的每个环境上查看保证环境的一致,甚至要将这些环境重新搭建一遍,就像每次将货物打散了重装一样麻烦,中间稍有差池,比如开发环境用了JDK 1.8,而线上是JDK 1.7,比如开发环境用了root用户,线上需要使用hadoop用户,都可能导致程序的运行失败。
-
容器如何对应用打包呢? 还是要学习集装箱,首先要有个封闭的环境,将货物封装起来,让货物之间互不干扰,互相隔离,这样装货卸货才方便。好在ubuntu中的lxc技术早就能做到这一点,这里主要使用了两种技术,一种是看起来是隔离的技术,称为namespace,也即每个namespace中的应用看到的是不同的IP地址,用户空间,进程号等。另一种是用起来是隔离的,称为cgroup,也即明明整台机器有很多的CPU,内存,而一个应用只能用其中的一部分。
-
有了这两项技术,集装箱的铁盒子我们是焊好了,接下来是决定往里面放什么的时候了。最简单粗暴的方法,就是将上面列表中所有的都放到集装箱里面。但是这样太大了,因为虚拟机的镜像就是这样的,动辄几十G,如果你安装一个干干静静的ubuntu操作系统,什么都不装,就很大了。这其实相当于把船也放到了集装箱里面,答案当然是NO.
-
所以撇下第一项操作系统,剩下的所有的加起来,也就几百M,就轻便多了。所以一台服务器上的容器是共享操作系统内核的,容器在不同机器之间的迁移不带内核,这也是很多人声称容器是轻量级的虚拟机的原因。轻不白轻,自然隔离性就差了,一个集装箱把船压漏水了,所有的集装箱一起沉。
-
另一个需要撇下的就是随着应用的运行而产生并保存在本地的数据,多以文件的形式存在,例如数据库文件,文本文件。这些文件会随着应用的运行,越来越大,如果这些数据也放在容器里面,会让容器变得很大,影响容器在不同环境的迁移。而且这些数据在开发,测试,线上环境之间的迁移是没有意义的,生产环境不可能用测试环境的文件,所以往往这些数据也是保存在容器外面的存储设备上。也是为什么人们称容器是无状态的。
-
总而言之,容器是轻量级的,隔离差的,适用于无状态的,基于镜像标准实现跨主机,跨环境的随意迁移。
-
有了容器,使得PaaS层对于用户自身应用的自动部署变得快速而优雅。容器快,快在了两方面, 第一是虚拟机启动的时候要先启动操作系统,容器不用启动操作系统,因为是共享内核的。第二是虚拟机启动后使用脚本安装应用,容器不用安装应用,因为已经打包在镜像里面了。所以最终虚拟机的启动是分钟级别,而容器的启动是秒级。
-
因为容器的启动快,人们往往不会创建一个个小的虚拟机来刚刚部署应用,因为这样太费时间了,而是创建一个大的虚拟机,然后在大的虚拟机里面再划分容器,而不同的用户不共享大的虚拟机,可以实现操作系统内核的隔离。
容器的粒度更加细,管理起来更难管,甚至是手动操作难以应对的。所以容器层面的管理平台是一个新的挑战,关键字就是自动化 。 -
容器管理平台
当前火热的容器管理平台有三大流派:
一个是Kubernetes,出自Borg,Borg是Google数据中心的容器管理平台。Kubernetes生态活跃,热度高。
一个是Mesos,我们称为乔峰型。Mesos的调度功能独有的,Mesos管理过Tweeter的容器集群。Mesos社区还是以Mesosphere为主导。社区热度不足。
一个是Swarm,Swarm是Docker家族的集群管理软件 ,Docker可以说称为容器的事实标准,但是Swarm的集群管理能力却有所不足,好在Swarm借鉴了很多前面的集群管理思想,也在逐渐的成熟中。
二、如何做云计算开发?云计算的核心技术(重点)
参考:1,2,3,4,5,6,7
1、虚拟化技术 -> 虚拟机(计算,存储,网络)
计算虚拟化
-
CPU虚拟化 (二进制翻译):如何模拟CPU指令 (所有敏感指令),如何让多个VM共享CPU。
解决方案:硬件–>VMM(虚拟机监视程序)–>Guest os(虚拟机操作系统)–>app
全虚:将所有指令都收集到虚拟化层进行处理
半虚:设计理念是将16条指令,由VMM(虚拟化层)移向Guest OS(虚拟机操作系统)自身 通过主动的方式由Guest OS去处理这些指令,而不是被移交给VMM做处理。
硬虚(硬件辅助虚拟化):Guest OS执行到特殊指令可以直接下达到计算机系统硬件去处理,而不需要通过VMM去处理 -
内存虚拟化
概念: 把物理机的真实物理内存统一管理,包装成多个虚拟机的内存给若干虚拟机使用
Native操作系统对内存的认识与管理达成以下两点认识:内存都是从物理地址0开始的,内存都是连续的。 这也是内存虚拟化需要解决两个的问题。
解决:KVM(基于内核的虚拟机)是一种内建于Linux中的开源虚拟化技术,可将Linux转变为虚拟机监控程序,使主机计算机能够运行多个隔离的虚拟环境。
虚拟机的虚拟地址到物理机的物理地址的转换:GVA—>GPA—>HVA—>HPA。 -
IO虚拟化
I/O设备是可对数据进行输入输出的如:磁盘、网卡 I/o虚拟化分为全虚、半虚、I/o透传
全虚:VMM为虚拟机直接模拟出一个与真实设备相似的io设备
半虚:建议一个特权级别的虚拟机,Dom0:安装原生驱动和后端驱动;普通虚拟机(DomU):安装前端驱动
io透传:直接将原生驱动安装给VM使用 -
KVM技术:
基于内核的虚拟机,linux内核模块。II型虚拟化
任意一装有linux操作系统的虚拟机,安装KVM模块之后即变成了Hypervisor
网络虚拟化
-
网络的基本概念:
南北流量:流量经过路由。东西流量:流量不经过路由。
ip互联网协议地址,为计算机网络中主机通信设计的。
mac,物理地址,硬件地址,用来确定网络设备在网络中的位置。 -
vlan:虚拟局域网,在逻辑上将一个物理的局域网划分为多个逻辑设备的广播域的技术
作用:限制广播域、增加安全性,提高网络的健壮性,灵活
vlan:端口
Access:仅允许一个vlan id通过本接口,该vlan id与本接口的id相同
Trunk:允许多个id通过 -
分布式虚拟交换机在功能上类似于普通的二层交换机。 其中一端与VM的虚拟端口相连,中间是一条虚拟的链路。 另外一端则通过上行链路与主机上的物理网络适配器相连,再与物理交换机相连。 从而连接到各个主机和虚拟机,实现网络互通。
存储虚拟化
-
常见的物理磁盘类型:机械硬盘HDD,固态硬盘SSD。
-
集中式存储(RAID):
RAID机制(冗余磁盘阵列),高效(多块磁盘并行读写),安全(奇偶校验和热备技术)。
常用的RAID类型:
RAID0(条带化):多块硬盘逻辑成一块硬盘用(不具备冗余功能)
RAID1(镜像):多块硬盘逻辑成一块硬盘用
RAID5(独立的数据磁盘与分布式校验块):最少需要三块硬盘
RAID6:最少需要4块硬盘 -
集中式存储类型
块存储:块存储指的是块设备,一切以磁盘形式存在的存储都是块设备,即块存储。块存储强调的是裸磁盘(所有以磁盘形式提供给主机的访问的存储就是块存储)。
文件存储:通俗的理解“块存储+文件系统”打包后,对外提供存储服务。
对象存储:对象存储通俗的说就是基于对象的存储,对象在一个层结构中不会再有层级结构。而文件存储依旧保持传统的文件目录结构层级,当文件层级太深,就会降低速率。
集中式存储按照技术架构分为SAN、NAS -
分布式存储
概念: 分布式存储的资源来自于各个主机(服务器),然后将资源整合和分布式存储池,再为各个主机所用。
问题: 分布式存储为什么不用RAID机制
为了保证数据的高可用性和安全性,集中式存储使用的是RAID技术,RAID可以通过硬件和软件的方式来实现,无论是软RAID或者硬RAID,所有的硬盘都需要在一个服务器内 (硬RAID需要统一RAID卡,软RAID需要统一操作系统)。
由于分布式存储的硬盘分布在不同的服务器上,所以无法再使用RAID机制 。因此,分布式存储是通过副本机制来实现数据的高可靠性的。副本机制是指将数据复制成多份一模一样的内容,并分别保存在不同的服务器上,当某台服务器出现故障后,数据并不会丢失。
2、分布式技术 -> 资源池
参考:1,
云计算与分布式计算的区别
-
云计算(Cloud Computing)是分布式计算的一种;云计算在早期,就是简单的分布式计算,进行任务分发并对计算结果进行合并;当前的云计算已经不单单是一种分布式计算,而是分布式计算、效用计算、负载均衡、并行计算、网络存储、热备份冗余和虚拟化等计算机技术混合演进并跃升的结果
-
云计算属于分布式计算。还有一个网格计算也属于分布式计算,它们之间的一个重要区别在于资源调度模式。云计算采用集群来存储和管理数据资源,运行的任务以数据为中心。即调度计算任务到数据存储节点运行。而网格计算则以计算为中心。云计算则进一步将硬件资源虚拟化,活用虚拟机技术,对失败任务重新执行,而不必重启任务。
云计算的分布式存储
- 云计算系统中广泛使用的数据存储系统是由Google的GFS和Hadoop团队开发的HDFS。
- 一个GFS集群由一个主服务器(Master)和大量的块服务器(Chunk Server)构成 ,可被许多客户访问。主服务器存储文件系统所有的元数据,包括名字空间、访问控制信息、从文件到块的映射以及块的当前位置。主服务器控制涉及系统范围的活动,如块租约(Lease) 管理、孤儿块的垃圾收集以及块服务器间的块迁移。主服务器定期通过HeartBeat消息与每一个块服务 器通信,向块服务器传递指令并收集它的状态。GFS中的文件被切分为64 MB的块并以冗余9方式存储,每份数据在系统中保存3个以上备份。用户与主服务器的交流只限于对元数据的操作,所有涉及数据的通信都直接通过块服务器联系,这大大提高了系统的效率,并可防止主服务器负载过重,
- 云计算需要对分布式的海量数据进行处理和分析,因此数据管理技术必须能够用来高效地管理大量的数据。云计算系统中的数据管理技术主要是Google的BT(BigTable)数据管理技术和Hadoop团队开发的开源数据管理模块HBase 。BT是建立在GFS、Scheduler、Lock Service 和MapReduce之上的一种大型的分布式数据库,与传统的关系数据库不同,它把所有的数据都作为对象来处理,以形成一个巨大表格用来分布存储大规模结构化数据。
如何实现一个分布式锁
-
参考
-
一, 基于数据库实现分布式锁
1.悲观锁
利用select … where … for update 排他锁
注意: 其他附加功能与实现一基本一致,这里需要注意的是“where name=lock ”,name字段必须要走索引,否则会锁表。有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题。
2.乐观锁
所谓乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源,操作过程中认为不存在并发冲突,只有update version失败后才能觉察到。我们的抢购、秒杀就是用了这种实现以防止超卖。
通过增加递增的版本号字段实现乐观锁 -
基于缓存(Redis等)实现分布式锁
1.使用命令介绍:
(1)SETNX,SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
(2)expire,expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
(3)delete,delete key:删除key
2.实现
(1)获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
(2)获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
(3)释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。 -
基于Zookeeper实现分布式锁
ZooKeeper是一个为分布式应用提供一致性服务的开源组件,它内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一文件名。基于ZooKeeper实现分布式锁的步骤如下:
(1)创建一个目录mylock;
(2)线程A想获取锁就在mylock目录下创建临时顺序节点;
(3)获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁;
(4)线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点;
(5)线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。 -
对比
数据库分布式锁实现
缺点:
1.db操作性能较差,并且有锁表的风险
2.非阻塞操作失败后,需要轮询,占用cpu资源;
3.长时间不commit或者长时间轮询,可能会占用较多连接资源
Redis(缓存)分布式锁实现
缺点:
1.锁删除失败 过期时间不好控制
2.非阻塞,操作失败后,需要轮询,占用cpu资源;
ZK分布式锁实现
缺点:性能不如redis实现,主要原因是写操作(获取锁释放锁)都需要在Leader上执行,然后同步到follower。
总之:ZooKeeper有较好的性能和可靠性。
从理解的难易程度角度(从低到高)数据库 > 缓存 > Zookeeper
从实现的复杂性角度(从低到高)Zookeeper >= 缓存 > 数据库
从性能角度(从高到低)缓存 > Zookeeper >= 数据库
从可靠性角度(从高到低)Zookeeper > 缓存 > 数据库
3、容器化技术 -> 快速迁移
容器是一个标准的软件单元,它打包代码及其所有依赖项,以便应用程序从一个计算环境快速可靠地迁移到另一个计算环境。Docker 容器镜像是一个轻量级的、独立的、可执行的软件包,包括运行应用程序所需的一切:如代码、运行环境、系统工具、系统库和设置。Docker是容器的引擎,通过Docker引擎就可以实现容器的功能。
容器技术最重要的价值是:为在不同主机上运行的应用程序服务提供一个轻便、一致的格式。容器格式的标准化可加快交付体验,允许用户方便地对工作负载进行迁移,避免局限于单一的平台提供商。利用容器可以短时间内部署成百上千个应用,保证用户应用快速上线;容器可以简化配置过程,用户应用的运行环境可以直接打包到容器内,使用时可以直接启动。
如上图所示,左图为容器技术架构图,右图为虚拟化技术架构图。两者相比,容器与虚拟机最大的不同是容器里不再安装操作系统,容器的本质是一种操作系统级别的虚拟化,启动一个应用容器其实就是启动一个进程,节省了大量操作系统所占资源,同样一台计算机就可以服务于更多租户。容器技术对操作系统的资源进行再次抽象,而并非对整个物理机资源进行虚拟化。容器和虚拟机一起使用为部署和管理应用程序提供了极大的灵活性。
三、面经补充
1、云计算面经补充
计算机发展史、概念题
Q:你认为云计算到底解决了软件生产中的什么问题?
节约成本、外包扩大业务、网站防攻击、数据备份等等
Q:请解释云计算中的公有云、私有云和混合云,并说明它们的适用场景。
公有云是由第三方云服务提供商(如亚马逊AWS、微软Azure、谷歌云等)提供和管理的云基础设施和服务。这些基础设施和服务对外公开,客户可以按需使用并按照使用量付费。
私有云是指由单个组织或企业内部搭建和管理的云基础设施和服务。这些基础设施可以部署在自己的数据中心或由第三方托管,但对外部通常不公开。
混合云是指同时使用公有云和私有云的部署模型。在混合云中,组织可以将一些工作负载部署在公有云上,而将另一些工作负载部署在私有云上,并且这两者之间可以进行互操作。
Q:讨论云计算的五个基本特征。
资源收缩,快速部署,资源抽象,按用量计费,宽带访问
Q:请简述云计算中有哪些不同的层,并介绍各自的功能。
a) Saas:软件及服务,它让用户可以直接访问云应用程序,不必再系统上安装任何东西。
b) Iaas:基础设施即服务,它从硬件(比如内存和处理器速度等)等层面提供了基础设施
c) Paas:平台及服务,它为开发人员提供云应用程序平台。
Q:对云计算有什么了解?
云计算是一种基于互联网的计算方式,通过共享的资源池,提供可按需获取、可快速提供和可测量的计算服务。
它主要由三个部分组成:云存储、云计算和云服务。
云计算通过虚拟化技术,将硬件资源(如处理器、存储器、网络)进行抽象和汇总,形成资源池,通过软件技术对资源进行分配和管理,从而提供计算服务。
云计算可以根据需要快速提供计算、存储、网络等各种服务,可以节省企业的资金和时间成本,提高资源利用率。 云计算有多种服务模式,包括基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。
不同的服务模式适用于不同的业务需求。同时,云计算还有多种部署方式,包括公共云、私有云和混合云。企业可以根据自己的需求选择适合的部署方式。
Q:云计算服务中涉及的数据库服务通常包括以下几个方面?
+ 数据库即服务(DBaaS):DBaaS是一种将数据库作为云服务提供的模式,用户无需购买、安装和维护数据库软件和硬件设备,而是通过云服务提供商提供的界面或API来管理和使用数据库。
+ 数据库实例,用户可以在其中部署和运行自己的数据库系统。这些数据库实例通常包括预配置的硬件资源(如CPU、内存、存储空间)和数据库软件环境,用户只需根据自己的需求选择合适的实例类型和规格即可快速部署自己的数据库系统。
云计算核心技术
Q:云计算中的虚拟化技术是如何实现资源的隔离和共享的?
通过创建虚拟的计算资源(如虚拟机、容器等)来实现资源的隔离和共享。
资源隔离是指将不同用户或应用程序的计算资源彼此隔离,以确保它们在同一物理基础设施上运行时不会相互干扰。
+ 虚拟化层:在物理服务器上运行虚拟化软件,该软件负责创建和管理虚拟资源。虚拟化层将物理服务器的计算、存储和网络资源抽象化,以便多个虚拟实例可以共享这些资源。
+ 虚拟机(VM)技术:通过虚拟机管理器(如VMware、Hyper-V、KVM等),物理服务器可以被划分为多个虚拟机,每个虚拟机都运行着独立的操作系统和应用程序。这样,不同用户或应用程序的计算资源可以被隔离开来,就好像它们运行在不同的物理服务器上一样。
+ 容器技术:容器技术(如Docker、Kubernetes等)提供了一种更轻量级的虚拟化方式,容器可以在同一操作系统内共享内核,并且具有更快的启动时间和更小的资源开销。通过容器技术,不同应用程序的资源可以被隔离开来,同时共享相同的操作系统内核。
Q:请解释云计算中的弹性伸缩是什么,以及为什么弹性伸缩对云计算环境具有重要意义?
+ 云计算中的弹性伸缩是指根据实际需求动态地增加或减少计算资源(如服务器、存储和网络资源)的能力。这意味着在云平台上,系统能够根据负载、用户需求或其他指标来自动地增加或减少计算资源,以保持系统的性能和可用性。
Q:容器和虚拟机的区别?
+ 容器与虚拟机最大的不同是容器里不再安装操作系统,容器的本质是一种操作系统级别的虚拟化,启动一个应用容器其实就是启动一个进程,节省了大量操作系统所占资源。
Q:vm虚拟机为什么效率高?
对比其他虚拟技术,内核也有做虚拟化。
对比物理机,资源共享,资源隔离,资源管理相关的能力。
2、Linux面经补充
参考:1,2,3,4,5,6,7,8-git,9-git,10-内核,linux-运维
系统原理
Q:怎么看一个文件被哪些进程占用,除了命令,找到所有日志,自己统计。
lsof 文件名 (实现原理)
1、/proc 文件系统是 Linux 内核提供的一个虚拟文件系统,包含了关于系统运行状态的信息。
2、每个正在运行的进程在/proc/[PID]/fd目录下都有一个符号链接列表,这些链接指向该进程打开的文件描述符
3、 对于每个文件描述符,lsof会读取符号链接指向的真实文件路径,并获取该文件的相关信息,如文件类型、文件大小等
4、lsof根据文件描述符获取到的文件信息,查找相应的进程信息,包括进程ID、进程名称、用户ID等。
5、lsof将获取到的文件信息和进程信息以表格形式输出,显示文件被哪些进程占用。。
Q:Linux查看某个端口是否被占用?
sudo netstat -tuln | grep :80
sudo ss -tuln | grep :80
这将显示所有正在监听端口的服务,并且可以看到端口 80 是否被占用。
Q:Linux启动过程,从bios开始?
第一步:开机自检,加载 BIOS
第二步:读取 MBR(硬盘的主引导记录,MBR是第一个可开机设备的第一个扇区的引导分区块)
第三步:Boot Loader grub 引导菜单(里面的ext4驱动,可以识别/boot分区里的内容)
第四步:加载 kernel 内核 (根据 grub 设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。)
第五步:init 进程依据 inittab 文件夹来设定运行级别(内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取 /etc/inittab 文件,并依据此文件来进行初始化工作)
第六步:init 进程执行 rc.sysinit
第七步:启动内核模块
第八步:执行不同运行级别的脚本程序
第九步:执行 /etc/rc.d/rc.local
第十步:执行 /bin/login 程序,启动 mingetty,进入登录状态
Q:如何查看一个服务是否开机启动?
方法1: 到多用户模式对应的文件夹下查看是否有这个服务的名字
Q:运行级别(centos6里概念)
在centos6里有哪些运行级别?
runlevel 可以查看当前运行级别
0级:关机
1级:单用户(找回丢失密码)
2级:多用户无网络,不能使用NFS功能
3级:多用户有网络(multi-user),最常用的级别,CLI字符界面
(会定义哪些程序在字符界面下开机启动 -->开启的程序少–>消耗的资源少 -->最小化安装)
4级:保留,目前Linux暂无使用
5级:图像界面,GUI界面
(图形界面 -->会定义哪些程序在图形界面下开机启动 -->开启的程序多–>消耗资源多 -->带GUI服务器,linux里启动图形界面是启动GNOME 和KDE)
6级:重启
在centos7/8里该文件已经不再使用了
Q:内核子系统有哪些?操作系统的主要功能?
内核子系统包括文件系统、网络、内存管理等,操作系统的主要功能是资源管理和任务调度。
Q:系统的运行级别,默认的运行级别是?
系统的运行级别,默认的运行级别是3。
Q:虚拟化,完全虚拟化,半虚拟化,docker?
虚拟化有完全虚拟化、半虚拟化和容器虚拟化(如Docker)。
Q:Docker常用命令:,例如开启所有容器,删除所有镜像,复制文件到容器内?
`docker start $(docker ps -aq)`(开启所有容器)、`docker rmi $(docker images -q)`(删除所有镜像)、`docker cp`(复制文件到容器内)。
Q:解释一下什么是分布式部署,负载均衡,反向代理?
分布式部署是将应用程序部署在多台服务器上,负载均衡是将请求分配到多个服务器上,反向代理是代理服务器接收客户端请求并将其转发到后端服务器。
Q:对云原生的理解?
云原生是一种软件开发和部署方法,利用云计算和容器化技术,实现高度自动化、弹性扩展和持续交付。
常用命令
Q:常见的进程管理命令有哪些?
top ps systemctl nice service
Q:关闭Linux系统不重启
用 `shutdown -h now` 命令。
Q:数据库备份
使用 `mysqldump`。
Q:创建和解压压缩文件
使用 `tar` 命令。
Q:常见的端口、
Web服务使用80和443端口,数据库服务常用3306端口。
Q:常见的Linux日志文件和路径:
`/var/log/messages`、`/var/log/syslog`。
Q:常见的进程管理命令:
`ps`、`top`、`kill`。
Q:linux查看某个端口是否开启
a. 使用lsof -i:端口号命令行
b.使用netstat -aptn命令行,查看所有开启的端口号
其他补充:
- 如何停止一个进程?
kill命令被用来给程序发送信号。如果没有指定信号,默认发送TERM(终止)信号。
语法 : kill [-signal] PID … - 什么是硬链接和软链接?
硬链接:由于 Linux 下的文件是通过索引节点(inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配 inode 。每添加一个一个硬链接,文件的链接数就加 1 。
不足:
1、 不可以在不同文件系统的文件间建立链接;
2、 只有超级用户才可以为目录创建硬链接。
软链接:软链接克服了硬链接的不足,**没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。**因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
不足:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。
实际场景下,基本是使用软链接。
总结区别如下:
1、 硬链接不可以跨分区,软件链可以跨分区。
2、 硬链接指向一个 inode 节点,而软链接则是创建一个新的 inode 节点。
3、 删除硬链接文件,不会删除原文件,删除软链接文件,会把原文件删除。
软连接类似于快捷方式但不一样. - Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的?
1、 不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的。不可中断, 指进程不响应异步信号。
2、 暂停状态/跟踪状态:向进程发送一个 SIGSTOP 信号,它就会因响应该信号 而进入 TASK_STOPPED 状态;当进程正在被跟踪时,它处于 TASK_TRACED 这个特殊的状态。
正被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。
3、 就绪状态:在 run_queue 队列里的状态
4、 运行状态:在 run_queue 队列里的状态
5、 可中断睡眠状态:处于这个状态的进程因为等待某某事件的发生(比如等待 socket 连接、等待信号量),而被挂起
6、 zombie 状态(僵尸):父亲没有通过 wait 系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉
7、 退出状态
D 不可中断 Uninterruptible(usually IO)
R 正在运行,或在队列中的进程
S 处于休眠状态
T 停止或被追踪
Z 僵尸进程
W 进入内存交换(从内核 2.6 开始无效)
X 死掉的进程