Elasticsearch安裝
使用docker安裝
第一步下載鏡像,在https://www.docker.elastic.co/中,找到6.5.1版本的Elasticsearch,複製命令:
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.5.1
執行命令下載鏡像。
啓動之前需要設置一下vm.max_map_count,在/etc/sysctl.conf裏面添加:
vm.max_map_count = 262144
在通過 sysctl -p /etc/sysctl.conf
命令使其永久生效。
單節點啓動
接下來就是啓動單機版的Elasticsearch:
docker run -d --name es-single -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.5.1
後臺運行,容器名稱爲"es-single",映射容器內的9200、9300端口,並設置啓動類型爲單節點,啓動成功後可以訪問一下:
curl http://192.168.190.133:9200
返回如下結果則啓動成功:
docker-compose啓動es僞集羣
也可以使用docker-compose.yml
文件來配置集羣:
version: '3.7'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1
container_name: elasticsearch
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- 9201:9200
networks:
- esnet
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1
container_name: elasticsearch2
environment:
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.zen.ping.unicast.hosts=elasticsearch"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- esdata2:/usr/share/elasticsearch/data
networks:
- esnet
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
esnet:
使用docker-compose up
來啓動,在這裏,會啓動倆個Elasticsearch容器。
啓動成功後使用docker-compose ps
查看啓動情況:
驗證一下es集羣是否正常:
docker啓動es集羣
準備倆臺機器:192.168.1.129
、192.168.1.164
。
倆臺機器都需要在/etc/sysctl.conf裏面添加:
vm.max_map_count = 262144
在通過 sysctl -p /etc/sysctl.conf
命令使其永久生效。
第一個節點啓動:
docker run -d --name es01 \
-v es01data:/usr/share/elasticsearch/data \
-v /usr/local/es-config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-p 19200:19200 -p 19300:19300 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" --ulimit memlock=-1:-1\
docker.elastic.co/elasticsearch/elasticsearch:6.5.1
這裏使用目錄映射的方式實現自定義配置,這裏設置一下elasticsearch.yml的用戶組:chgrp 1000 elasticsearch.yml
,以便容器能夠擁有足夠的權限進行訪問,對於data、logs文件夾同樣適用,自定義elasticsearch.yml內容如下:
cluster.name: es-cluster #es集羣名稱,同一個集羣名稱需要相同
node.name: es01 #當前節點在集羣中的名稱,集羣中唯一
bootstrap.memory_lock: true #鎖定內存,禁止交換區交換,提升es性能
network.bind_host: 0.0.0.0 #可訪問es的ip,0.0.0.0表示任意ip均可訪問
network.publish_host: 192.168.1.129 #對外公開用於集羣信息交互的ip,設置爲容器的宿主機Ip
http.port: 19200 #設置以http形式訪問es的端口,通常是使用es的api來進行數據訪問
transport.tcp.port: 19300 #設置集羣節點之間信息交互的tcp接口
discovery.zen.ping.unicast.hosts: ["192.168.1.164:19300"] #用於發現集羣中其他任意個數的節點位置
discovery.zen.minimum_master_nodes: 1 #形成集羣所需要的最小節點數,官方建議設置爲:節點總數/2+1
第二個節點啓動:
docker run -d --name es02 \
-v es02data:/usr/share/elasticsearch/data \
-v /usr/local/es-config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-p 19200:19200 -p 19300:19300 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" --ulimit memlock=-1:-1\
docker.elastic.co/elasticsearch/elasticsearch:6.5.1
自定義elasticsearch.yml內容如下:
cluster.name: es-cluster
node.name: es02
bootstrap.memory_lock: true
network.bind_host: 0.0.0.0
network.publish_host: 192.168.1.164
http.port: 19200
transport.tcp.port: 19300
discovery.zen.ping.unicast.hosts: ["192.168.1.129:19300"]
discovery.zen.minimum_master_nodes: 1
倆個節點都啓動成功後,可使用curl http://192.168.1.164:19200/_cat/health
訪問集羣狀態:
1543214770 06:46:10 es-cluster green 2 2 0 0 0 0 0 0 - 100.0%
多主機集羣啓動時遇到的問題
注意:宿主機在端口映射時,建議與transport.tcp.port端口一致,此處有遇到過一個問題,當我爲es01做19300:9300
這樣的端口映射時,儘管我給es02節點的配置爲:discovery.zen.ping.unicast.hosts: ["192.168.1.129:19300"]
,但在啓動時es02的日誌中卻在不停的向192.168.1.129:9300
發起鏈接請求,導致鏈接不成功,集羣啓動失敗。
報錯信息如下:
[2018-11-26T05:58:44,691][WARN ][o.e.d.z.ZenDiscovery ] [es02] failed to connect to master [{es01}{-lnfIuNNSAimJ_DZIT0P7A}{hVrCg4JGSz6S8tJJQBrrrg}{192.168.1.129}{192.168.1.129:9300}{ml.machine_memory=3956260864, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}], retrying...
org.elasticsearch.transport.ConnectTransportException: [es01][192.168.1.129:9300] connect_exception
at org.elasticsearch.transport.TcpChannel.awaitConnected(TcpChannel.java:165) ~[elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.transport.TcpTransport.openConnection(TcpTransport.java:454) ~[elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.transport.TcpTransport.openConnection(TcpTransport.java:117) ~[elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.transport.ConnectionManager.internalOpenConnection(ConnectionManager.java:237) ~[elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.transport.ConnectionManager.connectToNode(ConnectionManager.java:119) ~[elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.transport.TransportService.connectToNode(TransportService.java:369) ~[elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.transport.TransportService.connectToNode(TransportService.java:356) ~[elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.discovery.zen.ZenDiscovery.joinElectedMaster(ZenDiscovery.java:507) [elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.discovery.zen.ZenDiscovery.innerJoinCluster(ZenDiscovery.java:475) [elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.discovery.zen.ZenDiscovery.access$2500(ZenDiscovery.java:88) [elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.discovery.zen.ZenDiscovery$JoinThreadControl$1.run(ZenDiscovery.java:1245) [elasticsearch-6.5.1.jar:6.5.1]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:624) [elasticsearch-6.5.1.jar:6.5.1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.lang.Thread.run(Thread.java:834) [?:?]