elasticsearch安裝配置(1)

elasticsearch報錯:None of the configured nodes are available: []

配置network.bind_host和publish_host(爲公網地址)能夠穿透局域網.java

-----------------------------------------------------------------------------------------------------------------------nicenode

1. 介紹

    全文搜索服務,基於Lucene構建的開源,分佈式,RESTful搜索引擎。
    官方網站: http://www.elasticsearch.org/ 
最好的學習資料:https://www.elastic.co/cn/
git

1.1 cluster

        表明一個集羣,集羣中有多個節點,其中有一個爲主節點,這個主節點是能夠經過選舉產生的,主從節點是對於集羣內部來講的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集羣外部來講的,由於從外部來看es集羣,在邏輯上是個總體,你與任何一個節點的通訊和與整個es集羣通訊是等價的。github

1.2 shards

        表明索引分片,es能夠把一個完整的索引分紅多個分片,這樣的好處是能夠把一個大的索引拆分紅多個,分佈到不一樣的節點上。構成分佈式搜索。分片的數量只能在索引建立前指定,而且索引建立後不能更改。數據庫

1.3replicas

        表明索引副本,es能夠設置多個索引的副本,副本的做用一是提升系統的容錯性,當個某個節點某個分片損壞或丟失時能夠從副本中恢復。二是提升es的查詢效率,es會自動對搜索請求進行負載均衡。npm

1.4 recovery

        表明數據恢復或叫數據從新分佈,es在有節點加入或退出時會根據機器的負載對索引分片進行從新分配,掛掉的節點從新啓動時也會進行數據恢復。json

1.5 river

        表明es的一個數據源,也是其它存儲方式(如:數據庫)同步數據到es的一個方法。它是以插件方式存在的一個es服務,經過讀取river中的數據並把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。
gateway
        表明es索引快照的存儲方式,es默認是先把索引存放到內存中,當內存滿了時再持久化到本地硬盤。gateway對索引快照進行存儲,當這個es集羣關閉再從新啓動時就會從gateway中讀取索引備份數據。
es支持多種類型的gateway,有本地文件系統(默認),分佈式文件系統,Hadoop的HDFS和amazon的s3雲存儲服務。
bootstrap

1.5 discovery.zen

        表明es的自動發現節點機制,es是一個基於p2p的系統,它先經過廣播尋找存在的節點,再經過多播協議來進行節點之間的通訊,同時也支持點對點的交互。跨域

1.6 Transport(默認9300端口)

        表明es內部節點或集羣與客戶端的交互方式,默認內部是使用tcp協議進行交互,同時它支持http協議(json格式)、thrift、servlet、memcached、zeroMQ等的傳輸協議(經過插件方式集成)。瀏覽器

2. 安裝

2.1 安裝jdk:

解壓上傳好的jdk包,編輯/etc/profile,配置好路徑就能夠了
我是解壓到/opt下
vi /etc/profile
最後面追加:

export JAVA_HOME=/opt/jdk1.8.0_101 export PATH=.:$JAVA_HOME/bin:PATH

運行命令source /etc/profile,使環境變量生效
檢查java -version:
出現:

root@iZwz9dzr0kho293sd4lp0sZ:/opt# java -version java version "1.8.0_101" Java(TM) SE Runtime Environment (build 1.8.0_101-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

則代表jdk已經安裝好

2.2 解壓啓動elasticsearch(單機版,僞集羣)

請不要用root帳號操做,用小號操做,解壓到/opt下
hadoop@iZwz9dzr0kho293sd4lp0sZ:/opt/elasticsearch-5.4.0$ tree -L 2
.
├── bin
│   ├── elasticsearch 啓動腳本
│   ├── elasticsearch.bat 啓動腳本
│   ├── elasticsearch.in.bat 環境變量配置
│   ├── elasticsearch.in.sh 環境變量配置
│   ├── elasticsearch-keystore
│   ├── elasticsearch-keystore.bat
│   ├── elasticsearch-plugin 插件安裝器
│   ├── elasticsearch-plugin.bat
│   ├── elasticsearch-service.bat
│   ├── elasticsearch-service-mgr.exe
│   ├── elasticsearch-service-x64.exe
│   ├── elasticsearch-service-x86.exe
│   ├── elasticsearch-systemd-pre-exec
│   ├── elasticsearch-translog
│   └── elasticsearch-translog.bat
├── config
│   ├── elasticsearch.yml 參數配置,集羣,節點,網絡,端口,併發等
│   ├── jvm.options
│   └── log4j2.properties
├── NOTICE.txt
├── lib jar庫
├── plugins 插件安裝後的目錄
└── README.textile

2.3 啓動以及驗證:

./elasticsearch -d
驗證,安裝成功則有以下提示:

