应用开发简介

Elasticsearh简介

Elasticsearch是一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎和分析引擎。设计用于大数据中,能够稳定、可靠、快速地实现实时搜索和分析,并且安装使用的方法十分简单方便。

Elasticsearch相比传统关系数据库,通过时间戳或者精确匹配做过滤的基本功能外,还能够进行全文搜索,处理同义词和根据相关性给文档打分,根据同一份数据生成分析和聚合的结果,在没有大量工作进程的情况下能做到对数据的实时处理。这也是Elasticsearch存在的重要意义。它让你以前所未有的速度处理大数据。

常用概念

基本概念

  • cluster

    代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。Elasticsearch的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看Elasticsearch集群,在逻辑上是个整体,你与任何一个节点的通信和与整个Elasticsearch集群通信是等价的。

  • shards

    代表索引分片,Elasticsearch可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

  • replicas

    代表索引副本,Elasticsearch可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高Elasticsearch的查询效率,Elasticsearch会自动对搜索请求进行负载均衡。

  • recovery

    代表数据恢复或叫数据重新分布,Elasticsearch在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

  • river

    代表Elasticsearch的一个数据源,也是其它存储方式(如:数据库)同步数据到Elasticsearch的一个方法。它是以插件方式存在的一个Elasticsearch服务,通过读取river中的数据并把它索引到Elasticsearch中,官方的river有couchDB、RabbitMQ、Twitter、Wikipedia的。

  • gateway

    代表Elasticsearch索引快照的存储方式,Elasticsearch默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个Elasticsearch集群关闭再重新启动时就会从gateway中读取索引备份数据。Elasticsearch支持多种类型的gateway,有本地文件系统(默认),分布式文件系统和Hadoop的HDFS。

  • discovery.zen

    代表Elasticsearch的自动发现节点机制,Elasticsearch是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

  • Transport

    代表Elasticsearch内部节点或集群与客户端的交互方式,默认内部是使用TCP协议进行交互,同时它支持HTTP协议(json格式)、Thrift、Servlet、Memcached、ZeroMQ等的传输协议(通过插件方式集成)。

  • Index

    这是Elasticsearch存储数据的地方,类似于关系数据库的database。

  • Document type

    类似关系数据库的表,一个index里面只可以有一个Document type。

  • Document

    这个类似关系数据库的一行,每一Document都有一个唯一的ID作为区分;

  • Field

    类似关系数据库的某一列,这是Elasticsearch数据存储的最小单位。

下载客户端

操作场景

您可以执行如下操作来完成运行环境准备。

操作步骤

  1. 确认服务端Elasticsearch组件已经安装,并正常运行。
  2. 下载Elasticsearch客户端程序到本地。
    1. 登录FusionInsight Manager系统。

      在浏览器地址栏中输入访问地址,地址格式为“http://FusionInsight Manager系统的WebService浮动IP地址:8080/web”。

      例如,在IE浏览器地址栏中,输入“http://10.10.10.172:8080/web”。

    2. 单击“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 更多 > 下载客户端”,“客户端类型”勾选“完整客户端”,单击“确定”开始下载客户端,等待下载完成。
    3. 获取并解压缩安装包“FusionInsight_Cluster_<集群ID>_Elasticsearch_Client.tar”。

配置并导入样例工程

概述

背景信息

Elasticsearch客户端安装程序目录中包含了Elasticsearch开发样例工程,将工程导入到IntelliJ IDEA开始样例学习。

前提条件

确保本地PC的时间与FusionInsight集群的时间差要小于5分钟,若无法确定,请联系系统管理员。FusionInsight集群的时间可通过FusionInsight Manager页面右下角查看。

导入Rest Client客户端样例工程

操作步骤

  1. 将在下载的客户端压缩文件包“FusionInsight_Cluster_<集群ID>_Elasticsearch_Client.tar”解压。
  2. 压缩包解压后,在“FusionInsight_Cluster_<集群ID>_Elasticsearch_ClientConfig\Elasticsearch”目录可获取样例工程“elasticsearch-rest-client-example ”。
  3. 在应用开发环境中,导入样例工程到IntelliJ IDEA开发环境。

    1. 选择“File > New > Project from Existing Sources”。
    2. 在显示的“Select File or Directory to Import”对话框中,选择"“elasticsearch-rest-client-example”"文件夹中的“.project”文件,单击“OK”。
    3. 确认后续配置,单击“Next”;如无特殊需求,使用默认值即可。
    4. 选择推荐的JDK版本,单击“Finish”完成导入。
  4. 获取新建用户的认证凭据文件。参考“准备开发用户”获取解压得到的用户user.keytab文件与krb5.conf文件,复制到样例工程的conf目录下,用于在样例工程中进行安全认证。
  5. 在客户端压缩文件包的“FusionInsight_Cluster_<集群ID>_Elasticsearch_ClientConfig\Elasticsearch\config”目录下存在配置文件“es-rest-client-example.properties”,请拷贝该文件的相关参数值赋值给样例工程conf目录下的文件“esParams.properties”。
  6. 在开发环境IntelliJ IDEA中,样例工程的conf目录下,打开文件“esParams.properties”,按需修改如下表1-9中提供的参数。

