在深入了解一个系统前,我们应该先对其有一定使用经验。所有今天我们先来安装 ES 并且使用 ES 进行第一次数据检索。

由于线上环境一般都是 Linux,所以我们将在 Ubuntu 20.04 上安装 ES,至于 Window 的用户可以安装 Ubuntu 的虚拟机。本文将为你介绍单机版 ES 7.13.0、Kibana 7.13.0、Cerebro 0.9.4 的安装,如果你对安装过程有一定了解或者对安装过程不感兴趣,可以直接使用一键安装脚本-gitee一键安装脚本-github来部署你的 ES 实例,当然这里也提供了用 docker-compose 安装的方式。需要说明的是,ES 小册-gitee 这个项目放了一些资源和脚本,本小册需要用到的资源都会链接到这里,ES 小册-github是其备份。

ok,下面就正式开始今天的内容吧。

一、Ubuntu 下安装 ES

在我们开始下面的内容前:你需要准备 Ubuntu 系统,并且最少 2G 内存。ES 安装的主要步骤如下:

  • 下载 ES 安装包并且解压安装,因为这里安装的是指定版本,所以不使用 Ubuntu apt 的方式啦。
  • 修改 ES 的配置、 ES JVM 参数配置、修改操作系统的系统配置。
  • 运行 ES。

1. 下载、解压 ES 安装包

你可以在 ES 7.13.0 进行下载,也可以在最新版下载页面进行下载。

最新版ES下载页.png

你也可以在 Ubuntu 上使用 wget 指令进行下载:

  1. wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.0-linux-x86_64.tar.gz

完成下载后,执行下面指令进行解压:

  1. #查看当前工作目录,我的工作目录为用户的家目录:/home/ubuntu
  2. pwd
  3. # 将es安装在/home/ubuntu/ES (我的用户为ubuntu)
  4. mkdir ES
  5. mv elasticsearch-7.13.0-linux-x86_64.tar.gz ES
  6. cd ES
  7. tar xvf elasticsearch-7.13.0-linux-x86_64.tar.gz
  8. # 我们可能会在单机上安装多个ES节点,现在先命名为es_node1
  9. mv elasticsearch-7.13.0 es_node1

解压后可以看到 ES 的文件目录结构如下:

目录 描述
bin 包含一些执行脚本,其中 ES 的启动文件和脚本安装文件就在这里
config 包含集群的配置文件(elasticsearch.yml)、jvm配置(jvm.options)、user等相关配置
JDK 7.0 后自带 jdk,java 运行环境
lib java 的类库
plugins 插件安装的目录
modules 包含所有 ES 的模块

2. 修改配置

虽然 ES 可以开箱即用,但这里我们还是需要修改部分配置的。ES 的配置文件在 config 目录内,我们主要关注两个配置文件:elasticsearch.ymljvm.options。elasticsearch.yml 是用来配置 ES 服务的各种参数的,而 jvm.options 主要保存 JVM 相关的配置。

执行下面指令来修改 elasticsearch.yml 的配置:

  1. cd es_node1
  2. # 需要注意的是,线上一定不能配置ip为 0.0.0.0,这是非常危险的行为!!!
  3. echo -e '\n' >> config/elasticsearch.yml
  4. echo 'cluster.name: my_app' >> config/elasticsearch.yml
  5. echo 'node.name: my_node_1' >> config/elasticsearch.yml
  6. echo 'path.data: ./data' >> config/elasticsearch.yml
  7. echo 'path.logs: ./logs' >> config/elasticsearch.yml
  8. echo 'http.port: 9211' >> config/elasticsearch.yml
  9. echo 'network.host: 0.0.0.0' >> config/elasticsearch.yml
  10. echo 'discovery.seed_hosts: ["localhost"]' >> config/elasticsearch.yml
  11. echo 'cluster.initial_master_nodes: ["my_node_1"]' >> config/elasticsearch.yml

下面对其中几个重要的配置进行解析。

  • discovery.seed_hosts 在开箱即用的情境下(本机环境)无需配置,ES 会自动扫描本机的 9300 到9305 端口。一旦进行了网络环境配置,这个自动扫描操作就不会执行。discovery.seed_hosts 配置为 master 候选者节点即可。 如果需要指定端口的话,其值可以为:[“localhost:9300”, “localhost:9301”]

  • cluster.initial_master_nodes 指定新集群 master 候选者列表,其值为节点的名字列表。这里配置了 node.name: my_node_1,所以其值为 [“my_node_1”],而不是 ip 列表 !

  • network.host 和 http.port 是 ES 提供服务的监听地址和端口,线上一定不能配置 ip 为 0.0.0.0,这是非常危险的行为!!!

