ELK之路第一步——Elasticsearch集群的搭建以及踩坑记录

elasticSearch集群

前言

Elk(Elasticsearch, Logstash, Kibana),一套分布式日志收集、存储和展示方案。

本来满怀信心开始学习这个系列,但是发现它并没有那么简单,所以打算从地基开始,一步步盖楼,从而达到目的,本文是ELK系列的第一篇。因为jdk版本的原因,本文Elasticsearch版本为:7.3.0,需要jdk11

一、架构

我打算用三台虚拟机来实现集群,一台master,两台数据节点。IP和Node名字分别为:

172.16.72.130 node-1

172.16.72.133 node-2

172.16.72.134 node-3

PS:接下来的操作,三台虚拟机操作都是一样的,我拿一台举例,其他两台照着做就行

二、下载

选择一个位置下载,我这里创建的是/usr/local/es目录

bash 复制代码
wget https://mirrors.huaweicloud.com/elasticsearch/7.3.0/elasticsearch-7.3.0-linux-x86_64.tar.gz
wget https://mirrors.huaweicloud.com/elasticsearch/7.3.0/elasticsearch-7.3.0-linux-x86_64.tar.gz.sha512

解压

bash 复制代码
tar -zxvf elasticsearch-7.3.0-linux-x86_64.tar.gz

三、虚拟机相关设置

3.1 创建es用户

elasticSearch不允许使用root用户启动,不然会报错

用root用户执行:

bash 复制代码
//创建es用户
useradd es
//为es用户设置密码,这很重要
passwd es es

3.2 为建es用户赋权sudo

如果没有sudo命令的,安装:yum install sudo -y

root用户执行

bash 复制代码
vim etc/sudoers

打开是这样的,我截取了部分,找到root ALL=(ALL) ALL这一行,跟在它下面 复制一行,添加

es ALL=(ALL) ALL,其中es就是我们3.1新建的用户名。

bash 复制代码
## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL
es    ALL=(ALL)     ALL

3.3 更换es目录所属用户

cd到解压目录

bash 复制代码
/usr/local/es/elasticsearch-7.3.0

递归更改elasticsearch-7.3.0下所有文件所属为es

bash 复制代码
chown -R es /usr/local/es/elasticsearch-7.3.0

四、Elasticsearch配置文件修改

本小节所有操作都用root用户,当然也可以切换到es,但是这样每个操作都要加sudo非常麻烦,我们启动的时候再切换用户就好。

4.1 修改elasticsearch.yml

进入config目录,先备份以前的

bash 复制代码
cp elasticsearch.yml elasticsearch.yml.bak

编辑

bash 复制代码
vim elasticsearch.yml

因为我们是三台集群,为了方便,我就把三台机器的配置全部放在这一起了,大家后面分开复制各自的就行了。

重点讲一下:http.port 是你访问网页的时候的端口,transport.tcp.port 是节点通信间的端口,如果你在一台机器上部署两个节点,记得端口不能一样,下面discovery.seed_hosts也要用节点通信端口。

yaml 复制代码
# node-1
cluster.name: elk-cluster
node.name: node-1
node.master: true
node.data: false
node.ingest: false
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["172.16.72.130:9300","172.16.72.133:9300","172.16.72.134:9300"]
cluster.initial_master_nodes: ["node-1"]

#node-2
cluster.name: elk-cluster
node.name: node-2
node.master: true
node.data: true
node.ingest: false
network.host: 0.0.0.0
##节点间通信端口
http.port: 9300
transport.tcp.port: 
discovery.seed_hosts: ["172.16.72.130:9300","172.16.72.133:9300","172.16.72.134:9300"]

#node-3
cluster.name: elk-cluster
node.name: node-3
node.master: true
node.data: true
node.ingest: false
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["172.16.72.130:9300","172.16.72.133:9300","172.16.72.134:9300"]

4.2 修改jvm.options

  1. 修改启动内存:

    bash 复制代码
    vim jvm.options

    这里主要修改启动内存,默认是4g,我这里改成256m,这个根据你自己服务器硬件来定

    -Xms256m

    -Xmx256m

  2. 修改gc,在GC configuration这一行下面

    修改为G1GC,因为我用的jdk11。

    bash 复制代码
    -XX:+UseG1GC

    不修改会报错:

    OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.

4.3 修改jdk路径

Elasticsearch是自带jdk的,但是大多数,我们的开发环境中已经有了jdk,我们cd到bin目录下

bash 复制代码
vim elasticsearch-env

来看看这个是怎么判断es是怎么判定自带的jdk和我们自己的jdk的

