zoukankan      html  css  js  c++  java
  • 运维之日志系统Elasticsearch 分享(一)

      1. 1.elasticsearch介绍

    Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你以一个之前从未有过的速度和规模,去探索你的数据。它被用作全文检索、结构化搜索、分析以及这三个功能的组合

    Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。 Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

      1. 2.应用场景

    mysql虽然也可以搜索,比如查询某个字符串%,需要全表扫描

    es可以灵活的存储不同类型的数据

    比如,商城的商品搜索

    比如,所有产品的评论

      1. 3.数据格式

    Elasticsearch 使用JavaScript Object Notation 或者JSON作为文档的序列化格式。JSON序列化被大多数编程语言所支持,并且已经成为 NoSQL领域的标准格式。它简单、简洁、易于阅读。

    虑一下这个 JSON 文档,它代表了一个user对象:

    {

    "email": "john@smith.com", "first_name": "John",

    "last_name": "Smith",

    "info":

         { "bio": "Eco-warrior and defender of the weak", 

         "age": 25,

         "interests": [ "dolphins", "whales" ]

         },

    "join_date": "2014/05/01" 

    }

    1. 2.安装
      1. 2.1.几种安装方式介绍

    官方文档

    https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html

        1. 2.1.1.java安装

    yum install java

        1. 2.1.2.软件包安装

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.2.rpm

    rpm -ivh elasticsearch-6.4.2.rpm

    systemctl daemon-reload

    systemctl enable elasticsearch.service

    systemctl start elasticsearch.service

    systemctl status elasticsearch.service

    ps -ef|grep elastic

    lsof -i:9200

        1. 2.1.3.tar安装

     

        1. 2.1.4.docker安装

     

      1. 2.2.测试是否安装成功

    [root@elk-75 elasticsearch]# curl 'http://localhost:9200/?pretty'

    {

      "name" : "KhcOKcU",

      "cluster_name" : "elasticsearch",

      "cluster_uuid" : "tTJ0Rmc0Qp6oB-Sx6euCIA",

      "version" : {

        "number" : "6.4.2",

        "build_flavor" : "default",

        "build_type" : "rpm",

        "build_hash" : "04711c2",

        "build_date" : "2018-09-26T13:34:09.098244Z",

        "build_snapshot" : false,

        "lucene_version" : "7.4.0",

        "minimum_wire_compatibility_version" : "5.6.0",

        "minimum_index_compatibility_version" : "5.0.0"

      },

      "tagline" : "You Know, for Search"

    }

    1. 3.重要配置
      1. 3.1.相关配置目录以及配置文件

    rpm -ql elasticsearch#查看elasticsearch软件安装了哪些目录

    /etc/elasticsearch/elasticsearch.yml   #配置文件

    /etc/elasticsearch/jvm.options    #jvm虚拟机配置文件

    /etc/init.d/elasticsearch#init启动文件

    /etc/sysconfig/elasticsearch#环境变量配置文件

    /usr/lib/sysctl.d/elasticsearch.conf#sysctl变量文件,修改最大描述符

    /usr/lib/systemd/system/elasticsearch.service  #systemd启动文件

    /var/lib/elasticsearch# 数据目录

    /var/log/elasticsearch#日志目录

    /var/run/elasticsearch#pid目录

      1. 3.2.elsticsrach配置文件解读

    Elasticsearch 已经有了很好的默认值,特别是涉及到性能相关的配置或者选项,其它数据库可能需要调优,但总得来说,Elasticsearch不需要。如果你遇到了性能问题,解决方法通常是更好的数据布局或者更多的节点。

    [root@elk-75 elasticsearch]# egrep -v "^#" elasticsearch.yml 

    cluster.name: dba5 

    node.name: node-1

    path.data: /data/elasticsearch

    path.logs: /var/log/elasticsearch

    bootstrap.memory_lock: true

    network.host: 192.168.47.75

    http.port: 9200

    discovery.zen.ping.unicast.hosts: ["192.168.47.75"]

    discovery.zen.minimum_master_nodes: 2

      1. 3.3.修改配置重新启动

    mkdir /data/elasticsearch

    chown -R elasticsearch:elasticsearch /data/elasticsearch/

    systemctl restart elasticsearch

    systemctl status elasticsearch

      1. 3.4.锁定内存失败解决

    官方解决方案

    https://www.elastic.co/guide/en/elasticsearch/reference/6.4/setup-configuration-memory.html

    https://www.elastic.co/guide/en/elasticsearch/reference/6.4/setting-system-settings.html#sysconfig

    ### 修改启动配置文件

    vim /usr/lib/systemd/system/elasticsearch.service

    ### 增加如下参数

    [Service]

    LimitMEMLOCK=infinity

    ### 重新启动

    systemctl daemon-reload

    systemctl restart elasticsearch

    1. 4.elasticseartch术语及概念
      1. 4.1.索引词

    elastiasearch中索引词(term)是一个能够被索引的精确值。foo,Foo,FOO几个单词是不同的索引词。索引词(term)是可以通过term查询进行准确的搜索。

      1. 4.2.文本(text)

    文本是一段普通的非结构化文字。通常,文本会被分拆成一个个的索引词,存储在elasticsearch的索引库中。为了让文本能够进行搜索,文本字段需要事先进行分析了;当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本。

      1. 4.3.分析(analysis)

    分析是将文本转换为索引词的过程,分析的结果依赖于分词器。比如:FOO BARFoo-Barfoo bar这几个词有可能会被分析成相同的索引词foobar,这些索引词存储在Elasticsearch的索引库中。

      1. 4.4.集群(cluster)

    集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能。在所有节点,一个集群有一个唯一的名称默认为“elasticsearch”.此名称是很重要的,因为每个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群。当需要有多个集群的时候,要确保每个集群的名称不能重复,,否则节点可能会加入到错误的集群。请注意,一个节点只能加入到一个集群。此外,你还可以拥有多个独立的集群,每个集群都有其不同的集群名称。

      1. 4.5.节点(node)

    一个节点是一个逻辑上独立的服务,它是集群的一部分,可以存储数据,并参与集群的索引和搜索功能。就像集群一样,节点也有唯一的名字,在启动的时候分配。如果你不想要默认名称,你可以定义任何你想要的节点名.这个名字在理中很重要,Elasticsearch集群通过节点名称进行管理和通信.一个节点可以被配置加入到一个特定的集群。默认情况下,每个节点会加人名为Elasticsearch 的集祥中,这意味着如果你在网热动多个节点,如果网络畅通,他们能彼此发现井自动加人名为Elasticsearch 的一个集群中,你可以拥有多个你想要的节点。当网络没有集祥运行的时候,只要启动一个节点,这个节点会默认生成一个新的集群,这个集群会有一个节点。

      1. 4.6.分片(shard)

    分片是单个Lucene 实例,这是Elasticsearch管理的比较底层的功能。索引是指向主分片和副本分片的逻辑空间。对于使用,只需要指定分片的数量,其他不需要做过多的事情。在开发使用的过程中,我们对应的对象都是索引,Elasticsearch 会自动管理集群中所有的分片,当发生故障的时候,Elasticsearch 会把分片移动到不同的节点或者添加新的节点。

    一个索引可以存储很大的数据,这些空间可以超过一个节点的物理存储的限制。例如,十亿个文档占用磁盘空间为1TB。仅从单个节点搜索可能会很慢,还有一台物理机器也不一定能存储这么多的数据。为了解决这一问题,Elasticsearch将索引分解成多个分片。当你创建一个索引,你可以简单地定义你想要的分片数量。每个分片本身是一个全功能的、独立的单元,可以托管在集群中的任何节点。

      1. 4.7.主分片

    每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中。默认情况下,一个索引有5个主分片。你可以事先制定分片的数量,当分片一旦建立,则分片的数量不能修改。

      1. 4.8.副本分片

    每一个分片有零个或多个副本。副本主要是主分片的复制,其中有两个目的:

    - 增加高可用性:当主分片失败的时候,可以从副本分片中选择一个作为主分片。

    - 提高性能:当查询的时候可以到主分片或者副本分片中进行查询。默认情況下,一个主分片配有一个副本,但副本的数量可以在后面动态地配置增加。副本分片必部署在不同的节点上,不能部署在和主分片相同的节点上。

     

    分片主要有两个很重要的原因是:

    - 允许水平分割扩展数据。

    - 允许分配和井行操作(可能在多个节点上)从而提高性能和吞吐量。

    这些很强大的功能对用户来说是透明的,你不需要做什么操作,系统会自动处理。

      1. 4.9.复制

    复制是一个非常有用的功能,不然会有单点问题。当网络中的某个节点出现问题的时

    ,复制可以对故障进行转移,保证系统的高可用。因此,Elasticsearch 允许你创建一个或多个拷贝,你的索引分片就形成了所谓的副本或副本分片。

    复制是重要的,主要的原因有:

    - 它提供丁高可用性,当节点失败的时候不受影响。需要注意的是,一个复制的分片

    不会存储在同一个节点中。

    - 它允许你扩展搜索量,提高并发量,因为搜索可以在所有副本上并行执行。

    每个索引可以拆分成多个分片。索引可以复制零个或者多个分片。一旦复制,每个索引就有了主分片和副本分片。分片的数量和副本的数量可以在创建索引时定义。当创建索引后,你可以随时改变副本的数量,但你不能改变分片的数量。

    默认情況下,每个索引分配5个分片和一个副本,这意味着你的集群节点至少要有两个节点,你将拥有5个主要的分片和5个副本分片共计10个分片.

    每个Elasticsearch分片是一个Lucene 的索引。有文档存储数量限制,你可以在一个

    单一的Lucene索引中存储的最大值为lucene-5843,极限是2147483519(=integer.max_value-128)个文档。你可以使用cat/shards API监控分片的大小。

      1. 4.10.索引

    索引是具有相同结构的文档集合。例如,可以有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引。在系统上索引的名字全部小写,通过这个名字可以用来执行索引、搜索、更新和删除操作等。在单个集群中,可以定义多个你想要的索引。

      1. 4.11.类型

    在索引中,可以定义一个或多个类型,类型是索引的逻辑分区。在一般情况下,一种类型被定义为具有一组公共字段的文档。例如,让我们假设你运行一个博客平台,并把所有的数据存储在一个索引中。在这个索引中,你可以定义一种类型为用户数据,一种类型为博客数据,另一种类型为评论数据。

      1. 4.12.文档

    文档是存储在Elasticsearch中的一个JSON格式的字符串。它就像在关系数据库中表的

    一行。每个存储在索引中的一个文档都有一个类型和一个ID,每个文档都是一个JSON对象,存储了零个或者多个字段,或者键值对。原始的JSON 文档假存储在一个叫作Sour的字段中。当搜索文档的时候默认返回的就是这个字段。

      1. 4.13.映射

    映射像关系数据库中的表结构,每一个索引都有一个映射,它定义了索引中的每一个字段类型,以及一个索引范围内的设置。一个映射可以事先被定义,或者在第一次存储文档的时候自动识别。

      1. 4.14.字段

    文档中包含零个或者多个字段,字段可以是一个简单的值(例如字符串、整数、日期),也可以是一个数组或对象的嵌套结构。字段类似于关系数据库中表的列。每个字段都对应一个字段类型,例如整数、字符串、对象等。字段还可以指定如何分析该字段的值。

      1. 4.15.主键

    ID是一个文件的唯一标识,如果在存库的时候没有提供ID,系统会自动生成一个ID,文档的 index/type/id必须是唯一的。

      1. 4.16.elasticsearch和数据库的对应关系

    Elasticsearch数据库

    ------------------------------

    Index

    Type

    Document

    1. 5.交互
      1. 5.1.交互方式

    所有其他语言可以使用RESTful API通过端口9200Elasticsearch进行通信,你可以用你最喜爱的web客户端访问Elasticsearch.事实上,正如你所看到的,你甚至可以使用curl命令来和Elasticsearch交互

    一个 Elasticsearch 请求和任何 HTTP 请求一样由若干相同的部件组成:

    curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

    VERB 适当的 HTTP 方法谓词 : GET` `POST` `PUT` `HEAD 或者 `DELETE` PROTOCOL http 或者 https`(如果你在 Elasticsearch 前面有一个 `https 代理)

    HOST  Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。 

    PORT  运行 Elasticsearch HTTP 服务的端口号,默认是 9200

    PATH API 的终端路径(例如 _count 将返回集群中文档数量)Path 可能包含多个组件,例如: _cluster/stats _nodes/stats/jvm

    QUERY_STRING 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)

    BODY 一个 JSON 格式的请求体 (如果请求需要的话)

      1. 5.2.通用参数
        1. 5.2.1.pretty参数

    当你在任何请求中添加了参数?pretty=true时,请求的返回值是经过格式化后的JSON数据,这样阅读起来更加方便。

    系统还提供了另一种格式的格式化,?format=yaml,YAML格式,这将导致返回的结果具有可读的YAML格式。

        1. 5.2.2.human参数

    对于统计数据,系统支持计算机数据,同时也支持比较适合人类阅读的数据。?human=true,默认是false

        1. 5.2.3.响应过滤filter_path

    所有的返回值通过filter_path减少返回值的内容,多个值可以用逗号分开。也可以使用通配符*

      1. 5.3.curl命令行交互
        1. 5.3.1.计算文档数量

    [root@elk-75 ~]# curl -XGET 'http://192.168.47.75:9200/_count?pretty' -H 'Content-Type: application/json' -d '   

    {

      "query": { "match_all": {}

      } 

    }

    '

    {

      "count" : 0,

      "_shards" : {

        "total" : 0,

        "successful" : 0,

        "skipped" : 0,

        "failed" : 0

      }

    }

      1. 5.4.es-head插件交互
        1. 5.4.1.插件官方地址

    https://github.com/mobz/elasticsearch-head

        1. 5.4.2.使用docker部署elasticsearch-head

    docker pull alivv/elasticsearch-head

    docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head

        1. 5.4.3.使用nodejs编译安装

    官网地址

    https://nodejs.org/en/download/package-manager/

    https://nodejs.org/dist/latest-v10.x/

    http://npm.taobao.org

    下载安装

    yum install nodejs npm openssl screen -y

    node -v

    npm  -v

    npm install -g cnpm --registry=https://registry.npm.taobao.org

    cd /opt/

    git clone git://github.com/mobz/elasticsearch-head.git

    cd elasticsearch-head/

    cnpm install

    screen -S es-head

    cnpm run start

    Ctrl+A+D

        1. 5.4.4.修改ES配置文件支持跨域

    http.cors.enabled: true 

    http.cors.allow-origin: "*"

        1. 5.4.5.网页访问

    IP地址:9100

     

      1. 5.5.kibana交互
        1. 5.5.1.安装配置kibana

    wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.2-x86_64.rpm

    rpm -ivh kibana-6.4.2-x86_64.rpm

    [root@elk-75 soft]# grep "^[a-Z]" /etc/kibana/kibana.yml      

    server.port: 5601

    server.host: "192.168.47.75"

    elasticsearch.url: "http://192.168.47.75:9200"

    kibana.index: ".kibana"

    [root@elk-75 soft]# systemctl start kibana

    [root@elk-75 soft]# systemctl status kibana

    [root@elk-75 soft]# lsof -i:5601

    COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

    node    44667 kibana   12u  IPv4  72918      0t0  TCP 192.168.47.75:esmagent (LISTEN)

        1. 5.5.2.创建索引

     

        1. 5.5.3.过滤查询数据

     

    1. 6.相关操作API
      1. 6.1.文档相关的API

    官网地址:

    https://www.elastic.co/guide/en/elasticsearch/reference/current/indices.html 

        1. 6.1.2.插入数据

    [root@elk-75 scripts]# cat input_elk.sh 

    #!/bin/bash

    curl -XPUT '192.168.47.75:9200/megacorp/employee/1?pretty' -H 'Content-Type: application/json' -d'

    {

        "first_name" : "John",

        "last_name": "Smith",

        "age" : 25,

        "about" : "I love to go rock climbing", "interests": [ "sports", "music" ]

    }

    '

    curl -XPUT '192.168.47.75:9200/megacorp/employee/2?pretty' -H 'Content-Type: application/json' -d' {

    "first_name": "Jane",

    "last_name" : "Smith",

    "age" : 32,

    "about" : "I like to collect rock albums", "interests": [ "music" ]

    }

    '

    curl -XPUT '192.168.47.75:9200/megacorp/employee/3?pretty' -H 'Content-Type: application/json' -d' {

    "first_name": "Douglas", "last_name" : "Fir",

    "age" : 35,

    "about": "I like to build cabinets", "interests": [ "forestry" ]

    } '

    [root@elk-75 scripts]# bash input_elk.sh 

    {

      "_index" : "megacorp",

      "_type" : "employee",

      "_id" : "1",

      "_version" : 2,

      "result" : "updated",

      "_shards" : {

        "total" : 2,

        "successful" : 2,

        "failed" : 0

      },

      "_seq_no" : 1,

      "_primary_term" : 1

    }

    {

      "_index" : "megacorp",

      "_type" : "employee",

      "_id" : "2",

      "_version" : 1,

      "result" : "created",

      "_shards" : {

        "total" : 2,

        "successful" : 2,

        "failed" : 0

      },

      "_seq_no" : 0,

      "_primary_term" : 1

    }

    {

      "_index" : "megacorp",

      "_type" : "employee",

      "_id" : "3",

      "_version" : 1,

      "result" : "created",

      "_shards" : {

        "total" : 2,

        "successful" : 2,

        "failed" : 0

      },

      "_seq_no" : 0,

      "_primary_term" : 1

    }

     

        1. 6.1.3.查询文档

    #查询某一条数据

    [root@elk-75 scripts]# curl -XGET '192.168.47.75:9200/megacorp/employee/1?pretty'

    {

      "_index" : "megacorp",

      "_type" : "employee",

      "_id" : "1",

      "_version" : 1,

      "found" : true,

      "_source" : {

        "first_name" : "John",

        "last_name" : "Smith",

        "age" : 25,

        "about" : "I love to go rock climbing",

        "interests" : [

          "sports",

          "music"

        ]

      }

    }

     

        1. 6.1.4.删除文档

    #删除某条文档

    [root@elk-75 scripts]# curl -XDELETE '192.168.47.75:9200/megacorp/employee/1?pretty'

    {

      "_index" : "megacorp",

      "_type" : "employee",

      "_id" : "1",

      "_version" : 3,

      "result" : "deleted",

      "_shards" : {

        "total" : 2,

        "successful" : 2,

        "failed" : 0

      },

      "_seq_no" : 2,

      "_primary_term" : 1

    }

      1. 6.2.索引相关API
        1. 6.2.1.创建索引

    [root@elk-75 scripts]# curl -XPUT '192.168.47.75:9200/megacorp?pretty'

    {

      "acknowledged" : true,

      "shards_acknowledged" : true,

      "index" : "megacorp"

    }

        1. 6.2.2.查询索引信息

    #查询索引中所有的信息

    curl -XGET '192.168.47.75:9200/megacorp/employee/_search?pretty'

    #查询索引符合条件的信息:搜索姓名为:Smith的员工

    curl -XGET '192.168.47.75:9200/megacorp/employee/_search?q=last_name:Smith&pretty'

    #使用Query-string查询

    curl -XGET '192.168.47.75:9200/megacorp/employee/_search?pretty' -H 'Content-Type: application/json' -d'           

    {

    "query" : { "match" : {

    "last_name" : "Smith" }

    } }

    '

    #使用过滤器

    curl -XGET '192.168.47.75:9200/megacorp/employee/_search?pretty' -H 'Content-Type: application/json' -d'             

    {

    "query" : { "bool": {

    "must": { "match" : {

    "last_name" : "smith" }

    }, "filter": {

    "range" : {

    "age" : { "gt" : 30 }

    } }

    } }

    }

    '

        1. 6.2.3.删除索引

    #删除整个索引

    [root@elk-75 scripts]# curl -XDELETE '192.168.47.75:9200/megacorp?pretty'           

    {

      "acknowledged" : true

    }

    1. 7.集群管理
      1. 7.1.集群配置文件解读

    [root@elk-75 ~]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml 

    cluster.name: dba5 

    node.name: node-1

    path.data: /data/elasticsearch

    path.logs: /var/log/elasticsearch

    bootstrap.memory_lock: true

    network.host: 192.168.47.75

    http.port: 9200

    discovery.zen.ping.unicast.hosts: ["192.168.47.75","192.168.47.76","192.168.47.77"]

    discovery.zen.minimum_master_nodes: 1

    http.cors.enabled: true 

    http.cors.allow-origin: "*"

     

      1. 7.2.集群的相关API
        1. 7.2.1.查看集群健康状况

    查看集群健康状况:

    官网地址:

    https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html

    操作命令:

    [root@elk-75 ~]# curl -XGET 'http://192.168.47.75:9200/_cluster/health?pretty'

    {

      "cluster_name" : "dba5",

      "status" : "green",

      "timed_out" : false,

      "number_of_nodes" : 3,

      "number_of_data_nodes" : 3,

      "active_primary_shards" : 0,

      "active_shards" : 0,

      "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

    }

        1. 7.2.2.查看系统检索信息

    Cluster Stats API允许从群集范围的角度检索统计信息。

    官网地址:

    https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-stats.html

    操作命令:

    [root@elk-75 ~]# curl -XGET 'http://192.168.47.75:9200/_cluster/stats?human&pretty'

        1. 7.2.3.查看集群的设置

    官方地址:

    https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-get-settings.html

    操作命令:

    curl -XGET 'http://192.168.47.75:9200/_cluster/settings?include_defaults=true&human&pretty'

        1. 7.2.4.查询节点的状态

    官网地址:

    https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-info.html

    操作命令:

    curl -XGET 'http://192.168.47.75:9200/_nodes/procese?human&pretty'  

    curl -XGET 'http://192.168.47.75:9200/_nodes/_all/info/jvm,process?human&pretty'

    [root@elk-75 ~]# curl -XGET 'http://192.168.47.75:9200/_cat/nodes?human&pretty'                   

    192.168.47.76 21 96 0 0.02 0.04 0.05 mdi - node-2

    192.168.47.77 19 95 0 0.00 0.01 0.05 mdi * node-3

    192.168.47.75 36 85 0 0.07 0.06 0.19 mdi - node-1

        1. 7.2.5.索引分片

    curl -XPUT '192.168.47.75:9200/blogs?pretty' -H 'Content-Type: application/json' -d'

    {

    "settings" : { 

       "number_of_shards" : 3, 

       "number_of_replicas" : 1

     } 

    }'

     

        1. 7.2.6.调整副本数

    分片数一旦创建就不能再更改了,但是我们可以调整副本数

    curl -XPUT '192.168.47.75:9200/index2/_settings?pretty' -H 'Content-Type: application/json' -d'

    {

    "settings" : {

    "number_of_replicas" : 2

    }

    }

      1. 7.3.负载均衡与高可用

     

     

     

    1. 8.监控
      1. 8.1.x-pack

     

      1. 8.2.search guard权限管理

     

    1. 9.集群运维
      1. 9.1.滚动升级

     

      1. 9.2.备份与恢复
    1. 10.项目分享
      1. 10.1.中文分词器
        1. 10.1.1.官方地址

    https://github.com/medcl/elasticsearch-analysis-ik

        1. 10.1.2.分词器安装

    cd /usr/share/elasticsearch/bin

    ./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.2/elasticsearch-analysis-ik-6.4.2.zip

        1. 10.1.3.分词器测试

    创建索引

    curl -XPUT http://192.168.47.75:9200/index

    创建映射

    curl -XPOST http://192.168.47.75:9200/index/fulltext/_mapping -H 'Content-Type:application/json' -d'

    {

            "properties": {

                "content": {

                    "type": "text",

                    "analyzer": "ik_max_word",

                    "search_analyzer": "ik_max_word"

                }

            }

     

    }'

    创建一些文档

    curl -XPOST http:// 192.168.47.75:9200/index/fulltext/1 -H 'Content-Type:application/json' -d'

    {"content":"美国留给伊拉克的是个烂摊子吗"}

    '

    curl -XPOST http:// 192.168.47.75:9200/index/fulltext/2 -H 'Content-Type:application/json' -d'

    {"content":"公安部:各地校车将享最高路权"}

    '

    curl -XPOST http:// 192.168.47.75:9200/index/fulltext/3 -H 'Content-Type:application/json' -d'

    {"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}

    '

    curl -XPOST http://192.168.47.75:9200/index/fulltext/4 -H 'Content-Type:application/json' -d'

    {"content":"中国驻洛杉矶领事馆遭亚裔男子枪击嫌犯已自首"}

    '

    查询

    curl -XPOST http:// 192.168.47.75:9200/index/fulltext/_search?pretty  -H 'Content-Type:application/json' -d'

    {

        "query" : { "match" : { "content" : "中国" }},

        "highlight" : {

            "pre_tags" : ["<tag1>", "<tag2>"],

            "post_tags" : ["</tag1>", "</tag2>"],

            "fields" : {

                "content" : {}

            }

        }

    }

    '

        1. 10.1.4.更新字典

     

      1. 10.2.日志收集展示
        1. 10.2.1.架构图

     

        1. 10.2.2.nginx修改日志格式

    log_format access_json '{"@timestamp":"$time_iso8601",'

            '"host":"$server_addr",'

            '"clientip":"$remote_addr",'

            '"size":$body_bytes_sent,'

            '"responsetime":$request_time,'

            '"upstreamtime":"$upstream_response_time",'

            '"upstreamhost":"$upstream_addr",'

            '"http_host":"$host",'

            '"url":"$uri",'

            '"domain":"$host",'

            '"xff":"$http_x_forwarded_for",'

            '"referer":"$http_referer",'

            '"status":"$status"}';

        1. 10.2.3.redis配置

    ### 以守护进程模式启动

    daemonize yes

     

    ### 绑定的主机地址

    bind 192.168.47.75

     

    ### 监听端口

    port 6380

     

    ### pid文件和log文件的保存地址

    pidfile /opt/redis_cluster/redis_6380/pid/redis_6380.pid

    logfile /opt/redis_cluster/redis_6380/logs/redis_6380.log

     

    ### 设置数据库的数量,默认数据库为0

    databases 16

     

    ### 指定本地持久化文件的文件名,默认是dump.rdb

    dbfilename redis_6380.rdb

     

    ### 本地数据库的目录

    dir /data/redis_cluster/redis_6380

        1. 10.2.4.filebeat配置

    filebeat.prospectors:

    - type: log

      enabled: true

      paths:

        - /usr/local/nginx/logs/*access.log

      json.keys_under_root: true

      json.overwrite_keys: true

     

    output.redis:

        hosts: ["192.168.47.75"]

        key: "filebeat"

        db: 0

        timeout: 5

        1. 10.2.5.logstash配置

    root@docker-elk-135:~/docker_compose# cat logstash.conf 

    input {

      redis {

        host => "192.168.47.75"

        port => "6380"

        db => "0"

        key => "filebeat"

        data_type => "list"

      }

    }

     

    filter {

      mutate {

        convert => ["upstream_time", "float"]

        convert => ["request_time", "float"]

      }

    }

     

    output {

      if [source] == "/usr/local/nginx/logs/act.goumin.com_access.log" {

        elasticsearch {

          hosts => "http://192.168.47.75:9200"

          manage_template => false

          index => "act-%{+YYYY.MM}"

        }

      } 

     

     

      if [source] == "/usr/local/nginx/logs/app.goumin.com_access.log" {

        elasticsearch {

          hosts => "http:// 192.168.47.75:9200"

          manage_template => false

          index => "app-%{+YYYY.MM}"

        }

      }

        1. 10.2.6.redis验证数据

    keys *

    LLEN filebeat

    RPOP filebeat

      1. 10.3.提取es存储的日志IP并添加防火墙
        1. 10.3.1.架构图

     

        1. 10.3.2.功能实现

    1.提取录入到esnginx日志中的一定时间内的所有域名的访问IP最大的前10

    2.过滤后提取结果保存到文本中

    3.判断提取的IP是否白名单里的爬虫

    4.如果不是就添加到iptables防火墙里,每1小时恢复防火墙一次

    5.将封禁结果通过邮件发送给运维

        1. 10.3.3.脚本解读

    mysql-76:~/elk_ip# tree -L 2

    .

    ── ip_log

    │   ── act.log

    │   ── ask.log

    │   ── att.log

    │   ── bbs.log

    │   ── c.log

    │   ── dog.log

    │   ── i.log

    │   ── mall.log

    │   ── m.log

    │   ── www.log

    │   └── zhidao.log

    ── iptables_log

    ── mail_log

    │   ── all_ip.txt

    │   ── mail_all.txt

    │   ── mail_log.txt

    │   └── mail_status.txt

    ── scripts

    │   ── disable_ip.sh

    │   ── elk_topip.sh

    │   ── mail.sh

    │   └── url_list.txt

    └── spider_log

    提取IP脚本内容

    mysql-76:~/elk_ip/scripts# cat elk_topip.sh 

    #!/bin/bash

     

    ###脚本说明###

    #脚本功能:elasticsearch提取10分钟内访问IP次数最多的IP,然后存入日志中

     

    begin_time="$[$(date -d "-10 min" +%s)*1000]"

    end_time="$[$(date +%s)*1000]"

     

    url_date=$(date +%Y.%m)

     

     

    for url in $(cat /root/elk_ip/scripts/url_list.txt)

    do

      curl -s -XPOST http://192.168.47.135:19200/${url}-${url_date}/_search?pretty -H 'Content-Type: application/json'  -d '{"size":0,"_source":{"excludes":[]},"aggs":{"2":{"terms":{"field":"remote_addr.keyword","size":10,"order":{"_count":"desc"}}}},"stored_fields":["*"],"script_fields":{},"docvalue_fields":["@timestamp"],"query":{"bool":{"must":[{"match_all":{}},{"range":{"@timestamp":{"gte":'"${begin_time}"',"lte":'"${end_time}"',"format":"epoch_millis"}}}],"filter":[],"should":[],"must_not":[{"match_phrase":{"host.name":{"query":"lingdang-196"}}},{"match_phrase":{"remote_addr.keyword":{"query":"119.61.26.157"}}}]}}}'|egrep "key|"doc_count""|xargs -n 6|awk -F"[ ,]" '{print $3":"$7}'|egrep -v "192.168.5|210.14.154" >/root/elk_ip/ip_log/${url}.log

    done

    封锁脚本

    mysql-76:~/elk_ip/scripts# cat disable_ip.sh 

    #!/bin/bash

     

    ###脚本说明###

    #当提取IP的脚本执行完毕后,此脚本进行筛选和过滤

    #如果IP访问不足100次,过滤

    #如果来自196,过滤

    #如果是爬虫,过滤

    #其他情况加入加入防火墙阻止列表并调用发送邮件脚本发送邮件

     

    time=$(date +%F-%H:%M)

    mkdir -p /root/elk_ip/iptables_log/${time}

    mkdir -p /root/elk_ip/spider_log/${time}

    path_mail_log=/root/elk_ip/mail_log/mail_log.txt

    path_mail_all=/root/elk_ip/mail_log/mail_all.txt

    path_mail_status=/root/elk_ip/mail_log/mail_status.txt

     

    >${path_mail_log}

     

    for url in $(cat /root/elk_ip/scripts/url_list.txt)

    do

      path_ip_log="/root/elk_ip/ip_log/${url}.log"

      path_iptables_log="/root/elk_ip/iptables_log/${time}/${url}.log"

      path_spider_log="/root/elk_ip/spider_log/${time}/${url}.log"

      for i in $(cat ${path_ip_log})

      do

         ip=$(echo ${i}|sed -rn 's/(.*):(.*)/1/p')

         num=$(echo ${i}|sed -rn 's/(.*):(.*)/2/p')

         if [ "${num}" -gt "100" ]

         then

            cmd=$(/usr/bin/host ${ip}|egrep 'not found|no servers'|wc -l)

            if [ "${cmd}" == 1 ]

            then

              if [ "$(/sbin/iptables -nL|grep "${ip}"|wc -l)" == "0" ]

              then

                    /sbin/iptables -I INPUT 6 -s ${ip} -j DROP

                    echo "$(date +%F-%H:%M) ${num}:${ip}" >> ${path_iptables_log}

                    /bin/bash /root/elk_ip/scripts/mail.sh ${url} ${ip} ${num} ${time} >> ${path_mail_log}

              else 

                    echo "already exists $(date +%F-%H:%M) ${num}:${ip}" >> ${path_iptables_log}

              fi

            else

              echo "$(date +%F-%H:%M) ${num}:${ip}" >> ${path_spider_log}

              echo "$(/usr/bin/host ${ip})" >> ${path_spider_log}

            fi

         fi

      done

    done

     

    if [ -s ${path_mail_log} ]

    then

        cat ${path_mail_log} >> ${path_mail_all}

        cat ${path_mail_log}|mail -s 查封IP信息 zhangya@goumin.com,wangwangqi@goumin.com >> ${path_mail_status} 2>&1

    fi

    邮件脚本

    mysql-76:~/elk_ip/scripts# cat mail.sh 

    #!/bin/bash

    echo -e "

    访问域名: $1

    访问IP$2

    访问次数:$3

    访问时间:$4

    处理结果:添加防火墙成功

    ========================

    "

    1. 11.故障分享
      1. 11.1.滚动升级关闭自动分片导致的故障

     

      1. 11.2.内存分配不足导致GC问题

     

     

     

  • 相关阅读:
    Android的startActivityForResult()与onActivityResult()与setResult()参数分析,activity带参数的返回
    git stash 保存当前工作状态
    vim diff 的使用
    git pull 命令
    java 开发环境安装
    vim 处理换行符
    git 操作分支
    git 操作远程仓库地址
    vim 宏的使用
    Chrome 调试技巧
  • 原文地址:https://www.cnblogs.com/sseban/p/11974892.html
Copyright © 2011-2022 走看看