搭建單機模式的ES

前言

elasticsearch(下面稱爲ES)是一個基於Lucene的搜索服務器(By 百度百科:查看),所以他需要java的環境即jdk。如何安裝jdk就不在贅述了,無非就是刪除原版本後解壓再添加環境變量

注1:如果已經安裝了ES和ik,需要重新安裝,需要把/usr/share/elasticsearch/plugins/路徑下ik刪除,避免版本不匹配導致ES不能啓動

注2:再往linux中安裝軟件時,尤其是需要在網頁上測試的軟件時,需要將防火牆關閉,ES就是,如果不關閉防火牆,可以ping通,但是加上9200端口進行訪問時便會連接失敗。

注3:在虛擬機或者真正的服務器上,必須要把ip地址寫死,否則會出現一些莫名其妙的錯誤,(今天在虛擬機上搭建es,自動獲取ip的狀態下宿主機無法ping通,寫死之後便可以ping通了)

安裝過程

  1. Elasticsearch的官網:https://www.elastic.co/cn/downloads/
  2. 使用wget命令獲取ES:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz
  3. 解壓:tar -xvzf elasticsearch-6.3.1.tar.gz,需要注意的是,處於安全考慮,es是不允許root用戶啓動的,也就是說必須創建一個普通用戶進行解壓es安裝包,如果用root用戶解壓之後,則需要將文件的所有者進行改變
    adduser 用戶名
    chown -R 用戶名:用戶名組 目錄路徑
  4. 修改配置文件:vim elasticsearch-6.3.1/config/elasticsearch.yml 
    在該配置文件的末尾複製添加上如下信息即可,省的一個個找修改再取消註釋,如下信息其實就是該文件中需要修改的彙總,爲了簡便,可以直接複製添加。

    # 集羣的名字,需要自定義,如果是想要搭建es集羣,則保持此項相同即可
     cluster.name: luying
    # 節點名字,需要自定義,如果想要搭建es集羣,則保證此項不同即可
     node.name: luying-master
    # 是否是master
     node.master: true
    # ES的監聽地址,這樣別的機器也可以訪問,有的教程說此項設置成0.0.0.0代表任意ip都可以訪問本es,但失
    # 敗了,還是寫成本機ip爲正確寫法,不要寫成localhost,那樣其他ip無法訪問,一定要寫固定ip
     network.host: 192.168.2.133
    # 默認的就好,es啓動後通過web訪問es,只需輸入ip:9200,出現一個json即代表成功
     http.port: 9200
    # 本機最大允許運行節點個數,默認即可
     node.max_local_storage_nodes: 3
    # 增加新的參數,這樣head插件可以訪問es,解決跨域訪問問題,一把用不到
    # http.cors.enabled: true
    # http.cors.allow-origin: "*"

     

  5. 啓動:./elasticsearch-6.3.1/bin/elasticsearch(注意一定要用普通用戶啓動纔可以)

  6. 檢驗:使用瀏覽器,輸入ip:9200,出現json返回信息

  7. 關閉:直接使用Ctrl+C可以;但最好是使用命令:./elasticsearch -stop

  8. 後臺啓動命令:./elasticsearch -d

集羣部署

分別拷貝下載的es文件在三個不同的文件夾下,分別配置config/elasticsearch.yml

實例: ES1文件夾下的配置:

.............
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true

# 集羣的名字  必須與其他機器相同
cluster.name: niezp

# 節點名字,必須與其他節點不同
node.name: niezp-slave1

# 修改一下ES的監聽地址,這樣別的機器也可以訪問
network.host: 192.168.174.148

#  不能和其他的節點相同
http.port: 9202
#這裏要說下,這裏的IP地址就是你的mater es的機器ip地址,比如部署在本機可以下127.0.0.1 別的機器就寫別的機器的ip
discovery.zen.ping.unicast.hosts: ["192.168.174.148"]
node.max_local_storage_nodes: 3
# 增加新的參數,這樣head插件可以訪問es
#http.cors.enabled: true
#http.cors.allow-origin: "*"

實例: ES2文件夾下的配置:

.......
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true

# 集羣的名字  必須與其他機器相同
cluster.name: niezp

# 節點名字,必須與其他節點不同
node.name: niezp-slave2

