一、日志监控概述
二、ElasticSearch简介
三、安装
四、API简介
五、配置文件详解
六、插件

一、日志监控概述

1、日志处理常见的流程

日至收集->数据通道[传输]->处理[数据清洗]-->存储[持久化]>数据可视化
日志收集:日志为半结构化数据,
常见收集客户端软件:logstash,Fluentd,Logtail,rsyslog,FileBeat... //在日志收集方也可以设置感兴趣的日志(定制化)
pull:拉取,爬虫
push:推送,别人推送过来

数据通道:可以直接发送到处理方,或者使用消息队列解耦
存储:HDFS、NFS、HBase、ES自身... ;MySQL使用最左侧索引模糊查询性能不行。
全文索引:任何一个文字进行索引,还可以进行模糊匹配
处理和可视化:

  • ELK:ELasticSearch提供搜索、分析、存储三大主要功能,kibana提供可视化界面
  • jstorm/storm:
  • Flume:Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。 Flume-ng/Flume-og功能差异较大,注意区分
  • SkyEye:对java、scala等运行于jvm的程序进行实时日志采集、索引和可视化,对系统进行进程级别的监控,对系统内部的操作进行策略性的报警、对分布式的rpc调用进行trace跟踪以便于进行性能分析
  • Scribe:Facebook开源的日志收集系统,在Facebook内部已经得到大量的应用,分布式收集,统一处理
  • Log Parser:微软的日志分析工具
  • ...

常见架构组合方式:

  • flume+kafka+storm+mysql
  • Flume+HDFS+KafKa+Strom
  • logstash+ElasticSearch+Kibana
  • logtail+jstorm+HBase

本文重点介绍ELK模型

2、监控分类

应用监控:APM产品

  • google:dapper
  • twitter: zipkin (开源)
  • 淘宝:鹰眼
  • 京东:hydra (开源)
  • 大众点评:CAT (开源)
  • 小米:open-falcon (开源)
  • ...

日志监控:
ELK...
前端监控:

  • 听云 https://report.tingyun.com
  • 360分析 https://fenxi.360.cn
  • 百度监控 https://tongji.baidu.com
  • 奇云测 http://ce.cloud.360.cn
  • 其他...

二、ElasticSearch简介

1、搜索引擎

Lucene、Solr、Elasticsearch、Sphinx、LIUS、Egothor、Xapian、ComPass...
常用的搜索引擎:Lucene、Solr、ELasticsearch、Sphinx

Lucene:

  • 优势:成熟、社区活跃、所有的扩展,分布式,可靠性等都需要自己实现;
  • 缺点:非实时,从建索引到可以搜索中间有一个时间延迟,而当前的“近实时”(Lucene Near Real Time search)搜索方案的可扩展性有待进一步完善
    Solr:基于Lucene的全文搜索服务器
  • 优点:成熟、稳定、社区活跃;文档通过Http利用XML加到一个搜索集合中;支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式
  • 缺点:建立索引时,搜索效率下降,实时索引搜索效率不高
    Elasticsearch:基于Lucene构建的开源,分布式,RESTful搜索引擎
  • 优势:使用Lucene作为其核心来实现所有索引和搜索的功能,目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单 Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”
  • 缺点:还不够自动(不适合当前新的Index Warmup API)

Elasticsearch对比Solr

  • Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
  • Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
  • Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
  • Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
    总之,Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
    图片搜索引擎:lire 使用Lire(基于Lucene)索引并搜索图片:http://my.oschina.net/cwalet/blog/55502 ;http://www.lire-project.net/

2、Lucene概述

Lucene是最高效的开源搜素引擎框架。但是使用起来较为复杂,Elasticsearch作为一个应用程序使用 Lucene 作为内部引擎进行以下工作:
1)分布式的实时文件存储,每个字段都被索引并可被搜索
2)分布式的实时分析搜索引擎
3)可以扩展到上百台服务器,处理PB级结构化或非结构化数据
Lucene:索引链,没有前端界面,不获取文档
构件查询,读取结果,运行查询
ElaticSearch:搜索引擎的前端,核心是Lucene
索引,文档分析,构件文档等
Lucene: 提供了完整的查询引擎和索引引擎,部分文本分析引擎;Lucene中,使用这种“倒排索引”的技术,来实现相关映射。

