谈到线上环境,一般开发同学,不太容易接触到。即使接触到,也只是其中的冰山一角!
所以,其实说起线上环境的部署,咱们好像都有点懂,但是又都不一定完全懂!网上的知识无穷无尽,但往往都是各司一职,对于普通同学,很难窥其全貌!
所以,我今天就来说说,一些普通的线上环境的部署步骤,和一些脚本小技巧吧。只希望通过这篇文章,能够让大家有一个运维的全局!
我将会分几条线来整理咱们的运维思路!
一、从理论上讲,我们应该怎么做?
1. 针对的是什么样的用户群体,体量大量会有多少?
这是一个部署规划的前题。为啥呢?
一、如果你针对的是后台管理员,人数也不多,那么你可能只需要一个服务器就可以了,前后端也都可以部署在同一台服务器上;如果稍微考虑下单点故障问题,则顶多两台服务器搞定!
二、如果针对的是前端普通用户,那么,往往就会考虑多机部署,前后端分离,单点问题,负载均衡了;至于具体要部署多少台,则要根据你的用户情况来定了,当然,前期一般水需要多少台!只要能持横向扩展,则短期内,往往不太关心性能和架构问题!
2. 为支持预估的用户量,大概需要多少的带宽?
有访问就会有流量产生,而预估的用户量,则是一个带宽资源需求的一个决断依据!
一般针对前期用户不太确定的场景,可以先买个 10M 左右的共享带宽,基本能够应付;经过一段时间的观察后,再进行带宽的变更也可以;
当然,考虑带宽,自然也会存在一个公网IP的问题,因为流量是从IP进来的。
而在IP之前,则是域名的访问。
公网IP可以是直接指向机器的,也可以是指向负载均衡器的。如果想要支持横向扩展,则IP的指向一定是一个负载均衡器。因为只有这样,当遇到流量突增,或者做活动的时候,才能更快速的进行扩容!
3. 数据库规划如何?
数据在当下时代,算是重中之重了。机器没了可以再买,代码没了可以再写,但是数据没了就完蛋了!
数据库一般要新人两个基本原则: 一、带宽要大; 二、运算速度要快; 三、要能承受足够大的运算空间;
所以,一般不要在数据库上省钱,能多点就多点!
另外,也不要什么样的数据都往数据库(关系型数据库)存,搞清楚各类型数据库的强项与弱项,做出明智的选择。否则会带来很多不必要的麻烦!
4. 应用要基于系统来部署还是基于容器来部署?
这是个决策性的问题!基于系统的部署,是一种比较传统和常见的部署方式。优点是,很多系统工具都是完善的,只要你大概知道要部署什么,部署下来一般不会有太多问题,因为这是个完整的系统。
但是,由于系统与系统之间可能不能完全一致,有各种各样的差异,所以,你在这个机器上运行成功的东西,在另外的机器上则不一定能成功。因此,基于系统的部署将会使我人们的问题排查难度大大增加,而且移值性会很差。比如你在机器A上安装了10个软件,你可能配置了n个选项,但是,你在安装B机器的时候,你并不能很好的利用原有的配置,你还得从头一个个地来!
因此,有另一个部署方案,基于容器的部署(我这里是基于docker容器的部署)。docker就类似于一个个的虚拟机,但是它更加轻量级,当一个docker部署好后,你可以任意复制到其他机器上运行,看起来很诱人吧。不过,docker只是入门级容器,对于大量集群容器的管理,还是显得力不从心,当然你很容易找到另一个方案: Kubernetes (K8s); 你只要花上少许的时间了解下,你就可以应用了!当然了,使用容器的方案,有没有什么缺点呢?应该是有的,比如本来可以基于系统的监控方案,因为接入容器后,监控指标则不一定适用了,当然现成的方案还是有的,不过得另外再花点时间研究了。再比如:如果容器出了问题,是否能排查出来,这也是另一个问题!
5. 都有些什么样的基础设施或者中间件?
想要运行应用程序,自然是先考虑运行环境的。比如:应用需要 nginx 来做http服务器,用 tomcat 来做java web应用服务器,用redis来做缓存中间件,用zk来做应用协调中间件,用rabbitmq来做消息中间件,等等!
因此,要在代码跑起来之前,先要把这些环境给准备好咯。
准备这些中间件或基础设施之前,也要问下当下的形势,比如:是否需要集群部署,或者单机部署?往往集群部署又会依赖其他的中间件!也更复杂!
当然,这些都不是事。事儿是在出问题之后,能够有意识,能够猜测到问题发生的点!
6. 应用代码应该怎样部署?
当基础环境就绪后,就应该让主角上场了。应用代码怎么部署?
最简单的: 通过ftp上传代码到服务器上后,一个个部署!这种方案是最原始的,也是在没有办法搞更好的方案的时候使用的,不应长期使用;