ElasticSearch笔记整理(二):CURL操作、ES插件、集群安装与核心概念

[TOC]


CURL操作

CURL简介

curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求。简单的认为是可以在命令行下面访问url的一个工具。在centos的默认库里面是有curl工具的,如果没有请yum安装即可。

curl
    -X 指定http的请求方法 有HEAD GET POST PUT DELETE
    -d 指定要传输的数据
    -H 指定http请求头信息

curl创建索引库
    curl -XPUT http://<ip>:9200/index_name/
  PUT或POST都可以创建
  举例:
    curl -XPUT 'http://localhost:9200/bigdata'

CURL操作(一):索引库创建与查询

创建一个索引库:

curl -XPUT http://uplooking01:9200/bigdata
返回值{"acknowledged":"true"}

查看一个索引库信息:

curl -XGET http://uplooking01:9200/bigdata
返回值一个json字符串
如果想要格式良好的结果
curl -XGET http://uplooking01:9200/bigdata?pretty

在索引库中添加若干索引信息:

curl -XPOST http://uplooking01:9200/bigdata/product/1 -d'{
    "name":"hadoop",
    "author":"Dong Couting",
    "version":"2.9.4"
}'  
curl -XPOST http://uplooking01:9200/bigdata/product/2 -d'{
    "name":"hive",
    "author":"facebook",
    "version":"2.1.0",
    "url":"http://hive.apache.org"
}'
curl -XPUT http://uplooking01:9200/bigdata/product/3 -d'{
    "name":"hbase",
    "author":"apache",
    "version":"1.1.5",
    "url":"http://hbase.apache.org"
}'  

查询某一个索引库下面的所有数据:

curl -XGET http://uplooking01:9200/bigdata/product/_search
格式良好的写法:
curl -XGET http://uplooking01:9200/bigdata/product/_search?pretty
{
  "took" : 11,
  "timed_out" : false,  ---->是否超时
  "_shards" : {         ---->分片个数(就是kafka中的partition,一个索引库有几个分区)
    "total" : 5,        ---->默认分片有5个
    "successful" : 5,   ---->能够正常提供服务的有5个
    "failed" : 0        ----> (total-successful)=failed
  },
  "hits" : {            ---->查询结果集
    "total" : 2,        ---->查询到了几条记录
    "max_score" : 1.0,  ---->记录中最大的得分
    "hits" : [ {        ---->具体的结果集数组
      "_index" : "bigdata", ----->结果所在索引库
      "_type" : "product",  ----->结果所在索引库中的某一个类型type
      "_id" : "2",          ----->结果索引id
      "_score" : 1.0,       ----->索引得分
      "_source" : {         ----->索引具体内容_source
        "name" : "hive",        
        "author" : "facebook",
        "version" : "2.1.0",
        "url" : "http://hive.apache.org"
      }
    }, {
      "_index" : "bigdata",
      "_type" : "product",
      "_id" : "1",
      "_score" : 1.0,
      "_source" : {
        "name" : "hadoop",
        "author" : "Dong Couting",
        "version" : "2.9.4"
      }
    } ]
  }
}
PUT和POST区别
  • PUT是幂等方法,POST不是。所以PUT用于更新,POST用于新增比较合适。

  • PUT和DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有什么不同,DELETE也是一样。

  • POST操作不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建了若干的资源。

  • 还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别就在于POST是作用在一个集合资源(/articles)之上的,而PUT操作是作用在一个具体资源之上的(/articles/123),比如说很多资源使用数据库自增主键作为标识信息,这个时候就需要使用PUT了。而创建的资源的标识信息到底是什么,只能由服务端提供时,这个时候就必须使用POST。

    • ES创建索引库和索引时的注意点

    ​ 1)索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号

    ​ 2)如果没有明确指定索引数据的ID,那么es会自动生成一个随机的ID,需要使用POST参数

    curl-XPOST http://localhost:9200/bigdata/product/ -d'{"author" : "Doug Cutting"}’

举例说明幂等操作:
    StringBuilder sb = new StringBuilder();
    sb.append("aaaa");结果是什么?sb

    String str = new StringBuilder();

    str.substring();---->新的对象

CURL操作(二):高级查询、更新、删除与批量操作

查询所有:

只查询source中的个别字段
    curl -XGET 'http://uplooking01:9200/bigdata/product/_search?_source=name,author&pretty'

返回结果只查询source
    curl -XGET 'http://uplooking01:9200/bigdata/product/1?_source&pretty'