hadoop@iZwz9dzr0kho293sd4lp0sZ:/opt/elasticsearch-5.4.0/bin$ curl http://127.0.0.1:9200  { "name" : "d6tyDQa", "cluster_name" : "elasticsearch", "cluster_uuid" : "9uaoOC9mT3qiCdPViQ7vMg", "version" : { "number" : "5.4.0", "build_hash" : "780f8c4", "build_date" : "2017-04-28T17:43:27.229Z", "build_snapshot" : false, "lucene_version" : "6.5.0" }, "tagline" : "You Know, for Search" }

3. 詳細配置

3.1 Cluster集羣配置

集羣名稱,默認爲elasticsearch:
cluster.name: elasticsearch

設置一個節點的併發數量,有兩種狀況,一種是在初始復甦過程當中:
cluster.routing.allocation.node_initial_primaries_recoveries: 4
另外一種是在添加、刪除節點及調整時:
cluster.routing.allocation.node_concurrent_recoveries: 2

3.2 節點配置:名稱

es啓動時會自動建立隨機字符串做爲節點名稱而且每次不同,推薦進行配置:
node.name: elasticsearch-01
是否容許做爲主節點,默認值爲true:
node.master: true

是否存儲數據,即存儲索引片斷,默認值爲true
node.data: true

注意:
master和data同時配置會產生一些奇異的效果:
當master爲false,而data爲true時,會對該節點產生嚴重負荷;
當master爲true,而data爲false時,該節點做爲一個協調者(推薦);
當master爲false,data也爲false時,該節點就變成了一個負載均衡器。

你能夠經過鏈接http://localhost:9200/_cluster/health或者http://localhost:9200/_cluster/nodes,或者使用插件http://github.com/lukas-vlcek/bigdeskhttp://mobz.github.com/elasticsearch-head來查看集羣狀態。
節點自定義屬性,可用於後期集羣進行分片分配時的過濾:
node.rack: rack-01

3.3 Index 索引配置

設置一個索引的分片數量,默認值爲5:
index.number_of_shards: 5
設置一個索引可被複制的數量,默認值爲1:
index.number_of_replicas: 1
當你不須要分佈式時,可進行以下設置:
index.number_of_shards: 1
index.number_of_replicas: 0

這兩個屬性的設置直接影響集羣中索引和搜索操做的執行,假設有足夠的機器來持有分片和副本,那麼能夠按以下規則設置這兩個值:
- 擁有更多的分片能夠提高索引執行能力,並容許經過機器分發一個大型的索引;
- 擁有更多的副本可以提高搜索執行能力以及集羣能力,但副本增多會下降插入和刪除操做的效率
- 對於一個索引來講,number_of_shards一旦設置將不能修改,而number_of_replicas可使用索引更新設置API在任什麼時候候被增長或者減小;ElasticSearch關注加載均衡、遷移、從節點彙集結果等等,能夠嘗試多種設計來完成這些功能,能夠鏈接http://localhost:9200/A/_status來檢測索引的狀態。

3.4 Memory內存設置

JVM開始交換時,ElasticSearch表現並很差:你須要保障JVM不進行交換,能夠將bootstrap.mlockall設置爲true禁止交換:
bootstrap.mlockall: true
能夠編輯 elasticsearch-5.4.0/config/jvm.options
設置
-Xms10g
-Xmx10g
或者啓動時 設置 ./bin/elasticsearch -Xmx10g -Xms10g

3.5 Network網絡設置

默認狀況下,ElasticSearch使用0.0.0.0地址,併爲http傳輸開啓9200-9300端口,爲節點到節點的通訊開啓9300-9400端口,也能夠自行設置IP地址:
network.bind_host: 192.168.0.1 #設置爲0.0.0.0 可讓其餘機器訪問
publish_host設置其餘節點鏈接此節點的地址,若是不設置的話,則自動獲取,publish_host的地址必須爲真實地址:
network.publish_host: 192.168.0.1
bind_host和publish_host能夠一塊兒設置:
network.host: 192.168.0.1
能夠定製該節點與其餘節點交互的端口
transport.tcp.port: 9300 (TCP)
節點間交互時,能夠設置是否壓縮,轉爲爲不壓縮:
transport.tcp.compress: true
能夠爲Http傳輸監聽定製端口
http.port: 9200 (HTTP)
設置內容的最大長度:
http.max_content_length: 100mb
禁止HTTP:
http.enabled: false

3.6 Discovery自動發現設置

設置一個集羣中主節點的數量,當多於三個節點時,該值可在2-4之間:
discovery.zen.minimum_master_nodes: 1
設置ping其餘節點時的超時時間,網絡比較慢時可將該值設大:
discovery.zen.ping.timeout: 3s
上有更多關於discovery的設置。
是否容許當前節點發現多個集羣節點,默認值爲true:
discovery.zen.ping.multicast.enabled: false
設置新節點被啓動時可以發現的主節點列表(主要用於不一樣網段機器鏈接,可帶端口,可省略端口9300):
discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]

3.7 跨域9200端口設置:啓動elasticsearch-head時候,當不放到plugin/head/_site下時

