一、基本概念
节点(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个主分片,一份从分片模式
扩展方式:
纵向扩展:购买更好的服务器
横向扩展:通过增加节点来均摊负载和增加可靠性。
Elasticsearch虽然能从更强大的硬件中获得更好的性能,但是纵向扩展有它的局限性。所以推荐使用横向扩展
集群健康:
有三种状态:green
、yellow
或red
。
颜色 | 意义 |
---|---|
green | 所有主要分片和从分片都可用 |
yellow | 所有主要分片可用,但不是所有从分片都可用 |
red | 不是所有的主要分片都可用 |
故障转移:
假如当前情况为如下图,3个节点(node),3个主分片,2份从分片,NODE1为master
我们模拟测试杀掉主节点NODE1。一个集群必须要有一个主节点才能使其功能正常,所以集群做的第一件事就是各节点选举了一个新的主节点:Node 2
。
主分片1
和2
在我们杀掉Node 1
时已经丢失,我们的索引在丢失主分片时不能正常工作。如果此时我们检查集群健康,我们将看到状态red
:不是所有主节点都可用!
幸运的是丢失的两个主分片的完整拷贝存在于其他节点上,所以新主节点做的第一件事是把这些在Node 2
和Node 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的核心模块在未来将会更多的进行模块化处理。脚本语 言,现在预定义提供一个白名单列表,这些脚本不能读写文件,不能打开远程的连接。默认情况下,都不准许插件有特殊权限,否则必须事先声明这些权限。同时在插件安装时将会被警告有特殊权限的要求,这个时候你可以根据需要确认是否移除这些插件。
参考资料: