SpringCloud 和 Linux 八股文第二期五问五答
作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!
?点赞?收藏?不迷路!?
1.docker的好处,为什么要存在容器?
- 资源隔离:Docker 使用轻量级的容器化技术,可以在同一主机上运行多个容器,并且容器之间相互隔离,互不干扰。这可以防止应用程序之间的资源冲突,提高应用程序的安全性和稳定性。
- 简化管理:Docker 提供了丰富的管理工具和 API,可以方便地创建、启动、停止、删除和管理容器,以及构建和管理容器镜像。这简化了应用程序的管理和维护工作,减少了运维成本。
- 可伸缩性:Docker 容器可以方便地在不同的主机之间迁移,也可以通过容器编排工具(如 Docker Swarm、Kubernetes 等)进行自动化的容器集群管理,从而实现应用程序的高度可伸缩性和弹性。
- 灵活性:Docker 提供了丰富的容器镜像,可以基于现有的镜像构建自定义的容器,从而实现灵活的应用程序组合和定制化部署。
- 跨平台支持:Docker 支持多种操作系统和硬件架构,包括 Linux、Windows 和 macOS 等,使得应用程序可以在不同的平台上运行,提供了更大的灵活性和选择性。
总的来说,Docker 提供了一种轻量级、可移植、高效、简化管理的容器化解决方案,为应用程序的开发、测试、部署和运维带来了许多好处,提高了应用程序的可靠性、可伸缩性和灵活性。
2.docker怎么拉取镜像,怎么改文件卷
在 Docker 中,可以使用 docker pull 命令来拉取 Docker 镜像,使用 -v 参数来创建和管理文件卷。
- 拉取 Docker 镜像:
使用以下命令可以拉取 Docker Hub 上的镜像:
phpCopy code
docker pull <镜像名称>:<标签>
其中 <镜像名称> 是要拉取的 Docker 镜像名称, <标签> 是镜像的版本标签。例如,要拉取官方的 nginx 镜像,可以使用以下命令:
Copy code
docker pull nginx:latest
- 创建文件卷:
使用 -v 参数可以在容器和主机之间创建文件卷,用于数据持久化或与主机共享文件。
bashCopy code
docker run -d -p 8080:80 -v /path/on/host:/path/in/container <镜像名称>
其中 -d 参数表示以后台守护进程方式运行容器, -p 参数表示端口映射, -v 参数表示创建文件卷,将主机上的 /path/on/host 目录映射到容器内的 /path/in/container 目录。
例如,创建一个 nginx 容器,并将主机上的 /data/nginx 目录映射到容器内的 /usr/share/nginx/html 目录,可以使用以下命令:
bashCopy code
docker run -d -p 8080:80 -v /data/nginx:/usr/share/nginx/html nginx:latest
这样,容器内的 Nginx 服务将使用主机上的 /data/nginx 目录作为静态文件目录,对该目录的修改将持久化到主机上。
注意:在使用 -v 参数创建文件卷时,需要确保主机上的目录存在,并且具有足够的权限供容器使用。另外,文件卷是持久化的,即使容器被删除,文件卷中的数据仍然会保留。
在 Docker 中,可以通过以下几种方式修改数据卷:
- 在容器内部直接操作文件卷:可以通过在容器内部执行命令或使用容器内的应用程序来直接修改文件卷中的文件。例如,可以在容器内使用命令行工具(如 bash)进入容器,并使用标准文件操作命令(如 cp、mv、rm 等)来修改文件卷中的文件。
bashCopy code
docker exec -it <容器名称或容器ID> bash
- 在宿主机上修改文件卷:可以在宿主机上直接修改文件卷中的文件。例如,可以使用宿主机上的文本编辑器或其他工具来修改文件卷中的文件,这样容器内的应用程序会自动读取到修改后的文件。
- 使用 Docker Volume 插件:Docker 还支持使用 Docker Volume 插件来管理和修改数据卷。可以通过 Docker 插件机制来安装和配置不同类型的 Docker Volume 插件,从而实现对数据卷的高级管理和操作。
需要注意的是,修改文件卷时需要注意文件权限和所有权的问题。在容器内部或宿主机上修改文件卷时,需要确保文件权限和所有权与容器内的应用程序要求一致,以避免访问权限问题导致的错误或安全风险。
另外,对于正在运行中的容器,修改数据卷后可能需要重启容器或重新加载应用程序才能生效。因此,在修改数据卷时需要注意容器的运行状态和应用程序的重启或重新加载需求。
3.Es索引有哪些?
Elasticsearch(以下简称ES)的索引主要包括以下三种类型:
- 单个索引(Single Index):指一个索引只包含一个文档类型(type)的数据。该类型的索引具有良好的扩展性和灵活性,适合存储相似的数据类型。
- 多类型索引(Multi-type Index):指一个索引中包含多个文档类型的数据。该类型的索引由于存在多个文档类型,导致映射和搜索效率下降,已经不建议使用。
- 分区索引(Partitioned Index):指一个索引被分成多个分片(Shard),每个分片可以分布在不同的节点上,用于提高索引的可扩展性和可用性。分片数建议为5~50个之间,具体需要根据实际情况来确定。在实际使用中,可以根据数据类型和存储需求来选择合适的索引类型。如果数据类型相似且需要扩展,可以选择单个索引;如果需要在同一索引下存储多种类型数据,可以选择多类型索引;如果需要高可用和扩展性,可以选择分区索引。
4.ES架构
Elasticsearch(简称ES)是一个基于Lucene的分布式搜索引擎,具有高可用性、高扩展性和分布式实时搜索等特点。它主要包含以下几个组件:
- 节点(Node):单个服务器上的ES实例称为节点,每个节点都是一个独立的Java进程,可以是数据节点、路由节点或协调节点。
- 索引(Index):相当于数据库,ES中的索引是一个存储数据的逻辑容器,可以分成多个分片,每个分片可以分布在不同的节点上。
- 分片(Shard):每个索引可以分成多个分片,每个分片是一个Lucene索引。
- 副本(Replica):每个分片可以有多个副本,副本和分片放在不同的节点上,主要是为了提高数据的可用性和可靠性。
- 搜索(Search):ES支持丰富的查询语言和查询方式,可以进行复杂的全文搜索、聚合分析等操作。
- 集群(Cluster):由多个节点组成的逻辑集合,负责协调各节点之间的数据分布和数据共享等工作。
- 类型type: 类型类似与MySQL中的表,在一个索引中可以创建多个type。这个在es7及以后已经被废弃,只有_doc。
- 文档document文档类似: MySQL中的一条数据,存储的是具体的数据,存储格式为Json
- 字段field: 相当于MySQL中的字段。
- 映射mapping:mapping对处理数据方式和规则做的一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等
相对于传统关系型数据库,ES有以下优点:
- 分布式:ES采用分布式架构,可以水平扩展,提高了系统的可用性和性能。
- 搜索能力:ES基于全文索引,具有高效的全文搜索能力,支持复杂的查询语法。
- 高可用性:ES支持数据分片和多副本机制,可以提高数据的可用性和可靠性。
- 异步提交:ES采用异步提交的方式,写入操作不会阻塞查询操作,提高了系统的吞吐量。
- 灵活性:ES不需要预先定义表结构,支持动态添加字段,方便数据的扩展。
Java如何操作ES
- ES官方提供的JavaAPI:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.17/introduction.html 快速开始:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.17/connecting.html
- Es以前的官方JavaAPI,HighLevelRestClient(已废弃)
- Spring Data ElasticSearch(推荐) 文档:https://docs.spring.io/spring-data/elasticsearch/docs/4.4.10/reference/html/
5.为什么要使用ES,使用ES的好处
使用ES的好处:
- 搜索速度快:ES使用倒排索引,能够快速定位到需要查询的数据,比传统数据库的全表扫描要快很多。
- 高可用性:ES支持数据分片和副本机制,当一个节点故障时,数据仍然可以被访问,从而保证了系统的高可用性。
- 强大的搜索功能:ES提供了丰富的搜索功能,包括全文搜索、聚合分析、地理位置搜索等,能够满足大部分搜索场景的需求。
- 易于扩展:ES使用分布式架构,可以方便地扩展节点数量和数据量,以满足不断增长的业务需求。
使用ES可能会存在的问题:
- 数据一致性问题:ES采用的是异步复制的方式,可能会存在数据同步不及时或丢失的情况,需要通过合适的配置和数据备份来避免数据丢失。
- 数据安全问题:ES的默认配置下是没有开启安全认证机制的,因此需要通过配置用户名密码或其他安全措施来保护数据的安全。
- 数据存储成本问题:ES需要占用一定的存储空间,对于大规模的数据存储,需要考虑到存储成本的问题。