需要集中的日志系统的原因

目前现状,每个服务生产上有三台,定位生产问题,需要连上一台机器,然后使用 cd / tail / less / grep / sed / awk 等 linux命令去日志里查找故障原因。如果在这台机器没搜索到线索,就去另外两台机器上查日志。

但在分布式系统中,众多服务分散部署在数十台甚至上百台不同的服务器上,想要快速方便的实现查找、分析和归档等功能,使用Linux命令等传统的方式查询到想要的日志就费事费力,更不要说对日志进行分析与归纳了。

为解决大量日志归档,文件搜索慢,如何多维度查询就得需要集中化日志管理,将所有服务器上的日志收集汇总,常见的解决思路就是建立集中式日志收集系统。

EFK

  • Elasticsearch:负责存储日志。Elasticsearch 是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源,自动搜索负载等。

  • FileBeat:负责收集日志。

    • Filebeat 隶属于 Beats。目前 Beats 包含六种工具:

      Packetbeat(搜集网络流量数据)
      Metricbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
      Filebeat(搜集文件数据)
      Winlogbeat(搜集 Windows 事件日志数据)
      Auditbeat( 轻量型审计日志采集器)
      Heartbeat(轻量级服务器健康采集器)

  • Kibana:负责展示日志。Kibana可以为 Logstash 、Beats和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

注意:EFK 系统下的各个组件都非常吃内存,后期根据业务需要,EFK 的架构可进行扩展,当 FileBeat 收集的日志越来越多时,为防止数据丢失,可引入 Redis,而 ElasticSearch 也可扩展为集群,并使用 Head 插件进行管理, 所以要保证服务器有充足的运行内存和磁盘空间。

EFK 与 ELK 区别

EFK 和 ELK 只有一个区别, 收集日志的组件由 Logstash 替换成了 FileBeat,因为 Filebeat 相对于 Logstash 来说有2个好处:

  1. 侵入低,无需修改 elasticsearch 和 kibana 的配置;
  2. 性能高,IO 占用率比 logstash 小太多;

快速部署

离线安装Docker
# 1.下载Docker安装包(二进制) docker-19.03.1.tgz  https://download.docker.com/linux/static/stable/x86_64/ 
yum install -y wget
wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.1.tgz

# 2.解压docker-19.03.1.tgz
tar -zxvf docker-19.03.1.tgz

