赞
踩
此文章仅适用Elasticsearch.7x版本,因为7版本经过官方大改,不适合7以下版本参考,请知悉。
本人安装环境
Centos7.6、 Elasticsearch7.8 、三个主节点的配置(10.10.10.1、10.10.10.2、10.10.10.3)节点其实就是你的服务器外网ip
完整步骤
1、首先创建es的用户,这一点与之前版本的相同,因为es启动时,不允许使用root用户启动。创建用户后,并切换到新添加的用户下进行后续操作
- # 添加用户组
- groupadd es
-
- # 添加用户
- useradd -m -g es es
-
- # 配置密码
- passwd es
-
- #增加sudo权限
- visudo
-
- 然后在弹出的vi文本编辑框中的最后加上(es ALL=(ALL) NOPASSWD:ALL )
-
- #切换用户(使用es用户来启动elasticsearch)
- su es
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
2、下载es,这里可以使用自己的安装包(如果自己封装了插件的话),或者从官网上进行下载,如果使用7.8的话可以直接使用下面的方式进行下载
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-linux-x86_64.tar.gz
3、将es压缩包进行解压
tar xvf elasticsearch-7.8.9-linux-x86_64.tar.gz /usr/data/elasticsearch
4、配置(这个配置文件需要同步到10.10.10.1 10.10.10.2 10.10.10.3三个主机上)
4.1 修改es的配置文件
vi /usr/data/elasticsearch/config/elasticsearch.yml
yml中的配置内容,按需修改自己的ip
- # 增加以下内容
- # 集群名称必须相同
- cluster.name: es-yourname
-
- node.name: node-num
- # 当前节点是否可以被选举为master节点,是:true、否:false
- node.master: true
- # 当前节点是否用于存储数据,是:true、否:false
- node.data: true
-
- # 数据和日志存储的地方,建议与es的安装目录区分,方式es删除后数据的丢失
- path.data: /data/es/data
- path.logs: /data/es/logs
-
- # 需求锁住物理内存,是:true、否:false
- bootstrap.memory_lock: false
-
- # SecComp检测,是:true、否:false
- bootstrap.system_call_filter: false
-
- network.host: 0.0.0.0
- # 集群必须要配置此项,yourIp修改为自己的本机服务器的外网ip,否则集群失败
- network.publish_host: yourIp
-
- # 主机访问的端口号
- http.port: 9200
-
- # es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
- # es7之后,不需要discover.zen.ping.unicast.hosts这个参数,用discovery.seed_hosts替换
- discovery.seed_hosts: ["10.10.10.1","10.10.10.2","10.10.10.3"]
-
- # es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
- cluster.initial_master_nodes:["10.10.10.1","10.10.10.2","10.10.10.3"]
-
- # 是否支持跨域,是:true,在使用head插件时需要此配置
- http.cors.enabled: true
-
- # "*" 表示支持所有域名
- http.cors.allow-origin: "*"
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
4.2 修改 jvm.options
vim config/jvm.options
- # 按需修改如下内存大小即可
- -Xms4g
- -Xmx4g
4.3 创建数据和日志目录(也就是4.1中配置的路径)
- mkdir -p /data/es/data
- mkdir -p /data/es/logs
4.4 在三台服务器上分别启动es,没有先后之分,7版本会自动选取主节点的。
- ./usr/data/elasticsearch/bin/elasticsearch
- # 后台启动的话,使用下面的这个命令
- ./usr/data/elasticsearch/bin/elasticsearch -d
4.5 检查集群是否部署成功
- # 检查集群的健康状态
- GET /_cat/health?v
-
- # 集群中所有的节点
- GET /_cat/nodes?v
-
- 也可以这样访问:http://你的外网ip:9200/_cat/health?v
- http://你的外网ip:9200/_cat/nodes?v
参数说明:
1、在新版7.0的es中,对es的集群发现系统做了调整,不再有discovery.zen.minimum_master_nodes这个控制集群脑裂的配置,转而由集群自主控制,并且新版在启动一个新的集群的时候需要有cluster.initial_master_nodes初始化集群列表。
2、在es7中,discovery.zen.* 开头的参数,有些已经失效
问题解决(以下部分参考 ElasticSearch 7.8.0 集群环境搭建)
1、每个进程最大同时打开文件数太小
- vim /etc/security/limits.conf
-
- # 增加如下:
- # elsearch为用户名
- elsearch soft nofile 65536
- elsearch hard nofile 65536
-
- # 保存之后,退出当前用户重新登录生效,可用如下命令查看是否修改成功
- ulimit -Hn
- ulimit -Sn
2、申请锁定内存失败
- vim config/elasticsearch.yml
-
- # 修改,不锁定内存
- bootstrap.memory_lock: false
3、 最大虚拟内存太小
- vim /etc/sysctl.conf
-
- # 增加如下:
- vm.max_map_count=262144
-
- # 修改完之后,执行如下命令生效
- sysctl -p
4、 因为Centos6不支持SecComp,而ES5.2.0默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动
- vim config/elasticsearch.yml
-
- 设置为false
- bootstrap.system_call_filter: false
5、 最大线程数太小
- vim /etc/security/limits.conf
-
- # 增加如下:
- # elsearch为用户名
- elsearch soft nproc 4096
- elsearch hard nproc 4096
-
- # 保存之后,退出当前用户重新登录生效,可用如下命令查看是否修改成功
- ulimit -Hu
- ulimit -Su
6、 network.host 监听 0.0.0.0 之后无法组成集群

