低配服务器部署项目的思考

背景:

小公司意图构建官网,客户资源管理系统。但是老板对IT预算并没有那么多预算,所以采用借助云服务器方案阿里云搭建成本较小甚至免费的云环境。阿里云首次注册赠送12月的免费ECS服务器(配置项 cpu: 2核 ram: 2g bandwidth: 1Mbps 操作系统: centos 7)

问题:

毕竟使用免费的云资源(我想估计是仅供学习使用的),使用低配的云服务去构建公司官网(一个前端node, 一个后端java),客户资源系统(一个前端node,一个后端java),基础资源Mysql, Redis, Rabbitmq, jenkins等,更别说分布式系统辅助资源。

记得当时搭建完成启动应用后,使用一段时间后系统莫名其妙报错“网络异常”,后来一看才知道是Mysql被打挂了。无奈添加监听程序,检测到MYSQL运行异常,每次需要重新手动重启恢复。

这时候内存使用率已经达到95%以上,CPU使用率90%以上。毫无疑问,根本无法支持部署两个系统。

解决思路:

采用轻量级软件,占用内存较少的软件

首先想到就是NGINX,轻量级反向代理服务器

Nginx(engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是如何做到轻量级的呢?

关键在于Nginx实现原理采用单线程,非阻塞模型和异步IO模型

并且使用多路复用IO技术epoll,在一个线程中执行所有请求,这样做法避免大量的线程的创建,消耗大量CPU,RAM资源

当一个 IO 操作开始的时候,Nginx 不会等待操作完成就会去处理下一个请求,等到某个 IO 操作完成后,Nginx 再回过头去处理这次 IO 的后续工作。

epoll

上图为多路复用原理

各个work进程间通过accept_mutex互斥锁进行连接的获取,以防止惊群现象的发生(即所有进程都收到通知,却只有一个进程执行)。负载的实现通过accept_mutex_disable=所有连接数/8-空闲连接数,该值越大越不容易去获取accept_mutex锁,也即空闲连接数小于所有连接数的1/8时,不再去主动获取连接。

下面将隆重介绍解决低配资源的应用容器Docker

docker

Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低

docker直接利用宿主机的系统内核,避免了虚拟机启动时所需的系统引导时间和操作系统运行的资源消耗。利用docker能在几秒钟之内启动大量的容器,这是虚拟机无法办到的。快速启动、低系统资源消耗的优点使docker在弹性云平台和自动运维系统方面有着很好的应用前景。

docker 容器是如何做到轻量级的呢?

docker镜像是一个“应用程序和它运行依赖环境”的封装。当镜像运行起来后,即是docker容器。运行时的容器本质是操作系统下的一个进程,这些进程共享同一个宿主机OS的内核。

与传统VM相比,docker是一种操作系统虚拟化技术,并不需要在镜像内安装GuestOS。

docker在共享宿主机内核的基础上包装内核提供的一系列API,这些API中最重要的就是namespace和cgroup。通过namespace实现隔离,通过cgroup实现资源限制。

可以看出docker容器运行的进程和服务器宿主机共享一个内核,并且是运用到虚拟化技术。它同传统虚拟机不同的是,docker虚拟化是没有Guest OS的,也就是说docker会比虚拟机省去创建OS的一系列占用宿主机硬件资源的复杂操作。所以,docker容器会启动更快,效率更高。

在使用一系列提升性能的程序之后,两个系统程序包括基础资源都能顺利启动,CPU占用率仅仅只是50%,内存也就占用率达到80%下,不禁感叹道Docker makes me happy again again!!!!!

cpu​
ram

通过portainer.io监控docker容器的运行状态

portainer.io

致谢相关知识资源的网络提供者

2020.10.10

你可能感兴趣的:(低配服务器部署项目的思考)