怎么样来理解这个 discovery.seed_hosts 和 cluster.initial_master_nodes 呢?

cluster.initial_master_nodes 是候选者列表,一般我们线上环境候选者的数量会比较少,毕竟是用来做备用的。而且这个配置只跟选举 master 有关,也就是跟其他类型的节点没有关系,其他类型的节点不需要配置这个也是可以的。

discovery.seed_hosts 这个可以理解为是做服务或者节点发现的,其他节点必须知道他们才能进入集群,一般配置为集群的 master 候选者的列表。

在现实环境中是这些 master 候选者(组织联系人)可能会经常变化,那怎么办呢?discovery.seed_hosts 这个配置项除了支持 ip 外还支持域名,所以可以用域名来解决这个问题。其他类型节点的配置上写的是域名,域名解析到对应的 ip,如果机器挂了,新的节点 ip 换了,就把域名解析到新的ip即可,这样其他节点的配就不用修改了。所以非 master 候选节点要配 discovery.seed_hosts (组织联系人)才能顺利加入到集群中来。

除了修改 ES 服务配置外,还需要在 jvm.options 文件中配置 JVM 的参数,我们主要配置服务占用的堆内存的大小:

  1. echo -e '\n' >> config/jvm.options
  2. # 设置堆内存最小值
  3. echo '-Xms1g' >> config/jvm.options
  4. # 设置堆内存最大值
  5. echo '-Xmx1g' >> config/jvm.options

JVM 配置需要以下几点:

  • -Xms 和-Xmx 这两个 JVM 的参数必须配置为一样的数值。服务在启动的时候就分配好内存空间,避免运行时申请分配内存造成系统抖动。

  • Xmx 不要超过机器内存的 50%,留下些内存供 JVM 堆外内存使用

  • 并且 Xmx 不要超过 32G建议最大配置为 30G。接近 32G,可能会是 JVM 压缩指针的功能失效,导致性能下降。具体可以参考:a-heap-of-trouble

如果就上面的配置进行启动,ES 会报错:

  1. bootstrap check failure [1] of [1]:
  2. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

按照提示进行操作系统配置就可以了,需要执行下面指令来配置系统环境:

  1. sudo su
  2. echo -e '\nvm.max_map_count=262144' >> /etc/sysctl.conf
  3. sysctl -p
  4. exit;

3. 运行 ES

注意,ES 不能使用 root 来运行!!!!

  1. # 前台运行, 可以直接查看日志
  2. .bin/elasticsearch
  3. # 后台运行, 日志在 ./logs/my_app.log
  4. # 查看日志的话可以:tail -n 100 -f logs/my_app.log
  5. .bin/elasticsearch -d

在浏览器中访问 localhost:9211,如果得到以下结果即运行成功:

运行ES成功.png

二、Ubuntu 下安装 Kibana

Kibana 是官方的数据分析和可视化平台,但现在我们只需要把它当作 ES 查询的调试工具即可。 Kibana 与 ES 的版本是有对应关系的,所以需要下载与 ES 同版本的 Kibana,在这里下载 Kibana 7.13.0

下面是使用 wget 下载并且解压安装 Kibana 的指令:

  1. # 进入刚才安装ES的目录
  2. cd ES
  3. wget https://artifacts.elastic.co/downloads/kibana/kibana-7.13.0-linux-x86_64.tar.gz
  4. tar xvf kibana-7.13.0-linux-x86_64.tar.gz
  5. # 重命名
  6. mv kibana-7.13.0-linux-x86_64 kibana
  7. cd kibana
  8. # 需要注意的是,线上一定不能配置ip为 0.0.0.0,这是非常危险的行为!!!
  9. echo -e '\nserver.host: "0.0.0.0"' >> config/kibana.yml
  10. echo -e '\nelasticsearch.hosts: ["http://localhost:9211"]' >> config/kibana.yml
  11. ./bin/kibana >> run.log 2>&1 &

安装完成后,在浏览器中访问 localhost:5601,如果运行成功可以进入到如下界面:

运行Kibana成功.png

打开 Dev Tools 即可开始你的查询了,新版的 Kibana 加入了很多功能,比我之前用的 6.1.1 丰富很多!

