云信私有化方案中如何搭建高可用的日志和监控平台?

avatar
开发 @网易智企

导读

云信公有云系列产品已经稳定运行数年,随着企业对信息安全和数据隔离愈加重视,云信产品私有化课题必然成为云信发展过程中一个的重要分支。依赖虚拟化和容器技术的日臻成熟,云信业务系统已经全面完成私有化,并且在多家企业内部稳定运行,成为云信产品线重要的一部分。
在公有云的服务中,云信日志信息采集和系统监控报警是依赖网易多年技术沉淀下来的自研平台,然而对于云信私有化产品来说这套自研平台显得过于繁杂,同时相对于公有云,私有化产品由于搭建在企业内部的特殊性往往具有网络上的隔离,云信技术支持人员不易直接访问私有化环境,而企业运维人员对云信系统了解程度又相对有限。因此私有化产品需要搭建一套更轻量级同时又具备高可用的日志和监控平台来向企业内部的运维人员实时展示服务状态和运行数据并作出预警。
本文将详述云信私有化日志监控服务端架构,如果你需要为自己的产品搭建日志采集和监控平台,这篇文章可以作为参考。

云信私有化主要技术

在开始介绍日志监控平台,我们先初步了解一下云信私有化整体方案以及所使用的技术栈。现在云信公有云产品本身涉及的模块众多,技术架构和编程语言不同,依赖的环境和网络也有所区别,因此我们在云信私有化中使用docker来实现各个模块的封装和运行时资源隔离;在容器的部署和管理上我们没有选择经常在大型容器云平台中出现的Kubernetes,而采用了更轻量级的运维部署工具ansible,主要有两个原因:
一是私有化企业用户量级绝大大多数在10w以下级别,这对于企业和企业延伸服务已经是非常大规模,因此在私有化过程中,企业能提供的资源往往有限,可能只有几台甚至一台服务器,而部署一套Kubernetes会为企业带来额外的资源开销;
二是服务集群实时动态调整在私有化交付后对于企业自身运维人员往往并不需要,企业需要的只是在约定规模下云信能够高效运行,Kubernetes所提供的资源调度和节点控制对于私有化显得过于复杂和沉重。因此我们选择通过Ansible协同的多机同步控制处理框架并结合python扩展开发可视化部署管理平台,实现云信私有化的统一快速部署和管理。

日志和监控平台主要需求

1.高性能:满足云信私有化方案中运行数据和日志收集;
2.高可用保障:日志平台具备一定高可用能力,单一节点或网络出现故障,业务系统有能力继续采集和监控;
3.平台实时监控和报警:可视化的系统和模块信息监控,当系统网络资源,服务状态出现异常时及时做出报警;
4.日志系统安全性:保障平台日志和运营数据安全;

ELK基本组件简介

下面是通过一张基本的ELK最基本架构图来说明一下ELK Stack的主要组件和架构
Elasticsearch是个开源分布式搜索引擎,具有分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等特点。作为ELK的核心组件负责日志存储、检索和分析
Logstash 是一个具有实时渠道能力的数据收集引擎,在filter中可以很好的对数据进行预处理。
Kibana 是一款专门为 Elasticsearch 提供分析和可视化的 Web 平台。它可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度的表图。
Metricbeat&Filebeat
Beats负责ELK协议栈中数据采集部分,收集系统信息和日志向 Logstash 或 Elasticsearch 发送数据。Filebeat主要收集日志文件,可以初步检索和过滤日志信息,Metricbeat从系统和服务收集指标。

私有化日志平台架构

私有化所有模块均为容器化部署。由于部署在企业内部,技术支持维护不便,因此每个模块都要具备高可用特性。ElasticSearch采用集群化部署,es集群部署已经有成熟的解决方案,可参照官网或简书等网上内容。在nginx的部署上采用keeplived通过虚拟IP地址(VIP)实现高可用,备用服务的keepalived在主机宕机的情况会做出检测并自动接管VIP资源继续提供服务。
在大型企业中或使用场景中有明显业务高峰的企业,在实施部署时可增加高性能消息中间件kafka在logstash之前作为消息队列缓冲。

