1

1.Zookeeper

对于Zookeeper我们用一条简单的命令来测试一下:

echo ruok|nc localhost 2181

你应该可以看到:

imok

2.Kafka

Kafka 是由 Linked 开发并且开源的一套分布式的流平台,它类似于一个消息队列。 Kafka 的优势就是适合构建实时的流数据管道,并且可靠地获取系统和应用程序之间的数据, 还可以实时的对数据流进行转换。Kafka 的使用场景很多, 特别是在需要高吞吐量的系统上。首先来理解一下 Kafka 的几个基本的概念:

  • Topic, Kafka 将消息进行分类,每一类的消息称之为一个主题(Topic).
  • Producer, 发布消息的对象称之为主题生产者(Producer)
  • Consumer, 订阅消息并处理消息的对象称之为主题消费者(Consumers)
  • Broker, 已发布的消息保存在一组服务器中,称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker)。 消费者可以订阅一个或多个主题(topic),并从Broker拉数据,从而消费这些已发布的消息。

1. 创建一个主题

我们可以登录到 Kafka 容器中,做一些简单的小测试,登录到容器中的命令:

docker-compose exec kafka bash

首先来创建一个名为test的 Topic ,只有一个分区和一个备份:

kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic test

创建好之后,可以通过运行以下命令,查看topic信息:

kafka-topics.sh --list --zookeeper zookeeper:2181

2. 发送消息

Kafka 默认有提供了一个命令行的工具用来发送消息,一行是一条消息,运行 Producer 然后输入一些信息:

kafka-console-producer.sh --broker-list localhost:9092 --topic test 

3. 消费消息

Kafka 也提供了一个消费消息的命令行工具,将存储的信息输出出来。

kafka-console-consumer.sh --zookeeper zookeeper:2181 --topic test --from-beginning

3. Elasticsearch

ElasticStack技术栈包括的三个软件,而且一开始就是5.0的大版本,主要目的是为了让其他的软件版本号一致,方便各个软件的对应。不过到现在已经发展到了6.0的版本了,我们这次就是用这个版本。具体的更新详细可以查看这里Elasticsearch,这里只说说基本的概念。

Elasticsearch之所以可以方便的进行查询过滤排序是因为和 MongoDB 一样存储的是整个文档,然后还会根据文档的内容进行索引,而且文档的格式用的还是很友好的 JSON,比如一个简单的用户对象可以这么表示:

{
    "name": "Xiao Ming",
    "phone": "10086",
    "age": "25",
    "info": {
        "site" : "https://sunnyshift.com"
        "likes": ["games", "music"]
    }
}

在 Elasticsearch 中有四个名词,索引(idnex)、类型(type)、文档(document)、字段(field),这四个字段类似于数据库中的数据库(database), 表(table), 行(row), 列(column), Elasticsearch 可以包含多个索引,每个索引可以包含多个类型,每个类型可以包含多个文档,每个文档可以包含多个字段,把他想成数据库就行了。

我们来简单操作一下,先来创建一个索引,并且插入几条数据:

PUT /banji/xuesheng/1
{
    "name": "Xiao Ming",
    "age": "12"
}
PUT /banji/xuesheng/2
{
    "name": "Xiao Hong",
    "age": "16"
}

具体操作可以使用 Kibana 上面的 Dev Tools 来运行命令:
图片描述

有了数据之后就可以来简单的检索一下:
图片描述

这里只是介绍了一下简单的入门使用,之后可以像一些其他的操作比如过滤、组合、全文、啥的都不在话下,甚至还可以高亮搜索结果。

4. Logstash

Logstash 是一个日志收集器,支持非常多的输入源和输出源。我们简单的整合一下 ElasticStack 这个技术栈,这里用 Nginx 的访问日志来测试一下。Logstash 最新的是有一个 Beats 的组件来收集数据,这里先不考虑而是使用传统的配置文件,我们会直接把配置写到配置文件中。

Logstash 使用一个名叫 FileWatch 的 Ruby Gem 库来监听文件变化。这个库支持 glob 展开文件路径,而且会记录一个叫 .sincedb 的数据库文件来跟踪被监听的日志文件的当前读取位置。

使用 Dcoker 后配置文件路径在logstash/config下,可以在该目录下放置多个配置文件,最后 Logstash 会帮我们合并成一个。先来定义一个读取 Nginx 访问日志的配置:

input {
    file {
        path => [ "/var/log/nginx/access.log"]
        type => "accesslog"
    }
}
 
output {
    # 输出到 elasticsearch,索引名为 access-log
    elasticsearch { 
        hosts => "localhost:9200"
        index => "access-log"
        user => "elastic"
        password => "changeme"
    }
}

要注意的是这里写的 Nginx 的路径是相对于 Logstash 容器的,所以要把该路径挂载到容器中。然后重启 Logstash 就可以去 Kibana 中查看日志了, 附上 Logstash 重启命令。如果一切正常,那么就可以去 Kibana 中日志了。

docker-compose stop logstash
docker-compose up -d logstash

5. Kibana

Kibana 是一个可视化的 UI 界面,并且可以检索聚合分词搜索在 Elasticsearch 中的数据,并且还可以以非常精美的图标来展示统计数据。我们需要在 Management 页面中告诉 Kibana 我们刚才创建的 access-log 索引。
图片描述

到这里就完成了收集 Nginx 系统日志并展示出来,对于 Kibana 还有很多用法,就不一一撰述了。


wh469012917
331 声望25 粉丝