表1-9 配置说明表

配置名称

默认值

含义

esServerHost

形如ip1:port1,ip2:port2,ip3:port3......

Elasticsearch集群中任意节点IP与该IP节点上已安装的Elasticsearch实例的HTTP端口组合的列表,EsMaster实例除外

connectTimeout

5000

客户端和服务端建立连接的超时时间,以毫秒为单位

socketTimeout

60000

客户端获取服务器响应的超时时间,以毫秒为单位

connectionRequestTimeout

100000

从连接池获取连接的超时时间,以毫秒为单位

isSecureMode

true

客户端是否开启安全模式,true为开启安全模式,false为开启普通模式

principal

esuser@<系统域名>

认证主体

snifferEnable

true

Rest client是否开启嗅探功能,true为开启,false为不开启

customJaasPath

用户自定义jaas.conf文件路径,具体到文件名,不填将自动生成

       7. 确认样例工程conf目录下的“esParams.properties”中的参数“isSecureMode”=“true”,使用安全模式。

说明:

  • 导入样例代码时,加载如果报错,请使用较新的IntelliJ IDEA版本。
  • EsMaster实例的http请求功能已经关闭,esServerHost参数的值中,请不要包含EsMaster实例,即24148端口,否则会导致请求失败。
  • 配置参数“esServerHost”为已安装Elasticsearch集群中任意节点IP与该IP节点上已安装的任意Elasticsearch实例的HTTP端口组合的列表,形如“ip1:port1,ip2:port2,ip3:port3......”。该端口值可以通过以下方式查看:FusionInsight Manager界面选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 配置 > 全部配置”,单击对应实例“端口”,查看对应实例的“SERVER_PORT”参数值。
  • 如果要确认当前Elasticsearch集群是安全模式还是普通模式,请登录Fusioninsight集群界面,选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 配置 > 全部配置”,单击“安全”,找到参数“ELASTICSEARCH_SECURITY_ENABLE”,如果该值为true,则Elasticsearch集群为安全模式,如果为false,则Elasticsearch集群为普通模式。
  • 用户可登录FusionInsight Manager,选择“系统 > 权限 > 域和互信”,“本端域”参数的值即为当前系统域名。例如“本端域”参数为“9427068F-6EFA-4833-B43E-60CB641E5B6C.COM”,则“principal”的值为“esuser@9427068F-6EFA-4833-B43E-60CB641E5B6C.COM”。
  • 用户可通过配置参数“customJaasPath”自定义jaas.conf文件路径,如无该需求,可以不填,将自动生成。
  • 参数“customJaasPath”需要安装了6.5.1.5及以后的补丁才支持。

导入Transport客户端样例工程

操作步骤

  1. 将在下载的客户端压缩文件包“FusionInsight_Cluster_<集群ID>_Elasticsearch_Client.tar”解压。
  2. 压缩包解压后,在“FusionInsight_Cluster_<集群ID>_Elasticsearch_ClientConfig\Elasticsearch”目录可获取样例工程“elasticsearch-transport-client-example ”。
  3. 在应用开发环境中,导入样例工程到IntelliJ IDEA开发环境。
  1. 选择“File > New > Project from Existing Sources”。

  2. 在显示的“Select File or Directory to Import”对话框中,选择"“elasticsearch-transport-client-example”"文件夹中的“.project”文件,单击“OK”。
  3. 确认后续配置,单击“Next”;如无特殊需求,使用默认值即可。
  4. 选择推荐的JDK版本,单击“Finish”完成导入。

4. 获取新建用户的认证凭据文件。参考“准备开发用户”获取解压得到的用户user.keytab文件与krb5.conf文件,复制到样例工程的conf目录下,用于在样例工程中进行安全认证。

5. 在客户端压缩文件包的“FusionInsight_Cluster_<集群ID>_Elasticsearch_ClientConfig\Elasticsearch\config”目录下存在配置文件“es-transport-client-example.properties”,该文件已包含当前Elasticsearch集群中的所有实例列表,请拷贝该文件的相关内容覆盖样例工程conf目录下的“esParams.properties”。

