千家信息网

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

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,[TOC]CURL操作CURL简介curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求。简单的认为是可以在命令行下面访问url的一个工具。在
千家信息网最后更新 2025年01月31日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://: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/_typeBulk一次最大处理多少数据量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-28node.name: hadooppath.data: /home/uplooking/data/elasticsearchpath.logs:  /home/uplooking/logs/elasticsearchnetwork.host: uplooking01discovery.zen.ping.multicast.enabled: falsediscovery.zen.ping.unicast.hosts: ["uplooking01", "uplooking02", "uplooking03"]

ElasticSearch的集群状态:

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

ElasticSearch核心概念

Cluster

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

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

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

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

集群的查看状态:

http://: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等传输协议(通过插件方式集成)。

0