集群探索
REST API
现在,我们的节点(集群)已经跑起来了,下一步想着怎么跟它沟通。幸运的是,ES提供了广泛且强大的REST API用于与集群交互。下面是利用这个API,可以做的几件事情:
- 检查你的集群、节点和索引的健康状态和各种统计信息
- 管理你的集群、节点、索引数据和元数据
- 对你的索引进行CRUD(创建、读取、更新和删除)和搜索操作
- 执行高级的查询操作,像是分页、排序、过滤、脚本编写(scripting)、聚合(aggregations)和许多其它操作
集群健康
让我们从一个基础的健康检查开始,查看我们的集群是怎么工作的。我们使用CURL来干这事,当然,你也可以用其他可以发起HTTP/REST请求的工具。首先,假设我们在启动ES的同一个节点上,然后打开另一个SHELL窗口。
我们用_cat API来作集群健康检查。
curl -XGET 'localhost:9200/_cat/health?v&pretty'
响应为:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1475247709 17:01:49 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0%
可以看到,我们名称为elasticsearch
的集群是启动的,绿色状态。
当我们询问集群状态的时候,我们要么得到绿色、黄色或红色。绿色代表一切正常(集群功能齐全),黄色意味着所有的数据都是可用的,但是某些复制没有被分配(集群功能齐全),红色则代表因为某些原因,某些数据不可用。注意,即使是集群状态是红色的,集群仍然是部分可用的(它仍然会利用可用的分片来响应搜索请求),但是可能你需要尽快修复它,因为你有丢失的数据。
也是从上面的响应中,我们可以看到,一共有一个节点,由于里面没有数据,我们有0个分片。注意,由于我们使用默认的集群名字(elasticsearch),并且由于ES默认使用网络单播发现同台机器上的其它节点,如果你在你的网络中启动了多个节点,你就已经把她们加入到一个集群中了。在这种情形下,你可能在上面的响应中看到多个节点。
用以下命令可以获取集群中的节点列表:
curl -XGET 'localhost:9200/_cat/nodes?v&pretty'
响应为:
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1 10 5 5 4.46 mdi * PB2SGZY
可以看到,名为PB2SGZY
的节点,是集群中唯一的一个节点。
查看所有的索引
让我们看看现在有什么索引:
curl -XGET 'localhost:9200/_cat/indices?v&pretty'
响应是:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
这代表集群中目前还没有索引。
创建索引
现在,我们创建一个名为customer
的索引,然后再次获取所有的索引:
curl -XPUT 'localhost:9200/customer?pretty'
curl -XGET 'localhost:9200/_cat/indices?v&pretty'
第一个命令使用PUT
动词创建了名为customer
的索引。我们简单地将pretty附加到调用的尾部,使其以美观的形式打印出JSON响应(如果有的话)。
响应如下:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open customer 95SQ4TSUT7mWBT7VNHH67A 5 1 0 0 260b 260b
第二个命令的结果告诉我们,我们现在有一个名为customer
的索引,它有5个主分片和1个复制(默认),其中包括0个文档。
你也许发现了,customer
索引的健康度被标记为黄色了。回想我们之前讨论的,黄色意味着某些复制没有(或者还未)被分配。这个索引之所以这样,是因为ES默认为这个索引创建一份复制。由于现在我们只有一个节点在运行,那一份复制就分配不了了(为了高可用),直到当另外一个节点加入到这个集群后,才能分配。一旦那份复制在第二个节点上被复制,这个节点的健康状态就会变成绿色。
索引并查询一个文档
现在让我们放一些东西到customer
索引中。首先要知道的是,为了索引一个文档,我们必须告诉ES这个文档要到这个索引的哪个类型下。
让我们将一个简单的客户文档索引到customer
索引,external
类型中,这个文档的ID是1,操作如下:
curl -XPUT 'localhost:9200/customer/external/1?pretty&pretty' -H 'Content-Type: application/json' -d'
{
"name": "John Doe"
}
'
响应为:
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : true
}
从上面的响应中,我们可以看到,一个新的客户文档在customer
索引和external
类型中被成功创建。文档也有一个内部id 1, 这个id是我们在索引的时候指定的。
有一个关键点需要注意,ES在你想将文档索引到某个索引的时候,并不强制要求这个索引被显式地创建。在前面这个例子中,如果customer
索引不存在,ES将会自动地创建这个索引。
现在,让我们把刚刚索引的文档取出来:
curl -XGET 'localhost:9200/customer/external/1?pretty&pretty'
响应为:
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : { "name": "John Doe" }
}
除了一个叫做found
的字段来指明我们找到了一个ID为1的文档,和另外一个字段_source
返回我们前一步中索引的完整JSON文档之外,其它的都没有什么特别之处。
删除索引
现在,让我们删除刚才创建的索引,然后在列出所有的索引:
curl -XDELETE 'localhost:9200/customer?pretty&pretty'
curl -XGET 'localhost:9200/_cat/indices?v&pretty'
响应为:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
这表明我们成功地删除了这个索引,现在我们回到了集群中空无所有的状态。
在更进一步之前,我们再细看一下一些我们学过的API命令:
curl -XPUT 'localhost:9200/customer?pretty'
curl -XPUT 'localhost:9200/customer/external/1?pretty' -H 'Content-Type: application/json' -d'
{
"name": "John Doe"
}
'
curl -XGET 'localhost:9200/customer/external/1?pretty'
curl -XDELETE 'localhost:9200/customer?pretty'
如果我们仔细研究以上的命令,我们可以发现访问Elasticsearch中数据的一个模式。这个模式可以被总结为:
curl -<REST Verb> <Node>:<Port>/<Index>/<Type><ID>
这个REST访问模式普遍适用于所有的API命令,如果你能记住它,你就会为掌握ES开一个好头。