在深入了解一个系统前,我们应该先对其有一定使用经验。所有今天我们先来安装 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 进行下载,也可以在最新版下载页面进行下载。
你也可以在 Ubuntu 上使用 wget 指令进行下载:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.0-linux-x86_64.tar.gz
完成下载后,执行下面指令进行解压:
#查看当前工作目录,我的工作目录为用户的家目录:/home/ubuntu
pwd
# 将es安装在/home/ubuntu/ES (我的用户为ubuntu)
mkdir ES
mv elasticsearch-7.13.0-linux-x86_64.tar.gz ES
cd ES
tar xvf elasticsearch-7.13.0-linux-x86_64.tar.gz
# 我们可能会在单机上安装多个ES节点,现在先命名为es_node1
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.yml
和 jvm.options
。elasticsearch.yml 是用来配置 ES 服务的各种参数的,而 jvm.options 主要保存 JVM 相关的配置。
执行下面指令来修改 elasticsearch.yml 的配置:
cd es_node1
# 需要注意的是,线上一定不能配置ip为 0.0.0.0,这是非常危险的行为!!!
echo -e '\n' >> config/elasticsearch.yml
echo 'cluster.name: my_app' >> config/elasticsearch.yml
echo 'node.name: my_node_1' >> config/elasticsearch.yml
echo 'path.data: ./data' >> config/elasticsearch.yml
echo 'path.logs: ./logs' >> config/elasticsearch.yml
echo 'http.port: 9211' >> config/elasticsearch.yml
echo 'network.host: 0.0.0.0' >> config/elasticsearch.yml
echo 'discovery.seed_hosts: ["localhost"]' >> config/elasticsearch.yml
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 的参数,我们主要配置服务占用的堆内存的大小:
echo -e '\n' >> config/jvm.options
# 设置堆内存最小值
echo '-Xms1g' >> config/jvm.options
# 设置堆内存最大值
echo '-Xmx1g' >> config/jvm.options
JVM 配置需要以下几点:
-Xms 和-Xmx 这两个 JVM 的参数必须配置为一样的数值。服务在启动的时候就分配好内存空间,避免运行时申请分配内存造成系统抖动。
Xmx 不要超过机器内存的 50%,留下些内存供 JVM 堆外内存使用。
并且 Xmx 不要超过 32G。建议最大配置为 30G。接近 32G,可能会是 JVM 压缩指针的功能失效,导致性能下降。具体可以参考:a-heap-of-trouble。
如果就上面的配置进行启动,ES 会报错:
bootstrap check failure [1] of [1]:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
按照提示进行操作系统配置就可以了,需要执行下面指令来配置系统环境:
sudo su
echo -e '\nvm.max_map_count=262144' >> /etc/sysctl.conf
sysctl -p
exit;
3. 运行 ES
注意,ES 不能使用 root 来运行!!!!
# 前台运行, 可以直接查看日志
.bin/elasticsearch
# 后台运行, 日志在 ./logs/my_app.log
# 查看日志的话可以:tail -n 100 -f logs/my_app.log
.bin/elasticsearch -d
在浏览器中访问 localhost:9211,如果得到以下结果即运行成功:
二、Ubuntu 下安装 Kibana
Kibana 是官方的数据分析和可视化平台,但现在我们只需要把它当作 ES 查询的调试工具即可。 Kibana 与 ES 的版本是有对应关系的,所以需要下载与 ES 同版本的 Kibana,在这里下载 Kibana 7.13.0。
下面是使用 wget 下载并且解压安装 Kibana 的指令:
# 进入刚才安装ES的目录
cd ES
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.13.0-linux-x86_64.tar.gz
tar xvf kibana-7.13.0-linux-x86_64.tar.gz
# 重命名
mv kibana-7.13.0-linux-x86_64 kibana
cd kibana
# 需要注意的是,线上一定不能配置ip为 0.0.0.0,这是非常危险的行为!!!
echo -e '\nserver.host: "0.0.0.0"' >> config/kibana.yml
echo -e '\nelasticsearch.hosts: ["http://localhost:9211"]' >> config/kibana.yml
./bin/kibana >> run.log 2>&1 &
安装完成后,在浏览器中访问 localhost:5601,如果运行成功可以进入到如下界面:
打开 Dev Tools 即可开始你的查询了,新版的 Kibana 加入了很多功能,比我之前用的 6.1.1 丰富很多!
三、安装 Cerebro
Cerebro 是一个简单的 ES 管理工具,其安装如下:
cd ES
# 如果你无法从github下载文件,那么可以访问下面的链接手动(备份地址无法用wget下载)下载,然后再进行解压。
# 备份地址:https://gitee.com/dgl/es-booklet/raw/master/resources/cerebro-0.9.4.tgz
wget https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.tgz
tar xvf cerebro-0.9.4.tgz
mv cerebro-0.9.4 cerebro
cd cerebro
sed -i 's/server.http.port = ${?CEREBRO_PORT}/server.http.port = 9800/g' conf/application.conf
echo -e '\nhosts = [
{
host = "http://localhost:9211"
name = "my_app"
}
]' >> conf/application.conf
配置完成后,运行以下指令启动 cerebo:
#启动, 在run.log中查看日志
.bin/cerebro >> run.log 2>&1 &
如果启动成功,在浏览器中访问 localhost:9800 即可访问 cerebro。
四、安装伪集群版的 ES 服务
上面我们安装一个单机版的 ES 服务,但为了方便后续学习 ES 的分布式特性,这里我们安装伪集群版的 ES,所有节点都是相同的角色,并且在同一个机器上。其架构如下图所示:
如上图,左边的是单机版架构,右边的是伪集群版架构。
伪集群版详细的安装过程与单机版的差不多,这里只提供集群安装脚本-gitee、集群安装脚本-github。使用这个脚本,你只需要修改节点数和每个节点的内存这两个参数即可。
# 每个es节点的最大内存,单位m
es_max_mem=128
# es 节点数量
es_node_amount=3
安装完成后,在浏览器中访问 localhost:9800 即可访问 cerebro:
如上图,可以看到集群有 3 个节点,其中 my_node2 为集群的 Master,并且 3 个节点都是数据节点。
五、开始你的第一次搜索
在开始搜索前,需要先定义 mapping 和创建索引,并且插入数据。至于什么是索引、什么是 mapping,这里可以简单认为索引是类似于数据库的表,而 mapping 是类似于数据库表结构的定义。
在 Kibana 的 Dev Tools 中运行以下指令来创建索引:
PUT users
{
"mappings": {
"properties": {
"user_id": {
"type": "keyword"
},
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}
如下图,点击红色箭头处即可创建索引:
成功创建索引后,就可以写入数据到这个索引了。将数据插入到 users 索引,同样在 Kibana 中运行以下指令即可插入数据:
POST /users/_doc
{
"user_id":"123",
"name":"陈小明",
"age":10
}
POST /users/_doc
{
"user_id":"456",
"name":"黄小月",
"age":11
}
最后我们来执行数据查询,在 Kibana 中执行以下查询:
POST /users/_search
{
"query": {
"match_phrase": {
"name": "陈小明"
}
}
}
如下图,可以看到名字为“陈小明”的用户已经被查询出来了。
六、总结
本文为你介绍了 ES、Kibana、Cerebro 的安装,并且为你整理好了一键安装的脚本。 在安装 ES 的时候,我们需要注意几个配置项:
discovery.seed_hosts 配置为 master 候选者节点即可。
cluster.initial_master_nodes 用于指定新集群 master 候选者列表,其值为节点名字列表而不是 ip。
同时为你介绍了线上环境下,JVM 参数配置时需要注意的几个事项:
- -Xms 和 -Xmx 的配置需要一样。
- Xmx 不要超过机器内存的 50%,留出部分内存给 JVM 堆外内存使用。
- Xmx 不要超过 32G,避免 JVM 压缩指针的功能失效,导致性能下降。
好了,今天的内容到此为止。欢迎你在留言区与我分享你的想法,我们一起交流、一起进步。