# 修改一下ES的監聽地址,這樣別的機器也可以訪問
network.host: 192.168.174.148

# 不能和其他的節點相同
http.port: 9201
#同實例1說明
discovery.zen.ping.unicast.hosts: ["192.168.174.148"]
node.max_local_storage_nodes: 3
# 增加新的參數,這樣head插件可以訪問es
#http.cors.enabled: true
#http.cors.allow-origin: "*"

 相關技術

  1. Linux 添加用戶、刪除用戶、用戶授權
    1. 添加用戶
      1. 命令:只設置賬戶和密碼只用兩步
        useradd或adduser命令,使用權限是超級用戶(root)。例如:useradd esuser
        passwd命令。例如:passwd esuser    之後輸入兩次密碼即可。
      2. 格式:useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name
      3. 參數詳解:

        -c: 加上備註文字,備註文字保存在passwd的備註欄中。 

        -d:指定用戶登入時的主目錄,替換系統默認值/home/<用戶名> 

        -D:變更預設值。 

        -e:指定賬號的失效日期,日期格式爲MM/DD/YY,例如06/30/12。缺省表示永久有效。 

        -f:指定在密碼過期後多少天即關閉該賬號。如果爲0賬號立即被停用;如果爲-1則賬號一直可用。默認值爲-1. 

        -g:指定用戶所屬的羣組。值可以使組名也可以是GID。用戶組必須已經存在的,期默認值爲100,即users。 

        -G:指定用戶所屬的附加羣組。 

        -m:自動建立用戶的登入目錄。 

        -M:不要自動建立用戶的登入目錄。 

        -n:取消建立以用戶名稱爲名的羣組。 

        -r:建立系統賬號。 

        -s:指定用戶登入後所使用的shell。默認值爲/bin/bash。 

        -u:指定用戶ID號。該值在系統中必須唯一。0~499默認是預留給系統用戶賬號,所以該值必須大於499。

      4. 舉例:useradd -u 544 -d /usr/testuser1 -g users -m esuser1
        建立一個新用戶賬戶esuser1,並設置UID爲544,主目錄爲/usr/esuser,屬於users組。使用useradd命令所建立的賬號,實際上是保存在/etc/passwd文本文件中。

    2. 刪除用戶

      1. 刪除用戶:userdel esuser 

      2. 刪除用戶及目錄:userdel -f esuser

      3. 無法刪除:刪除時userdel esuser ,提示userdel: user esuser is currently used by process 1354 
        該提示證明,被刪除賬戶正在使用無法刪除,此時只能將該賬戶強制下線
        使用“w”命令查看此時正在登陸的賬戶

        使用pkill命令強制退出用戶:pkill -kill -t pts/1
    3. 用戶權限
      1. 賬號屬性:使用id命令

        usermod -G GROUPS USERNAME:改變用戶的附加組,會完全替換原有的附加組
        usermod -G -a GROUPS USERNAME:在原有附加組的基礎上追加附加組
        usermod -d PATH USERNAME:修改家目錄。修改後原先家目錄中的文件不能訪問了,因爲在當前的家目錄中並不存在這些文件。
        usermod -l NEWNAME USERNAME:改變用戶名
        usermod -e USERNAME:指定該用戶的過期時間
        usermod -L USERNAME:鎖定用戶
        usermod -U USERNAME:解鎖用戶

      2. 密碼管理:只能用根用戶操作,被操作的只能是非根用戶
        passwd –stdio:標準輸入讀取密碼
        passwd -l:鎖定用戶賬號(root only)
        passwd -u username:解鎖用戶賬號(root only)
        passwd -d username:刪除用戶密碼。用戶密碼刪除後不能登錄。
        passwd [username] : 修改密碼

      3. group管理:​​​​​

    4. 文件權限:
      1. 使用ll命令,共顯示七列信息,從左至右依次爲:權限、文件數、歸屬用戶、歸屬羣組、文件大小、創建日期、文件名稱

        -:第一位表示文件類型
           d 文件夾
              - 普通文件
              l 鏈接
           b 塊設備文件
              p 管道文件
           c 字符設備文件
           s 套接口文件
        owner/group/others三種身份各有自己的read/write/execute權限:
        rwx :第2-4位表示這個文件的屬主擁有的權限。r是讀、w是寫、x是執行 
        rwx :第5-7位表示和這個文件屬主所在同一個組的用戶所具有的權限 
        rwx :第8-10位表示其他用戶所具有的權限

      2. 常用的linux文件權限:

        各權限的分數對照表如下:     r:4   w:2   x:1;每種身份(owner/group/others)各自的三個權限(r/w/x)分數是需要累加的,下面則是常用的權限示例

        444 r--r--r--
        600 drw-------
        644 drw-r--r--
        666 drw-rw-rw-
        700 drwx------
        744 drwxr--r--
        755 drwxr-xr-x
        777 drwxrwxrwx

      3. 修改文件權限:

        1. 數字類型改變檔案權限:chmod [-R] xyz 檔案或目錄 
          xyz : 就是剛剛提到的數字類型的權限屬性,爲 rwx 屬性數值的相加。 
          -R : 進行遞歸(recursive)的持續變更,亦即連同次目錄下的所有檔案都會變更

        2. 符號類型改變檔案權限
          文件的九個權限分別對應(1)user (2)group (3)others三種身份,那麼我們就可以藉由u, g, o來代表三種身份的權限!此外, a 則代表 all 亦即全部的身份!那麼讀寫的權限就可以寫成r, w, x,也就是可以使用底下的方式來看:

          示例:設定一個檔案的權限成爲『-rwxr-xr-x』

          注意:三種身份之間用“,”連接,中間沒有任何空格符,並且可以任意組合。

        3. ACL權限分配:chmod 權限分配是對所有用戶進行設置,但在權限細分需求時存在不足, 此時可使用acl權限分配。(ACL的全稱是 Access Control List (訪問控制列表) ,一個針對文件/目錄的訪問控制列表。它在UGO權限管理的基礎上爲文件系統提供一個額外的、更靈活的權限管理機制。它被設計爲UNIX文件權限管理的一個補充。ACL允許你給任何的用戶或用戶組設置任何文件/目錄的訪問權限。)
          什麼是ACL權限呢?

    5. ​​​​獲取管理員權限:即獲取sudo權限

      1. 修改 /etc/sudoers文件:/etc/sudoers文件存放着sudo的相關用戶,但是默認沒有寫權限的,所以需要使用 chmod u+w /etc/sudoers 給 sudoers 授權

      2. 修改 /etc/sudoers 文件

      3. 修改 /etc/passwd 文件


        友情提醒:雖然方法三看上去簡單方便,其實是將一般用戶完全等同於了root用戶,可能會造成一些無法預料的問題,因此一般不推薦使用,推薦使用方法二。​​​​

  2. 修改網卡信息:將ip地址寫死,避免出現無法訪問的情況。

    1.  

      修改網卡文件: /etc/sysconfg/network-scripts/...

       

  3. 關閉防火牆,或者開放對應端口

    1. sudo systemctl stop firewalld.service
      sudo systemctl disable firewalld.service
      sudo systemctl stop iptables.service
      sudo systemctl disable iptables.service

      sudo vim /etc/selinux/config

      在生產環境中,防火牆是不可以關閉的,需要的是開放端口。

      註釋下面兩行:

      #SELINUX=enforcing

      #SELINUXTYPE=targeted

      sudo setenforce 0

      ​​​​​​​
    2. 此處使用一個命令即可:iptables -F  即清除預設表filter中的所有規則鏈的規則
    3. 開放端口:
      ​​​​​​​
       

