nydiaxiangxiang 2015-11-04
泰捷成立于2009年,是一家提供家庭视频服务的视频资源聚合公司。泰捷2011年推出了一个比较重要的软件产品,就是“泰捷视频”,它被放在泰捷的电视盒子里给用户提供包括点播、直播在内的视频服务。
下文是泰捷后台工程师李龙在QingCloud IOT沙龙现场演讲速记整理。
今天在这里主要跟大家分享一下泰捷软件开发的开发流程、后端的服务器架构、自动化服务器构建与应用部署,最后给大家分享两个我们开发中的遇到的例子。
由于泰捷目前的规模还相对较小,我们软件的开发流程也比较简单,步骤如下:
开发人员在本地环境做项目开发。
开发完成之后,由项目主管或者项目负责人进行代码评审。如果代码通过审核,会被提交到公司内部的代码仓库,同时推送到用于部署的外部代码仓库。
代码同步到部署仓库之后,如果是第一次部署或是需要变更运行环境,就要做代码上线的准备工作,也就是搭建线上服务器环境:1,用脚本在QingCloud上构建服务器。2,搭建基础软件设施,比如一些基本软件的安装、用户的添加、登录配置、把服务器纳入监控等。
在线上环境搭建完成以后,就可以进行代码部署了。代码部署是运用我们内部的代码部署工具,把部署仓库里的代码发布到线上服务器。如果需要做自定义的部署,可以把命令加入到部署脚本里。
如图所示,以上是我们整个的代码开发流程
后台服务器架构
泰捷的后台服务器架构可以分为三个方面:
1.首先是服务器的宏观架构。
宏观架构包括在线运营服务器,一个控制管理中心及运营支撑服务器。在线运营服务器分为单机公网服务和集群服务,单机公网服务就是由公网上的一台机器提供的服务;集群服务就是由一个由多台机器组成的集群提供的服务,目前使用的是QingCloud私网集群。在控制管理中心,利用脚本就可以直接创建和消毁其它服务器和集群,并且把支撑服务器上的资源添加到单机公网服务和集群服务上面。
2.数据中心之间的数据同步。
我们在全国有多个物理数据中心节点,包括北京、广东、香港以及其他省市。这些数据中心里有的是单机服务器,有的是集群服务。这些相同的服务器之间通过DNS轮循的方式把视频内容服务提供给用户,也就是说即使一个数据中心挂了,我们也能正常提供服务。数据中心之间也会根据业务需要做数据同步,就是把不同集群里的数据通过隧道或者VPN搭建私网的方式连接起来进行数据同步。
3.服务器的微观架构。
对于每一台服务器,我们会在上面做一些管理和监控进程。配置管理服务,是在管理中心有一个登录管理组件,里面记录了所有服务器的登录IP、登录端口、登录用户以及相应的证书;监控告警服务,可以了解服务器上面的状况,如果出现问题会发出报警;代码和数据服务,服务器可以拉取提交到部署服务器上的代码和文件。对于服务器本身来讲,我们还可以用QingCloud的API直接创建和删除。
自动化构建服务器
下面说一下服务器的自动化构建。对于单个服务器来说,自动化构建可以通过脚本利用QingCloud的API来操作。生成的机器主要有两种类型:对外服务器、支撑服务器(我们会专门设置一台服务器作为内部集群健康状态的监控服务器,当检测到出现问题时会及时发出警报),支撑服务器完全嵌在脚本里完在创建。
通过QingCloud创建完机器之后,就会有一个机器内部初始化的脚本,直接在服务器上运行。初始化之后,会注册一些信息,包括登录、用户配置、监控服务的端口和网络环境到控制管理中心。
接下来是应用的部署,代码仓库里面放着运行程序的代码。程序员在开发好应用之后,编写相应的部署脚本,脚本放在控制中心,在需要部署应用时,即可以迅速部署需要的应用。在应用部署完毕之后,需要程序员检验服务是否正常运行。如果有一天这个服务要下线,可以直接在控制管理中心或QingCloud上把机器销毁。在我们的使用中,QingCloud带给我们的好处,除了在线运行和部署之外,无论单机还是集群可以做成脚本快速生成和销毁,将工程师从一些基础环境搭建中解放出来。
我们目前使用的是Ubuntu系统,下一步我们将会做容器方式的部署,主要是基于Docker,这样部署的时候就不需要编写应用本身环境依赖的代码。在QingCloud上使用虚机可以很轻松的进行部署和自动伸缩,但是由于应用质量状况不能依据它的负载均衡器来评估,所以还可能需要收集客户端的数据,然后在自动化配置管理中心对集群做伸缩管理。
下面分享我们做过的一个案例。这是我当时做过的一个后台数据中心的服务架构(如上图所示)。这其实就是一个Mongo的分片集群,包括下面的三部分:Mongos、Config、Shard。Mongos根据数据的config里的分片信息把请求分发到不同的shard里面,不同的shard存储各自的数据。整个架构里面,Loadbalancer和Node.js、Mongos和shard都可以不断的扩容,以增强规模。
第二个案例是泰捷视频后台API服务的整体架构(如上图)。我们通过正向爬虫和反向爬虫,将视频数据搜集到爬虫库里。爬虫库里面有一个定时任务就是做合并,把新爬到的数据和原有数据做一个更新,这个合并的过程比较复杂,运营人员也会做一些人工合并。然后将这些合并后的数据写入到节目信息数据库里。这个节目信息数据库里面也有一个定时任务,它会在节目数据库有更新的时候触发,把变动的数据同步到数据中心,然后通过数据中心把这些数据提供给用户。
这两个例子有非常大的区别,第二个扩展起来要比第一个更为简单。因为第一个要支持几百万用户的并发写访问,通过Node.js做接入,要求所有的数据库服务器放在同一个数据中心内,以降低访问延迟。而第二个则没有这样的限制。
原文链接: https://community.qingcloud.com/topic/157