本篇文章开始给大家介绍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"
}
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
...
配置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生效
[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 ~]#
故障排查方法
故障排查的核心就是看日志,下面是看日志的三种方法
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