要修改 elasticsearch-5.4.0\config\elasticsearch.yml
追加配置,不然由於跨域問題,es不讓elastic-head訪問.

http.cors.enabled: true http.cors.allow-origin: "*"

參見elasticsearch-head單獨運行

而後在根目錄下$elasticsearch-head下運行

npm run start

便可啓動 elasticsearch-head,瀏覽器打開
http://localhost:9100/ ,elasticsearch-head便可自動鏈接本地的9200 elasticsearch端口

4. 插件管理

兩種安裝方式,在線安裝和下載安裝包離線安裝,以head插件爲例:

4.1 在線安裝:

./elasticsearch-plugin install mobz/elasticsearch-head -verbose
安裝完成,在瀏覽器打開http://127.0.0.1:9200/_plugin/head/ 便可

4.2 離線安裝

cd /opt git clone https://github.com/mobz/elasticsearch-head cd elasticsearch-head npm install npm run start

瀏覽器打開 http://localhost:9100/ (設置好elasticsearch的跨域)

4.3 必要參數配置

在線上es的config目錄的elasticsearch.yml增長如下配置,而後重啓es
indices.query.bool.max_clause_count: 10240

5. 某些問題

5.1啓動時報錯:

hadoop@iZwz9dzr0kho293sd4lp0sZ:/opt/elasticsearch-5.4.0/bin$ Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 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 2060255232 bytes for committing reserved memory. # An error report file with more information is saved as: # /opt/elasticsearch-5.4.0/bin/hs_err_pid1679.log

那是由於內存分配不夠,這裏我作測試,因此改成1g內存

################################################################ # Xms represents the initial size of total heap space # Xmx represents the maximum size of total heap space -Xms1g -Xmx1g ################################################################

5.2 啓動不了,請不要用root用戶啓動elasticsearch (防止內存和文件句柄耗盡而形成機器死機)

查看 logs/集羣名.log日誌,發現:
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:127) ~[elasticsearch-5.4.0.jar:5.4.0]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:114) ~[elasticsearch-5.4.0.jar:5.4.0]

5.3 文件句柄數太少

max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
[2017-06-07T22:03:54,832][INFO ][o.e.n.Node ] [node-1] stopping ...
[2017-06-07T22:03:54,865][INFO ][o.e.n.Node ] [node-1] stopped
[2017-06-07T22:03:54,865][INFO ][o.e.n.Node ] [node-1] closing ...
[2017-06-07T22:03:54,885][INFO ][o.e.n.Node ] [node-1] closed

vi /etc/security/limits.conf
添加

* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

5.4 沒有可用節點

NoNodeAvailableException[None of the configured nodes are available: [{#tran.......
請將節點設置:

network.host: 0.0.0.0

network.host:這個參數是用來同時設置bind_host和publish_host,這個值有時候設置爲0.0.0.0也不行,由於機器有多張網卡(特別是自行安裝了虛擬機的),綁定時會隨機綁定網卡,當網絡發生變化時,節點會被踢出去,因此最好的解決方法就是須要強制指定ip爲具體的ip

network.host: 192.168.0.1

network.bind_host:設置綁定的ip地址,能夠是ipv4或ipv6的,默認爲0.0.0.0。

network.bind_host: 192.168.0.1

network.publish_host:設置其它節點和該節點交互的ip地址,若是不設置它會自動判斷,值必須是個真實的ip地址。

network.publish_host: 192.168.0.1

某些時候連不上集羣,集羣以前報錯,多是netty版本默認爲4設置都比較高,能夠設置爲3
transport.type: netty3

若是是代碼裏拋這個錯,多是沒有初始化這個client變量,必定要初始化:

private static Client client; private static final Logger logger = LoggerFactory.getLogger(ESHelper.class); public ESHelper() { initClient(); } private static void initClient() { WTOIPProperties wtoipProperties=WTOIPProperties.getByConfType(""); String esNodes = wtoipProperties.getProperty("es.nodes", "127.0.0.1:9300"); String clusterName=wtoipProperties.getProperty("es.clusterName", "easin-tech"); Settings settings = Settings.builder() .put("cluster.name", clusterName)// 集羣名 .put("client.transport.sniff", true)// 自動把集羣下的機器添加到列表中 .build(); TransportClient newClient = new PreBuiltTransportClient(settings); for(String node:esNodes.split(",")) { String[] ipAndPort=node.split(":"); if(ipAndPort.length==1) { newClient.addTransportAddress(new InetSocketTransportAddress(InetAddresses.forString(ipAndPort[0]),9300));} else { newClient.addTransportAddresses(new InetSocketTransportAddress(InetAddresses.forString(ipAndPort[0]),Integer.valueOf(ipAndPort[1]))); } } ESHelper.client=newClient; logger.info("eshelper init ok!!!!"); } public static Client getClient() { if(ESHelper.client==null) { initClient(); } return ESHelper.client; }

而後任何地方要用 getClient(),而不能直接使用this.client成員變量

相關文章
相關標籤/搜索