一、基本概念

节点(node)是一个运行着的Elasticsearch实例。

 集群(cluster)是一组具有相同cluster.name的节点集合,他们协同工作,共享数据并提供故障转移和扩展功能,当然一个节点也可以组成一个集群。集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无 中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。

一个节点(node)就是一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成,它们具有相同的cluster.name,它们协同工作,分享数据和负载。当加入新的节点或者删除一个节点时,集群就会感知到并平衡数据。

在Elasticsearch中存储数据的行为就叫做索引(indexing) ,文档归属于一种类型(type),而这些类型存在于索引(index)中 。

  • 索引(名词) 如上文所述,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices 或indexes。

  • 索引(动词) 「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的INSERT关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。

  • 倒排索引 传统数据库为特定列增加一个索引,例如B-Tree索引来加速检索。Elasticsearch和Lucene使用一种叫做倒排索引(inverted index)的数据结构来达到相同目的。

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

分片(shard)是Elasticsearch在集群中分发数据的关键。把分片想象成数据的容器。文档存储在分片中,然后分片分配到你集群中的节点上。当你的集群扩容或缩小,Elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。

分片可以是主分片(primary shard)或者是从分片(replica shard)

从分片只是主分片的一个副本,它可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或者从别的shard取回文档。

当索引创建完成的时候,主分片的数量就固定了,但是从分片的数量可以随时调整。

在Elasticsearch中,每一个字段的数据都是默认被索引的

默认情况下,一个索引被分配5个主分片和一个从分片

二、分布式

单播与多播模式:

多播是需要看服务器是否支持的,由于其安全性,其实现在基本的云服务(比如阿里云)是不支持多播的,所以即使你开启了多播模式,你也仅仅只能找到本机上的节点。

单播模式安全,也高效,但是缺点就是如果增加了一个新的机器的话,就需要每个节点上进行配置才生效了。

 默认的方式为多播。

端口说明

     9300:节点之间交互的端口

     9200:数据传输端口

集群模式时,实体颜色的为主分片,暗颜色的为从分片,即备份。下图为5个主分片,一份从分片模式

wKioL1cYbvWSzlAnAAD1jI5nq4I658.png

扩展方式:

纵向扩展:购买更好的服务器

横向扩展:通过增加节点来均摊负载和增加可靠性。

Elasticsearch虽然能从更强大的硬件中获得更好的性能,但是纵向扩展有它的局限性。所以推荐使用横向扩展

集群健康:

有三种状态:greenyellowred

颜色意义
green所有主要分片和分片都可用
yellow所有主要分片可用,但不是所有分片都可用
red不是所有的主要分片都可用


故障转移:

假如当前情况为如下图,3个节点(node),3个主分片,2份从分片,NODE1为master

image2016-4-14%2016%3A11%3A31.png?versio

我们模拟测试杀掉主节点NODE1。一个集群必须要有一个主节点才能使其功能正常,所以集群做的第一件事就是各节点选举了一个新的主节点:Node 2

image2016-4-14%2016%3A13%3A3.png?version

主分片12在我们杀掉Node 1时已经丢失,我们的索引在丢失主分片时不能正常工作。如果此时我们检查集群健康,我们将看到状态red:不是所有主节点都可用!

幸运的是丢失的两个主分片的完整拷贝存在于其他节点上,所以新主节点做的第一件事是把这些在Node 2Node 3上的从分片升级为主分片,这时集群健康回到yellow状态。这个提升是瞬间完成的,就好像按了一下开关。

 

ps:为什么集群健康状态是yellow而不是green?我们有三个主分片,但是我们指定了每个主分片对应两个从分片,当前却只有一个从分片被分配,这就是集群状态无法达到green的原因,不过不用太担心这个:当我们杀掉Node 2,我们的程序依然可以在没有丢失数据的情况下继续运行,因为Node 3还有每个分片的拷贝。如果我们重启Node 1,集群将能够重新分配丢失的从分片,则颜色变为green

 

三、部署安装

安装:

#rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
 

#vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

#yum install elasticsearch    #可指定版本

