Elasticsearch 是一个开源的分布式 RESTful 搜索和分析引擎,具有现代、快速、分布式、可扩展、容错等优点。Elasticsearch 借助了 Apache Lucene 的能力,让你拥有更强的把控力,可以索引海量数据,并进行搜索。
一、环境准备
1.1 创建用户和组
Elasticsearch 5 版本开始,出于系统安全考虑设置,不再允许直接使用 root 用户启动了,会报 can not run elasticsearch as root 异常信息,所以需要将 Elasticsearch 启动在普通用户下,且为了环境隔离,最好为 Elasticsearch 单独创建一个独立的用户,譬如 elsearch,用户名可自定义。
useradd elsearch # 新建 elsearch 用户
passwd elsearch # 修改 elsearch 用户的密码
请使用 root 用户执行上述命令,以创建 elsearch 用户及修改密码。
1.2 环境变量
为 elsearch 用户配置 Elasticsearch 配置环境变量。切换到 elsearch 用户下,编辑打开用户环境变量文件:
vim ~/.bashrc
将如下信息追加到文件中末尾的新行中:
ES_HOME=/usr/local/elasticsearch
PATH=$PATH:$ES_HOME/bin
再通过键入 :wq
保存且退出后,一定要再通过 source ~/.bashrc
命令使变更生效。
1.3 资源限制
-
最大线程数
一般在 Linux 系统的默认情况下,系统普通用户可以创建的线程数是 1024 个,此处应确保 elsearch 用户可以创建的线程数至少为 2048 个。可用如下方式设置:vim /etc/security/limits.d/90-nproc.conf
在打开的文件新行中追加如下内容:
elsearch soft nproc 4096
如果未修改该配置,启动时将会报形如下述内容的异常信息:
max number of threads [1024] for user [elsearch] likely too low, increase to at least [4096] -
打开的文件数与线程数
vim /etc/security/limits.conf
在打开的文件新行中追加如下内容:
elsearch soft nofile 65536 elsearch hard nofile 131072 elsearch soft nproc 4096 elsearch hard nproc 4096
注意:此处的 elsearch 与上述创建的用户名对应。
如果未修改该配置,启动时将会报形如下述内容的异常信息:
node validation exception bootstrap checks failed -
系统控制文件
Elasticsearch 默认使用 mmapfs 目录存储索引,而 Linux 默认对 mmap 计数限制可能太低,会导致内存异常。系统控制文件是管理系统中的各种资源控制的配置文件,ES 需要开辟一个 65536 字节以上空间的虚拟内存,但 Linux 又不允许任何用户直接开辟虚拟内存,所以通过如下方式修改:vim /etc/sysctl.conf
在打开的文件新行中增加如下内容:
vm.max_map_count=655360
再执行
sysctl -p
命令使其生效。如果未修改该配置,启动时将会报形如下述内容的异常信息:
max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
二、下载
当前最新的版本可在官网的下载界面直接下载,官网贴心的为大家准备了不同环境下安装包,可直接根据自己的安装环境下载,甚至还有打好包的 Docker 镜像。因为在编写本文档时,当前最新的版本是 7.8.0,且笔者的操作系统为 Linux 系统,所以本文使用的安装包是 elasticsearch-7.8.0-linux-x86_64.tar.gz,故本文下述中提到的所有配置信息皆是基于此版本,虽然其他版本的配置大同小异,但仅供参考。
三、安装配置
3.1 解压
将下载好的安装包 elasticsearch-7.8.0-linux-x86_64.tar.gz 上传至 elsearch 用户的主目录下,解压并移动到 /usr/local/ 目录下(不一定是 /usr/local 目录, 也可以是别的目录, 只是我比较喜欢把程序文件夹放到这个目录下, 把数据文件夹放到 /data 目录下而已) 。
tar -zxf elasticsearch-7.8.0-linux-x86_64.tar.gz #解压安装包
mv elasticsearch-7.8.0-linux-x86_64 /usr/local/elasticsearch #移动到指定目录,并更名
chown -R elsearch:elsearch /usr/local/elasticsearch #变更程序所属用户组
注意:需要使用 root 用户执行以上命令。
下面简要介绍一下 Elasticsearch 的文件目录结构。
目录 | 配置文件 | 描述 |
---|---|---|
bin | 二进制脚本文件。 启动 elasticsearch、安装插件、运行统计数据等 | |
config | elasticsearch.yml | 集群配置文件。user、role based 相关配置 |
jdk | Java 运行环境 | |
data | path.data | 数据文件 |
lib | Java 类库 | |
logs | path.log | 日志默认存放目录 |
modules | 所有 Elasticsearch 模块 | |
plugins | 已安装的插件 |
3.2 JVM 配置
Elasticsearch 为 JVM 的配置专门准备了一个 config/jvm.options 配置文件,7.8.0 版本的默认设置 JVM 启动时占用内存与运行时的最大占用内存皆为 1 GB,即 -Xms1g -Xmx1g。在实际使用环境中,可能存在需调整的情况,下面给出三条调整建议:
- Xmx 和 Xms 设置成一样。
- 不要超过机器总内存的 50%。
- 不要超过 30 GB。
3.3 配置
与近年来很多流行的框架和中间件一样,Elasticsearch 的配置同样遵循“约定大于配置”的设计原则。Elasticsearch 具有极好的默认值设置,用户仅需很少的配置既可使用 Elasticsearch。用户既可以使用集群更新设置 API 在在正在运行的集群上更改大多数设置,也可以通过配置文件对 Elasticsearch 进行配置。Elasticsearch 服务的主配置文件为 config/elasticsearch.yml。
注意:下述配置中多处使用了 hostname 作为地址信息,请留意配置相关 hosts 映射关系。
-
集群名称
默认的集群名称为 elasticsearch,如果存在多个集群,或需要为该集群起一个具有义务含义的名称,则需要为其重定义名称。cluster.name: elasticsearch
注意:elasticsearch 的日志文件名皆以集群名为前缀。
-
节点名称
默认情况下,Elasticsearch 将使用随机生成的 UUID 的前七个字符作为节点 ID,该节点名称一经生成后,即使重启服务亦不会变更,所以建议配置一个更有意义的名称,一般直接使用主机名(hostname)作为节点名。node.name: ${HOSTNAME}
一般情况下,直接使用上述表达式即可,服务启动时会自动通过执行
hostname
命令获取节点名。如若将其变更为具体的节点名,且是直接将此配置拷贝到其他节点上,以形成集群时,则需要另单独修改之,因为形成集群的必要条件是集群名相同,节点名不同。 -
logs 和 data 路径配置
Elasticsearch 是会像数据库一样存储大量数据的,且有时还会根据日志信息排查问题,所以数据和日志的存放目录都会另外指定到有较大存储空间的磁盘上保存。path.logs: /data/elasticsearch/logs path.data: /data/elasticsearch/data
若不存在上述目录,Elasticsearch 在启动时是不会去自动创建,所以需自行创建,且需保证 elsearch 用户拥有读写权限,最好将该目录所属用户及用户组修改为 elsearch。下面提供相关命令,以供参考。
mkdir -p /data/elasticsearch/logs /data/elasticsearch/data #递归创建目录 chown -R elsearch:elsearch /data/elasticsearch #变更目录所属用户及用户组
data 目录是可以设多个路径。
path: data: - /data/elasticsearch/data_1 - /data/elasticsearch/data_2 - /data/elasticsearch/data_3
在生产环境中一定要为 path.data 指定多个路径,如果有条件的话,最好保证这些目录挂载到不同的物理磁盘上。这样做有两个好处:
- 提升读写性能:比起单块磁盘,多块物理磁盘同时读写数据有更高的吞吐量。
- 能够实现故障转移:即 Failover。
-
network.host
默认情况下,此 elasticsearch 服务绑定到回环地址上,例如 127.0.0.1(::1),因为几乎每台机器的回环地址都是 127.0.0.1,在其他机器上通过回环地址访问的肯定只能也是其本地环境,所以如此配置,意味着只有本机才能访问此服务。要想其他节点也能访问到此服务,则需要绑定到一个非回环地址。network.host: 158.220.71.139
请将上述 IP 地址(IPv4 或 IPv6)修改为当前节点的对外 IP 地址。
-
discovery.seed_hosts
集群中拥有被选举成 Master 节点资格的地址列表。可以是以逗号分隔的单个字符串,每个节点的格式为:host:port 或 host,若并没有明确指定端口,则默认使用 9300。discovery.seed_hosts: ["node1", "node2", "node3"]
上述表示 node1、node2 和 node3 三个节点皆有资格被选举成 Master 节点。
-
cluster.initial_master_nodes
在一个新集群初始化时,符合 Master 节点资格的节点集。cluster.initial_master_nodes: ["slave09", "slave10"]
-
JDK版本(可选)
一般 elasticsearch 都会要求使用且内置了当前最新的 JDK 版本,但是在实际加载时,会优先判断本地的环境变量中是否存在 JAVA_HOME 变量,如果存在则用之,否则将加载内置的 JDK。假如在实际应用环境中,JAVA_HOME 所指的版本并非当前最新版,且因某些原因不能去变更它,那么可通过简单的修改配置信息,直接使用内置的 JDK 版本。在当前每半年发布一个 JDK 版本的时代,实际项目使用的版本很难跟上其发布的步伐,所以在部署 elasticsearch 时,强烈建议使用其内置版 JDK。
vim $ES_HOME/bin/elasticsearch-env
在 7.8.0 版本中,该配置信息位于第 39~50 行,如下注释掉判断是否存在 JAVA_HOME 变量的流程分支,直接使用内置的 JDK 版本。
#if [ ! -z "$JAVA_HOME" ]; then # JAVA="$JAVA_HOME/bin/java" # JAVA_TYPE="JAVA_HOME" #else if [ "$(uname -s)" = "Darwin" ]; then # macOS has a different structure JAVA="$ES_HOME/jdk.app/Contents/Home/bin/java" else JAVA="$ES_HOME/jdk/bin/java" fi JAVA_TYPE="bundled jdk" #fi
四、启动与停止
4.1 启动
在完成环境变量和参数配置的前提下,使用 elsearch 用户执行以下命令即可启动 elasticsearch:
elasticsearch -d
参数
-d
表示在后台以守护进程模式运行。
执行完启动命令后,可通过查看 /data/elasticsearch/logs 目录下的 elasticsearch.log (若在配置过程中修改了集群名称,则此文件名应为"集群名.log")文件,来检测启动过程中是否存在问题。
在确认启动日志中无异常信息后,再在终端上执行下述命令:
curl -X GET http://localhost:9200
能看到以下返回信息:
{
"name" : "Xxx",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "9zwi2VFeTCyuQdUVkre2ew",
"version" : {
"number" : "7.8.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "757314695644ea9a1dc2fecd26d1a43856725e65",
"build_date" : "2020-06-14T19:35:50.234439Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
这说明 Elasticsearch 集群已经启动并且正常运行。
或者直接在浏览器上访问 http://localhost:9200 地址,效果相同。
4.2 单节点多实例启动
在同一个节点上启动多个 elasticsearch 实例:
bin/elasticsearch -E node.name=node1 -E cluster.name=my_cluster -E path.data=/data/es/node1 -d
bin/elasticsearch -E node.name=node2 -E cluster.name=my_cluster -E path.data=/data/es/node2 -d
bin/elasticsearch -E node.name=node3 -E cluster.name=my_cluster -E path.data=/data/es/node3 -d
执行完上述命令后,可在终端执行下述命令查看集群的节点信息:
curl -X GET http://localhost:9200/_cat/nodes
得到的节点信息为:
158.220.71.139 26 64 0 0.00 0.01 0.05 dilmrt - node1
158.220.71.139 25 64 0 0.00 0.01 0.05 dilmrt * node2
158.220.71.139 27 64 0 0.00 0.01 0.05 dilmrt - node3
4.3 停止
Elasticsearch 并没有封装出一个具体的停止命令,官方的停服方式是需要在启动服务时,指定一个用于存放 pid 的文件:
bin/elasticsearch -p /tmp/elasticsearch-pid -d #指定进程号存放信息的方式启动
cat /tmp/elasticsearch-pid|xargs kill -SIGTERM #通过存放的进程号关闭服务
虽然使用此种方式停服会自动删除 elasticsearch-pid 文件,能做到毫无遗留痕迹,但停止时需要指定对应的 pid 文件,假如该 pid 文件丢失、起停非同一人操作呢?
我相信绝大部分操作者在启动时,都会下意识的不指定 pid 文件,毕竟该操作与启服目的并无直接关联,而停服则可直接通过查找进程并kill
的方式来停止服务,即省去的查找 pid 文件的步骤。该停服方式稍写优雅点的话,则是如下命令:
ps -ef|grep Elasticsearch|grep -v grep|awk '{print $2}'|xargs kill -SIGTERM
值得注意的是:此命令会杀死该节点上所有含“Elasticsearch”关键字的服务进程,即如果你是单节点多实例启动,亦会全部停止。
为了避免每次停服都要去手工写上述一长串命令,此处将上述命令进行再封装,可整理成一个stop.sh 脚本,存放于 $ES_HOME/bin/ 目录下。脚本内容如下:
#!/bin/sh
SIGNAL=${SIGNAL:-TERM}
case "`uname`" in
Linux)
bin_abs_path=$(readlink -f $(dirname $0))
;;
*)
bin_abs_path=`cd $(dirname $0); pwd`
;;
esac
base_dir=`cd $bin_abs_path/..; pwd`
PIDS=$(ps ax|grep Elasticsearch|grep java|grep "$base_dir"|grep -v grep|awk '{print $1}')
if [ -z "$PIDS" ]; then
echo "No elasticsearch server to stop"
exit 1
else
kill -s $SIGNAL $PIDS
while true
do
PID=$(ps ax|grep Elasticsearch|grep java|grep "$base_dir"|grep -v grep)
if [ -z "$PID" ]; then
echo " stopped"
break
fi
echo -n "."
sleep 1
done
fi
要记得为该脚本赋可执行权限:
chmod +x stop.sh