私有化的源起
在做公有云平台的过程中,我们接触到很多客户,有许多客户和我们反馈:“你们的云平台服务很好、线上也很稳定,但我们希望能把云平台搬到自己的环境里部署起来”。在进一步了解情况后,我们也得到了客户要求私有化的几个诉求点:
1. 私密性要求
一些企业出于数据保密及安全方面的顾虑,希望能把关键数据安放在自建机房或者数据中心,对网络访问进行严格控制;另外像银行金融机构以及政府部门会受到监管合规等方面的限制,私密性甚至是一个硬指标。
2. 自主性要求
希望能够自主掌控IM系统,这类客户一般自身便具有较强的开发和运维团队。
3. 数据资产化要求
公有云上的客户需要依赖我们的数据开放能力,而在私有化部署后客户能够一手掌握存储的原始数据以及使用过程产生的所有日志信息,使数据真正转变为企业资产,满足灵活多样的数据分析需求进而增值。
4. 本地化应用要求
一些企业对应用时延有较高要求,公有云平台无法满足,从而需要进行本地私有化部署。另外和现有企业内部信息系统整合,构建沟通交流协作大平台的需求成为企业选择私有化部署的一种考量。
由于私有化的呼声持续增长,我们决定启动私有化项目,那么从服务提供者的角度我们需要什么样的私有化呢?
1. 复用业务代码
复用公有云代码,不重复造轮子,减少与公有云代码版本的差异性,使私有化系统最大限度继承公有云上的能力,降低测试开发维护成本。
2. 适配不同环境
具有私有化需求的客户来自各行各业,私有化部署环境也会各不相同,系统除了能在网易蜂巢、阿里云、华为云等主流云平台上跑起来,也需要能够适配企业自建数据中心的虚拟机以及物理机环境。
3. 部署高效可复制
部署流程标准化自动化。我们所追求的私有化,不是耗费1-2个月的工作量为企业部署一套定制化系统,而是高效可复制的。另外针对目前企业中IM相关的企业办公等场景的部署规模等实际情况,标准化部署我们走的是相对轻量化的路线,有效降低企业的部署成本。
4. 服务稳定可靠
这其实是一个分布式系统的基本要求,内部各个组件高可用可扩展,消除单点。
私有化面临的问题
明确了需求后我们再来看看所面临的一些问题。
公有云的主体架构如下,主要由客户端层、网关接入和路由层、业务层、中间件、数据存储层以及监控系统组成,其中接入层根据不同的连接方式以及应用场景拆分为多个服务,业务层根据不同业务逻辑划分出漫游、推送、历史消息以及抄送等服务。
在这些服务里面会涉及到JAVA、C、Golang等多种技术栈,当这些服务混合部署到各种环境中,如何解决依赖管理以及可能发生的底层库冲突,怎么通过技术让这个过程变得简单高效,是我们面临的主要问题。
下面我们来看如何解决落地。
私有化解决方案
概括起来主要是围绕Docker技术从主机、容器、镜像和编排四个层面来解决
- 主机
主机上除了标准的操作系统,初始化只需要安装Docker引擎、Supervisor和MetricBeat。其中,Supervisor起到管理容器实例的作用,当容器出现状况时起到一定的故障恢复的作用;MetricBeat是ELK技术栈中的监控agent,能够向监控系统上报主机的资源使用情况以及各个容器的健康状况。最小化依赖组件,就降低了出现依赖冲突的可能性,达到兼容更多云主机、虚拟机以及物理机环境的目的。
- 镜像
主机上最小化依赖项,那么每个服务依赖管理的任务就落到了镜像这个层面上。每个镜像对应一种服务并且自我管理依赖,多个镜像对应的容器之间相互隔离。比如服务A依赖jdk7,而服务B必须跑在jdk8版本上,如果这两个服务没有容器化而是跑在同一主机环境下,我们就需要显式指定所使用的JAVA路径,增加额外的复杂度。更坏的情况,如果出现底层库的版本冲突,可能会导致不同服务无法部署在一个主机上,这显然是我们不想看到的。但通过Docker与生俱来的隔离特性,我们能很好地规避这个问题。
- 容器
镜像实例化后我们便得到了运行中的容器,不同于单进程容器的是,我们使用Supervisor作为容器入口,再由Supervisor来管理容器中的多个进程,这些进程有主次之分,主进程对外提供服务,次进程一般包括MetricBeat和FileBeat,前者起到主进程监控和业务监控的功能,后者是ELK生态中的日志采集组件。
- 编排
将多个同类容器组成集群,将非同类容器进行配置并连接可达,是编排的基本功能。往往说起Docker容器编排,大家首先想到的是kubernetes(以下简称k8s),不同于容器云等场景,在企业IM场景中用户数普遍为几十万左右,对应的集群主机数量一般不超过10台,在这种规模下将k8s整合进去代价较大。于是我们考虑轻量的方式,就是使用Ansible。
对于Ansible,做过运维的同学应该比较熟悉,它基于SSH采用无agent架构,是集群管理的有力工具。虽然丢失了k8s中容器动态管理以及故障自我恢复等高级功能,但通过前面提到的在主机和容器层面引入Supervisor管理的方式,在一定程度上保留了容器管理和故障恢复的能力。
Ansible虽然轻量,但通过丰富的功能模块、角色定义,能够具备强大的脚本表达能力,我们在此基础上编写主机初始化流程,各个服务的高可用集群如基于keepalived虚拟ip的MySQL主从或者双主集群以及基于OpenResty负载均衡双主集群。
除了技术架构上的四个层面,在ansible部署脚本之上我们封装了http接口并开发了可视化的安装向导。此外我们还提供管理平台和运维平台kibana,这些可视化平台能够方便交付工程师和运维工程师在安装部署、集群管理、应用管理以及运维监控等方面提高效率,真正做到从部署到交付后运维的全流程高效可复制。
最后,我们把验收工作比作交付的最后一公里,由于PaaS产品并不像SaaS那样能够做到开箱即用的效果,我们提供了demo程序进行测试,覆盖iOS/AOS/Web/PC等主流客户端,具备单聊、群聊、聊天室、双人及多人音视频通话等场景便于客户在场景中验证核心能力。Demo程序开放源代码,便于后续接入集成。
云信实战经验总结
那么,从IM私有化实践中我们可以得到什么经验?总结为以下五点:
1) 标准OS提供计算资源,兼容异构环境
2) Docker实现程序包封装和运行时资源隔离
3) Ansible实现分布式集群高可用部署
4) 可视化平台使部署及管理高效可复制
5) 多端demo验证突破交付最后一公里
以上就是网易云信IM私有化实践的分享,期待和大家共同探讨、交流。
网易云信(NeteaseYunXin)是集网易18年IM以及音视频技术打造的PaaS服务产品,来自网易核心技术架构的通信与视频云服务,稳定易用且功能全面,致力于提供全球领先的技术能力和场景化解决方案。开发者通过集成客户端SDK和云端OPEN API,即可快速实现包含IM、音视频通话、直播、点播、互动白板、短信等功能。