文档:Document
    包含了一个或多个域的容器;
        field:value //键值对,真正搜索搜索的是value
    域:field
        有很多选项
            索引选项、存储选项、向量使用选项;//可单独或组合使用

        索引选项:用于通过倒排索引来控制文本是否可被搜索。
            //只有成为索引中的项才可以被搜索。
            Index:ANYLIZED //分析(切词)并单独作为索引项
            Index.Not_ANYLIZED //不分析(不切词),把整个内容当一个索引项
            Index.ANYLIZED_NORMS //类似于Index:ANYLIZED,但不存储token的Norms[加权基准]
            Index.Not_ANYLIZED_NORMS //类似于Index:Not_ANYLIZED,但不存储值的Norms(加权基准)
            Index.No:不对此域的值进行索引,因此不被搜索。
        存储选项:是否需要存储域的真实值
            title:this is a Notebook //根据存储法则,存储N为小写,那展示的时候,展示的是大写?小写?

            store.YES:存储真实值
            store.NO:不存储真实值
        域向量选项用于在搜索期间控制该文档所有的唯一项动能完全从文档中检索时使用;

搜索:

  • 查询Lucene索引时,返回的是一个有序的scoreDOC对象
  • 查询时,Lucene会为每个文档计算其score
  • lucence:java语言研发

API:

  • IndexSearcher:索引搜索入口
  • Query及其子类:
  • QueryParser:查询分析器
  • TopDocs:lucene每一次返回的对象scoreDoc放在TopDocs数组中;TopDocs:保存查询结果ScoreDocs中分值较高的前10个
  • ScoreDOC:搜索返回的对象

Luence的多样化查询

  • IndexSearcher中的search方法;