6. 在开发环境IntelliJ IDEA中,样例工程的conf目录下,打开文件“esParams.properties”,按需修改表1-10中提供的参数。

 表1-10 配置说明表

配置名称

默认值

含义

clusterName

elasticsearch_cluster

Elasticsearch集群的名称

esServerHosts

ip1:port1,ip2:port2

集群中节点的ip和transport端口,多个用逗号隔开

principal

esuser@系统域名

认证主体

krb5Path

/D:/workspace/esuser/

krb5文件的路径

keytabPath

/D:/workspace/esuser/

keytab文件的路径

isSecureMode

true

是否为安全模式,true表示安全模式,false表示普通模式

isSniff

true

是否开启嗅探功能,true表示开启嗅探,false表示不开启嗅探

customJaasPath

用户自定义jaas.conf文件路径,具体到文件名,不填将自动生成

  • 说明:

  • 集群名称“clusterName”可以在装有Elasticsearch客户端的节点上执行以下命令查看:

    curl -XGET --negotiate --tlsv1.2 -k -u : "https://ip:httpPort/_cluster/health?pretty" | grep cluster_name

    命令中的“ip”参数为Elasticsearch集群中任意节点的“ip”,参数“httpport”为该IP节点上已安装的任意EsNode实例的HTTP端口,该端口值可以在FusionInsight Manager界面的Elasticsearch服务下,选择该实例的“配置”,选择“全部配置”右上角搜索参数“SERVER_PORT”获取。

  • “principal”的格式为“用户名+域名”。用户在FusionInsight Manager的“系统 > 权限 > 用户”中创建。可登录FusionInsight Manager,选择“系统 > 权限 > 域和互信”,查看“本端域”参数值,即为当前系统域名。例如“本端域”参数为“9427068F-6EFA-4833-B43E-60CB641E5B6C.COM”,则“principal”的值为“esuser@9427068F-6EFA-4833-B43E-60CB641E5B6C.COM”。
  • 配置参数“esServerHosts”为已安装Elasticsearch集群中任意节点IP与该IP节点上已安装的任意Elasticsearch实例的HTTP端口组合的列表,形如“ip1:port1,ip2:port2,ip3:port3......”。该端口值可以通过以下方式查看:FusionInsight Manager界面选择“集群 > 待操作集群的名称 > 服务 > Elasticsearch > 服务配置”,参数类别选择“全部配置”,单击对应实例“端口”,查看对应实例的“TRANSPORT_TCP_PORT”参数值。
  • 用户可通过配置参数“customJaasPath”自定义jaas.conf文件路径,如无该需求,可以不填,将自动生成。
  • 参数“customJaasPath”需要安装了6.5.1.5及以后的补丁才支持。

准备安全认证

准备认证机制代码

场景说明

在安全集群环境下,各个组件之间的相互通信不能够简单的互通,而需要在通信之前进行相互认证,以确保通信的安全性。Elasticsearch应用开发需要进行Spnego安全认证。Spnego认证是一种扩展了Kerberos,使用GSS-API认证机制的安全协议。安全认证主要采用代码认证方式,需要“krb5.conf”和“user.keytab”,支持Oracle JAVA平台和IBM JAVA平台。

“krb5.conf”和“user.keytab”文件已经通过“准备开发用户”获得,并放置于样例工程conf目录下。

  • Rest Client客户端修改样例工程conf目录下配置文件esParams.properties的参数principal为“新建的用户名@<系统域名>”。
  • Transport客户端修改样例工程conf目录下配置文件esParams.properties的参数principal为“新建的用户名@<系统域名>”。

Transport客户端认证还需进行如下处理:

  • 安全模式和非安全模式下不同的处理
if (isSecureMode.equals("true")) {
    setSecConfig();} else {
    System.setProperty("es.security.indication", "false");
    
}
builder = RestClient.builder(HostArray);
  • 设置安全认证需要的环境变量
private static void setSecConfig() {
  try {
   String path = System.getProperty("user.dir") + File.separator + "conf" + File.separator;
   LOG.info("FilePath is " + path);
   LoginUtil.setJaasFile(principal, path + "user.keytab");
   LoginUtil.setKrb5Config(path + "krb5.conf");
   System.setProperty("elasticsearch.kerberos.jaas.appname", "EsClient");

   // add for ES security indication
   System.setProperty("es.security.indication", "true");
   LOG.info("es.security.indication is  " + System.getProperty("es.security.indication"));
  } catch (Exception e) {
   LOG.error("Failed to set security conf", e);
  }
 }

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