搜索神器Elasticsearch的最佳使用实践
Posted 云时代架构
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索神器Elasticsearch的最佳使用实践相关的知识,希望对你有一定的参考价值。
01
Elasticsearch的配置说明
在Elasticsearch安装目录下的conf文件夹中包含了一个重要的配置文件:elasticsearch.yml。
Elasticsearch的配置信息有很多种,大部分配置都可以通过elasticsearch.yml和接口的方式进行。下面我们列出一些比较重要的配置信息。
cluster.name:elasticsearch:配置Elasticsearch的集群名称,默认值是elasticsearch,建议改成与所存数据相关的名称,Elasticsearch会自动发现在同一网段下的集群名称相同的节点。
node.name: "node1":集群中的节点名,在同一个集群中不能重复。节点的名称一旦设置,就不能再改变了。当然,也可以设置成服务器的主机名称,例如node.name:${HOSTNAME}。
node.master: true:指定该节点是否有资格被选举成为Master节点,默认是true,如果被设置为true,则只是有资格成为Master节点,具体能否成为Master节点,需要通过选举产生。
node.data:true:指定该节点是否存储索引数据,默认为true。数据的增、删、改、查都是在Data节点完成的。
index.number_of_shards:5:设置默认的索引分片个数,默认为5片。也可以在创建索引时设置该值,具体设置为多大的值要根据数据量的大小来定。如果数据量不大,则设置成1时效率最高。
index.number_of_replicas: 1:设置默认的索引副本个数,默认为1个。副本数越多,集群的可用性越好,但是写索引时需要同步的数据越多。
path.conf:/path/to/conf:设置配置文件的存储路径,默认是Elasticsearch目录下的conf文件夹。建议使用默认值。
path.data:/path/to/data1,/path/to/data2:设置索引数据的存储路径,默认是Elasticsearch根目录下的data文件夹。切记不要使用默认值,因为若Elasticsearch进行了升级,则有可能导致数据全部丢失。可以用半角逗号隔开设置的多个存储路径,在多硬盘的服务器上设置多个存储路径是很有必要的。
path.logs: /path/to/logs:设置日志文件的存储路径,默认是Elasticsearch根目录下的logs文件夹,建议修改到其他地方。
path.plugins: /path/to/plugins:设置第三方插件的存放路径,默认是Elasticsearch根目录下的plugins文件夹。
bootstrap.mlockall: true:设置为true时可锁住内存。因为当JVM开始swap时,Elasticsearch的效率会降低,所以要保证它不swap。
network.host: 192.168.0.1:用于同时设置bind_host和publish_host这两个参数。
http.port: 9200:设置对外服务的HTTP端口,默认为9200。Elasticsearch的节点需要配置两个端口号,一个是对外提供服务的端口号,一个是集群内部通信使用的端口号。http.port设置的是对外提供服务的端口号。注意,如果在一个服务器上配置多个节点,则切记对端口号进行区分。
transport.tcp.port: 9300:设置集群内部的节点间交互的TCP端口,默认是9300。注意,如果在一个服务器上配置多个节点,则切记对端口号进行区分。
transport.tcp.compress: true:设置在节点间传输数据时是否压缩,默认为false,不压缩。
discovery.zen.minimum_master_nodes:1:设置在选举Master节点时需要参与的最少的候选主节点数,默认为1。如果使用默认值,则当网络不稳定时有可能会出现脑裂。合理的数值为(master_eligible_nodes/ 2) + 1,其中master_eligible_nodes表示集群中的候选主节点数。
discovery.zen.ping.timeout: 3s:设置在集群中自动发现其他节点时ping连接的超时时间,默认为3秒。在较差的网络环境下需要设置得大一点,防止因误判该节点的存活状态而导致分片的转移。
02
常用的接口
虽然现在有很多开源软件对Elasticsearch的接口进行了封装,使我们可以很方便、直观地监控集群的状况,但是在Elasticsearch 5以后,很多监控软件开始收费。了解常用的接口有助于我们在程序或者脚本中查看我们的集群情况,以下接口适用于Elasticsearch 5.1.0版本。
1.索引类接口
通过下面的接口创建一个索引名称为indexname且包含3个分片、1个副本的索引。
curl -XPUT 'localhost:9200/indexname?pretty' -H 'Content-Type: application/ json' -d'
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}'
通过下面的接口删除索引。
curl -XDELETE ' localhost:9200/indexname '
通过该接口就可以删除索引名称为indexname的索引。
通过下面的接口可以删除多个索引。
curl -XDELETE 'localhost:9200/indexname1, indexname2 '
curl -XDELETE ' localhost:9200/indexname*'
通过下面的接口可以删除集群下的全部索引。
curl -XDELETE ' localhost:9200/_all'
curl -XDELETE ' localhost:9200/* '
进行全部索引的删除是很危险的,我们可以通过在配置文件中添加下面的配置信息,来关闭使用_all和使用通配符删除索引的接口,使删除索引只能通过索引的全称进行。
action.destructive_requires_name:true
通过下面的接口获取索引的信息,其中,pretty参数用于格式化输出结果,以便更容易阅读。
curl -XGET ' localhost:9200/indexname?pretty'
通过下面的接口关闭、打开索引。
curl -XPOST ' localhost:9200/indexname/_close'
curl -XPOST ' localhost:9200/indexname/_open'
通过下面的接口获取一个索引中具体type的mapping映射。
curl -XGET ' localhost:9200/indexname/typename/_mapping?pretty'
当一个索引中有多个type时,获得mapping时要加上typename。
通过下面的接口获取索引中一个字段的信息。
curl -XGET 'localhost:9200/indexname/indexname/_mapping/field/fieldname'
通过下面的接口为索引添加别名(_alias)。
curl -XPUT ' localhost:9200/indexname/_alias/aliasname?pretty'
以上接口为索引indexname添加了别名aliasname,添加成功后可以通过别名或索引名访问该索引。
通过下面的接口对索引别名进行批量操作(_aliases)。
curl -XPOST ' localhost:9200/_aliases?pretty'-H 'Content-Type: application/json' -d'{
"actions": [
{ "remove": {"index": "indexname", "alias":"aliasname" }},
{ "add": { "index": "indexname", "alias": "newalias" }}
]
}'
通过_aliases接口对索引的别名进行添加和移除,remove表示移除,add表示添加。可以同时对多个索引进行操作。
通过下面的接口获取索引的settings。
curl -XGET'localhost:9200/indexname/_settings?pretty'
settings是索引级别的,不需要添加typename。
通过下面的接口进行分析(分析某个字段是如何建立索引的)。
curl-XGET 'localhost:9200/indexname/_analyze?pretty' -H 'Content-Type:application/json' -d'{
"field": "fieldname",
"text": "使用fieldname分词的数据"
}'
该接口返回的是对字符串“使用fieldname分词的数据”使用fieldname的分词方式。
通过下面的接口清除索引上的缓存。
curl-XPOST 'localhost:9200/indexname/_cache/clear?pretty'
通过下面的接口刷新(flush)索引。
curl-XPOST 'localhost:9200/indexname/_flush?pretty'
通过下面的接口刷新(refresh)索引。
curl-XPOST 'localhost:9200/indexname/_refresh ?pretty'
通过下面的接口对索引进行优化:
curl-XPOST 'localhost:9200/indexname/_forcemerge?pretty'
在Elasticsearch5.x之后的版本中使用_forcemerge替换了_optimize命令。
2.cat接口
cat命令提供了一系列的Elasticsearch集群状态的查询接口。通过执行curl-XGET localhost: 9200/_cat 获取所有的_cat命令:
/_cat/aliases
/_cat/aliases/{alias}
/_cat/templates
/_cat/health
/_cat/nodes
/_cat/allocation
/_cat/count
/_cat/count/{index}
/_cat/indices
/_cat/indices/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/pending_tasks
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}/_cat/tasks
/_cat/nodeattrs
/_cat/master
/_cat/snapshots/{repository}
/_cat/segments
/_cat/segments/{index}
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/shards
/_cat/shards/{index}
/_cat/plugins
/_cat/repositories
在上述接口中可以添加的参数如下。
参数v(verbose):让输出的信息显示表头信息。
curl -XGET 'localhost:9200/_cat/master?v'
id host ip node
xLslDXvxQHKVnWCKJROG7g 192.168.0.75 192.168.0.75 vm75
如果不添加参数v,则不显示上面的表头信息“id”“host”“ip”“node”。
参数help:输出该命令可以显示的列。
curl -XGET 'localhost:9200/_cat/master?help'
id | |node id
host | h |host name
ip | |ip address
node | n |node name
在上述结果中,第1列表示_cat/master命令可以返回的字段名称,第2列是简称,第3列是字段的描述。
参数h:可以指定返回的字段。
$ curl -XGET 'localhost:9200/_cat/master?v&h=host,ip,node'
host ip node
192.168.0.75 192.168.0.75 vm75
3.查看集群的状态
查看集群健康状态的接口。
curl -XGET 'localhost:9200/_cluster/health?pretty'
curl -XGET ' localhost:9200/_cluster/health?level=indices&pretty'
curl -XGET ' localhost:9200/_cluster/health?level=shards&pretty'
接口1是集群的状态;接口2不仅包含集群的状态,还包含索引级的状态;接口3是更细粒度的分片级的状态。
查看集群状况的接口(_cluster/state)。
curl -XGET 'localhost:9200/_cluster/state?pretty'
查看集群统计信息的命令(_cluster/stats)。
curl-XGET 'localhost:9200/_cluster/stats?pretty'
在返回的结果中包含了在集群中包含的索引个数、节点信息、分片信息、内存信息、CPU信息、缓存信息等。
查看一个索引的统计信息的命令。
curl -XGET ' localhost:9200/indexname/_stats?pretty'
返回一个索引的各项统计信息,包括:索引的大小、数据条数、查询次数、查询耗时、分片数、merger数、刷新次数(flush和refresh)、查询缓存的大小等跟索引相关的统计信息。
查看集群挂起的任务接口(_cluster/pending_tasks),并返回集群中待执行的任务。
curl -XGET 'localhost:9200/_cluster/pending_tasks?pretty'
4.查看节点的状态
查看节点信息的接口。
curl -XGET ' localhost:9200/_nodes?pretty'
返回集群中各个节点的详细信息例如:集群名称、节点名称、节点所在服务器的操作系统、JVM、用到的Elasticsearch模块等节点信息。
查看节点统计信息的接口。
curl -XGET ' localhost:9200/_nodes/stats?pretty'
返回集群中各个节点的统计信息,例如:查询次数、写索引次数、merge 次数及耗时、索引大小、分片数等统计信息。
curl -XGET 'localhost:9200/_nodes/{nodeID}/hot_threads?pretty'
Elasticsearch虽然提供的接口功能非常强大,但是在使用上并不是很友好,本书的作者之一刘淏开源了两个Elasticsearch插件sp-console和sp-tools。
sp-console(https://github.com/psfu/es-sp-console)封装了cat的命令,体验非常友好,在使用上完全仿照Linux的界面,可以查看历史的查询结果及出错信息,并支持上下键切换历史命令等。
sp-tools(https://github.com/psfu/es-sp-tools)是一个权限和日志管理工具,可以通过Cookie中的密钥来维护登录状态,插件支持IP白名单和黑名单,也可以通过sp-console来控制其启动与关停,更新IP白名单和黑名单等信息;其日志记录模块经过大量优化,对系统占用非常友好。
这两个插件现在已经在多个公司的正式环境下使用。如果有兴趣,则可以参与升级和维护。
- End -
推荐阅读
以上是关于搜索神器Elasticsearch的最佳使用实践的主要内容,如果未能解决你的问题,请参考以下文章
以图搜图 最佳实践阿里云 Elasticsearch 向量检索4步搭建“以图搜图”搜索引擎,