上述的节点属性可以根据实际的情况来进行配置。如果只有三台配置一般的服务器,在测试环境可以将master节点和datanode节点共用,也就是 node.master: true 并且 node.data: true ;在生产环境中,最好将节点分离,特别是masternode和datanode,哪怕是用配置非常差的服务器安装masternode。至于clientnode则需要看情况,如果有大量的查询,并且有很多的聚合分析查询的话,可以部署;ingestnode这个也是看具体的情况,如果有使用ingest等api的情况,也可以进行部署。至于集群规划这个我们在后续的文章中再来讲解。
索引(index)索引是Elasticsearch对逻辑数据的逻辑存储,所以它可以分为更小的部分。你可以把索引看成关系型数据库的表。然而,索引的结构是为快速有效的全文索引准备的,特别是它不存储原始值。如果你知道MongoDB,可以Elasticsearch的索引看成MongoDB里的一个集合。如果你熟悉CouchDB,可以把索引看成CouchDB数据库索引。Elasticsearch可以把索引存放在一台机器或者分散在多台服务器上,每个索引有一或多个分片(shard),每个分片可以有多个副本(replica)。
根据将ElasticSearch和传统关系型数据库作比较的话如下类比表:
Relational DB -> Databases -> Tables -> Rows -> Columns Elasticsearch -> Indices -> Types -> Documents -> Fields但是根据最新的ElasticSearch7.x中已经将Types移除了,并且在日常的使用中,我建议最好把一个索引(index)当做数据库的一张表来使用,类型(type)除了必要的情况,最好无视它,将它和索引库名设置一样即可。
这里顺便再来说下创建索引库的结构。我们知道在关系型数据库中需要创建表才能添加数据,但是在ElasticSearch中可以直接插入数据,它会根据你的第一条数据来自动创建索引库的结构, 但是这种在很多情况下是不符合我们要求的。如果我们想自己进行创建的话,那么就有必要了解一下index的setting和mapping了。
setting
setting可以理解为管理这个index的一些重要属性的,比如分片(shard)和副本(replica),它决定这个索引库最终的配置形态。初学者的话,可以只用管这三个配置参数即可:
number_of_shards: 是设置的分片数,设置之后无法更改!
refresh_interval: 是设置es缓存的刷新时间,如果写入较为频繁,但是查询对实时性要求不那么高的话,可以设置高一些来提升性能。可以更改
number_of_replicas : 是设置该索引库的副本数,建议设置为1以上。
mapping
mapping可以理解为关系型数据库的表结构,指定字段的类型。初学者可以先只用关心text、keyword、byte、short、integer、long、float、double、boolean、date这几个字段,其中text和keyword都是string类型,选择区分很简单,需要进行分词用text,不需要并且进行排序或聚合的可以用keyword。
分片(shard)分片是一个单一的Lucene实例。这个是由Elasticsearch管理的比较底层的功能。索引是指向主分片和副本分片的逻辑空间。对于使用,只需要指定分片的数量,其他不需要做过多的事情。在开发使用的过程中,我们对应的对象都是索引,Elasticsearch会自动管理集群中所有的分片,当发生故障的时候,一个Elasticsearch会把分片移动到不同的节点或者添加新的节点。
主分片(primary shard):每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中。默认情况下,一个索引有5个主分片。你可以在事先制定分片的数量,当分片一旦建立,分片的数量则不能修改。
副本分片(replica shard):每一个分片有零个或多个副本。副本主要是主分片的复制,其中有两个目的:
1、增加高可用性:当主分片失败的时候,可以从副本分片中选择一个作为主分片。
2、提高性能:当查询的时候可以到主分片或者副本分片中进行查询。默认情况下,一个主分配有一个副本,但副本的数量可以在后面动态的配置增加。副本必须部署在不同的节点上,不能部署在和主分片相同的节点上。
分片设置很重要!一个index指定了分片之后是无法修改的,因此在设置分片的时候一定要事前做好规划!