ElasticSearch分布式搜索-(1)环境搭建以及基础知识

ElasticSearch分布式搜索引擎

       ElasticSearch设计的理念就是分布式搜索引擎,底层实现还是基于Lucene的(主要提供基于Java的索引和搜索技术,以及拼写检查,命中突出显示和高级分析/标记化功能。),核心思想是在多台机器上启动多个es进程实例,组成一个es集群。

  • ElasticSearch在ubuntu上的安装

         接下来我将一步一步介绍在ubuntu的安装。为了支持ElasticSearch,我们需要java 8 以上的支持。并且介绍安装过程中常常遇到的问题。

    一、建立文件传输

       选择在windows下载安装包的,则需要建立ftp/xftp连接,这里的文件传输可以用Winscp、Xftp等等。连接到ubuntu直接拖拽文件即可实现上传,在连接过程中,可能会出现连接拒绝的问题,这里主要参考以下两个别的博主的解决方案:

        1、WinSCP连接linux系统root登录时拒绝访问解决办法;

       2、winscp 服务器拒绝了SFTP连接,但它监听FTP连接。 想要用FTP协议来代替SFTP吗?最好是用加密的。

    二、安装JDK1.8

         在官网下载jdk1.8版本的包,官网地址:java 1.8 官网 。这里我用的包的下载地址是:          https://download.oracle.com/otn/java/jdk/8u211-b12/478a62b7d4e34b78b671c754eaaf38ab/jdk-8u211-linux-x64.tar.gz 

        将下载的jdk包通过ftp上传到ubuntu,文件上传完毕后需解压:

解压到当前目录下:
 tar -zxvf jdk-8u211-linux-x64.tar.gz 

解压到指定的文件夹:
 tar -zxvf jdk-8u211-linux-x64.tar.gz -C /指定的目录

         JDK解压过后则需要配置环境变量,如下所示(ubuntu中vi命令有一些小小的问题,或者是我用不习惯,所以我使用vim命令):

打开配置文件:
sudo vim /etc/profile

        在配置文件底部中加入如下java配置信息(JAVA_HOME填写自己的jdk解压存放路径):

#set Java environment 
export JAVA_HOME=/usr/local/soft/java/jdk1.8.0_211
export JRE_HOME=$JAVA_HOME/jre  
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH  
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 

         配置完毕则保存退出,执行命令让配置文件生效:

source /etc/profile

         在ubuntu任意目录输入java -version 、javac -version 能正常查看版本信息则安装成功。

   三、ElasticSearch安装 

         和java的安装类似,去官网下载相应的包解压即可。网上的安装ElasticSearch教程比较多,这里我用的是这个:ElasticSearch安装 。安装完毕,若是没有问题,则在浏览器打开127.0.0.1:9200 则会显示以下信息:

ElasticSearch分布式搜索-(1)环境搭建以及基础知识_第1张图片

