ElasticSearch
1、简介
(1)全文搜索引擎
(2)分布式文档数据库
2、与关系型数据库的区别
关系型数据库:数据库->表->行->列
Elasticsearch:索引(Index)->类型(type)->文档(Documents)->字段(Fields)
3、目录结构
bin:脚本文件,包括ES启动&安装插件等
config:elasticsearch.yml(ES配置文件)、jvm.options(JVM配置文件)、日志配置文件等
JDK:内置的jdk
lib:类库
logs:日志文件
modules:ES所有模块,包括X-pack等
plugins:ES已经安装的插件,默认没有插件
data:ES启动的时候,默认与logs同级,用来存储文档数据。该目录可在elasticsearch.yml中配置
4、部署
部署前下载对应版本的安装包到服务器
(1)修改系统参数
vi /etc/security/limits.conf
* soft nofile 165535
* hard nofile 165535
* soft nproc 65536
* hard nproc 65536
vi /etc/sysctl.conf
vm.max_map_count=262144
sysctl -p //生效
(2)配置
vi /opt/elasticsearch-7.15.0/config/elasticsearch.yml
(3)修改JDK环境变量
(4)修改内存
vi /opt/elasticsearch-7.15.0/config/jvm.options
-Xms16g
-Xmx16g
(5)修改ES使用JDK
vi /opt/elasticsearch-7.15.0/bin/elasticsearch-env
JAVA="$ES_JAVA_HOME/bin/java"
(6)设置用户
chown -R elasticsearch:elasticsearch /opt/
chown -R elasticsearch:elasticsearch /data/es/ //es数据存放目录
(8)启动
su - elasticsearch -c '/opt/elasticsearch-7.15.0/bin/elasticsearch -d'
runuser -l elasticsearch -c '/opt/elasticsearch-7.15.0/bin/elasticsearch -d'
(9)设置开机自启动
(10)ES占用端口号
9200:ES外部通讯
9300:ES内部通信
(11)访问ES
http://ip:9200
5、ES中的分片
(1)为什么引入分片
物理机资源有限,若一个索引存在海量文件,则不能再一个节点上存储,引入片可以实现同一个索引存储在不同的分片中;
索引指一个或多个分片的逻辑命名空间;一个分片保存了一份数据的部分信息;一个分片即一个lucene实例;分片是数据的容器,文档保存在分片中;分片被分配在集群中的各个节点,当集群扩容缩容时,ES会在各节点迁移分片,使得数据仍然可以均匀的分布在集群中
(2)主分片与从分片
主分片尽可能的平均分配到不同节点上,随着节点的增加主分片会再次被重新分配,该过程由ES主动完成,从分片是主分片的一个副本,不会和主分片在一个节点上默认情况 下,一个索引创建5个主分片和5个从分片,若只有一个节点,则5个主分片不能分配,ES状态为YELLOW
索引的任意一个文档都归属于主分片,主分片决定索引能够保存的最大的数据量,理论上一个主分片能够存储Integer.MAX_VALUE - 128 个文档
(3)对文档的创建、索引、删除都是在主分片上完成之后同步到从分片
(4)住主分片为3,副分片为1,表示每个主分片有一个副分片,即副分片数量也为3
(5)分片是一个完整的搜索引擎,他拥有节点上的所有资源
(6)负分片的数量可以动态调整,主分片的数量在索引创建完成之后就已经确定
6、ES集群状态
GREEN YELLOW READ
Green:所有主分片和从分片都准备就绪(分配成功),即使有一台机器挂了(假设一台机器一个实例),数据都不会丢失,但会变成 Yellow 状态。
Yellow:所有主分片准备就绪,但存在至少一个主分片(假设是 A)对应的从分片没有就绪,此时集群属于警告状态,意味着集群高可用和容灾能力下降,如果刚好 A 所在的机器挂了,而从分片还处于未就绪状态,那么 A 的数据就会丢失(查询结果不完整),此时集群进入 Red 状态。
Red:至少有一个主分片没有就绪(直接原因是找不到对应的从分片成为新的主分片),此时查询的结果会出现数据丢失(不完整);写入会返回异常。、
7、ES集群节点类型
master:node.master=true
data:node.data=true
client:node.master=false node.data=false
8、ES集群的自动发现机制
(1)当集群存在10个节点时,若有三个节点断开,因为发现机制会出现两个集群,通过一下参数配置
discovery.zen.minium_master_nodes:6 //表示当节点数小于6时,无法组成集群
(2)发现机制形式
单播发现:发送请求到单个节点
多播(组播)发现:一台机器可以同时向多台机器发送请求
注意:ES的配置文件只有在重启的时候才能生效
9、ES使用
(1)查看集群状态
curl -X GET "localhost:9200/_cluster/health?pretty"
(2)查看集群节点
curl -XGET "http://localhost:9200/_cat/nodes?pretty"
(3)查看集群索引
curl -XGET "http://localhost:9200/_cat/indices?pretty"
(4)查看集群分片
curl -X GET "localhost:9200/_cluster/health?pretty&level=shards"
(5)查看集群恢复情况
curl -X GET "localhost:9200/_recovery?pretty"
(6)尝试重新分配分片
curl -X GET "localhost:9200/_cluster/reroute"
(7)检索文档
curl -XGET "http://127.0.0.1:9200/aaa-2023.06.01/_search?pretty"
(8)高亮搜索
curl -XGET "http://127.0.0.1:9200/aaa--2023.06.01/_search?q=sourceNode:aaa-public/Pod/aaa-86775fd5bc-qxmth"
(9)创建索引
curl -XPOST "http://127.0.0.1:9200/ljtest" -H 'Content-Type:application/json' -d '{"setting":{"number_of_shards":2,"number_of_replicas":2}}'
(10)修改副分片数量
curl -XPUT "http://127.0.0.1:9200/ljtest/_setting" -H 'Content-Type:application/json' -d '{"index":{"number_of_replica":1}}'
(11)插入一个文档
curl -XPOST "http://127.0.0.1:9200/ljtest/student" -H 'Content-Type:application/json' -d '{"name":"John Smith","age":42,"confirmed":true,"join_date":"2014-06-01","home":{"lat":51.5,"lon":0.1},"accounts":[{"type": "wechat","id":"ll"},{"type": "qq","id":"ll"}]}'
(12)创建自带id的文档
curl -XPUT "http://127.0.0.1:9200/website/blog/123" -H 'Content-Type:application/json' -d '{"title":"test","text":"Just trying this out...","date":"2023/06/01"}'
(13)返回某个文档部分字段
curl -XGET "http://127.0.0.1:9200/ljtest/test/123?_source=title,text"
(14)检验文档是否存在
curl -i -XHEAD http://localhost:9200/ljtest/test/123
(15)更新整个文档
curl -XPUT "http://127.0.0.1:9200/ljtest/testg/123" -H 'Content-Type:application/json' -d '{"title":"test","text":"test","date":"2023/06/13"}'
(16)更新文档部分字段
curl -XPOST "http://127.0.0.1:9200/website/blog/123" -H 'Content-Type:application/json' -d '{"doc":{"tags":[ "testing" ],"views":0}}' //文档新增字段
(17)删除文档
curl -XDELETE "http://127.0.0.1:9200/ljtest/test/123"
(18)返回多个文档
curl -XGET "http://127.0.0.1:9200/_mget?pretty" -H 'Content-Type:application/json' -d '{"docs":[{"_index":"website","_type":"blog","_id":234},{"_index":"ljtest","_type":"students","_id":123}]}'
10、问题排查思路
(1)遇到集群Red时,我们可以从如下方法排查
集群层面:
curl -X GET "localhost:9200/_cluster/health?pretty"
索引层面:
curl -X GET "localhost:9200/_cluster/health?pretty&level=indices"
分片层面
curl -X GET "localhost:9200/_cluster/health?pretty&level=shards"
看恢复情况:
curl -X GET "localhost:9200/_cluster/_recovery?pretty
(2)有unassigned分片的排查思路
诊断:
curl -X GET "http://localhost:9200/_cluster/allocation/explain?pretty"
查询索引详细信息
curl -XGET localhost:9200/_cluster/allocation/explain?pretty -H 'Content-Type:application/json' -d '{"index":"test_log-20230607","shard":0,"primary":true}'
primary为true为主分片,为false为从分片
尝试重新分配。
curl -X POST "http://localhost:9200/_cluster/reroute"