接近实时(NRT)
Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)
集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。在产品环境中显式地设定这个名字是一个好习惯,但是使用默认值来进行测试/开发也是不错的。
节点(node)
一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。
1.Cluster
cluster.name: elasticsearch
设置ElasticSearch集群的名字,默认的集群名字为elasticsearch,如果想要让某一ElasticSearch节点加入集群只需指定cluster.name
2. Node
node.name: “Franz Kafka“,设置ElasticSearch节点的名字
node.master: true,设置节点是否为主节点
node.data: true,设置节点是否存储索引分片
3. Index
index.number_of_shards: 5,设置索引的分片数,默认为5个分片
index.number_of_replicas: 1,设置索引的副本数,默认为1个副本
4. Paths
path.data: /data/esdata,设置索引数据的存储路径
path.logs: /data/eslogs,设置日志数据的存储路径
rest接口
Elasticsearch提供了非常全面和强大的REST API,利用这个REST API你可以同集群交互。下面是利用这个API,可以做的几件事情:
检查集群、节点和索引的健康状态、和各种统计信息
管理集群、节点、索引数据和元数据
对索引进行CRUD(创建、读取、更新和删除)和搜索操作
集群健康
以基本的健康检查作为开始,可以利用它来查看我们集群的状态。此过程中,我们使用curl,当然,你也可以使用任何可以创建HTTP/REST调用的工具。我们假设我们还在我们启动Elasticsearch的节点上并打开另外一个shell窗口。
要检查集群健康,我们将使用_cat API。需要事先记住的是,我们的节点HTTP的端口是9201:
curl ‘localhost:9201/_cat/health?v’
ElasticSearch常用命令
_cat系列_cat系列提供了一系列查询elasticsearch集群状态的接口。你可以通过执行curl -XGET localhost:9201/_cat获取所有_cat系列的操作 http://47.94.18.202:9201/
/_cat/allocation ?v
/_cat/shards ?v
/_cat/master ?v /_cat/nodes ?v /_cat/indices ?v /_cat/indices/{index} ?v /_cat/segments ?v /_cat/segments/{index} ?v /_cat/count ?v /_cat/count/{index} ?v /_cat/recovery ?v /_cat/recovery/{index} ?v /_cat/health ?v /_cat/pending_tasks ?v /_cat/aliases ?v /_cat/aliases/{alias} ?v /_cat/thread_pool ?v /_cat/plugins ?v /_cat/fielddata ?v /_cat/fielddata/{fields} ?v
_cluster系列1、查询设置集群状态curl -XGET localhost:9201/_cluster/health?pretty=truepretty=true表示格式化输出level=indices 表示显示索引状态level=shards 表示显示分片信息2、curl -XGET localhost:9201/_cluster/stats?pretty=true显示集群系统信息,包括CPU JVM等等3、curl -XGET localhost:9201/_cluster/state?pretty=true集群的详细信息。包括节点、分片等。3、curl -XGET localhost:9201/_cluster/pending_tasks?pretty=true
_nodes系列1、查询节点的状态curl -XGET ‘http://localhost:9201/_nodes/stats?pretty=true’curl -XGET ‘http://localhost:9201/_nodes/192.168.1.2/stats?pretty=true’curl -XGET ‘http://localhost:9201/_nodes/process’curl -XGET ‘http://localhost:9201/_nodes/_all/process’curl -XGET ‘http://localhost:9201/_nodes/192.168.1.2,192.168.1.3/jvm,process’curl -XGET ‘http://localhost:9201/_nodes/192.168.1.2,192.168.1.3/info/jvm,process’curl -XGET ‘http://localhost:9201/_nodes/192.168.1.2,192.168.1.3/_allcurl -XGET ‘http://localhost:9201/_nodes/hot_threads
ES-sql简化检索操作,使得会sql操作的人即可使用es进行数据检索。
地址:
http://47.94.18.202:9201/_plugin/sql/
更新与删除操作
update curl -XPUT localhost:9201/films/md/1 -d { …(data)… }
curl -XPUT http://localhost:9201/changzhijun/changzhijun/1 -d ‘{
“first_name” : “John2”,
“last_name” : “Smith2”,
“age” : 25,
“about” : “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}’
Delete
curl -XDELETE localhost:9201/changzhijun/changzhijun/1
脑裂问题
由于某些节点的失效,部分节点的网络连接会断开,并形成一个与原集群一样名字的集群,这种情况成为集群脑裂(split-brain)现象。这个问题非常危险,因为两个新形成的集群会同时索引和修改集群的数据。
ES集群脑裂可能导致的原因:1. 网络: 由于是内网通信, 网络通信问题造成某些节点认为 master 死掉, 而另选 master的可能性较小; 进而检查 Ganglia 集群监控, 也没有发现异常的内网流量, 故此原因可以排除。内网一般不会出现es集群的脑裂问题,可以监控内网流量状态。外网的网络出现问题的可能性大些。
2. 节点负载: 由于 master 节点与 data 节点都是混合在一起的, 所以当工作节点的负载较大( 确实也较大) 时, 导致对应的 ES 实例停止响应, 而这台服务器如果正充当着 master节点的身份, 那么一部分节点就会认为这个 master 节点失效了, 故重新选举新的节点, 这时就出现了脑裂; 同时由于 data 节点上 ES 进程占用的内存较大, 较大规模的内存回收操作也能造成 ES 进程失去响应。 所以, 这个原因的可能性应该是最大的。
3、回收内存
由于data节点上es进程占用的内存较大,较大规模的内存回收操作也能造成es进程失去响应。
当脑裂发生后, 唯一的修复办法是解决这个问题并重启集群。 这儿有点复杂和可怕。 当elasticsearch 集群启动时, 会选出一个主节点( 一般是启动的第一个节点被选为主) 。 由于索引的两份拷贝已经不一样了, elasticsearch 会认为选出来的主保留的分片是“主拷贝”并将这份拷贝推送给集群中的其他节点。 这很严重。 让我们设想下你是用的是 node 客户端并且一个节点保留了索引中的正确数据。 但如果是另外的一个节点先启动并被选为主, 它会将一份过期的索引数据推送给另一个节点, 覆盖它, 导致丢失了有效数据。