TermQuery:对索引中的特定项进行搜索,Term是索引中的最小索引片段,每个Term包含了一个域名和一个文本值

    title: This is a Desk.
    owner: Tom Blair
    description: this is a desk, it's belong to Tom.

    title: This is a table.
    `owner:Clinton
    description: this is a desk,it's  belong to Clinton.
        This: 1 2
        Desk: 1
        table: 2
TermQuery可以指定搜索域为title中,title中包含Desk
TermRangQuery:可以指定多个域进行搜索,例如在title和descrition中包含Desk
NumericRangQuery:数值范围搜索,判定其数值大小
PrefixQuery:用于搜索以指定字符串开头的项,
BooleanQuery:布尔型搜索,用于实现组合搜索,组合逻辑有三种:AND,OR,NOT
PhraseQuery:定义距离范围,来进行搜索。
WillcardQuery:通配查询,?,*
FuzzyQuery:模糊查询,根据模糊程度:Levenshtein距离算法 //距离真实查询内容有多远

3、相关概念

正排索引:正排索引是指文档ID为key(可以理解为主键),表中记录每个关键词出现的次数,查找时扫描表中的每个文档中字的信息,直到找到所有包含查询关键字的文档。
倒排索引:以word作为关键索引表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。
分词:
不同语言的切词方式时不同的; 还有同义词,语法错误:,大小写分析,错别字等:分析引擎,进行语法分析

倒排索引原理
两篇文章:
文章1.Tom lives in Guangzhou,I live in Guangzhou too.
文章2.He once lived in Shanghai.
分词后:
文章1关键字为:[tom][live][guangzhou][i][live][guangzhou]
文章2关键字为:[he][live][shanghai]
加上 出现频率 和”出现位置“信息后,我们的索引结构为:
关键字 文章号码[出现频率] 出现位置
guangzhou 1[2] 3,6
he 2[1] 1
i 1[1] 4
live 1[2],2[1] 2,5,2
shanghai 2[1] 3
tom 1[1] 1
Lucene中,就是使用这种“倒排索引”的技术,来实现相关映射。
基本组件:

  • 索引(index):文档的容器,索引是具有类似特性的文档的集合。类似于表;索引名必须使用小写字母;
    一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices 或indexe
  • 类型(type):类型是索引内部的逻辑分区,其意义取决于用户需求,一个索引内部可以定义一个或多个类型。
    一般来说:类型就是拥有相同的域的文档的预定义
    //建议在一个索引中存储一个type的数据。
  • 文档(document):文档是lucene索引和搜索的的原子单位,它包含了一个或多个域,是域的容器,基于JSON格式表示。
    每个域的组成部分:一个名字,一个或多个值,拥有多个域的值,通常称为多值域
    Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。
    在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤
  • 映射(mapping):原始内容存储为文档之前,需要事先进行分析,例如切词、过滤某些词;映射用于定义此分析机制该如何实现
    除此之外,ES还为映射提供了诸如将域中的内容排序等功能。
    例如This is a boy //is 和a要不要过滤掉,boy是关键字等
    Relational DB -> Databases -> Tables -> Rows行 -> Columns列
    Elasticsearch -> Indices   -> Types  -> Documents -> Fields 

4、ELK概述

ELK stacks:ELK(ElasticSearch, Logstash, Kibana)
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面;可以帮助您汇总、分析和搜索重要数据日志。

ELasticsearch对lucence拓展:把一个索引,分片,分别存储到多个节点上

  • 对分片进行HA:例如把分片1和分片1的副本,分别存储在A和C两个节点上。A就是片1的主节点,c就是片1的从节点片2在B和C上一份,B为片2的主节点,C为片2的分节点
  • 主从结构:主节点可写,从节点更新//
  • 查询:每一个节点都知道所有分片所在node,可以帮忙做递归
  • 写入:请求对2的写,API会转发到2上

5、ES组件

  • Cluster:ES的集群标识为集群名称;默认为"elasticsearch"。节点基于该名字决定加入到哪个集群中,一个节点只能属于一个集群。
  • Node:运行了单个ES实例的主机即为节点,集群的成员,用于存储数据、参与集群索引、搜索操作。节点的标识靠节点名。
    默认会生成随机子串作为主机名
  • Shard:分片,将索引切割成为的物理存储组件,但每一个shard都是一个独立且完整的索引。
    创建索引时,ES默认可为其分割为5个shard,可以按需定义,创建完成之后不可修改。
  • Shard有两种类型:primary shard和replica。用户可自定义每个primary replica的个数
    Replica用于数据冗余及查询时的负载均衡,每个主shard的副本数量可以自定义。
    主shard的副本数量可以动态修改,但是index的切割shard个数不能动态修改
    ES Cluster工作过程:
  • 启动时:通过多播(默认)或单播方式,在9300/tcp查找同一个集群中的其它节点。并与之建立通信。
    集群中的所有节点会选举出一个主节点负责管理整个集群状态,以及在集群范围内决定各shards的分布方式。
    站在用户角度而言,每个均可接受并响应用户的各类请求。

集群状态:green,red,yellow //yellow:修复过程。green正常,red不可用
yellow状态:各副本shard都不可用,只能使用主shard。读请求将无法进行LB
主node会检测所有shard,主shard是否正常,副shard数量是否满足。假如主shard不在,就修改某个副shard为主,副本shard不够,则添加

主节点会周期检查各个从节点是否可用:
任意一个节点不可用:进入修复模式,重新均衡。 //Mogilefs不会自动进行rebalance,但是 elasticsearch可以自动进行

ES选举过程:

  • 1、集群已经选举完毕,新节点会加入然后接受之前的master
  • 2、整个master集群刚开始初始启动的时候
    Bully选举算法
    Leader选举的基本算法之一。它假定所有节点都有一个惟一的ID,该ID对节点进行排序。 任何时候的当前Leader都是参与集群的最高id节点
    只有一个Leader将当前版本的全局集群状态推送到每个节点。 ZenDiscovery(默认)过程就是这样的:
  • 1、每个节点计算最低的已知节点ID,并向该节点发送领导投票
  • 2、如果一个节点收到足够多的票数,并且该节点也为自己投票,那么它将扮演领导者的角色,开始发布集群状态。
  • 3、所有节点都会参数选举,并参与投票,但是,只有有资格成为 master 的节点的投票才有效.

图1:
ElasticSearch详解(一)_第1张图片

https://www.elastic.co/guide/en/elasticsearch/reference/2.2/modules-discovery-zen.html#no-master-block

三、安装

1、环境配置

node1   192.168.192.222
node2   192.168.192.223
node3   192.168.192.224

配置java环境变量,不再重复。请自行百度。版本使用新版本
elasticsearch:是用jruby研发 //json java python因此需要先安装jdk
ruby有cruby和jruby
JDK区分:Oracle JDK和OpenJDK

2、修改ES配置文件

node1配置: elasticsearch.yml

  • cluster.name: my-cluster
  • node.name: node1
  • network.host: 192.168.192.222
  • http.port: 9200
  • discovery.zen.ping.unicast.hosts: ["node1", "node2", "node3"]

node2配置:

  • cluster.name: my-cluster
  • node.name: node2
  • network.host: 192.168.192.223
  • http.port: 9200
  • discovery.zen.ping.unicast.hosts: ["node1", "node2", "node3"]

node3配置:

  • cluster.name: my-cluster
  • node.name: node3
  • network.host: 192.168.192.224
  • http.port: 9200
  • discovery.zen.ping.unicast.hosts: ["node1", "node2", "node3"]

3、启动

bin/elasticsearch -d  以daemon方式运行
> * ERROR: [2] bootstrap checks failed
> * [1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
> * [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
针对上面2个报错
不能用root启动,否则会报错
vim /etc/security/limits.conf 
ulimit -Hn 查看当前nofile hard limit
ulimit -n 调整

echo $((65530*10)) > /proc/sys/vm/max_map_count 

四、API简介

访问elasticsearch使用Restful API:
四类API:

  • 1.检查集群、节点、索引等健康与否,以及获取其相应状态
  • 2.管理集群、节点、索引及元数据
  • 3.执行CRUD操作:增删查改
  • 4.执行高级操作,例如paging,filtering

ES访问接口:tcp/9200
curl -X [VERB] PROTOCOL://Host:PORT/path/?Query_STRING -d 'BODY'
VERB:get,put,delete等
PROTOCOL:http,https
QUERY_STRING:查询参数,例如?pretty表示易读的JSON格式输出;

curl -X GET 'http://192.168.192.222:9200/?pretty'       
curl -X GET 'http://192.168.192.222:9200/_cluster/health?pretty'        
curl -X GET 'http://192.168.192.222:9200/_cat/'   //查看cat API的用法        
curl -X GET 'http://192.168.192.222:9200/_cat/nodes' //查看node信息
curl -X GET 'http://192.168.192.222:9200/_cat/nodes?v' //verbose显示
curl -X GET 'http://192.168.192.222:9200/_cat/nodes?help' //帮助
curl -X GET 'http://192.168.192.222:9200/_cat/nodes?h=name,ip,port,uptime,heap,current' //h:head头部内容
curl -X GET '192.168.192.222:9200/_cluster/stats?pretty=true'  //查看集群性能信息
curl -X GET 'http://192.168.192.222:9200/_cluster/pending_tasks?pretty=true'  //查看等待中的任务

1、集群类API

Cluster API:
    curl -XGET 'http://192.168.192.222:9200/_cluster/health?level=shards'
    curl -XGET 'http://192.168.192.222:9200/_cluster/health?level=indicies&pretty' //并且
    curl -X GET 'http://192.168.192.222:9200/_cluster/state/nodes?pretty' //显示所有状态node id
    1.cluster Health //node健康状态
    2.Cluster State //状态
        curl -X GET 'http://192.168.192.222:9200/_cluster/state/?pretty'
    3.Cluster Stats //统计数据
        curl -X GET 'http://192.168.192.222:9200/_cluster/stats?pretty'
    4.Cluster Reroute //重新路由,对某个查询重新路由到另外一个节点
    5.Cluster Update Settings //更新集群中的某些事务
    6.Nodes Stats
         curl -X GET 'http://192.168.192.222:9200/_nodes/stats?pretty' //默认显示所有node,可以指定显示的那个node
    ...
curl -X GET 'http://192.168.192.222:9200/_cluster/health?pretty'
{
  "cluster_name" : "my-cluster",
  "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
}

status:

  • green:集群百分百可用
  • yellow:所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。
  • red:至少一个主分片(以及它的全部副本)都在缺失中。数据丢失:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。
    number_of_nodes 和 number_of_data_nodes 这个命名完全是自描述的。
    active_primary_shards 指出你集群中的主分片数量。这是涵盖了所有索引的汇总值。
    active_shards 是涵盖了所有索引的_所有_分片的汇总值,即包括副本分片。
    elocating_shards 显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。
    initializing_shards 是刚刚创建的分片的个数。比如,当你刚创建第一个索引,分片都会短暂的处于 initializing 状态。这通常会是一个临时事件,分片不应该长期停留在 initializing 状态。你还可能在节点刚重启的时候看到 initializing 分片:当分片从磁盘上加载后,它们会从 initializing 状态开始。
    unassigned_shards 是已经在集群状态中存在的分片,但是实际在集群里又找不着。通常未分配分片的来源是未分配的副本。比如,一个有 5 分片和 1 副本的索引,在单节点集群上,就会有 5 个未分配副本分片。如果你的集群是 red 状态,也会长期保有未分配分片(因为缺少主分片)。
    curl -s '192.168.192.222:9200/_cluster/health?level=shards;pretty=true' //查看索引中每个分片的状态和位置。可以定位是哪些索引异常

Relational DB -> Databases -> Tables -> Rows行 -> Columns列
Elasticsearch -> Indices -> Types -> Documents -> Fields

各种版本API用法:

https://www.elastic.co/guide/en/elasticsearch/reference/index.html
https://www.elastic.co/guide/en/elasticsearch/reference/6.6/index.html

2、CRUD之类的API

增加
为部门(partment)下的销售部(xiaoshou)建立员工索引,编号为1

[root@node2 ~]# curl -H "Content-Type: application/json" -X POST '192.168.192.223:9200/partment/xiaoshou/1?pretty'  -d '  
{
"first_name":"zhong",
"seconde_name":"guo",
"gender":"Male",
"age":26,
"interests": [ "sports", "music" ]
}'

索引名:partment
类型名:xiaoshou
文档:1

注意:如果不添加Content-Type: application/json 可能会报错406

[root@node2 ~]# curl -H "Content-Type: application/json" -X POST '192.168.192.223:9200/partment/xiaoshou/2?pretty'  -d '  
{
"first_name":"Rong",
"last_name":"Huang",
"gender":"Female",
"age":23,
"courses":"Luoying Shenjian"
}'

查看文档

[root@node3 ~]# curl -XGET '192.168.192.222:9200/partment/xiaoshou/2?pretty' //查看

更新文档
PUT方法会覆盖原有文档
如果只更新部分内容:使用_update API

[root@node3 ~]# curl -H "Content-Type: application/json" -XPOST '192.168.192.222:9200/partment/xiaoshou/2/_update?pretty' -d '
{
"doc":{ "age":28 }
}'
[root@node3 ~]# curl -XGET '192.168.192.222:9200/partment/xiaoshou/2?pretty' //再次查看

删除文档

curl -XDELETE '192.168.192.222:9200/partment/xiaoshou/2'

删除索引

    curl -XGET '192.168.192.222:9200/_cat/indices?v'  //查看索引
    curl -XDELETE '192.168.192.222:9200/students' //删除索引

五、配置文件详解

elasticsearch.yml 主配置文件
jvm.options jvm参数配置文件
log4j2.properties 日志配置文件
elasticsearch.keystore SSL相关
配置文件参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/modules.html
API方式修改配置:https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-update-settings.html

1、elasticsearch.yml参数分类

Cluster-level routing and shard allocation  //设置shard如何分配
Discovery   //node之间的发现规则
Gateway //集群内有多少个node存活才可以恢复
HTTP    //设置http restful接口
Indices     //全局索引相关配置
Network     //默认网络配置
Node client     //node作为非data node或者作为master node加入集群
Painless    //用于ElasticSearch的内置脚本语言,旨在尽可能安全。 
Plugins //插件 
Scripting   //自定义脚本在Lucene表达式、Ad groovy中可用。您也可以用内置的脚本语言编写脚本,非常简单。
Snapshot/Restore    //使用快照/还原备份数据 
Thread pools    //线程池设置
Transport   //内部node之间的传输层配置
Tribe nodes //一个节点在多个es集群中伴有角色
Remote clusters //远程集群用于在传输层上跨集群连接的功能中。 
Cross-cluster search    //跨集群搜索允许跨多个集群执行搜索请求,而无需加入它们,并在它们之间充当联合客户机。 

2、示例说明

cluster.name: es6.2  //集群名称
node.name: node-1   //node名称
node.master: true //允许一个节点是否可以成为一个master节点,es是默认集群中的第一台机器为master,如果这台机器停止就会重新选举master. 任何主节点的节点(默认情况下所有节点)都可以被主选举过程选为主节点。
node.data: true //允许该节点存储数据(默认开启) 

注意:主节点必须有权访问该data/目录(就像data节点一样 ),因为这是集群状态在节点重新启动之间持续存在的位置。

node.ingest:true  //
search.remote.connect:true //开启跨群集搜索(默认启用)

# 配置文件中给出了三种配置高性能集群拓扑结构的模式,如下: 
# 1. 如果你想让节点从不选举为主节点,只用来存储数据,可作为数据节点 
# node.master: false
# node.data: true
# node.ingest: true

# 2. 如果想让节点成为主节点,且不存储任何数据,并保有空闲资源,可作为协调器 
# node.master:true 
# node.data:false 
# node.ingest:false 

# 3. 如果想让节点既不称为主节点,又不成为数据节点,那么可将他作为摄取节点,从节点中获取数据,生成搜索结果等 
# node.master: false 
# node.data: false 
# node.ingest: true

# 4. 仅作为协调器 
# node.master: false 
# node.data: false
# node.ingest: false

path.data: /var/data/elasticsearch  //数据目录
path.logs: /var/log/elasticsearch   //日志文件的路径 
network.host: 127.0.0.1 //节点将绑定到此主机名或IP地址

http.port: 9200     //绑定到传入HTTP请求的端口,可以接受单个值或者范围

transport.tcp.port: 9300    //端口绑定节点之间的通信。接受单个值或范围。如果指定了范围,则节点将绑定到范围中的第一个可用端口。默认为9300-9400
transport.publish_port: 9300 //与此节点通信时,群集中其他节点应使用的端口。当群集节点位于代理或防火墙之后并且transport.tcp.port不能从外部直接寻址时很有用。默认为通过分配的实际端口 transport.tcp.port
transport.bind_host: 127.0.0.1 //将传输服务绑定到的主机地址。默认为transport.host(如果设置)或network.bind_host
transport.publish_host: 127.0.0.1  //发布集群中要连接到的节点的主机地址。默认为transport.host(如果设置)或network.publish_host
transport.host: 127.0.0.1  //用于设置transport.bind_host和transport.publish_host默认为transport.host或network.host
transport.tcp.connect_timeout: 30s //套接字连接超时设置(以时间设置格式)。默认为30s
transport.tcp.compress: false //设置是否压缩tcp传输时的数据,默认为false,不压缩。
transport.ping_schedule: 5s //安排常规ping消息以确保连接保持活动状态。默认为5s在传输客户端和-1(禁用)
network.bind_host: 127.0.0.1    //绑定到哪个网络接口以侦听传入请求
network.publish_host: 127.0.0.1 //发布主机是节点通告集群中其他节点的单个接口,以便这些节点可以连接到它。目前,Elasticsearch节点可能会绑定到多个地址,但只发布一个。如果未指定,则默认为“最佳”地址network.host,按IPv4 / IPv6堆栈首选项排序,然后按可访问性排序。如果您将其设置为 network.host多个绑定地址,但依赖于特定地址进行节点间通信,则应该明确设置 network.publish_host。transport.tcp.port
network.tcp.no_delay: true  //启用或禁用TCP无延迟 设置。默认为true。
network.tcp.keep_alive: true    //启用或禁用TCP保持活动状态。默认为true。
network.tcp.reuse_address: true //地址是否应该重复使用。默认为true在非Windows机器上。
network.tcp.send_buffer_size    //TCP发送缓冲区的大小(以大小单位指定)。默认情况下不明确设置。
network.tcp.receive_buffer_size //TCP接收缓冲区的大小(以大小单位指定)。默认情况下不明确设置。
bootstrap.memory_lock: true //设置为true来锁住内存。因为内存交换到磁盘对服务器性能来说是致命的,当jvm开始swapping时es的效率会降低,所以要保证它不swap

使用head等插件监控集群信息,需要打开以下配置项 ###########
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-credentials: true

################################### Gateway ###################################
# 以下静态设置(必须在每个主节点上设置)控制刚刚选择的主服务器在尝试恢复群集状态和群集数据之前应等待的时间,修改后需要重启生效
gateway.expected_nodes: 0 //预计在集群中的(数据或主节点)数量。只要预期的节点数加入群集,恢复本地碎片就会开始。默认为0
gateway.expected_master_nodes: 0 //预计将在群集中的主节点的数量。一旦预期的主节点数加入群集,就会立即开始恢复本地碎片。默认为0
gateway.expected_data_nodes: 0 //预计将在群集中的数据节点的数量。只要预期数量的节点加入群集,就会开始恢复本地碎片。默认为0
gateway.recover_after_time: 5m  //设置初始化恢复过程的超时时间,超时时间从上一个配置中配置的N个节点启动后算起。默认为5m

################################## Discovery ##################################
#### 该配置十分重要,没有正确配置,可能无法构成集群
# 这是一个集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测
# discovery.zen.ping.unicast.hosts: ["host1:port", "host2:port", "host3:port"]
# 默认为["127.0.0.1", "[::1]"]

discovery.zen.ping.unicast.hosts.resolve_timeout: 5s    //在每轮ping中等待DNS查找的时间量。指定为 时间单位。默认为5秒
discovery.zen.ping_timeout: 3s  //确定节点将多久决定开始选举或加入现有的群集之前等待,默认3s
discovery.zen.join_timeout:     //一旦一个节点决定加入一个现有的已形成的集群,它将发送一个加入请求给主设备,默认值是ping超时的20倍。
discovery.zen.minimum_master_nodes: 2   
为防止数据丢失,配置discovery.zen.minimum_master_nodes设置(默认设置1)至关重要, 以便每个符合主节点的节点都知道 为了形成群集而必须可见的主节点的最小数量。
为了解释,假设您有一个由两个主节点组成的集群。网络故障会中断这两个节点之间的通信。每个节点都会看到一个主节点的节点......本身。随着minimum_master_nodes设置为默认1,这是足以形成一个集群。每个节点将自己选为新的主人(认为另一个主人资格的节点已经死亡),结果是两个集群,或者是一个分裂的大脑。直到一个节点重新启动后,这两个节点才会重新加入。任何已写入重新启动节点的数据都将丢失。
现在想象一下,您有一个具有三个主节点资格的节点的集群,并 minimum_master_nodes设置为2。如果网络拆分将一个节点与其他两个节点分开,则具有一个节点的一侧不能看到足够的主节点,并且会意识到它不能将自己选为主节点。具有两个节点的一侧将选择一个新的主控(如果需要)并继续正常工作。一旦网络拆分解决,单个节点将重新加入群集并再次开始提供服务请求。
该设置应该设置为符合主数据节点的法定数量:
(master_eligible_nodes / 2)+ 1

六、插件

plugins:插件
插件扩展ES的功能:
添加自定义的映射类型、自定义分析器、本地脚本、自定义发现方式
安装:
1.直接将插件放置在plugins目录中
/usr/share/elasticsearch/plugins
2.使用plugin脚本进行安装
/usr/share/elasticsearch/bin/plugin
/usr/share/elasticsearch/bin/plugin -h
//在一个节点上安装,在其他节点上可以查看
插件:
_plugin/plugin_name 访问

        systemctl restart elasticsearch.service
        http://192.168.192.222:9200/_plugin/marval/
        http://192.168.192.222:9200/_plugin/bigdesk/
        http://192.168.192.222:9200/_plugin/head

head插件:是一个Elasticsearch的集群管理工具,它是完全由HTML5编写的独立网页程序,
以查看集群几乎所有信息,还能进行简单的搜索查询,观察自动恢复的情况等等。
kopf插件:Kopf是一个ElasticSearch的管理工具,它也提供了对ES集群操作的API。
bigdesk插件:集群监控插件,通过该插件可以查看整个集群的资源消耗情况,cpu、内存、http链接等等。
analysis-ik插件:为了提高搜索的效率,es使用倒排索引来做全文搜索。
通过analyzer(分词器)先把需要分析的文本,表征化为适合的term(词),然后标准化这些term,使他们容易被搜索到。
(比如说模糊大小写,空格等等),analysis-ik是专门用于中文的分词器。

bigdesk插件安装方式:

    ./plugin install mobz/elasticsearch-head
    ./plugin install lmenezes/elasticsearch-kopf
    bigdesk:
        https://github.com/lukas-vlcek/bigdesk/tree/master  下载zip压缩包
        cd /usr/share/elasticsearch/plugins/
        mkdir bigdesk-master/_site -pv
        将解压后的bigdesk-master文件夹下的所有文件拷贝到_site目录下
        cd /usr/share/elasticsearch/plugins/bigdesk-master
        vim plugin-descriptor.properties
            description=bigdesk
            version=bigdesk
            name=bigdesk
            site=true
        vim bigdesk-master/_site/js/store/BigdeskStore.js   
            major >= 1 

marvel安装:https://www.elastic.co/guide/en/marvel/current/getting-started.html

推荐网址:
https://es.xiaoleilu.com/
https://elasticsearch.cn/
https://www.elastic.co/guide/cn/kibana/current/index.html
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
https://github.com/JThink/SkyEye
https://www.elastic.co/downloads/past-releases
https://blog.csdn.net/qq_34021712/article/details/79342668