目前,我使用的个人计算机具有i7-3820
4 个核心、8 个超线程的处理器。
我运行一个apache-spark
参数为local[6]
(6 vCPU) 的独立 sat 来进行一些计算。但这必须改变,因为我希望最后能够调度这些组件:
正在
apache-spark
做计算。一master
和二workers
有一个真正的集群。(
PostGis
Postgresql) 数据库。疼痛文本文件或 csv 文件的存储,通常来自开放数据。
Geoserver
创建地理地图的实例。日志分析器,
ELK
.一个
Kafka
流,用于从组件传输有关组件正在执行的操作、发现的事件、必须执行的操作以及分析日志的事件。供用户在
Angular
应用程序中查看地图和结果的 Web 应用程序。如果我像今天一样保持独立
apache-spark
,并放弃集群的想法,我可以将它们全部放在我自己的计算机上,只要我使用端口和环境变量。我可以
Debian 10
使用Vagrant
和在其上创建许多虚拟机Virtualbox
。我还可以对每个组件进行 dockerize。
我应该如何选择:
- 许多虚拟机,带有
Vagrant
/Virtualbox
。 Docker
只是,Docker-Engine
直接安装在我的电脑上,- 一些虚拟机
Docker
上有吗? - 还有什么更好的,可以考虑吗?
但我不是注定要失败吗,因为:
- 一个
apache-spark
集群 3 个 vCPU, - 1 为
PostGis
, - 1 为
Geoserver
, - 1 为
ELK
, - 1 对于网络应用程序,
= 8 个可用的 vCPU 上有 7 个,这样我就只剩下一个 vCPU 来运行我的计算机Eclipse
来进行开发并在我的计算机上执行其他任务?
答案1
这种类型的决策通常更多地是系统管理员的决策,而不是开发人员的决策。在开发机器上,您通常不应该考虑划分为虚拟机/容器的决定。很多时候,您可以“在裸机上”进行开发,直接安装所有内容。
然而!
系统管理员希望您考虑一些注意事项,以及从长远来看对您有帮助的事情。
- 由于软件的生产版本将部署到多个节点(如您在问题中所建议的那样进行分解),因此最好的做法是测试在此配置下一切正常。
- 由开发人员而不是系统管理员来决定容器之间的分界线是有意义的。例如,如果要使用 docker 进行部署,那么开发人员编写
Dockerfile
是否在开发计算机上以这种方式运行它是有意义的。
考虑到这一点,您实际上不需要过多担心容器的确切性质,只需担心它们之间的分界线在哪里。
VM、Docker 与 VM 上的 Docker
据我所知,虚拟机技术能够在所有虚拟机上累积分配比主机实际拥有的核心还要多的虚拟核心。虽然虚拟机的内核数不能多于主机的物理内核数,但具有 HT 的处理器算作 8 个内核而不是 4 个。因此,如果您愿意,您可以在虚拟机中运行。但一般来说,虚拟机是重量级容器。它们在每个容器内运行完整的操作系统(包括内核),并且往往会占用大量 RAM(如果不是 CPU)。
虚拟机也非常有状态。商业开发中的一项挑战是保持生产环境、测试和开发环境保持一致。很容易在虚拟机中留下大量垃圾,使测试通过,但在生产中却会失败。
另一方面,Docker(不在 Windows 主机上运行)以一种非常轻量级的方式隔离进程,它不像虚拟机那样为每个容器运行单独的内核。相反,它使用 Linux 内核内置的特殊隔离技术在主机上运行进程。这使得它非常高效。
Docker 还强调一次性容器。这使得拆除(销毁)容器并从您的映像重新开始以证明它在生产时可以工作变得非常容易。