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) [?:?]