Docker部署ElasticSearch集群
最近想把项目依赖的ElasticSearch(简称为ES)5.2.2升级为6.8.2,不过升级过程还需要进行严谨的测试才行,于是就先通过Docker部署一个ES 6.8.2的集群。
准备工作
准备两台服务器:
- 10.10.100.197 8C32G
- 10.10.170.161 8C32G
- 创建elastic用户
确保这两台机器的操作系统版本为CentOS7
,并且都安装了Docker。
阅读官方文档https://www.elastic.co/guide/en/elasticsearch/reference/6.8/docker.html
根据官方示例创建目录结构
运行官方示例
通过文档,我们先在10.10.100.197
运行一个例子:
首先,调整内核参数
1 | sysctl -w vm.max_map_count=262144 |
运行容器
1 | docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.8.2 |
这里的docker.elastic.co/elasticsearch/elasticsearch:6.8.2
可更换为elasticsearch:6.8.2
。这个demo运行起来后,可以访问浏览器http://10.10.100.197:9200/
,次数会显示如下信息:
1 | { |
这就表示这个demo已经成功运行起来了,接下来进入容器了解内部目录信息。
查看容器内部结构
使用如下命令查看容器:
1 | docker ps |
使用docker exec
命令进入容器
1 | docker exec -it e55ffe98db79 /bin/bash |
此时,默认会进入ES的安装目录,查看目录结构:
1 | LICENSE.txt NOTICE.txt README.textile bin config data lib logs modules plugins |
pwd
查看全路径
1 | /usr/share/elasticsearch/config |
创建宿主机目录并创建配置文件
按照容器内的结构,我们在/home/elastic/
目录下创建了data
、config
、logs
、plugins
目录
1 | su - elastic |
将容器内的config
目录拷贝出来
1 | docker cp condescending_ride:/usr/share/elasticsearch/config/ . |
这样,在/home/elastic
目录下有了data
、config
、logs
、plugins
这四个目录,并且config
目录中包含有容器中的配置文件。
修改配置文件
修改上一步拷贝出的配置文件elasticsearch.yml
。
1 | -cluster.name: "docker-cluster" |
修改完毕后,拷贝到10.10.170.161
这台机器中
1 | scp -r * [email protected]:/home/elastic/ |
在10.10.170.161
上同样修改elasticsearch.yml
这个配置文件。
1 | cluster.name: "dev" |
在10.10.100.197
的/home/elastic/data/
中创建node1
目录。
在10.10.170.161
的/home/elastic/data/
中创建node2
目录。
运行容器
经过以上步骤,基本上目录结构与配置文件都已经搞定,此时可以运行容器了。
在10.10.100.197
执行如下命令启动容器:
1 | docker run -d --restart always --name es-node1 -p 9200:9200 -p 9300:9300 --privileged=true -v /home/elastic/config:/usr/share/elasticsearch/config -v /home/elastic/data:/usr/share/elasticsearch/data -v /home/elastic/logs:/usr/share/elasticsearch/logs -v /home/elastic/plugins:/usr/share/elasticsearch/plugins --net=host docker.elastic.co/elasticsearch/elasticsearch:6.8.2 |
此时会无限重启,使用docker logs es-node1
查看日志发现logs/gc.log
无法创建,没有权限。尽管我们加了--privileged=true
也不行,于是chmod -R 777 /home/elastic/*
一把唆(不建议哈),此时就可以启动了,同样的操作再另一台机器也执行一下。
在10.10.170.161
执行如下命令启动容器:
1 | docker run -d --restart always --name es-node2 -p 9200:9200 -p 9300:9300 --privileged=true -v /home/elastic/config:/usr/share/elasticsearch/config -v /home/elastic/data:/usr/share/elasticsearch/data -v /home/elastic/logs:/usr/share/elasticsearch/logs -v /home/elastic/plugins:/usr/share/elasticsearch/plugins --net=host elasticsearch:6.8.2 |
容器名称不一样是因为这台机器不造咋回事无法拉取docker.elastic.co/elasticsearch/elasticsearch:6.8.2
的镜像。
此时又出现无限重启,查看日志发现是忘记设置内核参数了:
1 | [2019-08-29T08:24:44,743][INFO ][o.e.b.BootstrapChecks ] [node2] bound or publishing to a non-loopback address, enforcing bootstrap checks |
执行如下命令解决问题:
1 | sysctl -w vm.max_map_count=262144 |
此时,两台ES都已经成功启动。
检查集群
打开http://10.10.170.161:9200/_cat/nodes?v查看状态,刚开始可能只有一个节点
1 | ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name |
刷新几下出现了另一个节点:
1 | ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name |
此时集群部署完毕。