集群术语

- 节点:   一个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秒