查看原文
其他

搜索神器Elasticsearch的最佳使用实践

李海亮 云时代架构 2019-05-09
    选择“置顶公众号”,精品文章第一时间送达!


相关阅读:学习搜索必须先了解的Lucene知识

                  搜索是神器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.bind_host: 192.168.0.1:设置本节点绑定的IP地址,IP地址类型是IPv4IPv6,默认为0.0.0.0

  • network.publish_host: 192.168.0.1:设置其他节点和该节点交互的IP地址,如果不设置,则会进行自动判断。

  • network.host: 192.168.0.1:用于同时设置bind_hostpublish_host这两个参数。

  • http.port: 9200:设置对外服务的HTTP端口,默认为9200Elasticsearch的节点需要配置两个端口号,一个是对外提供服务的端口号,一个是集群内部通信使用的端口号。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'
  • 通过下面的接口获取一个索引中具体typemapping映射。

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命令。

2cat接口

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数、刷新次数(flushrefresh)、查询缓存的大小等跟索引相关的统计信息。

  • 查看集群挂起的任务接口(_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'

返回集群中所有节点的热线程,如果加上node id,则返回该节点的热线程。


Elasticsearch虽然提供的接口功能非常强大,但是在使用上并不是很友好,本书的作者之一刘淏开源了两个Elasticsearch插件sp-consolesp-tools

  • sp-consolehttps://github.com/psfu/es-sp-console)封装了cat的命令,体验非常友好,在使用上完全仿照Linux的界面,可以查看历史的查询结果及出错信息,并支持上下键切换历史命令等。

  • sp-toolshttps://github.com/psfu/es-sp-tools)是一个权限和日志管理工具,可以通过Cookie中的密钥来维护登录状态,插件支持IP白名单和黑名单,也可以通过sp-console来控制其启动与关停,更新IP白名单和黑名单等信息;其日志记录模块经过大量优化,对系统占用非常友好。


这两个插件现在已经在多个公司的正式环境下使用。如果有兴趣,则可以参与升级和维护。


本文节选自即将出版的《可伸缩服务架构:框架与中间件》一书,作者:李艳鹏、杨彪、李海亮、贾博岩、刘淏。


- End -

推荐阅读

搜索是神器Elasticsearch入门介绍

SpringBoot技术栈搭建个人博客【前台开发/项目总结】

从零开始学设计模式(二)--抽象工厂模式,单例模式,建造者模式及原型模式

阿里巴巴 Apache Dubbo 布道师谈 Service Mesh

微服务之服务调用与安全控制

拜托!面试请不要再问我Spring Cloud底层原理

支付系统

支付公司账务系统的那些事

从支付宝SDK的支付流程理解什么是公钥和私钥,什么是加密和数字签名

支付对账系统怎么设计?

如何健壮你的后端服务

阿里首席架构师分享的Java工程师职业规划

【推荐书籍】




      

        扫码购买




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存