但是中间会有很多的问题。我将大家处理问题的方案汇总在下面:

  1.    linux报错:export `=' not a valid identifier的一般原因  ;  
  2.    Linux---关闭Elasticsearch进程,并重新启动 ;
  3.    ElasticSearch不能以root启动,需要创建一个用户启动,否则会报错;
    org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
    	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.1.1.jar:7.1.1]
    	at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.1.1.jar:7.1.1]
    

     

  4.    报内存错误的时候,错误信息如下,是因为启动内存不足,可以适当缩小启动所需内存:
    Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000ca660000, 899284992, 0) failed; error='Cannot allocate memory' (errno=12)
    #
    # There is insufficient memory for the Java Runtime Environment to continue.
    # Native memory allocation (mmap) failed to map 899284992 bytes for committing reserved memory.
    # An error report file with more information is saved as:
    # logs/hs_err_pid11433.log
    

    这时候需要修改elasticsearch下的config/jvm.options 文件,通过vim或vi打开编辑,将参数

    -Xms1g
    -Xmx1g
    
    修改为:
    -Xms512m
    -Xmx512m

     

  5. 当再次启动的时候报错,意思是获取节点锁失败:

     

    mylinux@ubuntu:/usr/local/soft/ElastciSearch/elasticsearch-7.1.1$ ./bin/elasticsearch
    [2019-06-26T23:51:55,997][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [ubuntu] uncaught exception in thread [main]
    org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks, tried [[/usr/local/soft/ElastciSearch/elasticsearch-7.1.1/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
    	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.1.1.jar:7.1.1]
    	at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.1.1.jar:7.1.1]
    	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.1.1.jar:7.1.1]
    	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.1.1.jar:7.1.1]
    	at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.1.1.jar:7.1.1]
    	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.1.1.jar:7.1.1]
    	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.1.1.jar:7.1.1]
    Caused by: java.lang.IllegalStateException: failed to obtain node locks, tried [[/usr/local/soft/ElastciSearch/elasticsearch-7.1.1/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
    

    这是因为ElasticSearch为正常关闭导致的,处理过程如下:

    输入命令查看:
        ps -ef | grep elastic
    输出信息如下:
    mylinux   10730  10452  7 23:34 pts/11   00:00:27 /usr/local/soft/java/jdk1.8.0_211/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/tmp/elasticsearch-1898663747749619498 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Dio.netty.allocator.type=unpooled -Des.path.home=/usr/local/soft/ElastciSearch/elasticsearch-7.1.1 -Des.path.conf=/usr/local/soft/ElastciSearch/elasticsearch-7.1.1/config -Des.distribution.flavor=default -Des.distribution.type=tar -Des.bundled_jdk=true -cp /usr/local/soft/ElastciSearch/elasticsearch-7.1.1/lib/* org.elasticsearch.bootstrap.Elasticsearch
    mylinux   10792  10730  0 23:34 pts/11   00:00:00 /usr/local/soft/ElastciSearch/elasticsearch-7.1.1/modules/x-pack-ml/platform/linux-x86_64/bin/controller
    mylinux   11080  10452  0 23:40 pts/11   00:00:00 grep --color=auto elastic
    杀掉进程10730:
       kill -9 10730
    再次输入查询:
       ps -ef | grep elastic
    输出:
       mylinux   11132  10452  0 23:42 pts/11   00:00:00 grep --color=auto elastic
    

    6. 报以下异常(文件权限不足):

    Exception in thread "main" java.nio.file.AccessDeniedException: /usr/local/soft/ElastciSearch/elasticsearch-7.1.1/config/jvm.options
    	at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
    	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    	at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
    	at java.nio.file.Files.newByteChannel(Files.java:361)
    	at java.nio.file.Files.newByteChannel(Files.java:407)
    	at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
    	at java.nio.file.Files.newInputStream(Files.java:152)
    	at org.elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:60)
    

    则是因为当前文件没有权限,需要这样执行:

       chown -R 用户名:用户名 /需要添加权限的文件夹
    如:
       chown -R mylinux:mylinux /usr/local/soft/ElastciSearch/elasticsearch-7.1.1

    7.max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144],出错如下:

    ERROR: [2] bootstrap checks failed
    [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
    [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    

    解决方案:

    执行命令:
        sysctl -w vm.max_map_count=262144
    查看结果:
        sysctl -a|grep vm.max_map_count
    显示:
        vm.max_map_count = 262144

     

  • ElasticSearch基础概念

有一些概念是Elasticsearch的核心。从一开始就理解这些概念将极大地帮助简化学习过程。

近实时(NRT):ElasticSearch是一个近乎实时的搜索平台,这意味着从索引文档到可搜索文档的时间有一点延迟(通常是一秒)

集群:集群是一个或者对个节点(服务器)的集合,它们共同保存您的整个数据,并且提供跨所有节点的联合索引号和搜索功能。集群是唯一名称标识符,默认情况下为elasticsearch,此名称非常重要,因此如果节点设置为按名称加入集群,则该节点只能是集群的一部分。需要确保不要在不同的环境中重用相同的集群名称,否则会导致节点加入错误的群集,例如,您可以使用lonnging-dec,logging-stage以及logging-prod用于kaifa,登录和生产集群。请注意,拥有一个只包含单个节点的集群是完全正常的,此外,您还可以拥有多个独立的集群,每个集群都有唯一的集群名称。

节点:节点是作为集群一部分的单个服务器,存储诗句并参与集群的索引和搜索功能。与集群一样,节点由名称标识,默认情况下,该节点是在启动时分配给节点的随机通用唯一标识符(UUID)。如果不需要默认值,可以定义所需的任何节点名称。此名称对于项目管理非常重要,您可以在其中识别网络中的哪些服务器与ElsaticSearch集群的哪些节点相对应。可以将节点配置为安集群名称加入特定集群。默认情况下,每个节点设置为加入一个名为cluster的集群,这意味着如果您在网路上启动了许多节点并且假设他们可以相互发现,那么它们将自动形成并加入一个名为cluster的集群。在单个集群中,您可以拥有任意数量的节点。此外,如果您的网路上当前没有其他集群的节点正在运行,则默认情况下启动单个节点将形成一个名为新单节点集群ElasticSearch。

索引:索引是具有某些类似特征的文档集合。列如。您可以拥有客户的数据的索引,产品目录的另一个索引以及订单数据的另外一个索引。索引由名称标识(必须全部为小写),并且此名称用于在对其中的文档执行缩影,搜索,更新和删除操作是引用索引。在单个集群中,您可以根据需要制定任意数量的索引。

文档:文档是可以编制索引的基本信息单元。例如,您可以为单个客户提供文档,为单个产品提供另外一个文档,为单个订单提供另外一个文档。该文档一JSON标识,JSON是一种普遍存在的互联网数据交换格式。

碎片和副本:索引可能存储大量可能超过单个节点的硬件限制的数据。例如,占用1TB磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独从单个节点提供搜索请求。为了解决这个问题,ElasticSearch提供了将索引细分为多个成为分片的功能。创建索引时,只需要定义所需的分片数即可。每个分片本省都是给一个功能齐全且独立的索引,可以托管在集群中的任何节点上。优点:(1、允许水平分割和收缩内容量,允许多个节点分布/并行化操作,从而提高性能/吞吐量)。分片的分布式方式以及如何将其文档聚合搜索请求的机制完全由ElasticSearch管理,对用户而言是透明的。在任何时候都可能初选故障而导致数据丢失,强烈推荐使用故障转移机制,以防止分片/节点以某种方式脱机或任何原因消失。为此,ElasticSearch允许您将索引的分片的一个或者多个副本制作成所谓的副本分片或简称副本。优点:(1、发生故障时提供高可用性。2、允许拓展搜索量、吞吐量,因为可以在所有副本上并行执行搜索)总而言之,每个索引可以拆分为多个分片。索引也可以复制为零(表示没有副本)或更多次。复制后,每个索引都将具有主分片(从中复制的原始分片)和副本分片(主分片的副本)。可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,您可以随时动态更改副本数,但不能在事后更改分片数。默认情况下,Elasticsearch中的每个索引都分配了5个主分片和1个副本,这意味着如果群集中至少有两个节点,则索引将包含5个主分片和另外5个副本分片(1个完整副本),总计为每个索引10个分片。

你可能感兴趣的:(分布式)