本文发布于Cylon的收藏册,转载请著名原文链接~


1 elasticsearch介绍

ES是一个基于Lucene实现的开源、分布式、基于Restful风格的全文本搜索引擎;此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索:也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据。

1.1 elasticsearch基本组件

索引(index):文档容器,换句话说,索引是具有类似属性的文档的集合。类似于表。索引名必须使用小写字母:

类型(type):类型是索引内部的逻辑分区,其意义完全取决于用户需求。一个索引内部可定义一个或多个类型。一般来说,类型就是拥有相同的域的文档的预定义。

文档(document):文档是Lucene索引和搜索的原子单位,它包含了一个或多个域。是域的容器:基于J50N格式表示。每个域的组成部分:一个名字,一个或多个值;拥有多个值的域,通常称为多值域:

映射(mapping):原始内容存储为文档之前需要事先进行分析,例如切词、过滤掉某些词等:映射用于定义此分析机制该如何实现;除此之外,ES还为映射提供了诸如将域中的内容排序等功能。

1.2 es的集群组件

cluster: es的集群标识为集群名称:默认“elasticsearch”。节点就是靠此名字来决定加入到哪个集群中。一个节点只能属性于一个集群。

Node:运行了单个es实例的主机即为节点。用于存储数据、参与集群索引及搜索操作。节点的标识靠节点名。

Shard:将索引切割成为的物理存储组件:但每一个shard都是一个独立且完整的索引;创建索引时,ES默认将其分割为5个shard,用户也可以按需自定义,创建完成之后不可修改。

shard有两种类型:primary shard和replica。replica用于数据冗余及查询时的负载均衡。每个主shard的副本数量可自定义,且可动态修改。

1.3 es的工作过程

es节点启动时默认通过多播方式或单播方式在TCP协议的9300端口查找同一集群中的其他节点,并与之建立通讯。判断是否为同一集群的标准为集群名称,集群中的所有节点会选举出一个主节点负责管理整个集群状态,以及在集群范围内决定各shared的分布方式。站在用户使用中角度而言,每个节点都可以接收并相应各类请求,无需区分哪个为主节点。

当集群中某一节点为down状态时,主节点会读取集群状态信息,并启动修复过程。此过程中主节点会检查所有可用shared的主shared,并确定主shared是否存在。各种shared及对应副本shared是否对数。此时集群状态会转换为yellow。

es集群有三种状态:green、red(不可用)、yellow(修复状态)。

当某状态为down的节点上存在主shared,此时需要从各副本shared中找一个提升为主shared。在yellow状态时,各副本shared均处于未分配模式。此时各个副本都不可用,只能使用主shared。集群虽可基于各组shared进行查询,但此时吞吐能力有限。yellows属于残破不全状态。

接下来的过程中,主节点将会查找所有的冗余shard,并将其配置为主shared。如果某shared的副本数量少于配置参数的数量,会自动启动复制过程,并为其建立副本shared。直至所有条件都满足从yellow转换至green。

es工作过程中主节点会周期性检查各节点是否处于可用状态,任意节点不可用时,修复模式都会启动,此时集群将会进入重新均衡过程。

2 安装elasticsearch

下载地址:http://www.elastic.co/cn/downloads/elasticsearch

image

image

官方文档中写明对es每个版本对jdk的要求。

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

2.1 常用es配置文件说明

修改配置文件:/etc/elasticsearch/elasticsearch.yml

cluster.name: test1 #←集群名称,同一网段下可以有多个集群,通过名称区分不同的集群。

node.name: node-1  #←节点名

node.master: true #←是否有资格被选举成为node
node.data: true

# es5中已废弃
index.number_of_shards: 5  #←默认索引分片个数,默认为5片。
index.number_of_replicas: 1	 #←默认索引副本个数,默认为1个副本

path.conf: /path/to/conf   #←文件的存储路径
path.data: /path/to/data   #←索引数据的存储路径,多个存储路径,用逗号隔开
path.work: /path/to/work   #←日志文件的存储路径
path.plugins: /path/to/plugins   #←插件的存放路径
network.bind_host: 192.168.0.1   #←绑定的ip地址 
network.publish_host: 192.168.0.1  #←设置其它节点和该节点交互的ip地址
network.host: 192.168.0.1  #←同时设置bind_host和publish_host
transport.tcp.port: 9300  #←节点之间交互的tcp端口,默认是9300。
http.port: 9200   #←设置对外服务的http端口,默认为9200。
transport.tcp.compress: true   #←设置是否压缩tcp传输时的数据,默认false不压缩
http.max_content_length: 100mb  #←内容的最大容量,默认100mb
http.enabled: false   #←使用http协议对外提供服务,默认为true开启。