始终只有一个节点:
- vim config/elasticsearch.yml
-
- # 增加如下配置,用于集群内各机器间通信:
- network.publish_host: yourIp
-
遇到启动elasticsearch失败,使用的是专门的用户es来启动的,启动日志提示不能加载配置文件:
- [es@**** bin]$ ./elasticsearch
- Exception in thread "main" 2020-06-03 17:36:23,881 main ERROR No log4j2 configuration file found. Using default configuration: logging only errors to the console. Set system property 'log4j2.debug' to show Log4j2 internal initialization logging.
- 2020-06-03 17:36:24,113 main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
- at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
- at java.lang.SecurityManager.checkPermission(SecurityManager.java:585)
- at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.checkMBeanTrustPermission(DefaultMBeanServerInterceptor.java:1848)
- at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:322)
- at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
- at org.apache.logging.log4j.core.jmx.Server.register(Server.java:389)
- at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:167)
- at org.apache.logging.log4j.core.jmx.Server.reregisterMBeansAfterReconfigure(Server.java:140)
- at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:556)
- at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:617)
- at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:634)
- at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:229)
- at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:242)
- at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
- at org.apache.logging.log4j.LogManager.getContext(LogManager.java:174)
- at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:618)
- at org.elasticsearch.common.logging.ESLoggerFactory.getLogger(ESLoggerFactory.java:54)
- at org.elasticsearch.common.logging.ESLoggerFactory.getLogger(ESLoggerFactory.java:62)
- at org.elasticsearch.common.logging.Loggers.getLogger(Loggers.java:101)
- at org.elasticsearch.ExceptionsHelper.<clinit>(ExceptionsHelper.java:42)
- at org.elasticsearch.ElasticsearchException.toString(ElasticsearchException.java:663)
- at java.lang.String.valueOf(String.java:2994)
- at java.io.PrintStream.println(PrintStream.java:821)
- at java.lang.Throwable$WrappedPrintStream.println(Throwable.java:748)
- at java.lang.Throwable.printStackTrace(Throwable.java:655)
- at java.lang.Throwable.printStackTrace(Throwable.java:643)
- at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
- at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
- at java.lang.Thread.dispatchUncaughtException(Thread.java:1959)
- SettingsException[Failed to load settings from /usr/local/elasticsearch-5.6.0/config/elasticsearch.yml]; nested: AccessDeniedException[/usr/local/elasticsearch-5.6.0/config/elasticsearch.yml];
- at org.elasticsearch.node.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:102)
- at org.elasticsearch.cli.EnvironmentAwareCommand.createEnv(EnvironmentAwareCommand.java:72)
- at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:67)
- at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134)
- at org.elasticsearch.cli.Command.main(Command.java:90)
- at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91)
- at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84)
- Caused by: java.nio.file.AccessDeniedException: /usr/local/elasticsearch-5.6.0/config/elasticsearch.yml
- at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
- at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
- at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
- at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
- at java.nio.file.Files.newByteChannel(Files.java:361)
- at java.nio.file.Files.newByteChannel(Files.java:407)
- at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
- at java.nio.file.Files.newInputStream(Files.java:152)
- at org.elasticsearch.common.settings.SettingsBuilder.loadFromPath(Settings.java:1032)atorg.elasticsearch.node.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:100)...6more[elk@dockerbin] Builder.loadFromPath(Settings.java:1032)at org.elasticsearch.node.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:100)... 6 more[elk@docker bin]Builder.loadFromPath(Settings.java:1032)atorg.elasticsearch.node.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:100)...6more[elk@dockerbin]
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
解决:
看到“Caused by: java.nio.file.AccessDeniedException: /usr/local/elasticsearch-7.8.0/config/elasticsearch.yml”的提示,就去检查目录的权限,果然是root:root权限,使用es用户去启动,就报错了。
将目录的权限改成es:es就好了。(chown -R es:es elasticsearch-7.8.0即可修改目录所有者为es了)
- [root@**** ~]# ll /usr/local/
- drwxr-xr-x 7 root root 123 6月 7 2020 elasticsearch-7.8.0
- [root@**** local]# chown -R es:es elasticsearch-7.8.0
- [root@**** local]# ll
- drwxr-xr-x 7 es es 123 6月 7 2020 elasticsearch-7.8.0
注意:本文章的/data/es/data、/data/es/logs也要设置成es所有者,否则也会出现错误
elasticsearch7 出现master not discovered yet, this node has not previously joined a bootstrapped (v7+)
- 报错 :[2019-10-21T15:52:32,213][INFO ][o.e.c.c.ClusterBootstrapService] [node-2] skipping cluster bootstrapping as local node does not match bootstrap requirements: [node-1]
- [2019-10-21T15:52:42,220][WARN ][o.e.c.c.ClusterFormationFailureHelper] [node-2] master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and this node must discover master-eligible nodes [node-1] to bootstrap a cluster: have discovered []; discovery will continue using [192.168.0.150:9300] from hosts providers and [{node-2}{nU2Duwl8Su-qZ7N3rcfwWA}{4OqPHF-FRlyb_F7xhYoAow}{192.168.0.130}{192.168.0.130:9300}{ml.machine_memory=67267657728, xpack.installed=true, ml.max_open_jobs=20}] from last-known cluster state; node term 0, last-accepted version 0 in term 0
此WARN出现是集群失败,就是一开始设置的3个master节点没有集群成功。
解决:
- network.publish_host: 192.168.0.130
- network.publish_host: 192.168.0.150 两个机器分别设置自己的IP(如果有3个机器,就要在3个机器的yml中分别设置好自己本机的外网ip进去即可)
ik插件地址: https://github.com/medcl/elasticsearch-analysis-ik,为了演示需要,这里选择wget方式。
下载
[root@localhost download]$ wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.8.0/elasticsearch-analysis-ik-7.8.0.zip
安装插件
- [es@localhost elastic]$ cd plugins
-
- [es@localhost plugins]$ cd mkdir ik && cd ik
-
- [es@localhost ik]$ cp ../../../download/elasticsearch-analysis-ik-7.8.0.zip .
-
- [es@localhost ik]$ unzip elasticsearch-analysis-ik-7.8.0.zip
完成后重启es
使用crul命令,输入下面的URL地址,验证分词器是否成功。
[es@localhost elastic]$ curl -X GET -H "Content-Type: application/json" "http://localhost:9200/_analyze?pretty=true" -d'{"text":"中华五千年华夏"}';
ik_max_word: 将文本按最细粒度的组合来拆分,比如会将“中华五千年华夏”拆分为“五千年、五千、五千年华、华夏、千年华夏”,总之是可能的组合;
ik_smart: 最粗粒度的拆分,比如会将“五千年华夏”拆分为“五千年、华夏”
不添加分词类别,Elastic对于汉字默认使用standard只是将汉字拆分成一个个的汉字,而我们ik则更加的智能,下面通过几个案例来说明。
在JSON格式中添加analyzer节点内容为ik_smart
[es@localhost elastic]$ curl -X GET -H "Content-Type: application/json" "http://localhost:9200/_analyze?pretty=true" -d'{"text":"中华五千年华夏","analyzer": "ik_smart"}';
在JSON格式中添加analyzer节点内容为ik_max_word
[es@localhost elastic]$ curl -X GET -H "Content-Type: application/json" "http://localhost:9200/_analyze?pretty=true" -d'{"text":"中华五千年华夏","analyzer": "ik_max_word"}';
(1)https://github.com/mobz/elasticsearch-head
(2)安装node https://nodejs.org/en/download/
下载完上面两个包后记得上传到服务器中
(3)下载下来的jar包是xz格式的,一般的linux可能不识别,还需要安装xz.
yum -y install xz
(4)然后解压nodejs的安装包
- xz -d node那个.xz后缀安装包的文件名(这句执行后会生成tar包的,然后执行下面第二句)
- tar -xvf node那个.tar后缀安装包的文件名
(5)解压完node的安装文件后,需要配置下环境变量,编辑vim /etc/profile,添加
- # set node environment
- export NODE_HOME=/usr/local/software/node-v10.14.2-linux-x64(看清自己存放node的目录)
- export PATH=$PATH:$NODE_HOME/bin
(6)别忘记立即执行以下
source /etc/profile
(7)这个时候可以测试一下node是否生效
- echo $NODE_HOME
- node -v
- npm -v
(8)安装grunt
grunt是一个很方便的构建工具,可以进行打包压缩、测试、执行等等的工作,5.0里的head插件就是通过grunt启动的。因此需要安装一下grunt:
npm install -g cnpm --registry=https://registry.npm.taobao.org
(9)安装完成后检查一下:
- [root@localnode1 elasticsearch-head]# grunt -version
- grunt-cli v1.2.0
- grunt v0.4.5
修改head源码
由于head的代码还是2.6版本的,直接执行有很多限制,比如无法跨机器访问。因此需要用户修改两个地方:
修改服务器监听地址
目录:es-head/Gruntfile.js
增加hostname属性,设置为*
修改连接地址
目录:head/_site/app.js
修改head的连接地址:
改为你的地址。
两处修改完成即可开启head了。
首先开启ES。
然后在es-head目录中,执行npm install 下载以来的包:
- 首先是:(首先要转到head的主目录中,然后执行npm install安装所需的包)
- cd /*********/head/
npm install
最后,启动nodejs
- grunt server
-
- 或者在head的主目录中运行npm run start也是可以运行head的
这个时候,访问http://你的服务器外网ip:9100就可以访问head插件了。
如果你的连接不上,需要在elasticsearch.yml文件中增加以下配置重启即可:
- http.cors.enabled: true
- http.cors.allow-origin: "*"
如果输入 npm -v 出现 npm错误Error: Cannot find module '../lib/utils/unsupported.js'
- npm -v
- internal/modules/cjs/loader.js:605
- throw err;
- ^
-
- Error: Cannot find module '../lib/utils/unsupported.js'
- at Function.Module._resolveFilename (internal/modules/cjs/loader.js:603:15)
- at Function.Module._load (internal/modules/cjs/loader.js:529:25)
- at Module.require (internal/modules/cjs/loader.js:659:17)
- at require (internal/modules/cjs/helpers.js:22:18)
- at /usr/local/node-v11.4.0-linux-x64/bin/npm:19:21
- at Object.<anonymous> (/usr/local/node-v11.4.0-linux-x64/bin/npm:153:3)
- at Module._compile (internal/modules/cjs/loader.js:723:30)
- at Object.Module._extensions..js (internal/modules/cjs/loader.js:734:10)
- at Module.load (internal/modules/cjs/loader.js:620:32)
- at tryModuleLoad (internal/modules/cjs/loader.js:560:12)
- Build step 'Execute shell' marked build as failure
-
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
解决办法:
①、试试把node.js的版本从12降到10或者8或者6......如果降级成功的话就好了
②、如果降级node.js还是没有用,CentOs可以使用yum命令自动安装相关依赖包
- sudo curl -sL https://rpm.nodesource.com/setup_12.x | bash -
-
- sudo yum install -y nodejs
Linux安装grunt出现-bash: grunt: command not found 错误解决
重新输入下面命令安装即可
npm install -g grunt-cli
elasticsearch-head-master访问http://你的外网ip:9100然后提示Cannot GET /
检查elasticsearch-head下Gruntfile.js是不是如下配置好了
- connect: {
- server: {
- options: {
- hostname: '*',
- port: 9100,
- base: '.',
- keepalive: true
- }
- }
- }
还有elasticsearch安装目录下的 config/elasticsearch.yml
- http.cors.enabled: true
- http.cors.allow-origin: "*"
在/etc/init.d
目录下新建文件elasticsearch
(当然也不一定要在/etc/init.d目录下创建,看你习惯,只是
init.d 目录中存放的是一系列系统服务的管理(启动与停止)脚本;用service命令可执行init.d目录中相应服务的脚本,这是为了更方便的启动。并不是说只在init.d里才能执行)
- #!/bin/sh
- #chkconfig:
- #description: elasticsearch
-
- export JAVA_HOME=/usr/local/java/jdk1.8.0_112
- export JAVA_BIN=/usr/local/java/jdk1.8.0_112/bin
- export PATH=$PATH:$JAVA_HOME/bin
- export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- export JAVA_HOME JAVA_BIN PATH CLASSPATH
-
- case "$1" in
- start)
- #下面的“<<!”是切换用户后,待执行的命令,执行完后使用“!”来进行结束
- su es<<!
- cd 你的elasticsearch主目录
- ./bin/elasticsearch -d
- !
- #上面的“!”是以上面的对应起来,并且顶格放置,这是语法
- echo "elasticsearch startup" #将该行替换成你自己的服务启动命令
- ;;
- stop)
- es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`
- kill -9 $es_pid
- echo "elasticsearch stopped"
- ;;
- restart)
- es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`
- kill -9 $es_pid
- echo "elasticsearch stopped"
- su es<<!
- cd 你的elasticsearch主目录
- ./bin/elasticsearch -d
- !
- echo "es startup"
- ;;
- *)
- echo "start|stop|restart"
- ;;
- esac
-
- exit $?
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
保存退出,赋予执行权限
chmod +x elasticsearch
添加到开机启动任务
sudo chkconfig --add /etc/init.d/elasticsearch
使用service elasticsearch start/stop/restart
来操作
在/etc/init.d
目录下新建文件elasticsearch_head
- #!/bin/sh
- #chkconfig: 2345 80 05
- #description: es_head_run
-
- export NODE_PATH=/home/soft/node-v8.11.1-linux-x64
- export PATH=$PATH:$NODE_PATH/bin
- #如果centOs使用yum命令安装了nodejs就不用输入上面两行export语句了,因为yum安装自动配置好了
-
- cd /home/soft/elasticsearch-head-master
- nohup npm run start >/home/soft/elasticsearch-head-master/nohup.out 2>&1 &
保存退出,赋予执行权限
chmod +x elasticsearch_head
添加到开机启动任务
sudo chkconfig --add /etc/init.d/elasticsearch_head
操作service elasticsearch_head启动
下载kibana
- wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.0-linux-x86_64.tar.gz
-
- tar -zxvf kibana-7.8.0-linux-x86_64.tar.gz
修改配置文件
- vim config/kibana.yml
-
- # 放开注释,将默认配置改成如下:
-
- server.port: 5601
- server.host: "0.0.0.0"
- #elasticsearch.url: "http://你的服务器外网ip(your domain):9200"
- elasticsearch.hosts: ["http://你的服务器外网ip(your domain):9200"]
- kibana.index: ".kibana"
启动
./bin/kibana
7.8.0版本的kibana我在服务器运行的时候出现以下问题:
- FATAL Error: Setup lifecycle of "monitoring" plugin wasn't completed in 30sec. Consider disabling the plugin and re
- -start.
这个致命问题没找到解决办法,暂时放弃kibana启动,转用head处理。
kibana的监听端口是5601
访问: http://127.0.0.1:5601
可以看到使用分词器效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。