1.图解Elasticsearch 容错机制:master选举、replica容错、数据恢复。
master node宕机,自动master选举 red
初步解析document的核心元数:_index,_type,_id
{
"_index" : "test_index",
"_type" : "test_type",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"test_content" : "test test"
}
}
1._index元数据
a.代表一个document存放在哪个index中
b.类似的数据放在在一个索引,非类似的数据放 在不同索引。product index(包含所有的商品) sales index(包含所有的商品销售数据)
c.index中包含了很多类似的document。 其实说 这些document的fileds很大一部分是相同。
d.索引名称必须是小写的,不能用下止划线开头,不能包含逗号。
创建index反例分析图
2._index
a.代表document属于index中的哪个index中的些许不同的几类数据分析。
b.一个索引通常会划分为多个type,逻辑上对index中有些许不同的几类数据进行分析。因为一批相同的数据,可能有很多相同的fields,但是还是可能有一些轻微的不同,可能会有少数fields是不一样的,如:商品 可能划分为电子商品,生鲜商品,日化商品 等等。
c.type名称可以是大写或者小写和,但是同时不能用下划开头,不能包含逗号。
3._id元数据
a.代表document的唯一标识,与index和type一起 可以唯一标识和定位一个document
b . 我们可以手动指定doccment的id也可以不指定 由es自动为我们创建一个id.
手动指定document id
a.根据应用情况来部,是否满足手动指定document id 的前提。一般来说 是从某些其他的系统中,导入一些数据到ao会采取这种方式 就是呀使用系统中已有的数据的唯一 标识,作为es中document的id
b.put /index/type/id
2.自动生成document id
(1) post /index/test_type
POST /test_index/test_type
{
"test_content":"my test"
}
2).自动生成的id 长度是20脸上字符 URL安全 base64编码,GUID分布工系统并行生成时不可能发生冲突
1._source 元数据
2.定制返回 结果
PUT /test_index/test_type/1
{
"test_field1":"test_field1",
"test_field2":"test_field2"
}
{
"_index" : "test_index",
"_type" : "test_type",
"_id" : "1",
"_version" : 2,
"_seq_no" : 2,
"_primary_term" : 2,
"found" : true,
"_source" : {
"test_field1" : "test_field1",
"test_field2" : "test_field2"
}
}
_source 元数据 就是说 我们在 创建一个document的时候,使用的那个放在requst body中的json串 ,默认情况下 在get的时候 ,会原封不动的给我们返回回来。
定制返回的结果 指定_source中 返回哪些field
GET /test_index/test_type/1?_source=test_field2 (多个时用逗号隔分)
{
"_index" : "test_index",
"_type" : "test_type",
"_id" : "1",
"_version" : 2,
"_seq_no" : 2,
"_primary_term" : 2,
"found" : true,
"_source" : {
"test_field2" : "test_field2"
}
}
3.document的全量替换
1.语法与创建文档是一样的,如果documet id 不存在 那么就是创建 如果document id已经存在 那么就是全量替换的,替换document的jsonm的内容
2.document是不可变的,要修改document的内容,第一种方式就是倒是替换,直接document重新建立索引,替换里面所有的内容。
3.es会将老的document标为deleted,然后新增我们给给定的一个document,当我们创建越来越多的document的时候,es会在适当时机后台自动删除标记为deleted的document.
4.document的强制创建
1.创建文档与全量替换的语法是一样的,有时我们只是想新建文档,不想替换文档,如果强制进行创建 呢
2.PUT /indx/type/id?op_type=create. PUT/index/type/id/_create
5.document的删除
(1) DELETE /index/type/id
(2)不会理解物理删除,只会将其标记为deleted,当数据越来越多的时候,在后台自动删除。
6.elasticsearch并发冲突问题
7.悲观锁与乐观控制方案
8.图解Elasticsearch内部如何基于_version进行乐观锁并发控制
(1)_version元数据
第一次创建一个doucment的时候,它的_version内部版本号就是1,每次对这个document执行修改或者删除操作,都会对这个_version版本号自动加1,哪怕是删除也会对这条数据的版本号加1
我们会发现,在删除一个document之后,可以人一个侧面证明,它不是立即物理删除掉的,因为它一些版本号等信息还是保留着的,先删除一条document 再重新创建 这个document,其实会在delete version基础 之上,再把version号加1
![](https://i-blog.csdnimg.cn/blog_migrate/035ead5ecf217c813b9a1b826a8c93ad.png)
9.上机动手实战演练基于_version(新版本更新为if_seq_no和if_primary_term)进行乐观并发控制
(1)先构造一条数据出来
PUT /test_index/test_type/7
{
"test_filed":"test test"
}
(2)模拟两个客户端,都获取到了同一条数据
{
"_index" : "test_index",
"_type" : "test_type",
"_id" : "7",
"_version" : 1,
"_seq_no" : 3,
"_primary_term" : 4,
"found" : true,
"_source" : {
"test_filed" : "test test"
}
}
(3)其中一个客户端,先更新一下这个数据,同时带上数据的版本号,确保说,es中的数据 的版本号,跟客户端中的数据的版本号是相同才能修改
PUT /test_index/test_type/7?if_seq_no=5&if_primary_term=4
{
"test_filed":"test clinet1"
}