本文作者:小熊博望运维经理 王明松
# 一、简介
ELK包括 [Elasticsearch](https://www.elastic.co/cn/logstash/)、[Kibana](https://www.elastic.co/cn/kibana/)和 [Logstash](https://www.elastic.co/cn/logstash/),[filebeat](https://www.elastic.co/cn/beats/filebeat)负责在终端进行采集,将数据上报给Logstash,存储在Elasticsearch或者其他存储(如S3),最终通过Kibana来呈现数据并进行分析,设置告警等。
替换之前一共有5个ELK集群,分别承担收集审计日志,收集业务日志,分析业务日志的职能。
其中收集审计日志是需要长期保存以供后期;
收集业务日志是主要是错误日志的收集和告警生成;
分析业务日志只是对业务情况进行实时展示,可靠性要求不高。
经过评估,准备替换掉其中前两种需求的共计4个ELK集群,只保留一个需要实时分析日志的集群。
[观测云](http://www.guance.com/)是国内领先的可观测平台,其基本功能与ELK一致。观测云的[日志](https://docs.guance.com/logs/)功能可以完全替代ELK来做日志收集,并且也可以做进一步的[指标](https://docs.guance.com/metrics/)生成和[告警](https://docs.guance.com/monitoring/)通知。
[datakit](https://docs.guance.com/datakit/)是观测云的客户端,是数据上报给观测云的唯一入口
# 二、替换思路
先后经过两次方案调整
## 方案一:logstash接入,只替换Elasticsearch和Kibana
[datakit 1.2.19](https://docs.guance.com/datakit/changelog/#cl-1.2.19)也就是2022年05月12日 之前的版本并不支持 filebeat采集器。
datakit 1.4.0 及之前的版本 功能不完全,有问题,而且不支持6.x版本的filebeat
所以当时的思路是 [logstash对接datakit的logstreaming采集器](https://docs.guance.com/integrations/logs/logstash/),观测云替代掉Elasticsearch和Kibana功能,这不是一个完美的方案,我们还需要维护非常耗费资源而且容易crash的logstash
这本来就是一个权宜之计,而且在datakit1.4.0 上面实验用logstash 6.x 接入并不成功,最终放弃。
## 方案二:filebeat接入,整体替换掉ELK
datakit 1.4.1 及以后版本 解决了各种问题,对于filebeat 6.x(我们使用的是6.2.2) filebeat 7.x(我们使用的是7.12.0)的支持均可以。
所以可以启用 [datakit的beats采集器支持](https://docs.guance.com/datakit/beats_output/),直接接受filebeat的输出。
这无疑是成本最低,改动最小的一个方案。将对应服务器或者容器镜像里的filebeat输出地址修改为datakit即可。只不过依然要维护丑陋的sidecar。
## 方案三:程序通过socket直接输入日志给datakit,整体替换掉filebeat和ELK
这是最早的一个思路,希望彻底扔掉任何外部程序,通过程序直接将相关日志对接给datakit,需要启用[datakit的日志采集的socket端口获取](https://docs.guance.com/datakit/logging/#socket)(跟文件获取方式是互斥的,只能开启一个)。
[支持的语言有java,golang和python](https://docs.guance.com/datakit/logging_socket/),对于json格式的日志支持效果非常好
但是这个只能采集应用的日志,无法采集web server的 access\_log,所以经过测试之后最终还是放弃了这个方案。
## 最终选择方案二
[datakit本身自己也是有日志采集功能](https://docs.guance.com/datakit/logging/)的,为何不用datakit来替代filebeat,主要出于以下考虑:
1. 我们现阶段只需要日志采集,而datakit功能丰富还会采集其他信息,观测云默认会[按datakit个数收费](https://docs.guance.com/billing/billing-method/#default),众多机器加起来是一笔不小的开支。虽然可以改为[按时间线收费](https://docs.guance.com/billing/billing-method/#time-data),但是依然会增加额外的成本,这个就非常没有必要了。
2. datakit终端比filebeat要大,在寸土寸金的容器镜像里比较奢侈
3. datakit配置有账号信息,而且还需要及时升级这个会对生成容器镜像的研发造成困扰,不如沿用filebeat,上手成本低。
4. 因为观测云是外部服务,由filebeat输出到有外网ip的统一的网关,可以有效减轻nat网关的压力,也可以方便运维定期升级,做容灾等。
# 三、替换方案
## 前置条件
1. 开通观测云账号
2. 在一台机器上装好最新版本的datakit
datakit版本选择 :[1.4.1](https://docs.guance.com/datakit/changelog/#cl-1.4.1)及之后,之前的版本会有问题。
## 配置datakit
datakit开启[Beats 数据采集功能](https://docs.guance.com/datakit/beats_output/)
确保tcp端口对filebeat服务器开放
source和service可以视情况预制在配置文件里,这两个键值会传递到观测云里
## 配置filebeat
修改filebeat的配置文件,修改[output.logstash的hosts](https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html#hosts),地址改为datakit的地址,注意这个地方填写多个地址的话不是一份数据多写,在没有配置[loadbalance](https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html#loadbalance)的情况下,只会随机选一个host写,配置了[loadbalance](https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html#loadbalance)就是负载均衡到多个host。
# 四、使用效果
1.登录到观测云之后,打开日志-查看器,即可看到日志
![image.png](https://dev-media.amazoncloud.cn/1870ffcc64fb4b43b27b2bec255e244a_image.png "image.png")
2.[filebeat配置fields里](https://www.elastic.co/guide/en/beats/filebeat/master/configuration-general-options.html#libbeat-configuration-fields)自定义设置的logtype,product 和datakit里预制的source(数据来源)和service(服务)都能看到
# 五、成本收益
1. **不再承担人力成本,稳定性提高**
节省了维护集群的人力成本若干。
saas服务性能弹性,再也不需要再担心ELK集群空间满,ELK集群性能不足等问题导致集群停摆。
2. **不再承担授权费**
ELK如果需要告警并且通知到外部,则需要购买 [白金级订阅来实现”检测告警外部操作“](https://www.elastic.co/cn/subscriptions)。
如果使用Elastic Cloud,也需要[订阅白金级才能使用”检测告警外部通知和操作“](https://www.elastic.co/cn/pricing/)。
3. **基础设施成本减少90%以上**
替换的外部集群之前的成本约为为:18000元人民币每月。
转到观测云之后新增成本为几百元人民币每月。
基础设施成本缩减为不到之前的5%,而且saas服务按量付费,成本会更加弹性。