栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

ElasticSearch

ElasticSearch

ElasticSearch 1. 什么是Restful 1. restful: 一种软件架构风格,如果一个架构符合REST原则,就称它为 RestFful 架构风格 2. rest : Resources Representation State Transfer 资源的表现层状态转化。设计原则 设计约束 设计思路 设计约定… 3. 资源(Resources): 所谓"资源",网络中一切事物统称为资源,就是网络上的一个实体,或者说是网络上的一个具体信息

每一个资源都存在一个唯一资源标识符(url)

4. 表现层(Representation) : 我们把"资源"具体呈现出来的形式,叫做它的"表现层"。 5. 状态转化(State Transfer): 客户端通过操作服务器中的资源,使资源发生某种状态转变,而这种转化是建立在表现层之上的,所以就是"表现层状态转化" CRUD 增删改查 6. REST原则 1. 指一个URL代表一个唯一资源 2. 使用Rest的URL替换传统URL

3. 通过HTTP协议里面四个动词:GET、POST、PUT、DELETe

对应四种服务器端的基本操作:

GET用来获取资源

POST用来更新资源(也可以用于添加资源)

PUT用来添加资源(也可以用于更新资源)

DELETE用来删除资源。

2. 什么是全文检索

全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程。

全文检索(Full-Text Retrieval(检索))以文本作为检索对象,找出含有指定词汇的文本。全面、准确和快速是衡量全文检索系统的关键指标。

关于全文检索,我们要知道:

1 只处理文本。
2 不处理语义。
3 搜索时英文不区分大小写。
4 结果列表有相关度排序。
3. 什么是ElasticSearch

Elasticsearch是一个基于Apache Lucene™的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

但是,Lucene只是一个库。想要 使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。

4. ES的应用场景 json格式数据 restful

Es主要以轻量级JSON作为数据存储格式,这点与MongoDB有 点类似,但它在读写性能上优于 MongoDB 。同时也支持地理位置查询 ,还方便地理位置和文本混合查询 。 以及在统计、 日志类数据存储和分析、可视化这方面是引领者。

5. ES的安装 1. 安装前准备 centos7 + java 8 + elastic 7.10.2 2. 在官方网站下载ES wget http://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.1.tar.gz 3. 用普通用户启动es,上传es到普通用户的家目录,并安装elasticsearch 4. elasticsearch的目录结构
    bin                         可执行的二进制文件的目录
    config                    	配置文件的目录
    lib                         运行时依赖的库
    logs        		运行时日志文件
    plugins                   	es中提供的插件
5. 运行es服务 在bin目录中执行 ./elasticsearch

启动成功

6. 测试ES是否启动成功 在命令终端中执行: curl http://localhost:9200 出现以下信息:

7. 开启ES远程访问 vim elasticsearch.yml 将原来network修改为以下配置: network.host: 0.0.0.0

8. 关闭网络防火墙

systemctl stop firewalld 关闭本次防火墙服务

systemctl disable firewalld 关闭开启自启动防火墙服务

9. 启动时错误解决方案

错误一

重新连接root

查看是否修改完成

错误二

错误三

全部修改完要退出重登虚拟机连接 否则不生效

http://172.16.246.133:9200 访问成功

6. ES中基本概念 1. 接近实时(NRT Near Real Time )

Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒内)

2. 索引(index)

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于关系型数据库中Database 的概念。在一个集群中,如果你想,可以定义任意多的索引。

Elasticsearch中的索引有多层的意思:
a 某一类文档的集合就构成了一个索引,类比到数据库就是一个数据库
(或者数据库表);
b它还描述了一个动作,就是将某个文档保存在elasticsearch的过
程也叫索引;
c 倒排索引。
3. 类型(type)

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数 据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。类型类似于关系型数据库中Table的概念。

NOTE: 在5.x版本以前可以在一个索引中定义多个类型,6.x之后版本也可以使用,但是不推荐,在7~8.x版本中彻底移除一个索引中创建多个类型

