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": ["<span style='color:red'>"],
"post_tags": ["</span>"],
"fields": {
# "content": {}
"*": {}
}
}
}
# 即使设置了*也不会全部高亮,仍然是对content高亮,因为es默认是开启严格匹配的
# 如果要全部字段高亮,关闭严格匹配"require_field_match": "false"
# 假设还是没有,查看ik有没有开启
"highlight": {
# 设置高亮类型
"pre_tags": ["<span style='color:red'>"],
"post_tags": ["</span>"],
"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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopword.dic</entry>
</properties>
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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopword.dic</entry>
<!--用户可以在这里配置自己的远程拓展词字典-->
<entry key="remove_ext_dict">自己主机ip:9090/es/</entry>
</properties>
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. 操作
依赖
<!-- 注意:按道理来说只要引入elasticsearch-rest-high-level-client即可。但是因为引入elasticsearch跟对应的版本不符。所以需要额外引入elasticsearch的正确版本。否则启动失败 -->
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.10.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.10.2</version>
</dependency>
<dependency>
<groupId>elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>7.10.2</version>
</dependency>
</dependencies>
启动远程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
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
配置文件
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 查看集群状态
启动成功
连接任意一个节点
带边框:主分片 普通:拷贝分片 星:主节点
支持新建索引
创建成功
断掉一个节点依然正常工作
断掉两个数据同步到最后一个节点上
重新启动两台节点 数据恢复