条件查询:
    curl -XGET 'http://uplooking01:9200/bigdata/product/_search?q=name:hbase&pretty'
        查询name为hbase的结果
    curl -XGET 'http://uplooking01:9200/bigdata/product/_search?q=name:h*&pretty'
        查询name以h打头的结果

分页查询:

curl -XGET 'http://uplooking01:9200/bank/acount/_search?pretty&from=0&size=5'

更新:

使用post put都可以
    curl -XPOST http://uplooking01:9200/bigdata/product/AWA184kojrSrzszxL-Zs -d'{"name":"sqoop", "author":"apache"}'
    curl -XPOST http://uplooking01:9200/bigdata/product/AWA184kojrSrzszxL-Zs -d'{"version":"1.4.6"}'
但是这些操作都是全局更新,理解为删除之前的,重新创建一个新的,id相同的document。

局部更新(必须使用POST)
    要是用update,同时要更新的是source中的doc内容
    curl -XPOST http://uplooking01:9200/bigdata/product/AWA184kojrSrzszxL-Zs/_update -d'
    {"doc":{"name":"sqoop", "author":"apache"}}'

说明:
   ES可以使用PUT或者POST对文档进行更新,如果指定ID的文档已经存在,则执行更新操作
注意:执行更新操作的时候,ES首先将旧的文档标记为删除状态,然后添加新的文档,旧的文档不会立即消失,
但是你也无法访问,ES会继续添加更多数据的时候在后台清理已经标记为删除状态的文档。

删除:

普通删除,根据主键删除
   curl -XDELETE http://localhost:9200/bigdata/product/3/
说明:如果文档存在,es属性found:true,successful:1,_version属性的值+1。
   如果文档不存在,es属性found为false,但是版本值version依然会+1,这个就是内部
管理的一部分,有点像svn版本号,它保证了我们在多个节点间的不同操作的顺序被正确标记了。
   注意:一个文档被删除之后,不会立即生效,他只是被标记为已删除。ES将会在你之后添加
更多索引的时候才会在后台进行删除。

批量操作-bulk:

Bulk api可以帮助我们同时执行多个请求
格式:
   action:[index|create|update|delete]
   metadata:_index,_type,_id
   request body:_source(删除操作不需要)
   {action:{metadata}}/n
   {request body}/n
   {action:{metadata}}/n
   {request body}/n
