请输入图片描述
本篇文章开始给大家介绍ELK日志分析,ElasticSearch(ES),负责日志的存储和检索。Logstash,负责日志的收集,过滤和格式化; - K:Kibana,负责日志的展示统计和数据可视化。

我们的内容也进入了运维知识的大神篇,大神篇会介绍ELFK、docker、K8s、数据库等内容。

首先我们需要用ES(Elasticsearch)去储存查询我们日志的数据,所以它在这个环节比较核心,没有ES我们的数据采集了也没有地方放,看也没法看。本篇文章会介绍,ES单点部署,JVM优化,配置OracleJDK,ES集群搭建,故障排查方法。

ES单点部署

1、环境准备

虚拟机

memory:2G,disk:2core,cpu:20G,IP:10.0.0.101,主机名:ELK101

memory:2G,disk:2core,cpu:20G,IP:10.0.0.102,主机名:ELK102

memory:2G,disk:2core,cpu:20G,IP:10.0.0.103,主机名:ELK103

2、下载软件

可以官网下载,也可以在文章末下载我准备的链接,这里我用7.17.5版本

官网链接:https://www.elastic.co/cn/downloads/past-releases#elasticsearch

3、创建目录

[root@ELK101 ~]# mkdir -pv /koten/{softwares,data,logs} 
mkdir: created directory ‘/koten’
mkdir: created directory ‘/koten/softwares’
mkdir: created directory ‘/koten/data’
mkdir: created directory ‘/koten/logs’

4、解压软件包

[root@ELK101 ~]# tar xf elasticsearch-7.17.5-linux-x86_64.tar.gz -C /koten/softwares/

5、添加普通用户以启用ES,并更改ES的属主属组

由于root用户无法启用,所以添加普通用户

[root@ELK101 ~]# useradd koten
[root@ELK101 ~]# chown koten:koten /koten/softwares/elasticsearch-7.17.5/ -R

6、修改文件描述符的打开上限

配置好network.host: 0.0.0.0报错,故修改

[root@ELK101 ~]# cat > /etc/security/limits.d/es.conf <<EOF
*          soft    nofile     65535
*          hard    nofile     131070
EOF
 
 
扩展
cat > /etc/security/limits.d/es.conf <<EOF
*          soft    nofile     65535
*          hard    nofile     131070
*          hard    nproc      4096             #有些时候还对nproc,与nofile同理修改下就行
EOF

7、修改虚拟内存映射上限

配置好network.host: 0.0.0.0报错,故修改

#永久修改内核参数
[root@ELK101 ~]# cat > /etc/sysctl.d/es.conf <<EOF
vm.max_map_count=262144
EOF
[root@ELK101 ~]# sysctl -f /etc/sysctl.d/es.conf    #启用配置文件
vm.max_map_count = 262144
 
扩展:查看内核参数:
[root@elk101 ~]# sysctl -q vm.max_map_count
vm.max_map_count = 262144
[root@elk101 ~]# 
#临时修改内核参数(重启OS后配置丢失):
[root@elk101 ~]# sysctl -w vm.max_map_count=262144

8、修改配置文件

[root@ELK101 ~]# egrep -v "^#|^$" /koten/softwares/elasticsearch-7.17.5/config/elasticsearch.yml 
network.host: 0.0.0.0                           #确保其他主机能访问到,不然只能本机访问
discovery.seed_hosts: ["10.0.0.101"]            #配置好network.host: 0.0.0.0报错,故修改
cluster.initial_master_nodes: ["10.0.0.101"]    #配置好network.host: 0.0.0.0报错,故修改

9、启动服务

#前台运行
[root@ELK101 ~]# su - koten -c "/koten/softwares/elasticsearch-7.17.5/bin/elasticsearch"
 
#放在后台运行
[root@ELK101 ~]# su - koten -c "/koten/softwares/elasticsearch-7.17.5/bin/elasticsearch -d"

10、检查服务是否正常访问