三、安装 Cerebro

Cerebro一个简单的 ES 管理工具,其安装如下:

  1. cd ES
  2. # 如果你无法从github下载文件,那么可以访问下面的链接手动(备份地址无法用wget下载)下载,然后再进行解压。
  3. # 备份地址:https://gitee.com/dgl/es-booklet/raw/master/resources/cerebro-0.9.4.tgz
  4. wget https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.tgz
  5. tar xvf cerebro-0.9.4.tgz
  6. mv cerebro-0.9.4 cerebro
  7. cd cerebro
  8. sed -i 's/server.http.port = ${?CEREBRO_PORT}/server.http.port = 9800/g' conf/application.conf
  9. echo -e '\nhosts = [
  10. {
  11. host = "http://localhost:9211"
  12. name = "my_app"
  13. }
  14. ]' >> conf/application.conf

配置完成后,运行以下指令启动 cerebo:

  1. #启动, 在run.log中查看日志
  2. .bin/cerebro >> run.log 2>&1 &

如果启动成功,在浏览器中访问 localhost:9800 即可访问 cerebro。

四、安装伪集群版的 ES 服务

上面我们安装一个单机版的 ES 服务,但为了方便后续学习 ES 的分布式特性,这里我们安装伪集群版的 ES,所有节点都是相同的角色,并且在同一个机器上。其架构如下图所示:

ES的安装架构.png

如上图,左边的是单机版架构,右边的是伪集群版架构。

伪集群版详细的安装过程与单机版的差不多,这里只提供集群安装脚本-gitee集群安装脚本-github。使用这个脚本,你只需要修改节点数和每个节点的内存这两个参数即可。

  1. # 每个es节点的最大内存,单位m
  2. es_max_mem=128
  3. # es 节点数量
  4. es_node_amount=3

安装完成后,在浏览器中访问 localhost:9800 即可访问 cerebro:

Cerebro访问ES集群.png

如上图,可以看到集群有 3 个节点,其中 my_node2 为集群的 Master,并且 3 个节点都是数据节点。

五、开始你的第一次搜索

在开始搜索前,需要先定义 mapping 和创建索引,并且插入数据。至于什么是索引、什么是 mapping,这里可以简单认为索引是类似于数据库的表,而 mapping 是类似于数据库表结构的定义。

在 Kibana 的 Dev Tools 中运行以下指令来创建索引:

  1. PUT users
  2. {
  3. "mappings": {
  4. "properties": {
  5. "user_id": {
  6. "type": "keyword"
  7. },
  8. "name": {
  9. "type": "text"
  10. },
  11. "age": {
  12. "type": "integer"
  13. }
  14. }
  15. }
  16. }

如下图,点击红色箭头处即可创建索引:

创建Mapping.png

成功创建索引后,就可以写入数据到这个索引了。将数据插入到 users 索引,同样在 Kibana 中运行以下指令即可插入数据:

  1. POST /users/_doc
  2. {
  3. "user_id":"123",
  4. "name":"陈小明",
  5. "age":10
  6. }
  7. POST /users/_doc
  8. {
  9. "user_id":"456",
  10. "name":"黄小月",
  11. "age":11
  12. }

最后我们来执行数据查询,在 Kibana 中执行以下查询:

  1. POST /users/_search
  2. {
  3. "query": {
  4. "match_phrase": {
  5. "name": "陈小明"
  6. }
  7. }
  8. }

如下图,可以看到名字为“陈小明”的用户已经被查询出来了。

执行第一次查询.png

六、总结

本文为你介绍了 ES、Kibana、Cerebro 的安装,并且为你整理好了一键安装的脚本。 在安装 ES 的时候,我们需要注意几个配置项:

  • discovery.seed_hosts 配置为 master 候选者节点即可。

  • cluster.initial_master_nodes 用于指定新集群 master 候选者列表,其值为节点名字列表而不是 ip。

同时为你介绍了线上环境下,JVM 参数配置时需要注意的几个事项:

  • -Xms 和 -Xmx 的配置需要一样。
  • Xmx 不要超过机器内存的 50%,留出部分内存给 JVM 堆外内存使用。
  • Xmx 不要超过 32G,避免 JVM 压缩指针的功能失效,导致性能下降。

好了,今天的内容到此为止。欢迎你在留言区与我分享你的想法,我们一起交流、一起进步。