例如:
{"index":{"_id":"1"}}
{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
{"index":{"_id":"6"}}
{"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}

  create和index的区别
    如果数据存在,使用create操作失败,会提示文档已经存在,使用index则可以成功执行。
使用文件的方式
curl -XPOST http://uplooking01:9200/bank/acount/_bulk --data-binary @/home/uplooking/data/accounts.json

关于批量操作的补充说明:

可以查看一下各个索引库信息
curl 'http://localhost:9200/_cat/indices?v'

Bulk请求可以在URL中声明/_index或者/_index/_type
Bulk一次最大处理多少数据量
Bulk会把将要处理的数据载入内存中,所以数据量是有限制的
最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载
一般建议是1000~5000个文档,如果你的文档很大,可以适当减少队列,大小建议是5~15MB,默认不能超过100M,可以在es的配置文件中修改这个值
http.max_content_length:100mb

CURL操作(三):ES版本控制

  • 普通关系型数据库使用的是(悲观并发控制(PCC))

    当我们在读取一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据。

  • ES使用的是(乐观并发控制(OCC))

    ES不会阻止某一数据的访问,然而,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败,这时候就由程序来决定如何处理这个冲突。它可以重新读取新数据来进行更新,又或者将这一情况直接反馈给用户。

  • ES如何实现版本控制(使用es内部版本号)

​ 1:首先得到需要修改的文档,获取版本(_version)号

​ curl -XGET http://localhost:9200/bigdata/product/1

​ 2:再执行更新操作的时候把版本号传过去

​ curl -XPUT http://localhost:9200/bigdata/product/1?version=1 -d ‘{"name":"hadoop","version":3}'(覆盖)

​ curl -XPOST http://localhost:9200/bigdata/product/1/_update?version=3 -d'{"doc":{"name":"apachehadoop","latest_version": 2.6}}'(部分更新)

​ 3:如果传递的版本号和待更新的文档的版本号不一致,则会更新失败

  • ES如何实现版本控制(使用外部版本号)

​ 如果你的数据库已经存在了版本号,或者是可以代表版本的时间戳。这时就可以在es的查询url后面添加version_type=external来使用这些号码。

​ 注意:版本号码必须要是大于0小于9223372036854775807(Java中long的最大正值)的整数。

     es在处理外部版本号的时候,它不再检查_version是否与请求中指定的数值是否相等,而是检查当前的_version是否比指定的数值小,如果小,则请求成功。
example:
     curl -XPUT 'http://localhost:9200/bigdata/product/20?version=10&version_type=external' -d '{"name": "flink"}'
     注意:此处url前后的引号不能省略,否则执行的时候会报错

ES插件

ES本身服务相对比较少,其功能的强大之处就体现在插件的丰富性上。有非常多的ES插件用于ES的管理,性能的完善,下面介绍的是几款常用的插件。

BigDesk Plugin

离线安装:
    bin/plugin install file:/home/uplooking/soft/bigdesk-master.zip
卸载:
    bin/plugin remove bigdesk
在线安装:
    bin/plugin install hlstudio/bigdesk
访问(web):
    http://uplooking01:9200/_plugin/bigdesk

Elasticsearch-Head Plugin

离线安装
    bin/plugin install file:/home/uplooking/soft/
在线安装
    bin/plugin install mobz/elasticsearch-head
访问
    http://uplooking01:9200/_plugin/head/

Elasticsearch Kibana

ELK(ElasticSearch LogStach Kibana)中的其中一个组件。

配置:
    server.port: 5601
    server.host: "uplooking01"
    elasticsearch.url: "http://uplooking01:9200"
    elasticsearch.username: "jack"
    elasticsearch.password: "uplooking"

访问:
    http://uplooking01:5601

常见的报表工具:
    折线图
    饼形图
    柱状图

ES集群安装

如果在一个局域网内的话,只需要修改一个地方:cluster.name 保持统一即可,
这样就可以通过发现机制找到新启动的机器。
如果在不同局域网内的要进行组网,直接禁用发现机制,指定对应的节点主机名即可。
(但实际上在使用2.3.0的版本时,并不能自动发现,所以为了配置集群,需要将该机制禁用并手动配置节点主机名)

cluster.name: bigdata-08-28
node.name: hadoop
path.data: /home/uplooking/data/elasticsearch
path.logs:  /home/uplooking/logs/elasticsearch
network.host: uplooking01
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["uplooking01", "uplooking02", "uplooking03"]

ElasticSearch的集群状态:

Green:  所有的主分片和副分片都可用
Yellow:所有的主分片都可以不是所有的副分片都可用
Red:    不是所有的主分片和副分片都可用

ElasticSearch核心概念

Cluster

代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。ES的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看ES集群,在逻辑上是个整体,你与任何一个节点的通信和与整个ES集群通信是等价的。

主节点的职责是负责管理集群状态,包括管理分片的状态和副本的状态,以及节点的发现和删除。

只需要在同一个网段之内启动多个ES节点,就可以自动组成一个集群。

默认情况下ES会自动发现同一网段内的节点,自动组成集群。

集群的查看状态:

http://<ip|host>:9200/_cluster/health?pretty

shards

代表索引分片,ES可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

可以在创建索引库的时候指定:

curl -XPUT 'localhost:9200/test1/' -d'{"settings":{"number_of_shards":3}}'

# 默认是一个索引库有5个分片 index.number_of_shards:5

replicas

代表索引副本,ES可以给索引设置副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高ES的查询效率,ES会自动对搜索请求进行负载均衡

可以在创建索引库的时候指定:

curl -XPUT 'localhost:9200/test2/'-d'{"settings":{"number_of_replicas":2}}'

# 默认是一个分片有1个副本 index.number_of_replicas:1

recovery

代表数据恢复或者叫数据重新分布,ES在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

gateway

代表ES索引的持久化存储方式,ES默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。当这个ES集群关闭再重新启动时就会从gateway中读取索引数据。ES支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。

discovery.zen

代表ES的自动发现节点机制,ES是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

如果是不同网段的节点如果组成ES集群,禁用自动发现机制:
    discovery.zen.ping.multicast.enabled: false

设置新节点被启动时能够发现的注解列表:
    discovery.zen.ping.unicast.hosts: ["master:9200","slave01:9200"]

transport

代表ES内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等传输协议(通过插件方式集成)。

原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/193539.html

(0)
上一篇 2021年11月15日 10:34
下一篇 2021年11月15日 10:34

相关推荐

发表回复

登录后才能评论