ELK的介绍和搭建

ELK是一整套解决方案,很多公司在使用如:Sina、携程、华为、美团等.
ELK分别代表(都是开源软件)
– Elasticsearch:负责日志检索和储存;
– Logstash:负责日志的收集和分析、处理;
– Kibana:负责日志的可视化.

ELK可以做什么?
ELK组件在海量日志系统的运维中,可用于解决:
– 分布式日志数据集中式查询和管理;
– 系统监控,包含系统硬件和应用各个组件的监控:
– 故障排查:
– 安全信息和事件管理:
– 报表功能.

Elasticsearch是一个基于Lucene的搜索服务器, 它提供了一个分布式多用户能力的全文搜索引擎.
主要特点:
– 实时分析;
– 分布式实时文件存储,并将每一个字段都编入索引;
– 文档导向,所有的对象全部是文档;
– 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas);
– 接口友好,支持JSON.

相关概念:
– Node: 装有一个ES服务器的节点;
– Cluster: 有多个Node组成的集群;
– Document: 一个可被搜索的基础信息单元;
– Index: 拥有相似特征的文档的集合;
– Type: 一个索引中可以定义一种或多种类型;
– Filed: 是ES的最小单位,相当于数据的某一列;
– Shards: 索引的分片,每一个分片就是一个Shard;
– Replicas: 索引的拷贝.

                                            下表为elk的整体机构列表:

注: se1~se5 下面改为了,es1~es5, IP地址61~67改为了51~57 , 为了测试结果,额外的搭建了一台apache的web服务器(httpd).

整个架构的流程是这样的:

web_httpd: 由于logstash依赖JAVA环境,而且占用资源非常大, 因此使用更轻量的filebeat插件来替代, 这个插件主要用来接收beats类软件发送过来的数据, 然后通过端口:5044将日志信息发送给logstash;

Logstash: 提供数据采集、加工处理以及传输, 将日志数据以正则表达式的方式结构化,定义索引,将数据输出到ES集群中;

ES集群: 界面显示索引列表, 提供了一个分布式多用户能力的全文搜索引擎,能够达到实时搜索;

Kbana: 数据可视化平台工具, 通过ES上的索引调用日志信息, 将数据绘制成图表(柱状图. 图表等).

ELK架构整体主机名和IP地址部署:

ansible: 192.168.1.50       es1:192.168.1.51       es2: 192.168.1.52       es3: 192.168.1.53        es4: 192.168.1.54

es5:192.168.1.55            kibana: 192.168.1.56      logstash: 192.168.1.57        web_server: 192.168.1.58

ES集群的搭建:
首先,准备6台服务器,五台搭建ES集群,一台用于搭建ansible服务器,用来完成五台服务的批量配置:
五台ES服务器,主机名和ip地址如下:

ansible: 192.168.1.50       es1:192.168.1.51       es2: 192.168.1.52       es3: 192.168.1.53        es4: 192.168.1.54

es5:192.168.1.55 

我们先来部署一台es1 ,其他的可以是相同的操作,也可以使用ansible批量部署:

<一>设置ip与主机名称对应关系(写上本机的IP地址和主机名):

[root@es1 ~]# vim /etc/hostname

192.168.1.51 es1

<二>准备需要的软件包(这些软件包都在真机上的/ftp/elk/下):

elasticsearch-2.3.4.rpm

kibana-4.5.2-1.x86_64.rpm

logstash-2.3.4-1.noarch.rpm

<三>为了可以在虚拟机上通过yum安装这些软件(通过yum来解决软件直接的依赖关系),我们需要制作一个yum仓库:

[root@room9pc01 ~]# cd /var/ftp/elk

[root@room9pc01 ~]# createrepo  .             //生成yum依赖的文件repodata,现在可以配置yum了

配置虚拟机es1的yum:

[root@es1 ~]# vim /etc/yum.repos.d/local.repo