ES部署過程中的報錯解析

  1. elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
    

    ES不能能使用root用戶直接運行,必須使用普通用戶運行。
    解決辦法:添加用戶,ES安裝目錄的所有者。

  2. Exception in thread "main" java.nio.file.AccessDeniedException: /opt/app/elasticsearch-6.6.0/config/jvm.options
    

    使用的用戶對安裝目錄的文件沒有權限造成的,(可能是當前登錄的用戶沒有權限,也可能是在更改安裝目錄的所有者的時候沒有遞歸安裝)
    解決辦法:
    切換用戶在啓動es,如果報同樣錯誤,使用chown -R 用戶名:用戶組名 目錄路徑更改文件所有者。

  3. [WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [es1] uncaught exception in thread [main]
    org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Unable to access ‘path.data’ (/var/es/dat)
    

    因爲不是root用戶,在配置文件的時候。數據目錄和日誌目錄等不能應該放在用戶家目錄下,防止因爲該用戶不能在所設置的目錄下創建文件而引起報錯。

  4. [unknown] unable to install syscall filter: 
    java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed
    

    Centos6不支持SecComp,而高版本ES在5.X之後默認bootstrap.system_call_filter爲true進行檢測,所以導致檢測失敗,失敗後直接導致ES不能啓動
    解決辦法(兩種):
    1.可以把Centos內核升級到Centos7。
    2.修改配置文件,關閉ES啓動時候的安全檢測。具體elasticsearch.yml中配置

  5.  initial heap size [104857600] not equal to maximum heap size [209715200]; this can cause resize pauses and prevents mlockall from locking the entire heap
    
    【1】: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536] 
    【2】: max number of threads [1024] for user [es] is too low, increase to at least [4096] 
    【3】: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    

    【1】系統設置的文件描述符太少了
    【2】爲用戶設置的可以開啓的線程太少了
    這兩個可以通過配置文件vi /etc/security/limits.conf 更改,添加如下內容:(這裏只爲啓動ES的es用戶更改了安全限制)

    es soft nofile 65536   #solf是軟限制的意思,hard是硬限制;軟限制可以在程序的進程中自行改變(突破限制),而硬限制則不行(除非程序進程有root權限)
    es hard nofile  65536  #nofile 文件描述符
    es soft nproc 4096    #nproc  進程的限制
    es hard nproc 4096	
    

    這裏兩個的設置沒有讓其立即生效的命令,因此如果修改之後重啓ES還報該錯則需要重啓機器。另外網上很多直接把第一項換爲“ * ”,*是指所有用戶,如果在生產中強烈不建議這樣做,可能會對其他用戶造成影響。
    其實生產環境,服務器是很難重啓的,所以很少有軟件安裝時需要重啓,此處並不需要重啓,將當前用戶重新登入,就可以了。
    【3】虛擬內存區域最大映射值太小了 通過vi /etc/sysctl.conf 可以更改。
    切換到root用戶修改配置sysctl.conf
    vi /etc/sysctl.conf
    添加下面配置:
    vm.max_map_count=655360
    並執行命令:
    sysctl -p(可以使其永久)

  6. 本機可以訪問.但是局域網外的其他機器無法訪問
    修改elasticsearch.yml配置文件,network.host項,綁定本機的IP
    PS:在配置文件中的localhost,迴環IP,路徑是tmp的一定要注意更改。

  7. SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: 	ParsingException[Failed to parse object: expecting token of type [START_OBJECT] but found [VALUE_STRING]];
    

    配置文件格式錯誤:
    配置文件的key:value之間的:後面必須有一個空格。

  8. Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 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 986513408 bytes for committing reserved memory.
    

    內存不足導致Java無法運行,(在elasticsearch和logstash中均可能出現)
    解決辦法:
    這個時候查看一下free -m 查看可用內存,然後查看config下的jvm.options文件,-Xms1g-Xmx1g配置的內存大小,更改此而配置項或者添加內存均可。

  9. 第一次啓動使用root用戶啓動,在config目錄下創建了文件,需要刪除

  10. Error: Port 5601 is already in use. Another instance of Kibana may be running!
    

    這是因爲5601的端口被佔用了,一般有因爲以下幾種可能而導致:
    netstat -tunlp|grep 5601   #查看端口占用情況,找到端口對應的進程id
    ps aux | grep PID  #查看對應的進程 
    #然後根據進程情況確定更改哪一個程序的端口號,使其不衝突即可

  11. Caused by: java.net.BindException: Cannot assign requested addres

    配置外網
    進入 config/ elasticsearch.ym
    打開配置文件elasticsearch.yml 將 network.host: 192.168.0.1 修改爲本機IP 0.0.0.0

  12. [warning][license][xpack] License information from the X-Pack plugin could not be obtained from Elasticsearch for the [data] cluster. [invalid_index_name_exception] Invalid index name [_xpack], must not start with '_'., with { index_uuid="_na_" & index="_xpack" } :: {"path":"/_xpack","statusCode":400,"response":"{\"error\":{\"root_cause\":[{\"type\":\"invalid_index_name_exception\",\"reason\":\"Invalid index name [_xpack], must not start with '_'.\",\"index_uuid\":\"_na_\",\"index\":\"_xpack\"}],\"type\":\"invalid_index_name_exception\",\"reason\":\"Invalid index name [_xpack], must not start with '_'.\",\"index_uuid\":\"_na_\",\"index\":\"_xpack\"},\"status\":400}"}
    

    Kibana連接elasticsearh的時候,瀏覽器中報錯爲
    Cannot connect to the Elasticsearch cluster currently configured for Kibana.
    `To use the full set of free features in this distribution of Kibana, please update Elasticsearch to the default distribution.```
    看報錯信息顯示因該是版本的問題,但是理論上elatic官網上的一套應該是沒有問題的,我試着卸載X-pack,發現es不能卸載,然後嘗試了很多辦法無果後,提交給了官網,收到回覆如下:
     

    您好,
    非常感謝您的回覆。
    初步瞭解您的情況之後,我找到了一個跟您問題相似的帖子,麻煩您參考下
    https://discuss.elastic.co/t/license-information-from-the-x-pack-plugin-could-not-be-obtained-from-elasticsearch-for-the-data-cluster/148030/9

    不知道您是否方便嘗試用下oss only的kibana?
    https://www.elastic.co/downloads/kibana-oss

    麻煩您看下是否能幫助解決您的問題~ 如果還有問題歡迎隨時與我聯繫。您也可以加我的微信:(這個就不顯示了)

    希望Elastic能帶給您一個無與倫比的使用體驗!

    Best regards,

    重點在上週新版本更新中,我直接用了最新的6.6.1,然後就沒有問題了,哈哈

  13. elasticsearch 6.6.1的新報錯
     

    Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file logs/gc.log due to Permission denied
    
    Exception in thread "main" org.elasticsearch.bootstrap.BootstrapException: java.nio.file.AccessDeniedException: /opt/app/elasticsearch-6.6.1/config/elasticsearch.keystore
    Likely root cause: java.nio.file.AccessDeniedException: /opt/app/elasticsearch-6.6.1/config/elasticsearch.keystore
    

    第一次啓動es使用了root用戶,在config目錄下創建了文件elasticsearch.keystore,只需要進入之後把文件刪除,然後用es的用戶啓動就可以了。

  14. 瀏覽器連接不上Kibana,資源無限重定向(特別早遇到的報錯,今天想起來了)
    在使用6.6.1的Kibana的時候,集羣跑一個週末,不操作,等到週一的時候,會出現瀏覽器連接補了Kibana的情況,但是Kibana的進程什麼的都正常,報錯信息好像是因爲資源無限重定向這樣的信息。
    這個問題諮詢官網好像也是版本問題,具體情況我忘記了,但是現在記得還有一個這樣的問題,大家如果遇到了可以

    今天搭建集羣的時候遇到新的報錯,是因爲我在一個節點啓動了es,生成了數據文件,然後沒有刪除數據文件,就把目錄用scp拷貝到其他的節點上而造成的,具體的報錯信息如下:
     

    failed to send join request to master [{node10}{nIHo2TdDRw-1-nbhr-Lmzw}{n_vGmHO9R2umfw99C5nOSg}{192.168.56.10}{192.168.56.10:9300}{ml.machine_memory=1968349184, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}], reason [RemoteTransportException[[node10][192.168.56.10:9300][internal:discovery/zen/join]]; nested: IllegalArgumentException[can't add node {node11}{nIHo2TdDRw-1-nbhr-Lmzw}{XcZDBLmxRCeKsHm4jp2M8w}{192.168.56.11}{192.168.56.11:9300}{ml.machine_memory=1968349184, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}, found existing node {node10}{nIHo2TdDRw-1-nbhr-Lmzw}{n_vGmHO9R2umfw99C5nOSg}{192.168.56.10}{192.168.56.10:9300}{ml.machine_memory=1968349184, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true} 
    with the same id but is a different node instance]; 
    

    刪除安裝目錄下的data文件夾,然後重新啓動即可。

  15. 更多問題可以參考博客:https://blog.csdn.net/wang909125961/article/details/87937335 
    csdn作者名字:wang__xg;鏈接地址:https://blog.csdn.net/wang909125961
    或者
    http://www.360doc.com/content/16/0801/19/17130779_580079662.shtml

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