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问题

     

     

     

  • 相关阅读:
    3.Appium运行时出现:Original error: Android devices must be of API level 17 or higher. Please change your device to Selendroid or upgrade Android on your device
    3.Python连接数据库PyMySQL
    2.Python输入pip命令出现Unknown or unsupported command 'install'问题解决
    2.Linux下安装Jenkins
    5.JMeter测试mysql数据库
    Android 4学习(7):用户界面
    Android 4学习(6):概述
    Android 4学习(5):概述
    Android 4学习(4):概述
    Android 4学习(3):概述
  • 原文地址:https://www.cnblogs.com/sseban/p/11974892.html
Copyright © 2011-2022 走看看