2、ES的安装
(1) 六字箴言:JDK->下载->启动->验证
(2) 开发模式和生产模式
3、ES-node
(1)Role:节点的角色
1.Master:主节点
2.voting:投票 仅投票节点,需要设置:node.voting_only
3.coordinating:每个节点都有协调的功能,而仅协调 node.master=false node.data=false不做数据存储的功能,只做转发
(2)Node-type:节点的类型
1.Master-eligible node(候选节点) node.master设置为true的节点
2.Data node(数据节点) node.data设置为true的节点,好处把master节点和数据存储的角色分开
注:仅投票节点也是可以作为数据节点的
3.Ingest node //类似于前置 处理节点,在数据处理之前做数据转换,有点像filter
4.Machine learning node(机器学习节点)
4、ES容错机制
(1)第一步:Master选举
1.脑裂:可能会产生多个Master节点
2.避免脑裂的配置:discovery.zen.minimum master nodes=N/2+1
(2)第二步:Replica容错
(3)第三步:重启故障机
(4)第四步:数据恢复
Master选举:
触发master选举的两个条件:
1.ping所有的节点,看看有没有哪个节点自称Master
每隔一段时间都会去触发
注意:
#设置主服务
node.master:true
#是否进行数据存贮
node.data:false
如果node.master配置为true代表,master节点宕机以后是有资格去竞选master节点的,一般来说master节点的作用比较单一,都是轻量级的操作,比如节点的均衡,创建和删除索引, 跟踪节点中的一部分确定哪些分片分配给哪些节点,一般master节点不用于数据节点
如果node.data为true说明这个节点是作为数据节点来使用的,这两个配置可以组合4种情况,node.data即使不配置也是true,所以当master设置为true的时候,原则上要把data设置为false,不希望master进行数据存储,因为索引和搜索都是CPU 内存 IO密集型,如果大量的搜索,master节点承担较大的压力有可能造成master节点宕机。
master设置为false,data设置为true,只存储数据,没有主节点的竞选资格,所以不参与选举,只存储数据。这种节点是数据节点data node,一般提供查询服务
master设置为true,data设置为false,有竞选主节点的资格,可以参与选举,有可能成为真正的master节点。
如果两个节点都设置为false,那么充当协调节点,仅协调,coordinating
不做存储,只做转发
2.满足node.master为true的时候才是候选节点
如果是本节点当选Master,票数过半后当选Master,然后告诉别的节点没戏,可以停下来了。如果是别的节点当选,那么弱弱的请求新的Master节点加入集群
5、ES集群的健康值检查 localhost:9200/_cluster/health
(1) Green:所有p shard 和 r shard均为active 集群很健康
(2) Yellow:至少一个replica shard不可用,但是数据仍然是完整的
(3) Red:至少有一个p shard为不可用状态,数据不完整,集群不可用
因为r shard是不承担数据的写入操作的,所有会丢失数据
es插件:Head master需要手动安装
6、最简单的增删改查CRUD
检查健康值的两种方法:
GET /_cluster/health
GET /_cat/health?v
cat常用命令:
(1)创建索引: PUT /索引?pretty
PUT /test_index?pretty
GET _cat/indices?v
DELETE /test_index?pretty
创建索引的时候一律采用小写字母,不要用大写字母
(2)删除索引:DELETE /test_index?pretty
(3)插入数据:
PUT /index/_doc/id
{
json数据
}
弱化type的概念,统一写死成_doc
PUT /product/_doc/1
{
"name":"xiaomi phone",
"desc":"shouji zhong de zhandouji",
"price":3999,
"tags":[ "xingjiabi","fashao","buka"]
}
PUT /product/_doc/2
{
"name":"xiaomi nfc phone",
"desc":"zhichi quangongneng nfc,shouji zhong de jianjiji",
"price":4999,
"tags":[ "xingjiabi","fashao","gongjiaoka"]
}
PUT /product/_doc/3
{
"name":"nfc phone",
"desc":"shouji zhong de hongzhaji",
"price":2999,
"tags":[ "xingjiabi","fashao","menjinka"]
}
PUT /product/_doc/4
{
"name":"xiaomi erji",
"desc":"erji zhong de huangmenji",
"price":999,
"tags":[ "low","bufangshui","yinzhicha"]
}
PUT /product/_doc/5
{
"name":"hongmi erji",
"desc":"erji zhong de kendeji",
"price":399,
"tags":[ "lowbee","xuhangduan","zhiliangx"]
}
(4)更新数据
1)全量替换
2)部分替换(指定字段更新)
语法:
POST /index/type/id/_update
{
"doc"{
"field":value
}
}
案例:
POST /product/_doc/1/_update
{
"doc":{
"price": 2999
}
}
GET /product/_doc/1
提供了基于rest风格的api和Java的rest api是一样的
(5)删除数据
语法:
DELETE /index/type/id
案例:
GET /product/_doc/1
但是再去创建的时候版本号+1,说明delete的时候,数据并没有被真正的删除掉,es删除数据的时候有延迟删除的机制,但是达到一定的时间后会真正的删除掉
查询数据:
GET /product/_search
GET product/_search?sort=price:asc
GET product/_search?q=price:3999&sort=price:asc
query DSL
GET /product/_doc/_search
{
"query":{
"match":{
"name":"phone xiaomi"
}
},
"sort":[
{"price":"desc"}
]
}