四、其他

常用配置:

cluster.name: ES_test
node.name: "app25"
node.master: true                                       #master节点是否开启
node.data: false                                        #data节点是否开启
path.data: /data/elasticsearch2.3
network.host: yourip                           #注意填写ip,不要写hostname;
index.number_of_shards: 6
index.number_of_replicas: 0
discovery.zen.ping.multicast.enabled: false             #单播模式,集群成员手动设置;
discovery.zen.ping.unicast.hosts: ["node1_ip:9300","node2_ip:9300","node3_ip:9300","node4_ip:9300"]



插件安装:

介绍两个对于查询你的Elasticsearch中数据非常有用的工具:

/usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf

  访问: http://elasticsearch1:9200/_plugin/kopf

/usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-head

 访问: http://elasticsearch1:9200/_plugin/head


 随着es的普及,对安全的需求越来越多,例如:

  • 账号认证,解决es匿名访问的问题。

  • 授权管理,对不同的账号按照不同维度分配(主要是索引)访问权限。

  • 只读权限,此条需求来源于 :某个Dashboard想分享给其他人,但又不想让其他人有权限修改。

  • 统一认证,单点登录。

 方案选择

  • elasticsearch-http-basic :优点:此方案部署简单快速,可以解决从无到有的过程,实现了账号认证和ip白名单认证功能,缺点:功能单一,只解决了#1需求。

  • kibana-authentication-proxy :优点:此方案是针对kibana实现的认证,优点是该方案支持“ Google OAuth2, BasicAuth(multiple users supported) and CAS Authentication ”解决了需求#4中的单点登录的需求,配合方案#1中的ip白名单能基本解决需求#1和#4.缺点:目前只支持到kibana3。

  • Shield :优点:功能强大,文档丰富。缺点:收费。

  • search-guard :优点:功能丰富的免费模块,能够很好的解决需求中所有问题(除了#4中的单点登录)。缺点:部署和配置稍复杂,文档较少,门槛较高。

 

版本:

ElasticSearch 2.3.0 

版本主要针对Lucene 5.5.0开发,同时修复了大量的2.2版本的bug。

这次更新主要增加了三大特性:重建索引的API,通过查询API,和任务管理API。

ElasticSearch  2.2.0

基于Lucene 5.4.1,修复了Elasticsearch 2.1.2和Elasticsearch 1.7.5版本中存在的很多bug,同时Elasticsearch 2.2.0增加了两个很棒的新功能:查询分析器和增强地理位置字段。这个版本增加了更加严格的安全性和修复了2.1的一个重大bug,就是在分片恢复的时 候会非常缓慢。以及许多其他的错误修复和改进。官方鼓励所有用户升级到此版本。

分析器(Profile API)

利用分析器可以得到查询的详细分 析信息,它可以让你了解和调试查询性能。查询的每一部分都独立的记录了统计时间,如多长时间重写查询,找到匹配的文档以及他们的得分情况。这个当查询慢的 时候就不需要进行猜测为什么这么慢:只要设置profile这个参数为true,你就可以得到最直接的深入的查询分析。

增强地理位置字段

地理位置字段在2.20版本中几乎进行了从写,它利用一个新的紧凑型数据结构存储在Lucene的索引中,可以增加50%的入库效率, 20-50%的查询效率,一半的存储空间和内存的占用以及更简单的映射参数。

对插件和脚本进行更严格的安全性检查

作为安全增强的一部分,Groovy和Lucene的表达式脚本语言已经移出了核心层,现在把他们作为默认的分 布式模块的插件。这样的调整可以控制这些模块的权限,已减少***的***,Elasticsearch的核心模块在未来将会更多的进行模块化处理。脚本语 言,现在预定义提供一个白名单列表,这些脚本不能读写文件,不能打开远程的连接。默认情况下,都不准许插件有特殊权限,否则必须事先声明这些权限。同时在插件安装时将会被警告有特殊权限的要求,这个时候你可以根据需要确认是否移除这些插件。

 

参考资料:

http://es.xiaoleilu.com/