[local_repo] 
name=CentOS-$releasever - Base
baseurl="ftp://192.168.1.254/centos-1804"
enabled=1
gpgcheck=0

[elk_repo]
name=elk - Base
baseurl="ftp://192.168.1.254/elk"
enabled=1
gpgcheck=0

[root@es1 ~]#yum repolist                         //会发现在原本的软件数量上加了3个

[root@es1 ~]# yum -y install  elasticsearch

<四>安装JDK,Elasticsearch要求至少Java 7,一般推荐使用OpenJDK 1.8

[root@es1 ~]#yum list | grep openjdk

[root@es1 ~]#yum install -y java-1.8.0-openjdk

<五>安装ES并修改配置文件

[root@es1 ~]#yum -y install elasticsearch

[root@es1 ~]#rpm  -qc  elasticsearch             //这条命令可以看到所有的elasticsearch配置文件

[root@es1 ~]#vim  /etc/elasticsearch/elasticsearch.yml

cluster.name: myelk                         //设置ES集群的名字,必须都一样
node.name: es1                                //当前节点的名字
network.host: 0.0.0.0                          //网络中的所有主机都可以访问
discovery.zen.ping.unicast.hosts: [“es1", “es2", “es3"]          //discovery为集群节点机器,不需要全部配置

<六>启动服务
– 启动服务并设开机自启
[root@es1 ~]#systemctl start elasticsearch

[root@es1 ~]#systemctl enable elasticsearch

<七>验证

[root@es1 ~]#netstat   -ntulp                     //能够看到9200,9300被监听

下面我是通过ansible来对ES集群进行批量部署:

进入ansible服务器(ansible的配置,和创建工作目录):

[root@room9pc01 ~]#ssh  [email protected]

<一>创建秘钥对,将公钥发送给其他服务器:

[root@ansible ~]#ssh-keygen  -N  ' '   -f   /root/.ssh/id_rsa             //其中' '这个是单引,里面没有空格,是为了让大家好识别

[root@ansible ~]#for  i   in  {51..55};do  scp-copy-id   [email protected].$i;done       //这个是群发,也可以单个发送  

<二>安装ansible自动.批处理工具

[root@ansible ~]#yum -y install  ansible 

<三>创建和配置工作目录

[root@ansible ~]#mkdir  /opt/xxoo               //在ansible中,我们一般不会更改原始配置文件,它的工作机制使我们可以自己创建文件夹,只需在相同的配置文件中写入必须的配置项即可

[root@ansible ~]#cd  /opt/xxoo

[root@ansible xxoo]#vim ansible.cfg

[defaults]

inventory  = /opt/xxoo/hosts                            //inventory  指定主机列表的名字和位置
host_key_checking = False                            //ansible在每台服务器上执行的时候都会提示,我们不让提示

[root@ansible xxoo]#vim  hosts                          //配置主机列表

[es]          //集合名字自己定义
es1
es2
es3
es4
es5

[root@ansible xxoo]#ansible es  -m ping             //绿色字体,出现Pang,则成功部署

[root@ansible xxoo]#vim  es.yml

---
- hosts: es
  remote_user: root
  tasks:
    - copy:
        src: local.repo
        dest: /etc/yum.repos.d/local.repo
        owner: root
        group: root
        mode: 0644

    - name: install the latest version of Apache
      yum:
        name: elasticsearch
        state: installed

    - name: install java-1.8.0-openjdk.x86_64
      yum:
        name: java-1.8.0-openjdk.x86_64
        state: installed
      tags: openjdk
      notify:
           restart es

    - template:                             //es的配置文件中有变量,此模块支持变量
        src: elasticsearch.yml
        dest: /etc/elasticsearch/elasticsearch.yml
        owner: root
        group: root
        mode: 0644
      tags: es_change                  //打标记,使可以单个调用此模块
      notify:                                    //若此模块执行,就通知handlers执行
        - restart es

  handlers:
    - name: restart es
      service:
        name: elasticsearch
        state: restarted
        enabled: yes

[root@ansible xxoo]#ansible-playbook   es.yml                //ansible 执行yml实现批量部署

<三>验证集群, 使用ES内置字段 _cluster/health

[root@ansible xxoo]#curl http://192.168.1.51:9200/_cluster/health?pretty         //也可以在firefox浏览器中输入

我的输出结果如下:

{
  "cluster_name" : "nsd1902",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 5,
  "number_of_data_nodes" : 5,
  "active_primary_shards" : 40,
  "active_shards" : 85,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

这里有一点需要说明,如果有的服务器没有起来,我们需要把所有ES服务器都停掉,先开启其中一台,再开启其他的,你先开启的就是主服务器.

为了可以清晰的管理,我们需要使用ES插件:(可以在web页面中通过图形化界面管理log日志)

ES常用插件:
• head插件
– 它展现ES集群的拓扑结构,并且可以通过它来进行索引(Index)和节点(Node)级别的操作
– 它提供一组针对集群的查询API,并将结果以json和表格形式返回
– 它提供一些快捷菜单,用以展现集群的各种状态

• kopf插件
– 是一个ElasticSearch的管理工具
– 它提供了对ES集群操作的API

• bigdesk插件
– 是elasticsearch的一个集群监控工具
– 可以通过它来查看es集群的各种状态,如:cpu、内存
使用情况,索引数据、搜索情况,http连接数等

<三>安装插件:

elasticsearch-head-master.zip

elasticsearch-kopf-master.zip

bigdesk-master.zip

插件在任意一台主机上都可以安装:(这里需要用plugin的绝对路径来安装)

[root@es5 ~]#/usr/share/elasticsearch/bin/plugin list         //查看安装的插件

[root@es5 ~]#/usr/share/elasticsearch/bin/plugin install   elasticsearch-head-master.zip

[root@es5 ~]#usr/share/elasticsearch/bin/plugin install    elasticsearch-kopf-master.zip

[root@es5 ~]#usr/share/elasticsearch/bin/plugin install     bigdesk-master.zip

这里必须使用 url 的方式进行安装,如果文件在本地,我们也需要使用 file:// 的方式指定路径,例如文件在/tmp/xxx下面,我们要写成 file:///tmp/xxx , 删除使用remove 指令.

[root@es5 ~]#/usr/share/elasticsearch/bin/plugin list        //查看三个插件是否都安装成功

<四>测试

firefox地址栏输入:192.168.1.55:9200/_plugin/head/

Kibana的安装与配置:[192.168.1.56]

kibana是一个数据可视化平台工具

特点:
– 灵活的分析和可视化平台
– 实时总结流量和数据的图表
– 为不同的用户显示直观的界面
– 即时分享和嵌入的仪表板

[root@kibana ~]# yum -y install kibana              //安装kibana,通过下载的rpm包

kibana 默认安装在 /opt/kibana下面,配置文件在/opt/kibana/config/kibana.yml

[root@kibana ~]#rpm  -qc  kibana        //也可以通过这条命令,列出kibana的配置文件

[root@kibana ~]#vim   /opt/kibana/config/kibana.yml         //修改配置文件

server.port: 5601        //服务器端口
server.host: "0.0.0.0"           //任何主机都可以访问到kibana
elasticsearch.url: "http://es3:9200"         //设置连接哪一台elasticsearch服务器,任意一台都可以        
kibana.index: ".kibana"                  //kibana的索引,它会在elasticsearch页面中显示
kibana.defaultAppId: "discover"        //kibana的默认显示页面
elasticsearch.pingTimeout: 1500           //elasticsearch的ping超时时间,超过则表示连接断开
elasticsearch.requestTimeout: 30000           //elasticsearch的访问超时时间
elasticsearch.startupTimeout: 5000                //elasticsearch的启动超时时间

[root@kibana ~]#systemctl start kibana           //启动服务

[root@kibana ~]#systemctl enable kibana         //设置开机自启动

[root@kibana ~]# ss -ntulp               //查看5601端口是否启动

打开浏览器,输入192.168.1.56:5601

修改Kibana的配置文件后启动Kibana,然后查看ES集群,如果出现.kibana Index表示Kibana与ES集群

连接成功.


部署web_httpd:[192.168.1.58]

[root@httpds ~]# yum  -y  install  httpd             //部署web服务器

[root@httpds ~]# systemctl  restart httpd         //重启服务

[root@httpds ~]# systemctl enable  httpd        //设置开机自启

[root@httpds ~]# echo   "hello world"    >   /var/www/html/index.html          //写一个简单的测试页面

安装与配置filebeat:

[root@httpds ~]# yum –y install filebeat

[root@httpds ~]#vim  etc/filebeat/filebeat.yml

       paths:
 15         -  /var/log/httpd/access_log                   #设置http的日志文件路径

 31       input_type: log                               #输入的文件格式是日志文件

72       document_type: apache_log          #这是一个文件索引,会在logstash中调用

278   logstash:
279     # The Logstash hosts
280     hosts: ["192.168.1.58:5044"]          #设置要监听logstash的主机名和端口号

[root@httpds ~]#systemctl  restart   filebeat        //重启服务

[root@httpds ~]#systemctl  enable  filebeat        //设置开机自启

部署Logstash:[192.168.1.57]

• 是一个数据采集、加工处理以及传输的工具
• 特点:
        – 所有类型的数据集中处理
        – 不同模式和格式数据的正常化
        – 自定义日志格式的迅速扩展
        – 为自定义数据源轻松添加插件

Logstash安装:

[root@logstash ~]#yum -y install  java-1.8.0-openjdk           //logstash依赖java环境,需要安装openjdk

[root@logstash ~]#yum –y install  logstash     //Logstash默认安装在/opt/logstash目录下

由于Logstash没有默认的配置文件,需要手动配置:

[root@logstash ~]#mkdir  /etc/logstash

[root@logstash ~]#vim /etc/logstash/logstash.conf

input{
 # file {                                                     #file指名进入的数据是文件类型
 #   path => ["/var/log/a.log"]                   #本机的服务日志文件路径,因为web服务在web_httpd上搭建的,所一这一段注释掉
 #   start_position => "beginning"            #设置logstash从日志的哪个位置开始读取
 #   sincedb_path => "/dev/null"               #logstash默认会从上次读取的位置继续读,将存储读取位置的文件路径设置为黑洞,会始终从头开始读取日志信息
 #   type => "testlog"                               #给日志打一个标记
 # }
  beats {                                                   #打开5044端口,通过filebeat从web_http服务器上获取日志信息
    port => 5044
  }
}

filter{                                                       #filter是对数据进行处理的过程
  grok {                                                    #grok正则分组匹配,利用正则表达式将日志机构化,可以自己写,也可以直接调用软件的宏
    match => {"message" => "%{COMBINEDAPACHELOG}"}
  }
}

output{                                                    #将处理过的数据传输给ES集群
  if [type] == "apache_log" {                   #判断语句,apache_log是在filebeat中定义的: document_type: apache_log (72行)
  elasticsearch {
    hosts => ["es1:9200","es2:9200","es3:9200"]            #主机名多定义几台,备用
    index => "weblog"                                                      #定义这个日志的索引名
    flush_size => 2000
    idle_flush_time => 10
  }
 }
}

[root@logstash ~]#/opt/logstash/bin/logstash   -f   /etc/logstash/logstash.conf             #启动logstash服务

然后进入kibana界面中,输入索引weblog,就可以开始绘制图表了

猜你喜欢

转载自blog.csdn.net/sxjwcs/article/details/92677246