Elasticsearch 是一个开源的分布式 RESTful 搜索和分析引擎,具有现代、快速、分布式、可扩展、容错等优点。Elasticsearch 借助了 Apache Lucene 的能力,让你拥有更强的把控力,可以索引海量数据,并进行搜索。
Elasticsearch 5 版本开始,出于系统安全考虑设置,不再允许直接使用 root 用户启动了,会报 can not run elasticsearch as root 异常信息,所以需要将 Elasticsearch 启动在普通用户下,且为了环境隔离,最好为 Elasticsearch 单独创建一个独立的用户,譬如 elsearch,用户名可自定义。使用root用户进行以下操作
useradd elsearch
passwd elsearch 密码根据要求定义
2. 关闭防火墙
执行关闭防火墙命令和禁止firewall开机启动命令。
systemctl stop firewalld & systemctl disable firewalld
执行firewall-cmd --state命令检查防火墙是否关闭。
屏幕出现如下信息表明防火墙成功关闭。
not running
3.环境变量
服务器无网情况下,可以忽略该步骤,配置了也没用。。。
无网情况下,需要安装本地JDK,否则,ES服务启动时,会报错,尽量使用更高版本。
为 elsearch 用户配置 Elasticsearch 配置环境变量。切换到 elsearch 用户下,编辑打开用户环境变量文件:vi ~/.bashrc
ES_HOME=/usr/local/elasticsearch/elasticsearch-7.14.1
PATH=$PATH:$ES_HOME/bin
根据安装的实际情况,将上面两句追加到文件末尾
4. 资源限制
4.1.最大线程数
一般在 Linux 系统的默认情况下,系统普通用户可以创建的线程数是 1024 个,此处应确保 elsearch 用户可以创建的线程数至少为 2048 个。可用如下方式设置:
vi /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]
vi /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
4.3 系统控制文件
Elasticsearch 默认使用 mmapfs 目录存储索引,而 Linux 默认对 mmap 计数限制可能太低,会导致内存异常。系统控制文件是管理系统中的各种资源控制的配置文件,ES 需要开辟一个 65536 字节以上空间的虚拟内存,但 Linux 又不允许任何用户直接开辟虚拟内存,所以通过如下方式修改:
vi /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]
5.设置hostname和hosts文件
hostname可以按照ES安装节点数命名:elsearch01,elsearch02,elsearch03等。
执行命令示例:hostnamectl set-hostname elsearch01
hosts文件中需要将IP和对应主机的hostname对应配置上
设置完成,需要重启才能生效,执行命令:
reboot
当前最新的版本可在官网的下载界面直接下载,官网贴心的为大家准备了不同环境下安装包,可直接根据自己的安装环境下载,甚至还有打好包的 Docker 镜像。因为在编写本文档时,当前最新的版本是 7.14.1,且笔者的操作系统为 Linux 系统,所以本文使用的安装包是 elasticsearch-7.14.1-linux-x86_64.tar.gz,故本文下述中提到的所有配置信息皆是基于此版本,虽然其他版本的配置大同小异,但仅供参考。
1. 解压
将下载好的安装包 elasticsearch-7.14.1-linux-x86_64.tar.gz 上传至服务器,解压到 /usr/local/elasticsearch 目录下,之后修改程序所属用户组(具体放到哪个目录可以自定义,不强制,根据个人习惯)
tar -zxf elasticsearch-7.14.1-linux-x86_64.tar.gz # 解压安装包
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 |
已安装的插件 |
2. JVM配置
Elasticsearch 为 JVM 的配置专门准备了一个 config/jvm.options 配置文件,7.14.1 版本的默认设置 JVM 启动时占用内存与运行时的最大占用内存皆为 4 GB,即 -Xms4g -Xmx4g。在实际使用环境中,可能存在需调整的情况,下面给出两条调整建议:
- Xmx 和 Xms 设置成一样。
- 不要超过机器总内存的 50%。
3 配置
ES官网地址:
Important Elasticsearch configuration | Elasticsearch Guide [7.14] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html
Elasticsearch的配置同样遵循“约定大于配置”的设计原则。Elasticsearch 具有极好的默认值设置,用户仅需很少的配置既可使用 Elasticsearch。用户既可以使用集群更新设置 API 在在正在运行的集群上更改大多数设置,也可以通过配置文件对 Elasticsearch 进行配置。Elasticsearch 服务的主配置文件为 config/elasticsearch.yml。
注意:下述配置中多处使用了 hostname 作为地址信息,请留意配置相关 hosts 映射关系。
vi config/elasticsearch.yml
3.1、集群名称
默认的集群名称为 elasticsearch,如果存在多个集群,或需要为该集群起一个具有义务含义的名称,则需要为其重定义名称,记得取消前面的#,否则不生效。
cluster.name: elasticsearch
默认情况下,Elasticsearch 将使用随机生成的 UUID 的前七个字符作为节点 ID,该节点名称一经生成后,即使重启服务亦不会变更,所以建议配置一个更有意义的名称,一般直接使用主机名(hostname)作为节点名,记得取消前面的#,否则不生效。
node.name: ${HOSTNAME}
Elasticsearch 是会像数据库一样存储大量数据的,且有时还会根据日志信息排查问题,所以数据和日志的存放目录都会另外指定到有较大存储空间的磁盘上保存,记得取消前面的#,否则不生效。
path.data: /home/elasticsearch/data
path.logs: /home/elasticsearch/logs
若不存在上述目录,Elasticsearch 在启动时是不会去自动创建,所以需自行创建,且需保证 elsearch 用户拥有读写权限,最好将该目录所属用户及用户组修改为 elsearch。下面提供相关命令,以供参考。
mkdir -p /home/elasticsearch/logs /home/elasticsearch/data #递归创建目录
chown -R elsearch:elsearch /home/elasticsearch #变更目录所属用户及用户组
data 目录是可以设多个路径。
path:
data:
- /home/elasticsearch/data_1
- /home/elasticsearch/data_2
- /home/elasticsearch/data_3
在生产环境中一定要为 path.data 指定多个路径,如果有条件的话,最好保证这些目录挂载到不同的物理磁盘上。这样做有两个好处:
- 提升读写性能:比起单块磁盘,多块物理磁盘同时读写数据有更高的吞吐量。
- 能够实现故障转移:即 Failover。
默认情况下,此 elasticsearch 服务绑定到回环地址上,例如 127.0.0.1(::1),因为几乎每台机器的回环地址都是 127.0.0.1,在其他机器上通过回环地址访问的肯定只能也是其本地环境,所以如此配置,意味着只有本机才能访问此服务。要想其他节点也能访问到此服务,则需要绑定到一个非回环地址,记得取消前面的#,否则不生效。
network.host: 30.61.2.6
请将上述 IP 地址(IPv4 或 IPv6)修改为当前节点的对外 IP 地址。
改为0.0.0.0,最后浏览器才可以访问,ip在浏览器中访问不成功。
集群中拥有被选举成 Master 节点资格的地址列表。可以是以逗号分隔的单个字符串,每个节点的格式为:host:port 或 host,若并没有明确指定端口,则默认使用 9200。目前未使用。
在一个新集群初始化时,符合 Master 节点资格的节点集。
cluster.initial_master_nodes中填写的值为主机的hostname值,多节点则填写多个节点的hostname,逗号隔开。
在最后加上这两句,要不然,外面浏览器就访问不了
http.cors.enabled: true
http.cors.allow-origin: "*"
本机未安装JDK,并且有网时,可以忽略本步骤。
一般 elasticsearch 都会要求使用且内置了当前最新的 JDK 版本,但是在实际加载时,会优先判断本地的环境变量中是否存在 JAVA_HOME 变量,如果存在则用之,否则将加载内置的 JDK。假如在实际应用环境中,JAVA_HOME 所指的版本并非当前最新版,且因某些原因不能去变更它,那么可通过简单的修改配置信息,直接使用内置的 JDK 版本。
在当前每半年发布一个 JDK 版本的时代,实际项目使用的版本很难跟上其发布的步伐,所以在部署 elasticsearch 时,强烈建议使用其内置版 JDK。
已安装就用以下命令进入,之后注释掉判断是否存在 JAVA_HOME 变量的流程分支,直接使用内置的 JDK 版本,如下图示例。
vi $ES_HOME/bin/elasticsearch-env
在完成环境变量和参数配置(见上文2.环境变量)的前提下,使用 elsearch 用户执行以下命令即可启动 elasticsearch:
su elsearch
./bin/elasticsearch -d
参数-d表示在后台以守护进程模式运行。
执行完启动命令后,可通过查看 /data/elasticsearch/logs 目录下的 elasticsearch.log (若在配置过程中修改了集群名称,则此文件名应为"集群名.log")文件,来检测启动过程中是否存在问题。
在确认启动日志中无异常信息后,再在终端上执行下述命令:
curl -X GET http://30.61.2.6:9200
能看到以下返回信息:
这说明 Elasticsearch 集群已经启动并且正常运行。
或者直接在浏览器上访问 http://30.61.2.6:9200 地址,效果相同。
如果多个节点启动以后,查询集群节点信息,通过以下命令:
curl -X GET http://30.61.2.6:9200/_cat/nodes
2. 停止
Elasticsearch 并没有封装出一个具体的停止命令,官方的停服方式是需要在启动服务时,指定一个用于存放 pid 的文件:
1、指定进程号存放信息的方式启动
bin/elasticsearch -p /tmp/elasticsearch-pid -d
2、通过存放的进程号关闭服务
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
简单点的方法,先ps -ef | grep Elasticsearch,之后kill掉对应进程就OK。