当然即使是机器规模不大,一个系统通常也会涉及到多种语言的开发,拿我们公司来说,底层是通过c++开发的,而也业务应用层是通过Python开发的,并且即使是C++也分了很多级别应用,python这边同样也是有多个应用,那么问题来了,每次系统出问题了,如何能够迅速查问题? 好一点的情况可能是python应用层查日志发现是系统底层处理异常了,于是又叫C++同事来查,如果C++这边能够迅速定位出错误告知python层这边还好,如果错误好排查,可能就是各个开发层的都在一起查到底是哪里引起的。当然可能这样说比较笼统,但是却引发了一个问题:
针对以上问题,我们想要实现的一个解决方案是:
关于实现这个系统时可能会面临的问题:
关于日志收集系统,业界的解决方案是ELK
ELK的解决方案是通用的一套解决方案,所以不免就会产生以下的几个问题:
针对这种情况,其实我们想要的系统是agent可以动态的获取某个服务器我们需要监控哪些日志 以及那些日志我们需要收集,并且当我们需要收集日志的服务器下线了,我们可以动态的停止收集 当然这些实现的效果最终也是通过web界面呈现。
主要的架构图为
关于各个组件的说明:
Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端点传递到另一个端点。 Kafka适合离线和在线消息消费。 Kafka消息保留在磁盘上,并在群集内复制以防止数据丢失。 Kafka构建在ZooKeeper同步服务之上。 它与Apache Storm和Spark非常好地集成,用于实时流式数据分析。
注:这里关于Kafka并不会介绍太多,只是对基本的内容和应用场景的说明,毕竟展开来说,这里的知识也是费非常多的
Kafka中有几个基本的消息术语需要了解:
Kafka的优点:
Kafka非常快,并保证零停机和零数据丢失。
Kafka的应用场景:
ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper通过其简单的架构和API解决了这个问题。ZooKeeper允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。 Apache ZooKeeper是由集群(节点组)使用的一种服务,用于在自身之间协调,并通过稳健的同步技术维护共享数据。ZooKeeper本身是一个分布式应用程序,为写入分布式应用程序提供服务。
ZooKeeper主要包含几下几个组件:
ZooKeeper的应用场景:
Zookeeper是强一致的多个客户端同时在Zookeeper上创建相同znode,只有一个创建成功
这个就是我们后面要通过代码实现的一步分内容,主要实现的功能是: 类似于我们在linux下通过tail的方法读日志文件,讲读取的内容发给Kafka 这里需要知道的是,我们这里的tailf是可以动态变化的,当配置文件发生变化是,可以通知我们程序自动增加需要增加的tailf去获取相应的日志并发给kafka producer 主要由一下几部目录组成:
以上是对整个要开发的系统的一个总的概括,以及架构的一个构建,并且各个组件的实现,接下来会一个一个实现每个部分的功能,下一篇文章会实现上述组件中log Agent的开发