#←默认为local即为本地文件系统,可以设置为本地文件系统,
# 分布式文件系统,hadoop的HDFS,和amazon的s3服务器等。
gateway.type: local 

gateway.expected_nodes: 2   #←集群中节点的数量,默认为2。
discovery.zen.ping.timeout: 3s #←自动发现其它节点时ping连接超时时间,默认为3秒	
discovery.zen.ping.multicast.enabled: false  #←打开多播发现节点,默认是true。

# 设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]

# 当你无法关闭系统的swap的时候,建议把这个参数设为true。
# 防止在内存不够用的时候,elasticsearch的内存被交换至交换区,导致性能骤降
bootstrap.mlockal1: true

参考:https://www.cnblogs.com/hanyouchun/p/5163183.html 修改启动脚本设置启动参数: /usr/share/elasticsearch/bin/elasticsearch

export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH

es2.x支持方式

export ES_HEAP_SIZE=256m

es5.x支持方式

$ cat /etc/elasticsearch/jvm.options 
-Xms128m
-Xmx128m

2.2 安装head插件

官方网站:https://github.com/mobz/elasticsearch-head#running-with-built-in-server

对于elasticsearch2.x

elasticsearch/bin/plugin install file:///root/elasticsearch-head.zip

对于Elasticsearch 5.x,head不支持网站插件。作为独立服务器运行。 https://www.cnblogs.com/alice626/p/6206722.html

https://www.cnblogs.com/xing901022/p/6030296.html

https://www.cnblogs.com/valor-xh/p/6293689.html

https://github.com/mobz/elasticsearch-head,github上下载压缩包。

因为head为独立启动的,所以随便放置任意目录即可。

2.2.1 安装node.js

https://nodejs.org/en/download/

解压后设置环境变量

export NODE_HOME=/usr/local/node-v6.9.1-linux-x64 
export PATH=$PATH:$NODE_HOME/bin

检查环境变量

$ node -v
v8.11.2
$ npm -v
5.6.0

2.2.2 安装grunt

npm install grunt-cli
$ grunt -version
grunt-cli v1.2.0

2.2.3 修改head配置

head/Gruntfile.js,增加hostname属性,设置为*

connect: { 
 	server: { 
 		options: { 
 			port: 9100, 
  			hostname: '*', 
 			base: '.', 
 			keepalive: true 
 		} 
 	} 
}

修改连接地址 head/_site/app.js

this.base_uri = 
this.config.base_uri || 
this.prefs.get("app-base_uri") || 
"http://10.0.0.12:19200";

2.2.4 运行head

在head目录下,执行npm install 下载以来的包:

nmp install

出现如下报错

Please report this full log at https://github.com/Medium/phantomjs
npm ERR! Darwin 15.0.0
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install"
npm ERR! node v4.4.3
npm ERR! npm  v3.10.9
npm ERR! code ELIFECYCLE
 
