ElasticSearch学习笔记2

shard 和 replica 机制

  • 一个 index 包含多个 shard,primary shard 的数量是在建立 index 的时候就确定的,不可修改,但是 replica 是可随时修改的
  • 新建 index 的时候,primary shard 的默认数量是 5,replica 默认是 1,默认有 10 个 shard,5 个 primary shard,5 个 replica shard
  • 每个 shard 是最小的工作单元,拥有部分的数据,是一个 Lucene 实例,有建立索引和处理请求的能力
  • 当 node 变化的时候,shard 会在 node 上自动进行负载均衡
  • replica shard 是 primary shard 的副本,负责容错,以及承担读请求负载
  • primary shard 不能和自己的 replica shard 放在同一个节点上,但是可以和其他 primary shard 的 replica shard 放在同一个节点上

扩容和容错性

假设现在我们有3个node,6个shard,则每个node上分配2个shard,此时最多容忍1台机器挂了,因为2台机器有4个shard,能存放下3个primary shard。此时如果我们进行水平扩容,将node变为6个,则每个node有1个shard,每个shard能使用的IO/CPU/Memory资源更多,性能会更好。 另外假设我们现在还是3个node,但是将shard变为9个,则每个node有3个shard,此时虽然每个shard使用的资源少了,但是容错性提高了,最多能容忍2个node故障,因为剩余的1个node还有3个shard,能包含所有数据。

容错过程分析

  1. 假设某个master node挂了,此时es通过选举选举中新的master节点,并将丢失的primary shard对应的replica shard提升为primary shard
  2. 重启故障的node,重启后,新的master node将数据复制到该节点上,原先的primary node变为replica node,同步是增量同步

创建index注意

index类似于mysql中的database,mysql中会将不同用途的数据放到不同的database中,es也一样,将同类的(fields基本相同)的document放到一起,这样带来的好处是不同index不会相互影响,因为不同index的shard是分类的,这就意味着彼此的shard操作不会影响。举个例子: 假设我们有一个book_index,存放了所有的书籍信息,供用户在线检索,另外还有一个需求是后台人员对book信息进行一些统计分析操作,由于这些操作都是非常耗时的,因此如果放在同一个index中,势必会影响线上浏览。

文档id生成

文档id的生成有两种方式:自动和手动。 手动的场景适合:假设数据来源是mysql系统,里面有自己的唯一id了,此时es只是辅助mysql进行一些检索操作,此时就用外部系统的id即可 自动:数据就是存在于es中,通过es的GUUID算法保证id的唯一,自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能会发生冲突

source元字段

source元字段的内容是在我们创建一个document的时候,使用的那个放在request body中的json串,默认情况下,在get的时候,会原封不动的给我们返回回来。 在我们查询的时候,如果带上_source参数,就可以定制返回的结果了。

document的替换、删除操作

1、document的全量替换

(1)语法与创建文档是一样的,如果document id不存在,那么就是创建;如果document id已经存在,那么就是全量替换操作,替换document的json串内容 (2)document是不可变的,如果要修改document的内容,第一种方式就是全量替换,直接对document重新建立索引,替换里面所有的内容 (3)es会将老的document标记为deleted,然后新增我们给定的一个document,当我们创建越来越多的document的时候,es会在适当的时机在后台自动删除标记为deleted的document


2、document的强制创建

(1)创建文档与全量替换的语法是一样的,有时我们只是想新建文档,不想替换文档,如果强制进行创建呢? (2)PUT /index/type/id?op_type=create,PUT /index/type/id/_create


3、document的删除

(1)DELETE /index/type/id (2)不会理解物理删除,只会将其标记为deleted,当数据越来越多的时候,在后台自动删除 (3)当我们删除完一个document后,再次PUT新建的时候,会在原来deleteverion基础上再加一

version并发控制

es通过version来进行乐观锁控制,语法是通过在参数version实现

?version=1
?version=1&version_type=external

version_type=external,唯一的区别在于,_version,只有当你提供的version与es中的_version一模一样的时候,才可以进行修改,只要不一样,就报错;当version_type=external的时候,只有当你提供的version比es中的_version大的时候,才能完成修改

es,_version=1,?version=1,才能更新成功 es,_version=1,?version>1&version_type=external,才能成功,比如说?version=2&version_type=external

partial update

partial update不需要传递整个json对象,而是只需要修改的filed,但是在服务端执行partial update的时候,其实和PUT还是一样的,都是先去读document,更新字段后,将老的document标记为删除,然后创建一个新的document,与全量update不同的是将get。modify。update操作放在了服务端,这样子减少了网络开销,提高性能。

partial update的时候是在server进行了乐观锁控制,1. 取到version 2.修改后更新,我们可以通过指定retry来声明重复1,2步骤的次数。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

《linux c编程指南》学习手记3

6.3.1 多个进程之间的关系 进程组:getpgrp(void)用来返回进程组号 setpgid用来创建一个新的进程组或将一个进程加入另一个已存在的进程组 6...

19680
来自专栏架构师之路

一分钟了解负载均衡的一切

什么是负载均衡 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均...

47490
来自专栏锦小年的博客

pycharm使用笔记2-远程连接

随着科技的发展,远程办公已经是一种趋势,远程开发能力对于每一个程序员来说都是必不可少的。有时候就算在公司,在进行开发的时候有许多的数据都是储存在服务器上的,所以...

412100
来自专栏Web 开发

推荐两款HTTP Log分析利器

一款是Apache Logs Viewer,这是一款PC端日志分析软件,从服务器上面把log日志下载回来跑的。

8200
来自专栏C/C++基础

google C++编程风格指南之头文件的包含顺序

(1)为了加强可读性和避免隐含依赖,应使用下面的顺序:C标准库、C++标准库、其它库的头文件、你自己工程的头文件。不过这里最先包含的是首选的头文件,即例如a.c...

12110
来自专栏coder修行路

一次python 内存泄漏解决过程

最近工作中慢慢开始用python协程相关的东西,所以用到了一些相关模块,如aiohttp, aiomysql, aioredis等,用的过程中也碰到的很多问题,...

35920
来自专栏TechBox

[!]The 'pods-xxx' target has libraries with conflicting name: libcrypto.a and libssl.a

34530
来自专栏技术博文

SPDY初探

原文链接:http://blog.chinaunix.net/uid-22312037-id-4865410.html 现有的HTTP协议存在如下几个问题: ...

36370
来自专栏问天丶天问

K8S 基础名词概念

28040
来自专栏人云亦云

Zookeeper部署与动态扩容

最近在一直维护以前的一个实时计算的系统,用到了很多有关storm、kafka、zookeeper之类的知识。自己也一直在学习这些系统的架构、源码。

2K80

扫码关注云+社区

领取腾讯云代金券