索引是库,类型是表(5.x)

4. 映射(Mapping)

Mapping是ES中的一个很重要的内容,它类似于传统关系型数据中table的schema(对表的字段、类型的约束),用于定义一个索引(index)中的类型(type)的数据的结构。 在ES中,我们可以手动创建type(相当于table)和mapping(相关与schema),也可以采用默认创建方式。在默认配置下,ES可以根据插入的数据自动地创建type及其mapping。 mapping中主要包括字段名、字段数据类型和字段索引类型

简洁:mapping 是ES每一个文档的约束信息,例如属性的类型,是否能被索引等。

5. 文档(document)

**一个文档是一个可被索引的基础信息单元,类似于表中的一条记录。**比如,你可以拥有某一个员工的文档,也可以拥有某个商品的一个文档。文档以采用了轻量级的数据交换格式JSON(Javascript Object Notation)来表示。

具体的一条数据,类比到数据库就是一条记录。

6. 概念关系图

面试题:5.x过渡到6.x版本的变化?

7. Kibana 1. 简介ES的可视化工具

2. 安装及启动

安装tar包解压

root下修改config —> kinaba.yml

server.host: "172.16.246.133"                		#Kibana服务器主机名 (虚拟机ip)
elasticsearch.hosts: ["http://172.16.246.133:9200"] #Elasticsearch服务器地址

启动:http://172.16.246.133:5601/

3. 使用 1. Dev Tools可以用来设置

默认6版本每创建一个索引就会有5个备份,7版本需要自己设置

索引创建成果标志

