达观数据:推荐系统部署难点与要点解析

推荐系统由于自身的复杂性和特点,与部署其他软件系统有很多不同,本文将对推荐系统的部署难点与要点进行简要的分析

序言

随着移动互联网的快速发展,我们进入了信息爆炸时代。在信息过载时代,信息及其传播形式多样化,用户对信息的需求成多元化和个性化发展趋势。搜索引擎已不能满足不同背景、不同目的、不同时期的个性化信息需求,于是个性化推荐应运而生。

构建一个推荐系统有以下两种方式:
  • Saas方式:通过调用第三方接口来获取个性化推荐结果;
  • 通过私有化部署方案:将推荐系统部署至本地环境,与本地的服务很好的有机结合到一起。

对于很多大型的银行、军工、政企等对数据安全要求比较高企业私有化部署是企业比较信赖的解决方案。然而推荐系统由于自身的复杂性和特点,与部署其他软件系统有很多不同。


常见的服务器环境

一般常见的服务器环境有:企业局域网、云服务器、局域网+VPN等几种情况。

企业局域网常见于大型的银行、军工、政企等,通常企业对服务器安全做过多层的安全隔离,安全性非常高,但由于大多数企业服务器的软件版本较低且相应设施相对落后,在该环境部署系统通常比较吃力,常常遇到软件版本兼容性、服务器异常等问题;

云服务器常见于大多数中小型互联网企业,由于可以直接访问外网,更新和安装软件非常方便,在该环境部署系统非常方便。但云服务器环境安全性相对较低,即便加防火墙做安全隔离也常常遇到病毒以及挖矿软件的入侵。

局域网+VPN相对以上两种是比较这种的方式,通过VPN来访问局域网内部,虽然安全性不如纯粹的局域网做到完全隔离,但能在保持较高的安全性下,提高部署的灵活性及更新安装软件简易性。

推荐系统部署的两种方式

推荐系统部署一般有两种方式:传统的应用部署方式(通过插件或脚本来安装应用)、通过部署容器方式

应用部署方式:将应用手动逐个部署至服务器上,这种方式比较繁琐,应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,需要解决大量的程序依赖问题,以及各个应用之间的耦合关系,可维护性较低,并且不利于应用的升级更新/回滚等操作。总体上缺少统一管理的方案。

通过部署容器方式:每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。随着云计算以及容器化技术的发展,docker已经成为了事实上的容器化标准,基于docker容器技术衍生出了众多管理云平台中多个主机上的容器编排的应用,目前较常见的容器编排应用有docker公司出品的Docker Swarm、Google的kubernetes(k8s)、Apache的Mesos和Marathon,以及rancher等。

与传统方式部署相比较,容器部署有以下优势:

1.快速的应用创建与部署:相比虚拟机镜像,容器镜像的创建更简便、更高效。

2.持续的开发、集成,以及部署:在快速回滚下提供可靠、高频的容器镜像编译和部署(基于镜像的不可变性)。

3.开发与运营的关注点分离:由于容器镜像是在编译/发布期创建的,因此整个过程与基础架构解耦。

4. 跨开发、测试、产品阶段的环境稳定性:在笔记本电脑上的运行结果和在云上完全一致。

5.在云平台与 OS 上分发的可转移性:可以在 Ubuntu、RHEL、CoreOS、预置系统、Google 容器引擎,乃至其它各类平台上运行。

6.以应用为核心的管理:从在虚拟硬件上运行系统,到在利用逻辑资源的系统上运行程序,从而提升了系统的抽象层级。

7.松散耦联、分布式、弹性、无拘束的微服务:整个应用被分散为更小、更独立的模块,并且这些模块可以被动态地部署和管理,而不再是存储在大型的单用途机器上的臃肿的单一应用栈。

8.资源隔离:各容器之间资源相互隔离,增加程序表现的可预见性。

9.资源利用率:高效且密集。

容器编排技术大大降低了私有化部署的难度,支持跨平台、平滑更新、弹性伸缩、自动部署和回滚等功能,原来需要一个团队是几个技术达人一起分工协作才能设计实现的分布式系统,现在只需要一个精悍的小团队就能搞定。

推荐系统部署与一般网络系统部署的区别

推荐系统由于自身的复杂性,与一般的网络系统部署有诸多区别。在部署前需针对要求满足的接口性能要求,以及用户量、行为数据量、物品数据量等数据规模的情况,对各个模块进行合理的资源分配。

模块从功能、运行方式以及架构上又可分为外设模块、数据上报模块、离线算法模块、近线算法模块、在线算法模块。

一般优先部署外设模块,包括mysql、redis、zookeeper、kafka、es等,且需要执行数据初始化步骤的任务(Job)或者脚本,并测试是否所有外设都是正常可用的。

其次,再部署数据上报模块,通过上报部分测试数据确认相应模块以及整个数据上报是否正常。

接着,再部署离线算法模块,手动启动离线模块来测试是否有正常生成离线模块的推荐候选集。再部署近线模块,通过查看日志确认是否都在正常工作。

最后,部署在线算法模块,通过调用推荐接口来确认推荐接口是否正常。

部署推荐系统与一般的网络系统最大的区别在于,需要根据推荐系统的计算逻辑,来分清部署和测试的前后依赖关系。


推荐系统的监控和报警

对服务器、操作系统、中间件、业务应用进行全面的监控和报警,对推荐系统的正常运行起着至关重要的作用。当系统出现异常时能否及时监控到并告警到工作人员,决定了是否能够及时避免更加严重的系统问题。

通常监控分为系统监控和业务监控

系统监控主要包括服务器的cpu、内存、硬盘等资源的监控,集群主从机状态以及容器运行状态的监控。

由于推荐系统自身的特点,业务监控主要包括离线任务监控、日志监控、消息队列监控、接口异常监控。

如何提高推荐系统的稳定性

对于推荐系统的应用方来说,通常是从推荐系统获取推荐结果后,直接将结果展示到前端。一旦推荐系统没有返回结果,前端会直接显示为空,所以推荐系统的稳定性对于使用推荐系统的应用方来说非常重要。

推荐系统的稳定性可以分为两个方面:

  • 推荐系统的基础环境的稳定性,也就是kubernetes或swarm集群的稳定性
  • 推荐系统本身的算法稳定性

从基础环境的稳定性来看,提高基础环境的稳定性有以下措施。

  • 首先,集群可以部署多个主机节点,通过负载均衡来负载各个主机请求,一旦某台主机挂了,负载均衡会自动剔除主机,同时做好监控报警,及时处理该异常主机节点。
  • 其次,可以将集群从(工作)节点隔离,根据推荐系统具体的业务性质,将从节点划分为不同功能的节点。
  • 最后,用于搭建整个推荐系统的服务器应做好安全隔离,避免病毒入侵。

对于推荐系统本身的稳定性,可以从以下几个方面入手。

  • 首先,在部署推荐系统的时候,尽可能每个应用模块都配置健康检查,当容器出现异常时,健康检查会自动重启容器,避免容器卡住的情况影响推荐服务。
  • 其次,对于推荐系统依赖的一些外设应用,可以部署多节点集群版,避免单一节点异常,影响推荐服务。
  • 最后,推荐接口应做好容灾措施,当接口出现异常时,推荐系统可以切换至灾备状态。

0条评论 添加新讨论

登录后参与讨论
Ctrl+Enter 发表