# 3.复制docker目录下所有文件到/usr/bin目录下(/usr/bin是环境变量目录,在任意目录下都执行docker命令)
cp docker/* /usr/bin

# 4.添加docker到系统服务
vi /etc/systemd/system/docker.service
# 添加内容如下
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target

# 5.赋予docker.service 可执行权限,并设置开机自启
# 赋予可执行权限
chmod +x /etc/systemd/system/docker.service
#设置开机自启并启动
systemctl enable --now docker.service

# 6.设置镜像源和docker主目录
# 在 docker 19.xx 版本以后使用data-root来代替graph
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://oebx1nkx.mirror.aliyuncs.com"],
"graph": "/hsadata/docker" # docker主目录 存储images等
}
EOF

# 重启docker:
systemctl restart docker
部署Elasticsearch

相关参考地址

dockerhub:https://hub.docker.com/_/elasticsearch

github:https://github.com/elastic/elasticsearch

elastic:https://www.elastic.co/guide/en/elasticsearch/reference/7.7/docker.html

# 1.拉取镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.7.1

# 2.调整系统内核参数
# elastic官方建议 生产环境下使用 elasticsearch镜像 需设置Linux参数 vm.max_map_count
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

# 3.新建 elasticsearch 目录
mkdir -p /hsadata/elasticsearch/{config,data,plugins}

# 4.修改 elasticsearch 配置
vim /hsadata/elasticsearch/config/elasticsearch.yml

# 配置内容如下
cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 开启 elasticsearch 安全认证 xpack认证
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

# 5.添加系统用户 elasticsearch
adduser elasticsearch

# 6.授权目录及所属
chmod g+rwx /hsadata/elasticsearch
chown -R elasticsearch:root /hsadata/elasticsearch/

# 7.创建并启动容器(4核8G)
# ES_JAVA_OPTS="-Xms2688m -Xmx2688m" JVM内核参数优化
# --ulimit nofile=65535:65535 设置 系统限制用户最大进程数 限制用户打开最大文件数
# --cpuset-cpus="1" -m 4G 限制容器可用的CPU和内存资源
# Redhat8.6 涉及到权限问题 导致启动失败
# 解决方案 不挂载data目录启动镜像 然后将容器内的data目录拷贝到宿主机即可
# docker cp es:/usr/share/elasticsearch/data /hsadata/elasticsearch/data
docker run -d -e ES_JAVA_OPTS="-Xms2688m -Xmx2688m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 --restart=always --ulimit nofile=65535:65535 --cpuset-cpus="1" -m 4G -v /hsadata/elasticsearch/data:/usr/share/elasticsearch/data -v /hsadata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -v /hsadata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /etc/localtime:/etc/localtime --name es 830a894845e3

# 8.启动xpack认证 并设置 elasticsearch 密码
# 进入 docker 容器
docker exec -it es bash
# 在容器内执行 并设置密码
elasticsearch-setup-passwords interactive
#.... 设置 es_xpack 认证的6个账户密码 ....

部署完成后 浏览器访问 http://服务器IP:9200 输入设置的用户名和密码即可 如下图

image-20230322144039465 image-20230322144120069

elastic 官网部分截图 vm.max_map_count

max_map_count 文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。

vm.max_map_count 是一个系统参数,它限制了一个进程可以拥有的虚拟内存区域(VMA)的数量。虚拟内存区域是一个连续的虚拟地址空间区域,它们在进程映射文件,链接共享内存,或分配堆空间时被创建。一些应用程序,如ES,需要较高的vm.max_map_count值,否则可能出错。vm.max_map_count的默认值是65535,但可以通过修改/etc/sysctl.conf文件来调整。

# 查看当前值
sysctl -a|grep vm.max_map_count

# 临时修改
sysctl -w vm.max_map_count=262144

# 永久修改
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

elastic 官网部分截图 ulimit

image-20230322112244396
部署Kibana

相关参考地址:

dockerhub:https://hub.docker.com/_/kibana

github:https://github.com/elastic/kibana

elastic:https://www.elastic.co/guide/en/kibana/current/get-started.html

# 1.拉取镜像
docker pull docker.elastic.co/kibana/kibana:7.7.1

# 2.创建目录
mkdir -p /hsadata/kibana/config

# 3.配置文件
vim /hsadata/kibana/config/kibana.yml
# 内容如下
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"
# 以下是 elasticsearch安全认证的用户名和密码
# 用户用 Kibana 密码是部署elasticsearch设置的
elasticsearch.username: "kibana"
elasticsearch.password: "3cu8rt00@A"

# 4.创建并启动容器
# link 引用 es容器名称为 elasticsearch
# 创建容器后在容器内部可以 ping通 elasticsearch(即es容器)
docker run -d --restart=always --link es:elasticsearch -p 5601:5601 -v /hsadata/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml -v /etc/localtime:/etc/localtime --name kibana 6de54f813b39

访问 Kinbana 页面 http://服务器IP:5601 如下图

用户名 elastic

密码是在elasticsearch容器中设置的密码(xpack安全认证)

修改Kibana日期格式

登录http://localhost:5601/,会进入Kibana的页面,选择Management -> Index Patterns -> Advanced Settings,找到Date format,如何修改这里的值,默认是MMMM Do YYYY, HH:mm:ss.SSS。
可以改成YYYY-MM-DD HH:mm:ss.SSS,这样页面的所有日期就会显示成2023-03-23 09:30:00.000 这种格式了
部署FileBeat(非docker)

相关参考地址

github:https://github.com/elastic/beats

elastic:https://www.elastic.co/guide/en/beats/filebeat/7.7/filebeat-overview.html

# 1.下载
yum install -y wget
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.1-linux-x86_64.tar.gz

# 2.解压
tar -zxvf filebeat-7.7.1-linux-x86_64.tar.gz

# 3.修改配置文件
cd filebeat-7.7.1-linux-x86_64
vim filebeat.yml

# 配置文件修改内容如下
- type: log
enabled: true
paths:
- /root/hsa-cep-gms.log
# - /var/log/messages
# multiline.pattern: ^\d{4}-\d{1,2}-\d{1,2}
# multiline.negate: true
# multiline.match: after

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
# es服务地址
hosts: ["10.0.0.76:9200"]
#protocol: "https"
# 设置es的用户名和密码
username: "elastic"
password: "3cu8rt00@A"
#================================ Processors =====================================
# 去掉FileBeat自身不需要的字段
processors:
# - add_host_metadata: ~
# - add_cloud_metadata: ~
# - add_docker_metadata: ~
# - add_kubernetes_metadata: ~
- drop_fields:
fields: ["input","agent","ecs","host","log.flags","log.offset"]
ignore_missing: false

# 4.编写 start.sh 启动脚本
vim start.sh

# 内容如下
#!/bin/bash
cd $1
./filebeat -e -c filebeat.yml > logs/filebeat.log 2>&1 &

# 添加可执行权限
chmod +x start.sh

# 创建logs目录
mkdir logs

# 5.添加到系统服务
vim /etc/systemd/system/filebeat.service
# 内容如下
[Unit]
Description=filebeat
After=network.target
[Service]
Type=forking
# 步骤4中 start.sh的全路径
ExecStart=/root/filebeat-7.7.1-linux-x86_64/start.sh /root/filebeat-7.7.1-linux-x86_64
ExecStop=/usr/bin/kill -s HUP
PrivateTmp=true
[Install]
WantedBy=multi-user.target

# 6.启动并设置开机自启
systemctl enable --now filebeat