Elasticsearch 学习笔记2 集群和数据
集群术语
- 节点: 一个elasticsearch实例(一个elasticsearch进程)就是一个节点
- 集群: 由一个或者多个elasticsearch节点组成
- 主节点: 临时管理集群级别变更:新建/删除索引,新建/移除节点,不参与文档级别变更或者搜索,当数据量增长时,不会成为集群瓶颈,集群只有一个主节点,通过各个节点选举产生
- 分片(shard):是最小级别工作单元,它只是保存了索引中所有数据的一部分
- 主分片:每个文档属于一个单独主分片,主分片数量可以在创建索引时指定,默认个数在配置中指定(index.number_of_shards),一个index默认有5个主分片
- 复制分片:主分片副本,用于搜索加速,可以在创建索引时指定,默认复制分片数在配置中设定(index.number_of_replicas)
集群状态
查看集群状态:
- 查看集群状态:/_cluster/health:可以获取当前集群状态(green/yellow/red),以及副本个数等信息
- green: 所有主分片和复制分片状态都ok
- yellow: 主分片ok,复制分片未完全ok
- red: 存在主分片不OK
- 修改index配置:{index}/_setting,可以动态修改{index}复制分片个数
文档
-
检索文档:
- id:默认es会生成一个22位,经过base64编码的id,是urlsafe的,当然在创建文档时,也可以指定id
- _source字段:里面存储了用户自定义的数据
- 检索部分文档:GET /sailor/user/1/_source,表示只需要_source字段
- GET /website/blog/123?_source=name,表示只检索_source字段中的name字段
- pretty:检索文档时,可以增加pretty把结果的json美化输出
- 当文档存在时http code为200,如果文档不存在则,code为404 Not Found
-
更新文档:
- 更新文档: 使用PUT,同时version会加1
-
创建文档:
- 创建文档:使用POST方式
- 当文档不存在时创建,使用POST /website/blog/123?op_type=create,如果创建成功,http code为201,如果存在,则创建失败,http code为409(conflict)
-
删除文档
- 删除文档时,使用DELETE方法,文档的version加1
- 如果文档正常删除,返回200,如果文档不存在,返回404
-
文档版本:
- 分布式版本冲突控制方法:悲观(提前锁定数据,如mysql),乐观(默认不会发生冲突,如果发生重复返回失败)
- 乐观方法:PUT /website/blog/1?version=1,修改时带上version
- 返回值:正常返回200,如果版本不匹配返回409(conflict)
- 修改时指定修改版本:PUT /website/blog/2?version=5&version_type=external,需要定义version_type为外部
- 如果定义的version小于当前version,则返回409,如果文档不存在,返回404,如果修改正常返回200
-
局部更新:
- POST /website/blog/1/_update,注意这里使用了POST
- 如果文档不存在则创建,如果文档存在则更新,使用upsert
- 文档冲突重试:使用retry_on_conflict参数
-
批量操作:
- bulk:可以批量进行增删改查
- 每个批量的数据量大小在:5-15M是比较合适的
分布式策略:
-
路由:
- 公式:shard = hash(routing) % number_of_primary_shards,基于routing进行哈希分片
- routing默认是id,也可以自己指定
-
副本工作方式:
- 默认是sync,只有当副本分片都进行操作后,才返回给客户端
- 可以设置为async,不过不建议设置,因为异步时,可能因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载
-
consistency策略:
- 默认是quorum:公式int( (primary + number_of_replicas) / 2 ) + 1,过半节点都操作完成后返回
- one:一个主分片完成即可返回
- all:所有主分片和复制分片都操作完成返回
-
timeout
- 默认一分钟,比如设定all,es会等待1分钟,等待所有副本返回
- 可以设置超时时间,如100表示100ms,30s表示30秒