拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux入门攻坚——87、ELK Stack-2-Elasticsearch安装使用

Elasticsearch是基于Lucene实现索引和搜索的一个分布式集群系统分布式是以索引的分片即shard来实现的辅以副本技术实现高性能和高并发处理。Gateway是Elasticsearch用来存储索引的文件系统支持多种文件系统Local FileSystem是本地的文件系统Shared FileSystem是共享存储也可以是Hadoop的HDFS一类的分布式存储也可以存储在Amazon S3云服务上。Gateway上层是一个分布式的Lucene框架Elasticsearch的底层API是由Lucene提供的每个Elasticsearch节点上都有一个Lucene引擎的支持。Lucene之上是Elasticsearch的模块包括索引模块、搜索模块、映射解析模块等River模块相当于第三方插件用于导入第三方数据源。Elasticsearch模块之上是Discovery、Scripting和第三方插件。Discovery是Elasticsearch的节点发现模块不同机器上的Elasticsearch节点要组成集群需要进行消息通信集群内部需要选举master节点这些功能都由Discovery模块完成。Scripting用来支持JavaScript、python等多种语言。再上层是Elasticsearch的传输模块和JMX。传输模块支持Thrift、Memcached、HTTP默认使用HTTP传输JMXJava Management Extensions是Java的管理框架用来管理Elasticsearch应用。最上层是Elasticsearch提供给用户的接口通过RESTFul API和Elasticsearch集群进行交互。安装Elasticsearch1、JDK安装Oracle JDK或OpenJDKElasticsearch需要Java语言支持需要安装JDK运行java查看其版本如果没有安装查看安装包系统盘中带有各种版本的java这里使用java1.8.0yum install java-1.8.0-openjdkyum install java-1.8.0-openjdk-devel关键点‌如果你只安装 java-1.8.0-openjdk系统中会有 java 命令但‌没有‌ javac 命令。许多依赖 Java 生态的工具包括某些版本的 Elasticsearch 及其插件在安装或运行时需要完整的 JDK 环境因此推荐安装 -devel 版本以确保兼容性。安装完毕后有/usr/bin/java程序查看其/usr/bin/java是一个两级链接文件如果有多种不同的版本只需修改/etc/alternatives/java链接即可方便切换版本。需要在环境变量中设置JAVA_HOME环境变量/etc/profile.d/java.shexport JAVA_HOME/usr2、安装Elasticsearch下载需要的Elasticsearch对应版本的安装包这里使用elasticsearch-5.6.16.rpmyum install elasticsearch-5.6.16.rpm3、配置Elasticsearch在/etc/elasticsearch/下有配置文件elasticsearch.yml默认给出的配置文件如下# Elasticsearch Configuration # NOTE: Elasticsearch comes with reasonable defaults for most settings. # Before you set out to tweak and tune the configuration, make sure you # understand what are you trying to accomplish and the consequences. # The primary way of configuring a node is via this file. This template lists # the most important settings you may want to configure for a production cluster. # Please consult the documentation for further information on configuration options: # https://www.elastic.co/guide/en/elasticsearch/reference/index.html # ---------------------------------- Cluster ----------------------------------- # Use a descriptive name for your cluster: #cluster.name: my-application # ------------------------------------ Node ------------------------------------ # Use a descriptive name for the node: #node.name: node-1 # Add custom attributes to the node: # ----------------------------------- Paths ------------------------------------ # Path to directory where to store the data (separate multiple locations by comma): #path.data: /path/to/data # Path to log files: #path.logs: /path/to/logs # ----------------------------------- Memory ----------------------------------- # Lock the memory on startup: #bootstrap.memory_lock: true # Make sure that the heap size is set to about half the memory available # on the system and that the owner of the process is allowed to use this # limit. # Elasticsearch performs poorly when the system is swapping the memory. # ---------------------------------- Network ----------------------------------- # Set the bind address to a specific IP (IPv4 or IPv6): #network.host: 192.168.0.1 # Set a custom port for HTTP: #http.port: 9200 # For more information, consult the network module documentation. # --------------------------------- Discovery ---------------------------------- # Pass an initial list of hosts to perform discovery when new node is started: # The default list of hosts is [127.0.0.1, [::1]] #discovery.zen.ping.unicast.hosts: [host1, host2] # Prevent the split brain by configuring the majority of nodes (total number of master-eligible nodes / 2 1): #discovery.zen.minimum_master_nodes: 3 # For more information, consult the zen discovery module documentation. # ---------------------------------- Gateway ----------------------------------- # Block initial recovery after a full cluster restart until N nodes are started: #gateway.recover_after_nodes: 3 # For more information, consult the gateway module documentation. # ---------------------------------- Various ----------------------------------- # Require explicit names when deleting indices: #action.destructive_requires_name: true其分为几个部分分别配置cluster、node、Paths、memory、network、discovery、Gateway、various等。如果是单节点运行可以不做修改直接运行但是这样容易混淆一般至少修改集群名字节点名字这里修改为cluster.name: elastic-dynode.name: node-brpath.data:/var/elasticsearchES的默认端口参与集群的事务9300/tcptransport.tcp.port接收请求9200/tcphttp.port4、启动Elasticsearchsystemctl daemon-reloadSystemctl start elasticsearch.service访问可以看到并没有形成集群修改配置文件中的network配置只加入了两个节点在 Elasticsearch 5.6.16 集群中如果配置了三个节点但 _cat/nodes 或集群状态只显示两个通常意味着‌第三个节点未能成功加入集群‌。这并非正常现象而是由配置错误、网络问题或主节点选举机制导致的。以下是导致该问题的常见原因及排查步骤检查“脑裂”防护配置 (minimum_master_nodes)这是 ES 5.x 版本最常见的问题。如果discovery.zen.minimum_master_nodes设置不当可能导致集群分裂或节点无法加入。‌原理‌该参数规定当选主节点所需的最小投票数。公式为 (具有 master 资格的节点数 / 2) 1。‌场景分析‌如果你有 3 个节点都配置了 node.master: true则该值必须设为 ‌2‌。如果设置为 1当网络波动时可能产生两个主节点脑裂导致部分节点归属不同子集群从而在查询时看似“少了一个节点”实际上它在另一个子集群里。如果设置为 3则只要有一个节点宕机或网络不通整个集群就无法选出主节点所有节点都可能处于非活跃状态。本次配置没有指定node.master默认应该node.master都为true所以此时discovery.zen.minimum_master_nodes应设置为2修改后5、与Elasticsearch交互Elasticsearch提供RESTFul API来与Elasticsearch交互。ES访问接口9200/tcpRESTFul API:四类API:(1) 检查集群、节点、索引等健康与否以及获取其相应状态(2) 管理集群、节点、索引及元数据(3) 执行CRUD操作(4) 执行高级操作例如paging, filtering等curl -XVERB PROTOCOL://HOST:PORT/PATH?QUERY_STRING -d BODYVERB: GET, PUT, DELETE等PROTOCOL: http, httpsQUERY_STRING查询参数例如?pretty表示用易读的JSON格式输出BODY: 请求的主体_cat API直接使用如_clusterCluster API- Cluster HealthGET _cluster/healthGET /_cluster/health/test1,test2GET /_cluster/health?wait_for_statusyellowtimeout50s- Cluster statecurl -XGET http://localhost:9200/_cluster/statecurl -XGET http://localhost:9200/_cluster/state/{metrics}/{indices}- Cluster statscurl -XGET http://localhost:9200/_cluster/stats?humanpretty其他的Cluster API还有具体用法可以看帮助文档- Pending cluster tasks- Cluster Reroute- Cluster Update Settings- Nodes Stats- Nodes Info- Remote Cluster Info- Task Management API- Nodes hot_threads- Cluster Allocation Explain APIES的插件Plugins插件扩展ES的功能添加自定义的映射类型、自定义分析器、本地脚本、自定义发现方式安装插件- 直接将插件放置于plugins目录/usr/share/elasticsearch/plugins- 使用plugin脚本进行安装/usr/share/elasticsearch/bin/elasticsearch-plugin早期版本使用名称叫做plugin高版本改为了elasticsearch-plugin除了命令更名Elasticsearch 5.x 对插件 ZIP 包的结构也有新要求所有插件文件必须包含在一个名为 elasticsearch 的顶级目录中。如果是通过 elasticsearch-plugin install 在线安装工具会自动处理这些结构如果是手动下载 ZIP 包安装需确保解压后的目录结构符合规范通常建议直接使用命令行安装以避免结构错误。早期版本的插件marvel、head、bigdesk、kopfElasticsearch 从 5.0 版本开始进行了重大架构调整移除了对“站点插件”即直接嵌入 ES 进程并提供 Web UI 的插件的支持。以下是各插件在 5.6.16 中的具体状态及替代方案Marvel → 已整合进 X-Pack状态不存在独立插件。说明Marvel 是 Elastic 官方推出的监控插件。在 ES 5.x 系列中Marvel 的功能被完全整合进了 X-Pack 扩展包中。替代方案安装并启用 X-PackES 5.6.16 内置但需配置 License。开启 xpack.monitoring.enabled: true 后通过 Kibana 的 Monitoring 模块查看集群监控数据。这是官方推荐的唯一监控路径。Head → 已不再作为插件支持需独立部署状态不能作为插件安装bin/elasticsearch-plugin install mobz/elasticsearch-head 会失败。说明Head 插件依赖 ES 的站点插件机制该机制在 5.0 中被移除。替代方案方案 A推荐使用 Cerebro。这是一个功能类似且 actively maintained积极维护的开源集群管理工具支持 ES 5.x/6.x/7.x。方案 B保留 Head将 Head 作为一个独立的 Node.js 应用运行从 GitHub 下载源码或 Docker 镜像然后在 elasticsearch.yml 中开启 CORS跨域资源共享yamlhttp.cors.enabled: truehttp.cors.allow-origin: * # 生产环境建议指定具体 IP然后通过浏览器访问独立运行的 Head 服务来连接 ES 集群。Bigdesk → 已不再作为插件支持需独立部署状态不能作为插件安装。说明Bigdesk 同样依赖站点插件机制。替代方案方案 A推荐使用 Cerebro 或 Kibana Dev Tools。方案 B保留 Bigdesk与 Head 类似Bigdesk 可以作为一个独立的静态 Web 服务运行例如通过 Python SimpleHTTPServer 或 Nginx 托管其 HTML/JS 文件。同样需要在 ES 中开启 CORS 配置以便前端页面能跨域请求 ES 的 REST API。Kopf → 已彻底弃用x-pack的安装bin/elasticsearch-plugin install file:///path/to/file/x-pack-5.6.16.zipElasticsearch的Documents API即CRUD API又分为几种类型的APISingle document APIs- Index API- Get API- Delete API- Update APIMulti-document APIs- Multi Get API- Bulk API- Delete By Query API- Update By Query API- Reindex APIIndex API PUT指令 curl -XPUT PUT twitter/tweet/1{user : kimchy,post_date : 2009-11-15T14:12:12,message : trying out Elasticsearch}创建一个文档同时也创建了索引和类型POST方法创建更新使用POST以及后跟_update请求体中使用doc直接指定字段进行修改还可以使用script对字段执行计算修改等删除文档DELETE删除索引DELETEcurl -XDELETE http://192.168.147.140:9200/students查询数据Query APIQuery DSLDomain Specific Languagebased on JSON to define queries。用户实现诸多类型的查询操作如simple term queryphraserange booleanfuzzy等ES的查询操作执行分为两个阶段分散阶段合并阶段查询方式向ES发起查询请求的方式有两种1、通过RESTFul request API查询也称query string2、通过发送REST request body进行curl -XGET http://192.168.147.140:9200/students/_search?pretty这是单索引查询curl -XGET http://192.168.147.140:9200/_search?pretty这是所有索引查询curl -XGET http://192.168.147.140:9200/s*t*/_search?pretty多索引查询带通配符Mapping和AnalysisES对每一个文档会取得其所有域的所有值生成一个名为“_all”的域执行查询时如果在query_string未指定查询的域则在_all域上执行查询操作区别如下两条curl -XGET http://192.168.147.140:9200/students/_search?qGuocurl -XGET http://192.168.147.140:9200/students/_search?qlast_name:Guo第一条表示在_all域搜索第二条表示在指定的域上搜索这里是last_name域访问mapping查看指定字段类型curl -XGET http://192.168.147.140:9200/_mapping/class1?prettyES中搜索的数据广义上可被理解为两类types:exactfull-text精确值指未经加工的原始值在搜索时进行精确匹配full-text用于引用文本中数据判断文档在多大程序上匹配查询请求即评估文档与用户请求查询的相关度为了完成full-text搜索ES必须首先分析文本并创建出倒排索引倒排索引中的数据还需进行“正规化”为标准格式即分词和正规化这两步就是分析。分析需要由分析器进行analyzer分析器由三个组件构成字符过滤器、分词器、分词过滤器ES内置的分析器Standard analyzerSimple analyzerWhitespace analyzerLanguage analyzer分析器不仅在创建索引时用到在构建查询时也会用到Query DSLrequest body分成两类query dsl执行full-text查询时基于相关度来评判其匹配结果查询执行过程复杂且不会被缓存filter dsl执行exact查询时基于其结果为“yes”或“no”进行评判速度快且结果缓存Filter DSLterm filter 精确匹配包含指定term的文档terms filter用于多值精确匹配range filters用于在指定的范围内查找数值或时间。boolean filter基于boolean的逻辑来合并多个filter子句must其内部所有的子句条件必须同时匹配即andmust_not其所有子句必须不匹配即notshould至少有一个子句匹配即orQUERY DSLmatch_all Query用于匹配所有文档没有指定任何query默认即为match_all query.match Query在几乎任何域上执行full-text或exact-value查询如果执行full-text查询首先对查询时的语句做分析如果执行exact-value查询搜索精确值此时建议使用过滤而非查询multi_match Query用于在多个域上执行相同的查询bool query基于boolean逻辑合并多个查询语句与bool filter不同的是查询子句不是返回yes或no而是其计算出的匹配度分值。因此boolean Query会为各子句合并其score查询语句语法检查GET /INDEX/_validate/query?pretty{...}GET /INDEX/_validate/query?explainpretty{...}ES的增删改查就像关系型数据库的SQL操作一样是很复杂的操作相比SQLES的更加复杂多样这里只是就最简单的使用进行了解最初级的入门。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门