使用Supervisor管理elk进程

除了在部署方案中支持组件高可用方案,私有化采用Supervisor作为进程管理,并随elk组件一同封装在镜像中。当所管理的进程意外挂掉,Supervisor会自动将其重新拉起,很方便的做到进程自动恢复的功能。
Supervisor配置文件实例

使用nginx 的IP白名单实现访问控制

Elk三大组件本身并不具有太多的安全相关设置,官方的相关的X-pack组件目前虽然已经开源,但是免费版功能使用上有很多限制,因此我们需要通过引入Nginx控制访问IP白名单来对日志平台进行安全加固。这一点也可以通过宿主机配置防火墙来实现,但是在私有化服务中,企业对于宿主机的防火墙管理差异很大,有些企业对防火墙管理基本一片空白,因此在镜像中使用Nginx作为反向代理在服务层进行白名单管理,使容器中的elk组件和Nginx作为整体提供服务是一个不错的选择,ELK组件均绑定本机的IP地址,Nginx作为对外访问出口,相当于为组件提供了白名单管理功能。
容器结构如下,与上一段内容相比加入nginx管理IP白名单,同样是使用supervior对进程进行管理。
除了管理白名单,elasticsearch还有一些其他工作可以加固安全
  • 修改默认elasticsearch的集群名;
  • 过期索引自动清理,确保使用磁盘空间;
  • ES配置绑定内网ip,防止多网卡时数据走外网网卡;
  • 关闭ES中使用接口通过正则表达式批量删除索引,配置项如下;

开发定制化的系统信息收集工具

通过对Metricbeat进行功能扩展是一个私有化中收集模块信息的好途径。Metricbeat作为ELK Stack用来采集和统计系统和应用信息的工具,已经整合包括系统信息,常用中间件信息,进程级别资源使用数据等模块,并且集成了精美的kibana图表。Metricbeat使用GO语言编写,接口清晰,适合通过二次开发增加个性化业务信息采集模块。
我们在二次开发过程中很好的利用公有云服务原有的服务监控接口和信息采集脚本以及系统指令,在模块中只封装了几个不同类型的指令调用接口,通过配置文件来配置模块具体调用脚本或指令并解析数据结果,把二次开发代码量降到最低。
在容器化过程中,metricbeat和filebeat两个采集模块均被集成在基础镜像中,其他镜像均基于基础镜像构建。在部署创建容器时,根据业务来生成的配置控制不同的采集指标

使用ElastAlert作为平台报警

ElastAlert是一款开源的使用python开发的elasticsearch报警工具,部署使用时需要注意所对应elasticsearch版本。使用过程中推荐一个elastalert的扩展API模块,搭配kibana可视插件可以在kibana直接编辑报警规则。
私有化报警内容涵盖四大方面,第一部分是服务器报警,主要有宿主机负载、cpu、网卡流量、磁盘、内存等指标;第二部分是中间件数据库基础服务层报警,例如mysql主从同步不一致,rabbitmq队列超限等内容;第三部是进程和JVM层,比如进程意外终止或重启,JVM gc频率过高;第四部分涉及到具体业务,自定义模块采集数据异常。

总结

企业私有云由于运维方面的因素对整体服务的高可用性提出了更高的要求,因此系统的监控和报警在私有化中就更显得重要。基于成熟的ELK Stack的搭建的日志收集和报警平台,承担了云信私有化中的日志和运行数据收集和保存,实时监控云信服务和系统情况,向运维负责人发送异常报警,为云信系统运行提供重要保障。
同时Elasticsearch作为高效的搜索引擎作用不仅于此,我们基于es的海量数据搜索统计能力,对平台日常运行数据进行二次分析和整理,通过kibana出色的图表展示,快速开发出一套的日常运行数据大盘,为决策者在企业产品研发方向提供了数据依据。