10. RestAPI 1. 基本CRUD
PUT /dangdang/       创建索引(不能有大写字母)
DELETE /dangdang     删除索引
DELETE /*            删除所有索引(执行这个操作后kibana也会异常关闭,需要重新运行)
GET /_car/indices?v  查看全部索引信息  加上?v是查看表头

# 类型操作  index/type(mapping)  一个索引中只能存在一个类型 
# mapping type:text keyword date integer long double boolean ip

# 创建类型(PUT POST)
# 用PUT创建要求索引不能存在(创建一个新索引)
PUT /ems
{
	"mapping":{
		"emp":{
			"properties":{
					"id":{"type":"keyword"},
					"name":{"type":"text"}
			}
		}
	}
}
# 文档操作:插入一条文档 PUT /索引/类型/1     这个1相当于ems/emp自带id,不是我们创建的那个
PUT /ems/emp/1
{
	"id":1,
	"name":"cc"
}

POST /ems/emp/1
{
	"id":1,
	"name":"cc"
}
# PUT和POST的区别是插入文档时PUT不会保留原有数据,直接替换原来全部的,POST会保留,推荐POST
# 假设插入文档没有提供文档id(也就是最后的那个数字),则es会自己给我们生成一个id

# 更新文档
# 1. 不保留原始数据更新(先删除后插入)
POST /ems/emp/1
{
	"name":"bb"
}
# 2. 保留原始数据更新,更新时添加新字段 POST /索引/类型/id/_update   {"doc:{}"}
POST /ems/emp/1/_update 
{
	"doc":{
		"name":"bb",
		// 添加新数据
		"bir":"2000-12-15"
	}
}
# 3. script更新(在原有的数据上)      POST /索引/类型/id/_update {"script":"ctx._source.类型 操作"}
POST /ems/emp/1/_update 
{
	"script":"ctx._source.name=yy"
}

# 文档批量操作 _bulk  添加(index) 删除(delete) 更新(update)
PUT /ems/emp/_bulk
// 生成新的
{"index":{"id:2"}}
	{"name":"aa"}
{"delete":{"id":1}}
{"update":{"id":"2"}}
	{"doc":{"name":"cc"}}

# 删除文档 DELETE /索引/类型/id
POST /ems/emp/1

# 查看类型   GET /索引名/_mapping/类型名
GET /ems/emp/_mapping/name
# 根据id查询文档中一条记录 GET /索引/类型/文档id
GET /ems/emp/1
11. ES中高级检索(Query) 1. 检索方式 1. 通过URL参数(QueryString) 2. 基于传递JSON作为请求体(request body) 推荐

3. QueryString
# 语法:GET /索引/类型/_search?查询条件
# q=*  查询所有  排序 sort 分页 from  size 只返回某个类型_source
GET /ems/emp/_search?q=*&sort=age:desc&size=5&from=0&_source=name
4. QueryDSL

特定领域对的查询语言

# 语法:GET /索引/类型/_search{}
# 1. 查询所有
GET /ems/emp/_search
{
	"query": {
		// 匹配所有文档
		"match_all":{}
	}
}

# 2. 查询所有并排序 sort   text字段无法排序
GET /emp/ems/_search
{
	"query": {
		"match_all": {}
	},
	"sort": [
    {
      "age": {
        "order": "desc"
      }
    },
    {
    	"bir": {
    		"order": "desc"
    	}
    }
	]
}

# 3. 分页查询 size from
GET /ems/emp/_search
{
	"query":{
			"match_all":{}
	},
	"size":"2",
	"from":"0",
	"sort": [
		{
		"age": {
			"order": "desc"
			}
		}
	]
}

# 4. 指定查询结果中返回指定字段_source
GET /ems/emp/_search
{
	"query": {
		"match_all": {}
	}
	"_source": ["name","age","content"]
}

# 5. queryDSL中term查询 基于关键词进行查询
# 1) type: 只有text类型分词  keyward、integer、date...不分词 
# 2) ES中默认使用分词器是标准分词器 StandardAnalyzer 中文-->单字分词 英文-->单词分词
# 查看分词器分词效果
GET /_analyze
{
	"text": "Redis is open source DB"
}
# 演示
GET /ems/emp/_search
{
	"query": {
		"term": {
			"content": {
				"value": "spring"
			}
		}
	}
}


# 6. 范围查询 range
GET /ems/emp/_search
{
	"query": {
		"range": {
			"age": {
				# 0-20 e结尾 包含
				"gte": 0,
				"lte": 20
			}
		}
	}
}

# 7. 前缀查询 基于关键词前缀(prefix)查询
GET /ems/emp/_search
{
	"query": {
		"perfix": {
			"address": {
				"value": "北京"
			}
		}
	}
}

# 8. 通配符查询 wildcard ?用来匹配一个任意字符 *用来匹配多个字符 只能放在后面
GET /ems/emp/_search
{
	"query": {
		"wildcard": {
			"FIELD": {
				# "value": "北?"
				"value": "北*"
			}
		}
	}
}

# 9. 多id查询(ids) 值为数组类型,用来根据一组id获取多个相应的文档
GET /emp/ems/_search
{
	"query": {
		"ids": {
			"values": ["1","2","3"]
		}
	}
}

# 10. fuzzy模糊查询  最大模糊错误必须在0-2之间
# 搜索关键词长度为2 不允许存在模糊
# 搜索关键词长度为3-5 允许一次模糊
# 搜索关键词长度大于5 允许最大两个模糊
GET /ems/emp/_search
{
	"query": {
		"fuzzy": {
			"content": "elasticsoarch"
		}
	}
}

# 11. 布尔查询(bool)  must:相当于&& should:相当于||  must_not: 相当于!
GET /ems/emp/_search
{
	"query": {
		"bool": {
		 # "must": [
		#	"should": [
	 must_not: [
				{
					"term": {
						"age": {
							"value": "23"
						}
					}
				},
					"term": {
						"address": {
							"value": "北京"
						}
					},
					"range": {
						"age": {
							"gte": 0,
							"lte": 30
						}
				}
			]
		}
	}
}

# 12. 高亮查询(highlight) 对查询结果二次渲染成高亮的
# 自定义高亮html标签:可以在highlight中使用pre_tags和post_tags
GET /emp/ems/_search
{
	"query": {
		"term": {
			"content": {
				"value": "redis"
			}
		}
	},
	"highlight": {
	  # 设置高亮类型
		"pre_tags": [""],
		"post_tags": [""],
		"fields": {
			# "content": {}
			"*": {}
		}
	}
}

# 即使设置了*也不会全部高亮,仍然是对content高亮,因为es默认是开启严格匹配的
# 如果要全部字段高亮,关闭严格匹配"require_field_match": "false"
# 假设还是没有,查看ik有没有开启
	"highlight": {
	  # 设置高亮类型
		"pre_tags": [""],
		"post_tags": [""],
		"fields": {
			"*": {}
		},
		"require_field_match": "false"
	}
}

# 13. 多字段查询(multi_match)
# 1. 如果搜索的字段分词,会对query先分词再搜索
# 2. 如果搜索的字段不分词,会直接使用query整体进行该字段搜索
GET /ems/emp/_search
{
	"query": {
		"multi_match": {
			"query": "Redis",
			"fields": ["content","address"]
		}
	}
}

# 14. 多字段分词查询(query_string) analyzer: 可以指定分词器
GET /ems/emp/_search
{
	"query": {
		"query_string": {
			"query": "Redis",
			"fields": ["name","content"]
		}
	}
}
12. 索引库原理

13. IK分词器

默认ES中采用标准分词器进行分词,这种方式并不适用于中文网站,因此需要修改ES对中文友好分词,从而达到 更加的搜索的效果。

1. 安装IK分词器

在线安装

cd /home/es/el…/bin

./el…-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.2/elasticsearch-analysis-ik-7.10.2.zip

重新启动es kibana

在线安装IK配置文件在es安装目录中analysis-ik目录

还可以本地安装

本地安装IK配置文件在 es安装目录/plugins/analysis-ik/configs

3. 测试IK分词器

IK分词器提供了两种mapping类型用来做文档的分词分别是
ik_max_word和ik_smart

GET /_analyze
{
	"text": "中华人民共和国国歌",
	# "analyzer": "ik_smart"
	"analtzer": ik_max_word"
}
4. 使用IK分词器
PUT /ems
{
	"mappings": {
		"emp": {
			"properties": {
				"name": {
					"type": "text"
					"analyzer": "ik_max_word"
					# 可写可不写,但是搜索的分词器一定要与索引一致
					# "search_analyzer": "ik_max_word"
				}
			}
		}
	}
}

# 放入文档测试
5. 配置扩展词

IK支持自定义扩展词典和停用词典,所谓扩展词典就是有些词并不是关 键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入 扩展词典。停用词典就是有些词是关键词,但是出于业务场景不想使用 这些关键词被检索到,可以将这些词放入停用词典。

如何定义扩展词典和停用词典可以修改IK分词器中config目 录中IKAnalyzer.cfg.xml这个文件。

注意:词典的编码必须为UTF-8,否则无法生效

1.修改vim IKAnalyzer.cfg.xml




    IK Analyzer 扩展配置
    
    ext_dict.dic
    
    ext_stopword.dic

2.在ik分词器目录下config目录中创建ext_dict.dic文件 编码一定要为UTF-8才能生效 vim ext_dict.dic 加入扩展词即可

3.在ik分词器目录下config目录中创建ext_stopword.dic文件 vim ext_stopword.dic 加入停用词即可

ext_dict.dic ext_stopword.dic一行只能有一个词 不能有,分割

修改后的自定义字典只能对后续文档生效,对原始文档无效

4.删除es/data文件 重启es

6. 每次人工去增加热词显然是不现实的,可以增加一个应用EMS,统计热词,写成一个ext.txt,再追加,动态热词追加

7. 实现配置IK远程拓展词典

建立Springboot项目,选择lombok、web、devtools

properties

server.port=9090
server.servlet.context-path=/es/ext.txt

在webapp下新建ext.txt 输入几个测试数据

启动springboot,访问自己主机ip:9090/es/

测试linux能不能ping通自己主机ip:9090/es/

修改vim IKAnalyzer.cfg.xml




    IK Analyzer 扩展配置
    
    ext_dict.dic
    
    ext_stopword.dic
  	
  	自己主机ip:9090/es/

kibana测试

同理可以配置远程拓展停止词字典(remove_ext_stopwords)

14. 过滤查询(filter query) 1. 过滤查询

ES中的查询操作分为查询(query)和过滤(filter)。查询是之前提到的query查询,默认会计算每个返回文档的得分,然后根据得分排序。过滤filter只会筛选出符合的文档,不计算得分,可以缓存文档。

从性能考虑,过滤比查询更快

过滤适合大范围筛选数据,查询适合精准匹配数据。一般应用先使用过滤操作过滤数据,然后使用查询匹配数据

2. 过滤语法(query和filter组合使用需要用bool组合到一起)
GET /ems/emp/_search
{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"content": {
							"value": "框架"
						}
					}
				},
			],
      "filter": {
      	"range": {
      		"age": {
      			"gte": 0,
      			"lte": 23
      		}
      	}
      }
		}
	}
}

先filter再query

ES会自动缓存经常使用的filter

3. 常见过滤器类型

term:指定关键词过滤,数组

exists filter:过滤存在指定字段,获取字段不为空的索引记录使用

ids filter:过滤含有指定字段的索引记录

# 1. 基于指定的关键词过滤 term
GET /ems/emp_search{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"name": {
							"value": "小黑"
						}
					}
				},
			],
      "filter": {
      	"term": {
      		"content": "架构"
      	}
      }
		}
	}
}

# 2. 多个关键词
GET /ems/emp_search{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"name": {
							"value": "小黑"
						}
					}
				},
			],
      "filter": {
      	"term": {
      		"content": ["架构","Redis"]
      	}
      }
		}
	}
}

# 2. 基于指定的字段过滤 filter query
GET /ems/emp/_search
{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"name": {
							"value": "小黑"
						}
					}
				}
			],
			"filter": {
				"exists": {
					"field": "address"
				}
			}
		}
	}
}

# 3. ids filter 
GET /ems/emp/_search
{
	"query": {
		"bool": {
			"must": [
				{
					"term": {
						"name": {
							"value": "小黑"
						}
					}
				}
			],
			"filter": {
				"ids": {
					"values": [
						"1",
						"2"
					]
				}
			}
		}
	}
}
15. Java操作ES 1. 基本结构

2. 操作

依赖


   
       org.elasticsearch.client
       elasticsearch-rest-high-level-client
       7.10.2
   
  
   
       org.elasticsearch
       elasticsearch
       7.10.2
   
  
     
       elasticsearch.plugin
       transport-netty4-client
       7.10.2
   

启动远程es kb

注意:java操作用的是9300端口,因为transportClient使用的是TCP,kibana是RestFul连接

建立客户端链接:test -> java -> com.cc -> TestEs

1. CRUD

测试对索引的操作:test -> java -> com.cc -> TestIndexAndeTypeMapping

要用@Before,需要删掉xml中的

测试对文档的操作:

添加文档

main -> java -> com.cc -> book

test -> java -> com.cc -> Testdocument

指定ID

自动生成ID

更新文档

删除文档

查询文档

查询一条

查询所有

term查询

2. 批量更新

3. 各种查询

查询所有见上

分页查询

倘若查询条件相同,只不过要区分term还是match_all查询,可以把查询结果单独封装,然后测试方法里面设置查询方式即可

查询条件

测试方法

4. 高亮查询

把结果放入emp对象

对输出结果高亮处理

5. 过滤查询filter

6. 综合

16. SpringBoot Data操作ES

RestClient和ElasticSearchRespositoy

RestClient:强大、灵活、但是不能友好地对象操作

ElasticSearchRespositoy:对象操作友好

1. RestClient

依赖


   org.springframework.boot
   spring-boot-starter-data-elasticsearch

配置文件

server.port=8989
server.servlet.context-path=/es

6版本后不再推荐使用transportClient,而是使用RestClient

配置类

@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {

    // 这个client用来替换transportClient对象(9300)
    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {
				//定义客户端配置对象
        //Rest接口9200
        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()  
            .connectedTo("172.16.246.133:9200")
            .build();
        //通过RestClients对象创建
        return RestClients.create(clientConfiguration).rest();                         
    }
}

测试启动

test -> java -> com.cc -> TestRestClient

CRUD 基本操作跟transportClient一样,可能方法名有些不同


我们发现基本上操作跟transportClient差不多,但是有个问题就是我们每次更新对象需要转换成JSON格式,十分麻烦。所以还有一种使用ElasticSearchRespositoy接口进行操作,他是一个rest客户端

简单的查询可以使用ElasticSearchRespositoy,想做更强大的功能就使用RestClient

2. ElasticSearchRespositoy

依赖和配置和配置类不变

我们可以使用@document将Emp的对象映射成ES中一条json格式文档

@document: 
	作用:将对象映射成ES中一条json格式文档
	属性:
   	indexName:用来指定这个对象转为json文档存入哪个索引中,要求es服务器中之前不存在这个索引名
    type: 用来指定在当前这个索引下创建的类型名称
@Field:
	作用:用在属性上,代表mapping中的一个属性,一个字段
	属性:
		type:用来指定字段的类型(枚举,FieldType.xxx)
		analyzer: 指定分词器
		formate: 指定日期格式
@id:将对象中id属性与文档中_id一一对应		

新建entity com.cc.entity -> Emp

自定义EmpResopsitory

新建dao com.cc.elasticsearch.dao -> EmpResopsitory接口

测试代码

test.java.com.cc.TestRestClient

1. CRUD


2. ElasticSearchRespositoy支持自定义指令



我们只需要在EmpResopsitory定义,无需实现

test

其他演示

3. 高亮查询

EmpResopsitory做不了高级查询例如高亮查询,所以需要借助RestFulClient

日期格式需要格式化

放入emp

17. es集群 1. 相关概念

es单个节点就可以集成集群,单个节点问题

1. 单节点压力问题 并发压力 物理资源上限压力
2. 数据冗余备份能力

集群cluster名称(only-one):elasticsearch

节点node(多个): 名称也是唯一的

分片与复制(shards & replicas)

分片

允许你水平分割/扩展你的内容容量允许你在分片(潜在地位于多个节点上)之上进行分布式的、并行的操作,进而提 高性能/吞吐量 至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的。

复制

故障转移机制,防止分片/节点离线数据丢失

在分片/节点失败的情况下,提供了高可用性。因为这个原因, 注意到复制分片从不与原/主要 (original/primary)分片置于同 一节点上是非常重要的。 扩展你的搜索量/吞吐量,因为 搜索可以在所有的复制上并行运行

每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个 索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制数量,但是不能改变分片的数量。

一个索引的多个分片可以存放在集群中的一台主机上, 也可以存放在多台主机上,这取决于你的集群机器数量。主 分片和复制分片的具体位置是由ES内在的策略所决定的。

6默认

7默认都为1

2. 快速搭建集群
1 将原有ES安装包复制三份
# 即使指定了es的master是es自己决定的
	cp -r elasticsearch-7.10.2/ master/
	cp -r elasticsearch-7.10.2/ slave1/
	cp -r elasticsearch-7.10.2/ slave2/
	
2 删除复制目录中data目录 
	#注意:由于复制目录之前使用过因此需要在创建集群时将原来数据删除
	rm -rf master/data
	rm -rf slave1/data
	rm -rf slave2/data
	
3 编辑文件夹中config目录中jvm.options文件跳转启动内存(默认启动1g)
	vim master/config/jvm.options  
	vim slave1/config/jvm.options
	vim slave2/config/jvm.options
	#分别加入: -Xms300m -Xmx300m
	
4 分别修改三个文件夹中config目录中elasticsearch.yml文件
	vim master/config/elasticsearch.yml
	vim salve1/config/elasticsearch.yml
	vim slave2/config/elasticsearch.yml

#分别修改如下配置:
master/config/elasticsearch.yml
 
cluster.name: my-es  #集群名称(集群名称必须一致)
node.name: node-1   #节点名称(节点名称不能一致)
network.host: 0.0.0.0    #监听地址(必须开启远程权限,并关闭防火墙)
http.port: 9201  #监听端口(在一台机器时服务端口不能一致)
discovery.seed_hosts: ["172.16.246.133:9302", "172.16.246.133:9303"]    #另外两个节点的ip
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
gateway.recover_after_nodes: 3  #集群可做master的最小节点数
transport.tcp.port: 9301  #集群TCP端口(在一台机器搭建必须修改)
http.cors.enabled: true
http.cors.allow-origin: "*"


salve1/config/elasticsearch.yml

cluster.name: my-es
node.name: node-2
network.host: 0.0.0.0
http.port: 9202
discovery.seed_hosts: ["172.16.246.133:9301", "172.16.246.133:9303"]
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
gateway.recover_after_nodes: 3
transport.tcp.port: 9302
http.cors.enabled: true
http.cors.allow-origin: "*"

slave2/config/elasticsearch.yml

cluster.name: my-es
node.name: node-3
network.host: 0.0.0.0
http.port: 9203
discovery.seed_hosts: ["172.16.246.133", "172.16.246.133:9302"]
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
gateway.recover_after_nodes: 3
transport.tcp.port: 9303
http.cors.enabled: true
http.cors.allow-origin: "*"

5 启动多个es
./master/bin/elasticsearch
./slave1/bin/elasticsearch
./slave2/bin/elasticsearch
	
6 查看节点状态
	curl  http://10.102.115.3:9201
	curl  http://10.102.115.3:9202
	curl  http://10.102.115.3:9203

7 查看集群健康
http://172.16.246.133:9201/_cat/health?v

3

启动 集群id都一致说明成功

集群健康

如果要通过kibana查看,需要修改配置

设置成master的,然后重启kibana,然后重新连接(连接任意一个节点)

检测是否分片

3. es集群可视化工具head
1 访问github网站
	搜索: elasticsearch-head 插件
	
2 安装git
	yum install git
	
3 将elasticsearch-head下载到本地
	git clone git://github.com/mobz/elasticsearch-head.git

4. 安装nodejs
	#注意: 没有wget的请先安装yum install -y wget
	wget http://cdn.npm.taobao.org/dist/node/latest-v8.x/node-v8.1.2-linux-x64.tar.xz

5 解压缩nodejs(elasticsearch-head 插件依赖node)
	xz -d node-v10.15.3-linux-arm64.tar.xz
	tar -xvf node-v10.15.3-linux-arm64.tar

6. 配置环境变量
	mv node-v10.15.3-linux-arm64 nodejs
	mv nodejs /usr/nodejs
	vim /etc/profile
		export NODE_HOME=/usr/nodejs
		export PATH=$PATH:$JAVA_HOME/bin:$NODE_HOME/bin
	source /etc/profile
7	进入elasticsearch-head的目录
	npm config set registry https://registry.npm.taobao.org
	npm install
	npm run start

8 跨域
  编写节点的elastsearch.yml配置文件开启head插件的访问(上面已经修改了)
	http.cors.enabled: true
	http.cors.allow-origin: "*"

9.  启动访问head插件 默认端口9100
	http://172.16.246.133:9100  查看集群状态


启动成功

连接任意一个节点

带边框:主分片 普通:拷贝分片 星:主节点

支持新建索引

创建成功

断掉一个节点依然正常工作

断掉两个数据同步到最后一个节点上

重新启动两台节点 数据恢复

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/761718.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号