操作系统: centos7
准备: 4台主机(虚拟机,我使用 VirtualBox6.1)
主机名 | IP |
---|---|
noed1 | 192.168.0.127 |
noed2 | 192.168.0.128 |
noed3 | 192.168.0.129 |
noed4 | 192.168.0.130 |
准备
主机上的基础配置
为了简化配置我们把主机上的防火墙关闭
systemctl stop firewalld
systemctl disable firewalld
下载ElasticSearch RPM版本安装包
curl -O https://mirrors.tuna.tsinghua.edu.cn/elasticstack/7.x/yum/7.10.1/elasticsearch-7.10.1-x86_64.rpm
这里使用清华的镜像,用来加速下载,也可以直接使用官方的。
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-x86_64.rpm
你也可以直接本地下载完了之后再上传到服务器上(我用迅雷下载还是挺快的)
如果不想用IP在主机间访问那么,建议配置hosts映射
sudo cat << EOF >> /etc/hosts
192.168.0.127 node1
192.168.0.128 node2
192.168.0.129 node3
192.168.0.130 node4
EOF
cat /etc/hosts
可以重启一下网络服务
systemctl restart network
安装
通过RPM方式安装,就是离线安装,整个过程不需要互联网。
安装RPM
sudo rpm -ivh elasticsearch-7.10.1-x86_64.rpm
安装完成后默认es是不会启动,它提示我们需要重新加载systemd 和 启动 es,在这之前我们先调整下Systemd Service的参数,让操作系统不限制锁内存。
如果不调整,在es启用了
bootstrap.memory_lock: true
参数后会提供ERROR: bootstrap checks failed memory locking requested for elasticsearch process but memory is not locked
无法启动
编辑服务配置文件
sudo vi /usr/lib/systemd/system/elasticsearch.service
在[Service]
栏目下增加一个配置,如下
LimitMEMLOCK=infinity
重新加载Systemd配置
sudo systemctl daemon-reload
配置
在启动之前,想对集群进行配置,通过RPM安装的ES配置文件位于/etc/elasticsearch/elasticsearch.yml
/etc/elasticsearch/
├── elasticsearch.keystore
├── elasticsearch.yml
├── jvm.options
├── jvm.options.d
├── log4j2.properties
├── role_mapping.yml
├── roles.yml
├── users
└── users_roles
编辑配置搭建集群
vi /etc/elasticsearch/elasticsearch.yml
配置的参数可以参考
#
# 集群名称
#
cluster.name: kkk
#
# ------------------------------------ Node ------------------------------------
#
# 结点名称
#
node.name: node1
#
# ----------------------------------- Paths ------------------------------------
#
# ES数据存储位置:
#
path.data: /var/lib/elasticsearch
#
# 日志文件存储位置:
#
path.logs: /var/log/elasticsearch
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
bootstrap.memory_lock: true
#
# ---------------------------------- Network -----------------------------------
#
# 设置ES绑定的IP,0.0.0.0 表示由系统指定
# 注意在安装有docker之类的地方,此处必需手动指定主机的IP地址
# 否则会发生注册之后,无法连接的问题。
#
network.host: 0.0.0.0
#
#http.port: 9200
#
# --------------------------------- Discovery ----------------------------------
#
# 主机发现,这里配置其他的节点主机名称或者IP
# 这个项目中不需要配置自己这台主机的IP,只需要提供其他节点的IP或主机名
#
# 例如: discovery.seed_hosts: ["192.168.0.128", "192.168.0.129", "192.168.0.130"]
#
discovery.seed_hosts: ["node2", "node3", "node4"]
#
# 可选选举为主节点的节点主机名
# 这里需要填入所有主机名称,这里填入了所有的节点
# 表示集群中任何一个节点都可以选举称为主节点
#
cluster.initial_master_nodes: ["node1", "node2", "node3", "node4"]
#
# For more information, consult the discovery and cluster formation module documentation.
#
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
#
#gateway.recover_after_nodes: 3
#
# For more information, consult the gateway module documentation.
#
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true
启动
在每个节点上都执行下面命令,我们先以node1节点上的命令为例:
设置开机自启动
sudo systemctl enable elasticsearch
启动ES
sudo systemctl start elasticsearch
注意首次启动可能会花费比较长的事件,请耐心等待
查看ES启动状态
systemctl status elasticsearch
RPM安装的启动日志位于/var/log/elasticsearch
下
日志文件与配置文件中设置的集群名称有关系,这里我设置的集群名称为kkk
,所以日志也就是kkk.log
跟踪并查看ES的日志(如果启动失败就到这里来看日志查找原因)
tail -f /var/log/elasticsearch/集群名称.log
在我的例子里: tail -f /var/log/elasticsearch/kkk.log
如果出现了上图的问题,很有可能是cluster.initial_master_nodes
等问题。如果出现了
ElasticsearchException: failed to bind service
那么请参考 《错误处理》章节
我们可以从其他主机上访问9200的端口来尝试看看ES是否启动成功,我们到node2上
curl node1:92000
如果有如下返回说明启动已经成功
这样在到其他节点中启动ES,node2、node3、node4
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
systemctl status elasticsearch
验证
我们通过ES的RESTful接口来查看集群的状态,我们到node1节点上运行
curl node1:9200/_cat/nodes
如果返回结果中有4个节点说明我们的集群已经搭建完成
图中*
的节点就是通过选举之后的主节点。
为了更加直观的验证和管理集群,这里推荐使用 cerebro 工具。
下面是cerebro的安装和使用的说明
下载cerebro https://github.com/lmenezes/cerebro
下载后在本机解压,我的操作使用的电脑是windows, 解压后目录结构如下:
我们切换目录到cerebro目录下,打开cmd运行,执行bin\
目录下的启动脚本
.\bin\cerebro.bat
接下来我们打开浏览器访问本地localhost:9000
端口
输入节点的IP和端口,这里输入了node1 192.168.0.127:9200
然后 Connect
界面如下
接下来我们将主节点node3关闭(关闭网络服务或关机都可以)
再次查看节点状态,这时候由于主节点丢失,会有段时间无法访问到页面,我们需要等待集群内重新完成选举
等待一会后我们重新刷新页面
可以发现 node1 选举为主节点了,这时候我们再把之前关闭的node3启动
过一会之后我们发现原来的node3主节点作为候选节点加入了集群中。
总结
通过RPM安装省去我们很多步骤
- 创建ES专用的用户
- 配置最大文件打开数量等
- 系统服务制作
在RPM安装完之后会自动创建Systemd的服务
通过RPM安装的一些目录位置如下
- 主程序位置:
/usr/share/elasticsearch
- 配置文件位置:
/etc/elasticsearch
- 进程ID文件位置:
/var/run/elasticsearch
- 日志文件位置:
/var/log/elasticsearch
这些配置你可以在
/usr/lib/systemd/system/elasticsearch.service
文件中找到如果需要修改,请在修改后
systemctl daemon-reload
然后重启服务systemctl restart elasticsearch
生效
插件安装
如果需要为ES安装插件,那么插件目录位于
/usr/share/elasticsearch/plugins
如果要安装插件,在上面的目录内创建相应插件的目录,然后解压进来,重启服务即可。
例如:
- ik分词器:https://github.com/medcl/elasticsearch-analysis-ik
- pinyin 分词器:https://github.com/infinilabs/analysis-pinyin
以IK分词器为例演示如何安装。
在插件项目中找到对应Release版本的插件包(例如 7.10.1),下载 zip 安装包。
将安装包,解压至/usr/share/elasticsearch/plugins/ik
unzip -d /usr/share/elasticsearch/plugins/ik elasticsearch-analysis-ik-7.10.1.zip
调用API检查插件安装情况。
/usr/share/elasticsearch/bin/elasticsearch-plugin list
重启ES
sudo systemctl restart elasticsearch
错误处理
ElasticsearchException: failed to bind service
在启动ES时出现该问题: ** java.nio.file.AccessDeniedException: /data/elasticsearch/nodes**
[2021-04-12T13:54:34,763][ERROR][o.e.b.Bootstrap ] [node-2] Exception
org.elasticsearch.ElasticsearchException: failed to bind service
at org.elasticsearch.node.Node.<init>(Node.java:729) ~[elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.node.Node.<init>(Node.java:289) ~[elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:227) ~[elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:227) ~[elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:393) [elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:170) [elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:161) [elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) [elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:127) [elasticsearch-cli-7.10.1.jar:7.10.1]
at org.elasticsearch.cli.Command.main(Command.java:90) [elasticsearch-cli-7.10.1.jar:7.10.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:126) [elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) [elasticsearch-7.10.1.jar:7.10.1]
Caused by: java.nio.file.AccessDeniedException: /data/elasticsearch/nodes
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:90) ~[?:?]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106) ~[?:?]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[?:?]
at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:388) ~[?:?]
at java.nio.file.Files.createDirectory(Files.java:694) ~[?:?]
at java.nio.file.Files.createAndCheckIsDirectory(Files.java:801) ~[?:?]
at java.nio.file.Files.createDirectories(Files.java:787) ~[?:?]
at org.elasticsearch.env.NodeEnvironment.lambda$new$0(NodeEnvironment.java:275) ~[elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.env.NodeEnvironment$NodeLock.<init>(NodeEnvironment.java:212) ~[elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:272) ~[elasticsearch-7.10.1.jar:7.10.1]
at org.elasticsearch.node.Node.<init>(Node.java:362) ~[elasticsearch-7.10.1.jar:7.10.1]
... 11 more
说明ES的用户也就是 /lib/systemd/system/elasticsearch.service
中描述的用户组下的用户不具有存储目录/data/elasticsearch
的访问权限。
解决办法就是将目录授予给ES用户:
sudo chown elasticsearch:elasticsearch /data/elasticsearch/
/data/elasticsearch/
路径在/etc/elasticsearch/ealsticsearch.yml
中配置
path.data: /data/elasticsearch
参考文献
[1]. Install Elasticsearch with Docker . elastic . 2020 . https://www.elastic.co/guide/en/elasticsearch/reference/7.10/docker.html
[2]. elasticsearch不能使用root启动问题解决. 博客园 . 秋寻草 . 2019.01 . https://www.cnblogs.com/gcgc/p/10297563.html
[3]. 解决:max file descriptors [65535] for elasticsearch process is too low . csdn . 春风化作秋雨 . 2019.05 . https://blog.csdn.net/jiahao1186/article/details/90235771
[4]. ELK搭建过程中出现的问题与解决方法汇总 . 博客园 . Hellxz博客 . 2019-06 . https://www.cnblogs.com/hellxz/p/11057234.html
[5]. 【已解决】ERROR: bootstrap checks failed memory locking requested for elasticsearch process but memory is not locked
. 博客园 . Hellxz博客 . 2019-06 . https://www.cnblogs.com/hellxz/p/11009634.html