最近想把项目依赖的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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name" : "w0LOSYp",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "2QU6eiYtTmCQjdnhKmpgxw",
"version" : {
"number" : "6.8.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "b506955",
"build_date" : "2019-07-24T15:24:41.545295Z",
"build_snapshot" : false,
"lucene_version" : "7.7.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}

这就表示这个demo已经成功运行起来了,接下来进入容器了解内部目录信息。

查看容器内部结构

使用如下命令查看容器:

1
2
3
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e55ffe98db79 docker.elastic.co/elasticsearch/elasticsearch:6.8.2 "/usr/local/bin/dock…" 58 seconds ago Up 56 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp condescending_ride

使用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/目录下创建了dataconfiglogsplugins目录

1
2
3
4
su - elastic
mkdir data
mkdir logs
mkdir plugins

将容器内的config目录拷贝出来

1
docker cp condescending_ride:/usr/share/elasticsearch/config/ .

这样,在/home/elastic目录下有了dataconfiglogsplugins这四个目录,并且config目录中包含有容器中的配置文件。

修改配置文件

修改上一步拷贝出的配置文件elasticsearch.yml

1
2
3
4
5
6
7
-cluster.name: "docker-cluster"
+cluster.name: "dev"
+node.name: node1
+bootstrap.memory_lock: false
+bootstrap.system_call_filter: false
+scovery.zen.ping.unicast.hosts: ["10.10.100.197", "10.10.170.161"]
network.host: 0.0.0.0

修改完毕后,拷贝到10.10.170.161这台机器中

1
scp -r * [email protected]:/home/elastic/

10.10.170.161上同样修改elasticsearch.yml这个配置文件。

1
2
3
4
5
6
7
cluster.name: "dev"
-node.name: node1
+node.name: node2
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
scovery.zen.ping.unicast.hosts: ["10.10.100.197", "10.10.170.161"]
network.host: 0.0.0.0

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
2
3
4
5
6
7
8
[2019-08-29T08:24:44,743][INFO ][o.e.b.BootstrapChecks    ] [node2] bound or publishing to a non-loopback address, enforcing bootstrap checks
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2019-08-29T08:24:44,754][INFO ][o.e.n.Node ] [node2] stopping ...
[2019-08-29T08:24:44,774][INFO ][o.e.n.Node ] [node2] stopped
[2019-08-29T08:24:44,775][INFO ][o.e.n.Node ] [node2] closing ...
[2019-08-29T08:24:44,787][INFO ][o.e.n.Node ] [node2] closed
[2019-08-29T08:24:44,789][INFO ][o.e.x.m.p.NativeController] [node2] Native controller process has stopped - no new native processes can be started

执行如下命令解决问题:

1
sysctl -w vm.max_map_count=262144

此时,两台ES都已经成功启动。

检查集群

打开http://10.10.170.161:9200/_cat/nodes?v查看状态,刚开始可能只有一个节点

1
2
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.10.170.161 6 99 1 0.29 0.29 0.22 mdi * node2

刷新几下出现了另一个节点:

1
2
3
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.10.100.197 7 99 0 0.30 0.11 0.07 mdi - node1
10.10.170.161 6 99 1 0.29 0.29 0.22 mdi * node2

此时集群部署完毕。