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 則會顯示以下信息:

但是中間會有很多的問題。我將大家處理問題的方案彙總在下面:

  1.    linux報錯:export `=' not a valid identifier的一般原因  ;  
  2.    Linux---關閉Elasticsearch進程,並重新啓動 ;
  3.    ElasticSearch不能以root啓動,需要創建一個用戶啓動,否則會報錯;
  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

    至此,就是我安裝ElasticSearch遇到的一些問題。

  • 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個分片。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章