[root@ELK101 ~]# curl 10.0.0.101:9200
{
  "name" : "ELK101",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "6-p-QpW_RKyE5iAfLm5KQQ",
  "version" : {
    "number" : "7.17.5",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "8d61b4f7ddf931f219e3745f295ed2bbc50c8e84",
    "build_date" : "2022-06-23T21:57:28.736740635Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

2023-11-13T12:38:08.png

11、编写ES服务的启动脚本

可以参考 systemctl cat sshd

[root@ELK101 ~]# cat > /usr/lib/systemd/system/es7.service <<EOF
[Unit]
Description=es7
After=network.target
 
[Service]
User=koten
Group=koten
Type=simple
ExecStart=/koten/softwares/elasticsearch-7.17.5/bin/elasticsearch
LimitNOFILE=131070
LimitNPROC=65535
 
[Install]
WantedBy=multi-user.target
EOF
[root@ELK101 ~]# systemctl daemon-reload
[root@ELK101 ~]# systemctl enable --now es7
[root@ELK101 ~]# systemctl status es7

JVM调优

修改默认堆内存大小,堆内存是指Java虚拟机(JVM)运行时所使用的内存中的一段,在生产环境中,建议设置物理服务器内存的一半;内存不得超过32Gb;建议将"-Xmx"和"-Xms"的值设置一致,避免因为内存不够提交申请再去扩大内存。

[root@ELK101 ~]# ps -ef|grep java|grep -i xms      #查看默认堆内存大小为990m,大概为虚拟机内存的一半
...  
-Xms990m -Xmx990m
...
 
-Xmx:最大的堆内存大小
-Xms:初始的堆内存大小
 
[root@ELK101 ~]# egrep -v "^#|^%" /koten/softwares/elasticsearch-7.17.5/config/jvm.options
...
-Xms256m
-Xmx256m
...
[root@ELK101 ~]# systemctl restart es7
[root@ELK101 ~]# ps -ef|grep java | grep Xms
...  
-Xms256m -Xmx256m
...

2023-11-13T12:38:57.png

配置OracleJDK

1、安装OracleJDK,可以在官网找,也可以用我给大家准备的放在文末的下载链接

ES有自带的JDK,我们在下载时也可以下载不带JDK的软件包(文末有链接),自己去配置

官网地址:https://www.oracle.com/java/technologies/downloads/#java8-linux

2、解压安装包

[root@ELK101 ~]#tar xf jdk-8u291-linux-x64.tar.gz -C /koten/softwares/

3、配置JDK环境变量

[root@ELK101 ~]#cat /etc/profile.d/jdk.sh
#!/bin/bash
export JAVA_HOME=/koten/softwares/jdk1.8.0_291
export PATH=$PATH:$JAVA_HOME/bin
[root@elk101 ~]# source  /etc/profile.d/jdk.sh 
[root@ELK101 ~]# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

4、修改ES启动脚本传递JAVA_HOME变量

变量少可以直接写进去,变量多需要写在 /etc/sysconfig/ 下面的配置文件里,类似于/etc/sysconfig/sshd

[root@ELK101 ~]# cat > /usr/lib/systemd/system/es7.service <<EOF
[Unit]
Description=es7
After=network.target
 
[Service]
User=koten
Group=koten
Type=simple
ExecStart=/koten/softwares/elasticsearch-7.17.5/bin/elasticsearch
LimitNOFILE=131070
LimitNPROC=65535
Environment=JAVA_HOME=/koten/softwares/jdk1.8.0_291    
 
[Install]
WantedBy=multi-user.target
EOF
[root@ELK101 ~]# systemctl daemon-reload
[root@ELK101 ~]# systemctl restart es7
[root@ELK101 ~]# systemctl status es7
● es7.service - es7
   Loaded: loaded (/usr/lib/systemd/system/es7.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-05-24 17:10:59 CST; 6s ago
 Main PID: 3356 (java)
   CGroup: /system.slice/es7.service
           ├─3356 /koten/softwares/jdk1.8.0_291/bin/.    #发现用的是oracle jdk
......

5、验证命令

- jps命令
jps     # 仅显示java程序的名称和PID。
jps -l  # 查看java的包名。
jps -v  # 查看java程序的详细信息。
 
[root@ELK101 ~]# jps     
3570 Jps
3356 Elasticsearch
[root@ELK101 ~]# jps -l
3356 org.elasticsearch.bootstrap.Elasticsearch
3583 sun.tools.jps.Jps
 
 
- jmap命令
[root@ELK101 ~]# jmap -heap `jps | awk  '/Elasticsearch/{print $1}'` | grep MaxHeapSize
   MaxHeapSize              = 268435456 (256.0MB)

搭建ES集群服务

1、创建数据目录和工作目录

[root@ELK101 ~]# install -d /koten/{data,logs}/es7 -o koten -g koten

2、修改配置文件

[root@ELK101 ~]# egrep -v "^#|^$" /koten/softwares/elasticsearch-7.17.5/config/elasticsearch.yml
cluster.name: koten-es7            #指定集群名称
path.data: /koten/data/es7         #指定数据目录
path.logs: /koten/logs/es7         #指定日志目录
network.host: 0.0.0.0              #对外暴露的IP地址
http.port: 19200                   #指定集群外部提供的http端口
transport.tcp.port: 19300          #指定集群内部数据传输端口
discovery.seed_hosts: ["10.0.0.101","10.0.0.102","10.0.0.103"]    #指定现有集群的主机地址
cluster.initial_master_nodes: ["10.0.0.101","10.0.0.102","10.0.0.103"]    #指定集群启动时,初始参与master选举的节点

3、拷贝数据目录

[root@ELK101 ~]# scp -r /koten/ 10.0.0.102:/    #es软件目录
[root@ELK101 ~]# scp -r /koten/ 10.0.0.103:/
 
[root@ELK101 ~]# scp /etc/profile.d/jdk.sh 10.0.0.102:/etc/profile.d/    #java的环境变量(java目录和path变量修改)
[root@ELK101 ~]# scp /etc/profile.d/jdk.sh 10.0.0.103:/etc/profile.d/
 
[root@ELK101 ~]# scp /etc/sysctl.d/es.conf 10.0.0.102:/etc/sysctl.d/    #内核映射上限
[root@ELK101 ~]# scp /etc/sysctl.d/es.conf 10.0.0.103:/etc/sysctl.d/
 
[root@ELK101 ~]# scp /usr/lib/systemd/system/es7.service 10.0.0.102:/usr/lib/systemd/system/                             #systemctl配置文件
[root@ELK101 ~]# scp /usr/lib/systemd/system/es7.service 10.0.0.103:/usr/lib/systemd/system/

4、其他节点创建用户,修改权限,启用内核参数调优

[root@ELK102 ~]# useradd -u 1000 koten
[root@ELK102 ~]# chown -R koten.koten /koten/softwares/elasticsearch-7.17.5/
[root@ELK102 ~]# install -d /koten/{data,logs}/es7 -o koten -g koten
[root@ELK102 ~]# sysctl -f /etc/sysctl.d/es.conf 
vm.max_map_count = 262144
 
[root@ELK103 ~]# useradd -u 1000 koten
[root@ELK103 ~]# chown -R koten.koten /koten/softwares/elasticsearch-7.17.5/
[root@ELK103 ~]# install -d /koten/{data,logs}/es7 -o koten -g koten
[root@ELK103 ~]# sysctl -f /etc/sysctl.d/es.conf 
vm.max_map_count = 262144

5、清空单点的数据,避免因为单点的缓存数据而污染集群的搭建

[root@ELK101 ~]# systemctl stop es7
[root@ELK101 ~]# rm  -rf /koten/data/es7/* /koten/logs/es7/* /tmp/*

6、所有节点同时启动服务,可以使用Xshell对全部会话或全部Shell生效

2023-11-13T12:40:45.png

[root@ELK101 ~]# systemctl enable --now es7
[root@ELK102 ~]# systemctl enable --now es7
[root@ELK103 ~]# systemctl enable --now es7

7、验证服务是否正常

[root@ELK101 ~]# systemctl status es7
[root@ELK101 ~]# ss -ntl | grep 19
LISTEN     0      128       [::]:19200                 [::]:*                  
LISTEN     0      128       [::]:19300                 [::]:* 
[root@ELK101 ~]# curl 10.0.0.101:19200
{
  "name" : "ELK101",
  "cluster_name" : "koten-es7",
  "cluster_uuid" : "Igsp-KSTQy2HvDZVtLA-OA",   
  "version" : {
    "number" : "7.17.5",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "8d61b4f7ddf931f219e3745f295ed2bbc50c8e84",
    "build_date" : "2022-06-23T21:57:28.736740635Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}     
[root@ELK101 ~]#  curl 10.0.0.101:19200/_cat/nodes
10.0.0.102 34 94 4 0.06 0.07 0.12 cdfhilmrstw * ELK102
10.0.0.101 48 96 3 0.01 0.06 0.11 cdfhilmrstw - ELK101
10.0.0.103 44 92 2 0.00 0.04 0.08 cdfhilmrstw - ELK103
 
#如果uuid显示_na_就是出问题了,可能是由于可运行的主机数量不足集群规定数量而出现的脑裂问题,解决办法就是重复5-7的步骤,此时查看集群健康状态会如下显示
[root@elk101 ~]# curl 10.0.0.101:19200/_cat/nodes
{"error":{"root_cause":[{"type":"master_not_discovered_exception","reason":null}],"type":"master_not_discovered_exception","reason":null},"status":503}[root@elk101 ~]# 

2023-11-13T12:41:49.png

故障排查方法

故障排查的核心就是看日志,下面是看日志的三种方法

1、查看服务状态

systemctl status es7 -l

2、通过系统日志查看

journalctl -u es7

3、查看启动日志

tail -100f /koten/softwares/elasticsearch-7.17.5/logs/elasticsearch.log

Java日志排错技巧1

核心点:从下到上找at,并找到最上面的一个at的上一行,通常就是报错信息

举例:报错信息为“can not run elasticsearch as root”

java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:107)
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:183)
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434)
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:169)
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:160)
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77)
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
    at org.elasticsearch.cli.Command.main(Command.java:77)
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125)
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80)
For complete error details, refer to the log at /oldboyedu/softwares/elasticsearch-7.17.5/logs/elasticsearch.log

Java日志排错技巧2

核心点:找错误日志的类型,ERROR特别注意,有时候WARN也需要看

举例:在ERROR字样的行的下面,“can not run elasticsearch as root”

[2023-05-24T17:42:33,520][INFO ][o.e.n.Node               ] [elk101] closed
[2023-05-24T17:42:45,076][ERROR][o.e.b.Bootstrap          ] [elk101] Exception
java.lang.RuntimeException: can not run elasticsearch as root

ES7.17.5安装包下载链接:https://pan.baidu.com/s/1Lgi_SqdnXvESuJYAAasa5g?pwd=4o6d

ES7.17.5无JDK安装包下载链接:https://pan.baidu.com/s/17bp9pMiBzqtTjHO_vSFwkw?pwd=h6og

OracleJDK下载链接:https://pan.baidu.com/s/1SbLRhTdA3iBSE94nHjsvkA?pwd=27mg

持续分享运维干货,感谢大家的阅读和关注!

发表评论

召唤看板娘