npm ERR! phantomjs-prebuilt@2.1.14 install: `node install.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the phantomjs-prebuilt@2.1.14 install script 'node install.js

解决方法

npm install phantomjs-prebuilt@2.1.14 --ignore-scripts

运行head

grunt server &

设置http对外提供服务

2.3 安装bigdesk

https://github.com/hlstudio/bigdesk

下载bigdesk

$ cd bigdesk-master
$ ll

bigdesk_es2.png
LICENSE
NOTICE
plugin-descriptor.properties
README.md
【_site】

进入_site目录

python -m SimpleHTTPServer port 8000

image

marven、kopf

2.x plugin 访问 9200/_plugin/head

3 ES使用

3.1 es api介绍

elasticsearch支持的是Restful风格的API接口

restuful介绍: http://www.ruanyifeng.com/blog/2014/05/restful_api.html?bsh_bid=516759003

四类API:

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

3.2 es api使用

E5访问接口:tcp/9200

curl -X [VERB] [PROTOCOL]://HOST:PORT/[PATH]?[QUERY_STR] -d '<BODY>'
  • VERB:GET,PUT,DELETE等。
  • PROTOCOL:http,https。
  • QUERY_STRING:查询参数,例如?pretty表示用易读的JSON格式输出。
  • BODY:请求的主体。

3.2.1 查看es工作状态

$ curl http://10.0.0.12:19200/?pretty
{
  "name" : "node-1",
  "cluster_name" : "test1",
  "version" : {
    "number" : "2.0.0",
    "build_hash" : "de54438d6af8f9340d50c5c786151783ce7d6be5",
    "build_timestamp" : "2015-10-22T08:09:48Z",
    "build_snapshot" : false,
    "lucene_version" : "5.2.1"
  },
  "tagline" : "You Know, for Search"
}

查看集群工作状态,?v查看详细信息。

$ curl 127.0.0.1:19200/_cat/nodes?v
ip        heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.0.0.9            27          90   1    0.07    0.03     0.05 mdi       -      node-1
10.0.0.12           46          91   0    0.00    0.01     0.05 mdi       *      node-2

health:查看当前集群健康状态的相关信息

$ curl 127.0.0.1:19200/_cat/health?pretty
1526839934 02:12:14 test green 2 2 0 0 0 0 0 0 - 100.0%

$ curl 127.0.0.1:19200/_cat/health?v
epoch      timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1526841115 02:31:55  test    green           2         2      0   0    0    0        0             0                  -                100.0%

3.2.2 自定义查询

$ curl 127.0.0.1:19200/_cat/nodes?h=ip,name,port,uptime,heap.current
10.0.0.9  node-1 19300 40.7m 107.2mb mdi
10.0.0.12 node-2 19300   57m  89.6mb mdi
$ curl 127.0.0.1:19200/_cat/master?v 
id                     host      ip        node
CorsR-_VSN2YHj5DCRXiKg 10.0.0.12 10.0.0.12 node-2

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index.html

3.2.3 state api

curl 127.0.0.1:19200/_cluster/state/nodes?pretty

{
  "cluster_name" : "test",
  "compressed_size_in_bytes" : 276,
  "nodes" : {
    "cplyIE3WS3a4sKRhjYQPoQ" : {
      "name" : "node-1",
      "ephemeral_id" : "axJ2wLcZRxyMMfLP7J54HA",
      "transport_address" : "10.0.0.9:19300",
      "attributes" : { }
    },
    "CorsR-_VSN2YHj5DCRXiKg" : {
      "name" : "node-2",
      "ephemeral_id" : "UTGxkPRYSRO_wU_URX_taw",
      "transport_address" : "10.0.0.12:19300",
      "attributes" : { }
    }
  }
}

curl 127.0.0.1:19200/_cluster/state/nodes?pretty curl 127.0.0.1:19200/_nodes/state?pretty https://www.elastic.co/guide/en/elasticsearch/reference/6.2/cluster-state.html

3.3 crud api

3.3.1 创建索引

curl -X PUT -H "Content-Type: application/json" http://127.0.0.1:19200/students/NO/1?pretty -d '

{
 "first_name": "jing",
 "last_name" : "guo",
 "gender" : "male",
 "age" :"25",
 "courses": "xianglong shiba zhang"
}'
{
  "_index" : "students",
  "_type" : "NO",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
'{
 "first_name": "rong",
 "last_name" : "huang",
 "gender" : "female",
 "age" :23,
 "courses": "luoying shenjian zhang"
}'
curl -XGET http://127.0.0.1:19200/students/NO/1?pretty
{
  "_index" : "students",
  "_type" : "NO",
  "_id" : "1",
  "_version" : 2,
  "found" : true,
  "_source" : {
    "first_name" : "rong",
    "last_name" : "huang",
    "gender" : "female",
    "age" : 23,
    "courses" : "luoying shenjian zhang"
  }
}

3.3.2 更新文档

curl -X POST -H "Content-Type: application/json" http://127.0.0.1:19200/students/NO/1/_update?pretty -d 
'{
  "doc": { "age": 18 }
}'
{
  "_index" : "students",
  "_type" : "NO",
  "_id" : "1",
  "_version" : 3,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}

3.3.3 删除文档

curl  -X DELETE http://10.0.0.12:19200/students/NO/1?pretty
{
  "_index" : "students",
  "_type" : "NO",
  "_id" : "1",
  "_version" : 4,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 3,
  "_primary_term" : 2
}

3.3.4 删除索引

curl  http://10.0.0.12:19200/_cat/indices
green open test1    cBL6BqIqStyr2a8O2n8Bdw 5 1 0 0  2.5kb  1.2kb
green open students g04VDxTUTEOLmdooHuuRpA 5 1 1 0 26.5kb 13.2kb

curl  -X DELETE http://10.0.0.12:19200/test1
{"acknowledged":true}

curl  http://10.0.0.12:19200/_cat/indices
green open students g04VDxTUTEOLmdooHuuRpA 5 1 1 0 26.5kb 13.2kb

3.4 查询数据

Query API Query DSL:JS0N based language for building complex queries。

用户实现诸多类型的查询操作,比如,simple term query,phrase,range boolean,fuzzy等:

ES的查询操作执行分为两个阶段:

  • 分散阶段:
  • 合并阶段:

列出一个索引的所有文档,较小级别时的演示说明

curl  http://10.0.0.12:19200/_search?pretty

{
  "took" : 15,  #←执行时长
  "timed_out" : false,  #←是否超时
  "_shards" : {   #←操作设计到多少个分片
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {   #←查询结果
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "students",
        "_type" : "NO",
        "_id" : "2",
        "_score" : 1.0,  #←文档平分,没有加权
        "_source" : {
          "first_name" : "jing",
          "last_name" : "guo",
          "gender" : "male",
          "age" : "25",
          "courses" : "xianglong shiba zhang"
        }
      },
      {
        "_index" : "students",
        "_type" : "NO",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "first_name" : "rong",
          "last_name" : "huang",
          "gender" : "female",
          "age" : 23,
          "courses" : "luoying shenjian zhang"
        }
      }
    ]
  }
}

默认情况下,只返回前十个。

curl -H 'content-type: application/json' http://10.0.0.12:19200/_search?pretty -d '{
    "query": {"match_all": {}}
}'

3.5 多索引、多类型查询

/_search:所有索引: /INDEX_NAME/_search:单索引: /INDEX1,INDEX2/_search:多索引: /s*,t*/_search: /students/class1/_search:单类型搜索 /students/class1,class2/_search:多类型搜索

3.6 插入测试数据

curl -H 'content-type: application/json' \
http://10.0.0.12:19200/test1/NO/1?pretty -d '{
   "name":"zhou yu",
   "age": "25",
   "weapon": "duan jian"
}'

curl -H 'content-type: application/json' \
http://10.0.0.12:19200/test1/NO/2?pretty -d '{
   "name":"zhangliang",
   "age": 31,
   "weapon": "fu zhou"
}'

curl -H 'content-type: application/json' \
http://10.0.0.12:19200/test1/NO/3?pretty -d '{
   "name":"zhang liao",
   "age": "31",
   "weapon": "dao"
}'

curl -H 'content-type: application/json' \
http://10.0.0.12:19200/test1/NO/4?pretty -d '{
   "name":"zhang fei",
   "age": "30",
   "weapon": "zhang ba she mao"
}'

curl -H 'content-type: application/json' \
http://10.0.0.12:19200/test1/NO/5?pretty -d '{
  "name": "zhu ge liang",
  "age": "18",
  "weapon": "yu shan",
  "intro": "31 years old"
}'

可以看出,默认按照字符串匹配。文档中的每个域存储为特定类型而非字符串。

{ 
"hits": 
 	{ "total": 3, "max_score": 0.87546873, "hits": 
 	[ { 
 			"_index": "test1", 
 		"_type": "NO", 
 		"_id": "3", 
 		"_score": 0.87546873, 
 		"_source": 
 		  { 	
 					"name": "zhang liao", 
           		"age": "31", 
 				"weapon": "dao" 
 		  } 
 		}, 
 	  { 
 		"_index": "test1", 
 		"_type": "NO", 
 			"_id": "2", 
 		"_score": 0.87546873, 
 		"_source": 	
 			{ 	
 			  "name": "zhangliang", 
 				  "age": 31, 
 			  "weapon": "fu zhou"
 			} 
 		} ,
 		{ 
 			"_index": "test1", 
 			"_type": "NO", 
 			"_id": "5", 
 			"_score": 0.2876821, 
 			"_source": 
 			{ 	
 				"name": "zhu ge liang", 
 				"age": "18", 
 				"weapon": "yu shan", 
 				"intro": "31 years old" 
 			} 
 		} 
 	] 
} 

指定域搜索做精确匹配

"hits": [ 
 	{ 
 			"_index": "test1", 
 			"_type": "NO", 
 			"_id": "3", 
 			"_score": 0.87546873, 
 			"_source": 
 			{ 
 				"name": "zhang liao", 
 				"age": "31", 
 				"weapon": "dao" 
 		 	} 
 		} , 
 		{ 
 		 	"_index": "test1", 
 		 	"_type": "NO", 
 		 	"_id": "4", 
 		 	"_score": 0.87546873,
 		 	"_source": 
 		 	{ 
 		 		"name": "zhang fei", 
 		 		"age": "30", 
 		 		"weapon": "zhang ba she mao" 
 		 	} 
 	} 
]

查看指定类型的mapping示例 curl “http://10.0.0.12:19200/test1/_mapping/NO?pretty” mapping定义了整个文档中的数据是被当做何种类型对待的。

{
	  "test1" : {
		"mappings" : {
		  "NO" : {
			"properties" : {
			  "age" : {
				"type" : "text",
				"fields" : {
				  "keyword" : {
					"type" : "keyword",
					"ignore_above" : 256
				  }
				}
			  },
			  "intro" : {
				"type" : "text",
				"fields" : {
				  "keyword" : {
					"type" : "keyword",
					"ignore_above" : 256
				  }
				}
			  },
			  "name" : {
				"type" : "text",
				"fields" : {
				  "keyword" : {
					"type" : "keyword",
					"ignore_above" : 256
				  }
				}
			  },
			  "weapon" : {
				"type" : "text",
				"fields" : {
				  "keyword" : {
					"type" : "keyword",
					"ignore_above" : 256
				  }
				}
			  }
			}
		  }
		}
	  }
	}

ES中搜索的数据广义上可被理解为两类:

  • types:exact
  • full-text

精确值:指未经加工的原始值;在搜索时进行精确匹配。NOTEBOOK≠notebook

full-text:用于引用文本中数据;判断文档在多大程序上匹配查询请求;即评估文档与用户请求查询的相关度。

为了完成ful1-text搜素,ES必须首先分析文本,并创建出倒排素引:倒排素引中的数据还需进行“正规化”为标准格式:如全部小写、负数变为单数、trees改为tree等。

创建倒排索引需要先分词再normalization。分词加正规化的操作及为分析。

分析需要由分析器(analyzer)进行。分析器由三个组件构成:字符过滤器、分词器、分词过滤器。

ES内置的分析器:

  • Standard analyzer:ES的默认分析器,适用于多种语言,基于Unicode方式进行分析。
  • Simple analyzer:简单分析器,根据所有的字母进行分析。
  • Wirtespace analyzer:只把空白字符当做单词分割。
  • Language analyzer:为多种语言分别提供各种各样的分析器。

分析器不仅在创建素引时用到;在构建查询时也会用到。构建索引时的分析器,分析用户查询并构建成查询语句的分词方式。两种方式需要保持一致。

[2018-09-21 05:24:03,381][INFO ][cluster.routing.allocation.decider] [node-1] low disk watermark [85%] exceeded on [JWxQxMkeTj6BkmIx-6DsXg][node-1][/var/lib/elasticsearch/my-application/nodes/0] free: 1gb[11.2%], replicas will not be assigned to this node

4 ES错误

ES索引yellow状态

查看片状态

curl 172.16.16.18:9200/_cat/shards
logstash-webapi-2018.10.30 0 p STARTED        1   6.1kb 127.0.0.1 6wPQIP5
logstash-webapi-2018.10.30 0 p STARTED        3  16.4kb 127.0.0.1 6wPQIP5
logstash-webapi-2018.10.30 0 r UNASSIGNED                         
logstash-webapi-2018.10.30 0 p STARTED     1824     1mb 127.0.0.1 6wPQIP5
logstash-webapi-2018.10.30 0 p UNASSIGNED
logstash-webapi-2018.10.30 0 p STARTED      272 363.4kb 127.0.0.1 6wPQIP5
logstash-webapi-2018.10.30 0 p UNASSIGNED
logstash-webapi-2018.10.30 0 p STARTED        0   5.1kb 127.0.0.1 6wPQIP5
logstash-webapi-2018.10.30 0 p UNASSIGNED
logstash-webapi-2018.10.30 0 p STARTED     4888   2.4mb 127.0.0.1 6wPQIP5
logstash-webapi-2018.10.30 0 p UNASSIGNED 

yellow表示所有主分片可用,但不是所有副本分片都可用,最常见的情景是单节点时,由于es默认是有1个副本,主分片和副本不能在同一个节点上,所以副本就是未分配unassigned

PUT 172.16.16.18:9200/logstash -d '
{
  "settings":{
           "number_of_shards":1,     
           "number_of_replicas":0
  }
}'

参考网址:elasticsearch集群健康为黄色

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2018/11/es/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。