当前,主流的日志采集产品除了SLS的ilogtail,还有Elastic Agent、Fluentd、Telegraf、Sysdig、Logkit、Loggie、Flume等。详细的对比结果见下表:
备注:
ilogtail | Elastic | Logkit | Sysdig | Fluentd | Telegraf | Loggie | Flume | |
产品类型 | 企业版 | 企业版 | 开源版 | 企业版 | 开源版 | 开源版 | 开源版 | 开源版 |
单机部署 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
集群管理 | 控制台(阿里云)、API、K8s Operator | 控制台(Fleet Server) | Logkit 助手 | 不支持 | 容器下有三方开源的Fluent Operator和Logging Operator,主机下不支持 | 不支持 | Kubernetes下可通过CRD配置,主机下不支持 | 不支持 |
集群监控 | 阿里云控制台 | Fleet UI | Logkit助手 | Sysdig Monitor | 通过第三方Prometheus,或REST API | InfluxData Platform | 通过第三方Prometheus | 使用额外的exporter |
可以看到提供完整集群管理能力的,主要是SLS、Elastic、和Logkit,下面会针对Elastic、Logkit做进一步介绍。
Fleet 是一个用于管理 Elastic Agent 配置的组件,由两部分组成:Fleet UI 和 Fleet Server。Fleet UI 是一个带有用户界面的 Kibana 应用程序,供用户载入和配置 agent 策略(注: agent 策略类似于SLS的ilogtail采集配置)、管理载入数据以及管理整个环境中的Elastic Agent。
Fleet Server 是 Elastic Stack 的一个后端组件,作为 Elastic Agent 的一部分部署在主机(服务器)上,Elastic Agent连接到该组件,以执行检索 agent 策略、更新和管理等命令。一个 Fleet Server 进程可以支持多个 Elastic Agent 连接,并作为控制平台,用作更新 agent 策略、收集状态信息以及协调多个 Elastic Agent 操作。Fleet Server 需要连接到支持 Elasticsearch 的集群才能运行。
Fleet 允许用户集中管理大量Elastic Agent,是管理与 Elastic Agents 通信的基础设施组件。
Fleet Server有两种部署模型,分别适用Elastic Cloud部署和本地部署。
在 Elastic Cloud 中配置和托管 Fleet Server,可以简化 Elastic Agent 的部署。在这种情况下,创建部署时,会自动部署一组高度可用的 Fleet Server。
管理员可以选择分配给 Fleet Server 的资源,以及是否希望将 Fleet Server 部署在多个可用区中。
一旦作为服务部署在 Elastic Cloud 上,Fleet Server 的整个生命周期都由 Elastic 管理。Fleet Server 具有可扩展性和高可用性,可在多个实例之间实现流量入口负载平衡,以满足规模要求。
Fleet Server 可以在本地部署并由用户管理。在此部署模型中,管理员负责 Fleet Server 部署和生命周期管理。这种操作模式主要用于满足数据处理要求,或用于Elastic Agent只能访问私有分段网络的场景,需要管理员配置 Fleet Server 的多个实例并使用负载均衡器来更好地扩展部署。
Fleet Server 是无状态的。因此,只要 Fleet Server 有能力接受更多连接,就可以对 Fleet Server 的连接进行负载均衡。负载均衡是在循环的基础上完成的。
在 Elastic Cloud 部署模型中,会自动预置多个 Fleet Server 以满足所选的实例大小(修改实例大小以满足规模要求),也选择多个可用区来满足容错要求,这些实例也可用于平衡负载。
在本地部署中,Fleet Server 的高可用性、容错性和生命周期管理是管理员的责任。
对于自建的 Fleet Server,监控是关键,因为 Fleet Server 的运行对于已部署Elastic Agent及其提供的服务的健康状况至关重要。当 Fleet Server 运行不正常时,可能会导致其管理的Elastic Agent的签入、状态信息和更新延迟。Elastic提供设计了对Fleet Server的监控功能。监控数据将告诉用户何时为 Fleet Server 添加容量,并提供错误日志和信息以解决其他问题。对于自我管理的Fleet Server,当用户创建新的 agent 策略或使用现有的 Default Fleet Server 策略时,默认情况下会启用监控。
Fleet 严重依赖 Elastic 环境,Fleet Server 对于合作的 Elastic 产品有兼容要求。
Elastic Agent 使用 http 协议, 通过 Fleet Server 与 Elasticsearch 通信:
Fleet Server 使用服务令牌与包含fleet-server服务帐户的 Elasticsearch 进行通信。每个 Fleet Server 可以使用自己的服务令牌,并且可以在多个服务器之间共享它(不推荐)。为每个服务器使用单独的令牌的优点是可以分别使每个服务器无效。
Elastic Cloud 直接托管 Fleet Server ,在不考虑扩展的情况下,不需要额外的设置(使用 Fleet 需要确保部署包含一个集成服务器实例)。可以在Fleet UI上确认集成服务器的可用性。
要部署自我管理的 Fleet Server,需要安装 Elastic Agent 并将其注册到包含 Fleet Server 集成的 agent 策略中。每个主机只能安装一个 Elastic Agent,不能在同一主机上运行 Fleet Server 和另一个 Elastic Agent,除非部署容器化 Fleet Server。
使用Fleet UI可以快速部署Fleet Server。
修改部署中的设置和 Fleet Server 策略来扩展 Fleet Server。Fleet Server 提供了一些高级设置。
cache
num_counters
//Size of the hash table. Best practice is to have this set to 10 times the max connections.
max_cost
//Total size of the cache.
server.limits
policy_throttle
//How often a new policy is rolled out to the agents.
checkin_limit.interval
//How fast the agents can check in to the Fleet Server.
checkin_limit.burst
//Burst of check-ins allowed before falling back to the rate defined by interval.
checkin_limit.max
//Maximum number of agents.
artifact_limit.max
//Maximum number of agents that can call the artifact API concurrently. It allows the user to avoid overloading the Fleet Server from artifact API calls.
artifact_limit.interval
//How often artifacts are rolled out. Default of 100ms allows 10 artifacts to be rolled out per second.
artifact_limit.burst
//Number of transactions allowed for a burst, controlling oversubscription on outbound buffer.
ack_limit.max
//Maximum number of agents that can call the Ack API concurrently. It allows the user to avoid overloading the Fleet Server from Ack API calls.
ack_limit.interval
//How often an acknowledgment (ACK) is sent. Default value of 10ms enables 100 ACKs per second to be sent.
ack_limit.burst
//Burst of ACKs to accommodate (default of 20) before falling back to the rate defined in interval.
enroll_limit.max
//Maximum number of agents that can call the Enroll API concurrently. This setting allows the user to avoid overloading the Fleet Server from Enrollment API calls.
enroll_limit.interval
//Interval between processing enrollment request. Enrollment is both CPU and RAM intensive, so the number of enrollment requests needs to be limited for overall system health. Default value of 100ms allows 10 enrollments per second.
enroll_limit.burst
//Burst of enrollments to accept before falling back to the rate defined by interval.
Fleet Server是一款成熟的商业产品,其对各个场景的支持、对安全的处理、配置的扩展性等等,都做的比较完善。文档较为详细,按照文档内容可以实现较快速的部署上手。
由于Fleet Server是企业版软件,所以若是想脱离环境和生态单独使用会比较困难。
Cluster是Logkit的集群管理解决方案。Logkit 通过添加 runner 的形式,提供了丰富的功能来收集、解析和发送多种格式的日志和系统信息。Cluster是为了解决在集群中部署多个 Logkit 时,runner 的管理变得繁琐的问题而开发的。
开发者将 Logkit 分成 master 和 slave 两类,master 可以管理 slave 上的 runner。master本身也可以是一个slave,承担数据收集的责任。
cluster 配置参数说明如下(完整的 Logkit 主配置文件字段说明请参考Logkit主配置文件):
参数名称 | 参数类型 | 是否必填 | 参数说明 |
master_url | string 数组 | slave 必填 master 选填 |
master_url中的每一项都应该是一个url(包括端口号),它们是当前 Logkit 各个 master 的 url 1. 对于 slave, 它会定期向每个链接发心跳注册,以便让其 master 获取自己的状态 2. 对于 master, 当填写该字段后,它本身也会作为 slave 受到它的 master 控制,当然这个 master 可以是它自己。 |
is_master | bool | 必填 | 标明当前 Logkit 是否是 master: 1. master 请置为 true 2. slave 请置为 false |
enable | bool | 必填 | 是否启用 cluster 功能, master 和 slave 都应该置为 true |
在启用 cluster 功能时,将 Logkit 主配置文件中的 bind_host 字段显式绑定一个可以保证master、slave能够互相通信的ip地址和端口,防止出现ip与master不在同一网段,造成master无法访问slave的情况。 (因为当此处的ip地址为空时,作为slave的Logkit会自行获取本机的一个ip地址,并在向master发心跳时将该ip地址发送给master, master会利用该ip与slave进行通信。)
在配置结束后,建议先启动作为master的Logkit,再启动作为slave的Logkit,这样可以避免slave产生向master发心跳失败的错误日志。
{
"cluster": {
"master_url": [],
//若master本身也想承担slave的功能
//可以填上其他master或自身的地址
//例如 "master_url": ["http://192.168.0.2:3000"],
"is_master": true,
"enable": true
}
}
{
"max_procs": 8, // 选填,默认为机器的CPU数量
"debug_level": 1, // 选填,默认为0,打印DEBUG日志
"bind_host":"127.0.0.1:3000", // 选填,默认自己找一个4000以上的可用端口开启
"profile_host":"localhost:6060", // 选填,默认为空,不开启
"clean_self_log":true, // 选填,默认false
"clean_self_dir":"./run", // 选填,clean_self_log 为true时候生效,默认 "./run"
"clean_self_pattern":"*.log-*", // 选填,clean_self_log 为true时候生效,默认 "*.log-*"
"clean_self_cnt":5, // 选填,clean_self_log 为true时候生效,默认 5
"rest_dir":"./.logkitconfs", // 选填,通过web页面存放的logkit配置文件夹,默认为logkit程序运行目录的子目录`.logkitconfs`下
"static_root_path":"./public", // 必填,logkit页面的静态资源路径,即项目中public目录下的内容,包括html、css以及js文件,请尽量填写绝对路径
"timeformat_layouts":["[02/Jan/2006:15:04:05 -0700]"], // 选填,默认为空。
"confs_path": ["confs","confs2", "/home/me/*/confs"], // 必填,监听的日志目录
"cluster": { // 启用 cluster 功能时填写.
"master_url": ["http://192.168.0.2:3000"],
"is_master": false,
"enable": true
}
}
Logkit 具有可视化工具Logkit助手,目前已支持 Cluster 。Logkit 助手主要有三个界面,分别是集群管理页面、机器管理页面和收集器管理页面。
Logkit Cluster的配置较为简单,在已经配置好Logkit的情况下,只需要在原有配置的基础上增加"cluster"字段就可以实现。同时,由于Logkit原本就是有Logkit助手这样的一个可视化前端的,所以增加集群功能后老用户很快就可以上手。
美中不足的是,该功能虽然解决了多机器同时添加runner繁琐的问题,但对于单机器同时添加多个runner的场景并没有优化,这里还有提升的空间。Logkit最大的问题在于文档的滞后,例如企业版2019年发布的对比文档中,对于是否支持集群管理,社区版为“不支持”,事实上本文参考的Logkit 社区版 Cluster 文档发布于2017年12月,社区版与企业版的文档内容产生了冲突。
原文链接
本文为阿里云原创内容,未经允许不得转载。