私有化的源起

在做公有云平台的过程中,我们接触到很多客户,有许多客户和我们反馈:“你们的云平台服务很好、线上也很稳定,但我们希望能把云平台搬到自己的环境里部署起来”。在进一步了解情况后,我们也得到了客户要求私有化的几个诉求点:

1. 私密性要求

一些企业出于数据保密及安全方面的顾虑,希望能把关键数据安放在自建机房或者数据中心,对网络访问进行严格控制;另外像银行金融机构以及政府部门会受到监管合规等方面的限制,私密性甚至是一个硬指标。

2. 自主性要求

希望能够自主掌控IM系统,这类客户一般自身便具有较强的开发和运维团队。

3. 数据资产化要求

公有云上的客户需要依赖我们的数据开放能力,而在私有化部署后客户能够一手掌握存储的原始数据以及使用过程产生的所有日志信息,使数据真正转变为企业资产,满足灵活多样的数据分析需求进而增值。

4. 本地化应用要求

一些企业对应用时延有较高要求,公有云平台无法满足,从而需要进行本地私有化部署。另外和现有企业内部信息系统整合,构建沟通交流协作大平台的需求成为企业选择私有化部署的一种考量。

私有化java 私有化部署IM_私有化java

在这些服务里面会涉及到JAVA、C、Golang等多种技术栈,当这些服务混合部署到各种环境中,如何解决依赖管理以及可能发生的底层库冲突,怎么通过技术让这个过程变得简单高效,是我们面临的主要问题。

下面我们来看如何解决落地。

私有化解决方案

概括起来主要是围绕Docker技术从主机、容器、镜像和编排四个层面来解决。

  • 主机

私有化java 私有化部署IM_java_02

主机上除了标准的操作系统,初始化只需要安装Docker引擎、Supervisor和MetricBeat。其中,Supervisor起到管理容器实例的作用,当容器出现状况时起到一定的故障恢复的作用;MetricBeat是ELK技术栈中的监控agent,能够向监控系统上报主机的资源使用情况以及各个容器的健康状况。最小化依赖组件,就降低了出现依赖冲突的可能性,达到兼容更多云主机、虚拟机以及物理机环境的目的。

  • 镜像

私有化java 私有化部署IM_运维_03

主机上最小化依赖项,那么每个服务依赖管理的任务就落到了镜像这个层面上。每个镜像对应一种服务并且自我管理依赖,多个镜像对应的容器之间相互隔离。比如服务A依赖jdk7,而服务B必须跑在jdk8版本上,如果这两个服务没有容器化而是跑在同一主机环境下,我们就需要显式指定所使用的JAVA路径,增加额外的复杂度。更坏的情况,如果出现底层库的版本冲突,可能会导致不同服务无法部署在一个主机上,这显然是我们不想看到的。但通过Docker与生俱来的隔离特性,我们能很好地规避这个问题。

  • 容器

私有化java 私有化部署IM_运维_04

镜像实例化后我们便得到了运行中的容器,不同于单进程容器的是,我们使用Supervisor作为容器入口,再由Supervisor来管理容器中的多个进程,这些进程有主次之分,主进程对外提供服务,次进程一般包括MetricBeat和FileBeat,前者起到主进程监控和业务监控的功能,后者是ELK生态中的日志采集组件。

  • 编排

私有化java 私有化部署IM_运维_05

将多个同类容器组成集群,将非同类容器进行配置并连接可达,是编排的基本功能。往往说起Docker容器编排,大家首先想到的是kubernetes(以下简称k8s),不同于容器云等场景,在企业IM场景中用户数普遍为几十万左右,对应的集群主机数量一般不超过10台,在这种规模下将k8s整合进去代价较大。于是我们考虑轻量的方式,就是使用Ansible。

对于Ansible,做过运维的同学应该比较熟悉,它基于SSH采用无agent架构,是集群管理的有力工具。虽然丢失了k8s中容器动态管理以及故障自我恢复等高级功能,但通过前面提到的在主机和容器层面引入Supervisor管理的方式,在一定程度上保留了容器管理和故障恢复的能力。

Ansible虽然轻量,但通过丰富的功能模块、角色定义,能够具备强大的脚本表达能力,我们在此基础上编写主机初始化流程,各个服务的高可用集群如基于keepalived虚拟ip的MySQL主从或者双主集群以及基于OpenResty负载均衡双主集群。

私有化java 私有化部署IM_docker_06

除了技术架构上的四个层面,在ansible部署脚本之上我们封装了http接口并开发了可视化的安装向导。此外我们还提供管理平台和运维平台kibana,这些可视化平台能够方便交付工程师和运维工程师在安装部署、集群管理、应用管理以及运维监控等方面提高效率,真正做到从部署到交付后运维的全流程高效可复制。

私有化java 私有化部署IM_大数据_07

最后,我们把验收工作比作交付的最后一公里,由于PaaS产品并不像SaaS那样能够做到开箱即用的效果,我们提供了demo程序进行测试,覆盖iOS/AOS/Web/PC等主流客户端,具备单聊、群聊、聊天室、双人及多人音视频通话等场景便于客户在场景中验证核心能力。Demo程序开放源代码,便于后续接入集成。

云信实战经验总结

那么,从IM私有化实践中我们可以得到什么经验?总结为以下五点:

1)     标准OS提供计算资源,兼容异构环境

2)     Docker实现程序包封装和运行时资源隔离

3)     Ansible实现分布式集群高可用部署

4)     可视化平台使部署及管理高效可复制

5)     多端demo验证突破交付最后一公里

以上就是网易云信IM私有化实践的分享,期待和大家共同探讨、交流。

私有化java 私有化部署IM_运维_08