bash 复制代码
# now set the classpath
ES_CLASSPATH="$ES_HOME/lib/*"

# now set the path to java
if [ ! -z "$JAVA_HOME" ]; then
  JAVA="$JAVA_HOME/bin/java"
else
  if [ "$(uname -s)" = "Darwin" ]; then
    # OSX has a different structure
    JAVA="$ES_HOME/jdk/Contents/Home/bin/java"
  else
    JAVA="$ES_HOME/jdk/bin/java"
  fi
fi

通过脚本得知,es会先去找我们系统的jdk,如果没找到,就会用自己的jdk路径,也就是$ES_HOME下面的

修改为:

bash 复制代码
 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"

如果上面办法不行,用下面这个办法,修改bin下的elasticsearch文件,在第二行位置添加如下内容:

JAVA_HOME就是你jdk的位置。

bash 复制代码
export JAVA_HOME=/***
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar

五、启动

1.切换用户

bash 复制代码
su es

2.开放端口

bash 复制代码
# 放行9200端口和9300端口,不放行9300端口,节点间无法通信,集群还是搭建不起来
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --zone=public --add-port=9300/tcp --permanent
# 重新加载防火墙
firewall-cmd --reload

2.cd到bin目录下,后台启动

bash 复制代码
./elasticsearch -d

3.浏览器访问

http://172.16.72.130:9200/

我访问了两个,可以看到集群已经搭建好了

六、启动报错

  1. No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender
    你没有切换用户,用root启动的,然后切换到es再启动就会报错,因为用root启动将文件的所属权变了,你需要重新执行chown来更改为es

  2. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

    bash 复制代码
    echo "vm.max_map_count=262144" > /etc/sysctl.conf
    sysctl -p
  3. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

    bash 复制代码
    sudo vim /etc/security/limits.conf
    # 加入以下内容
    * soft nofile 300000
    * hard nofile 300000
    * soft nproc 102400
    * soft memlock unlimited
    * hard memlock unlimited
  4. Caused by: java.lang.RuntimeException: can not run elasticsearch as root
    你用root用户启动了,切换为es,执行 su es

  5. ElasticSearch--warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
    或者
    warning: ignoring JAVA_HOME=C:\Program Files\Java\jdk1.8.0_191; using bundled JDK
    4.3节提到的,es自带jdk和本身jdk冲突的问题,解决了就不会报错了

  6. 一些权限问题
    记得用chown切换用户,如果还是不行 用chmod 755 来赋权,特别是日志问价你的读写权

  7. with the same id but is a different node instance];
    这是你用一台机器搭建两个节点的时候,copy包的时候导致重复了,建议保留一个节点的目录,另一个重新解压

七、可视化界面cerebro

es的集群肯定需要一个可视化界面来管控,我这里用的是cerebro,当然你也可以用Elasticsearch-head,不过Elasticsearch-head太老了,界面又难看,这个你随意。

  1. 进入GitHub官网:https://github.com/lmenezes/cerebro/releases,选择最新版本的v0.9.4,cerebro也好久没更新了,不过能用就行。
  2. 解压后启动
    端口和ip改成自己的,默认端口是9000,记得去防火墙开放端口
bash 复制代码
bin/cerebro -Dhttp.port=1234 -Dhttp.address=192.168.182.110
  1. 浏览器访问
    http://192.168.182.110:1234/
  2. 连接我们的主节点,就是上面部署的node1节点。

可以看到我们三个节点都是OK了的

后面本人还要深入研究Elasticsearch,可能会对本文做内容的补充,也会单独开一篇文章讲Elasticsearch的使用,大家多多关注哦。

相关推荐
it噩梦12 小时前
elasticsearch中使用fuzzy查询
elasticsearch
喝醉酒的小白14 小时前
Elasticsearch相关知识@1
大数据·elasticsearch·搜索引擎
小小工匠15 小时前
ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制
elasticsearch·composite·after_key·桶聚合分页
风_流沙15 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
希忘auto17 小时前
详解Redis的常用命令
redis·1024程序员节
TGB-Earnest17 小时前
【py脚本+logstash+es实现自动化检测工具】
大数据·elasticsearch·自动化
woshiabc1111 天前
windows安装Elasticsearch及增删改查操作
大数据·elasticsearch·搜索引擎
arnold661 天前
探索 ElasticSearch:性能优化之道
大数据·elasticsearch·性能优化
成长的小牛2331 天前
es使用knn向量检索中numCandidates和k应该如何配比更合适
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
Elasticsearch:什么是查询语言?
大数据·数据库·elasticsearch·搜索引擎·oracle