企业级日志分析系统 ELK
1.1.1 什么是 ELK
1.Elasticsearch 是一个实时的全文搜索,存储库和分析引擎。 2.Logstash 是数据处理的管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如Elasticsearch 等存储库中。
(java开发,有数据处理能力,比较重) 3.Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。 4.filebeat 数据收集,轻量级,可以代替logstash做收集,logstash只做数据处理 (go开发) #注意:elk 4个软件使用时,版本必须保持一致 官网: https://www.elastic.co/
ELK stack的主要优点:
1.功能强大:Elasticsearch 是实时全文索引,具有强大的搜索功能 2.配置相对简单:Elasticsearch 全部其于 JSON,Logstash使用模块化配置,Kibana的配置都比较简单。 3.检索性能高效:基于优秀的设计,每次查询可以实时响应,即使百亿级数据的查询也能达到秒级响应。 4.集群线性扩展:Elasticsearch 和 Logstash都可以灵活线性扩展 5.前端操作方便:Kibana提供了比较美观UI前端,操作也比较简单
1.2 ELK 应用场景
运维主要应用场景: 1.将分布在不同主机/容器的日志统一收集,并进行转换,通过集中的Web UI 进行查询和管理 2.通过查看汇总的日志,找到故障的根本原因 3.Web 展示和报表功能 4.实现安全和事件等管理
大数据运维主要应用场景: 1.查询聚合, 大屏分析 2.预测告警, 网络指标,业务指标安全指标 3.日志查询,问题排查,基于API可以实现故障恢复和自愈 4.用户行为,性能,业务分析
2 Elasticsearch 部署和管理
Elasticsearch 基于 Java 语言实现
部署方式 1.包安装 (简单,内嵌java(只能es用,其他软件不能用)) 2.二进制安装 (要自己配配置文件,service服务,麻烦些) 3.Docker 部署 4.Kubernetes 部署 5.Ansible 批量部署 #ES支持操作系统版本和 Java 版本官方说明 https://www.elastic.co/cn/support/matrix
2.2 Elasticsearch 安装前准备
2.2.1 安装前环境初始化
CPU 2C 内存4G或更多
2.2.1.2 关闭防火墙和SELinux
关闭防所有服务器的防火墙和 SELinux
#RHEL系列的系统执行下以下配置 [root@es-node1 ~]# systemctl disable firewalld [root@es-node1 ~]# systemctl disable NetworkManager [root@es-node1 ~]# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config [root@es-node1 ~]# reboot
2.2.2 安装 Java 环境 (可选)
Elasticsearch 是基于java的应用,所以依赖JDK环境 #注意: 安装7.X以后版本官方建议要安装集成JDK的包,所以无需再专门安装 JDK 关于JDK环境说明 #1.x 2.x 5.x 6.x都没有集成JDK的安装包,也就是需要自己安装java环境 #7.x 版本的安装包分为带JDK和不带JDK两种包,带JDK的包在安装时不需要再安装java,如果不带JDK的包仍然需要自己去安装java #8.X 版本内置JDK,不再支持自行安装的JDK #如果安装no-jdk的包,才需要安装java环境
2.3.1 包安装 Elasticsearch
2.3.1.1 安装 Elasticsearch 包
#下载链接 https://www.elastic.co/cn/downloads/elasticsearch #这里选择package managers包管理器下载更简单 https://mirrors.tuna.tsinghua.edu.cn/elasticstack/ #范例:安装 elasticsearch-8 #注意:是elasticsearch目录,不是enterprise-search目录 [root@ubuntu ~]#wget https://mirrors.tuna.tsinghua.edu.cn/elasticstack/8.x/apt/pool/main/e/elasticsearch/elasticsearch-8.6.1-amd64.deb [root@ubuntu ~]#dpkg -i elasticsearch-8.12.2-amd64.deb #启动 [root@ubuntu ~]#systemctl enable --now elasticsearch.service [root@ubuntu ~]#ss -lntp #9200用户访问端口, 9300集群使用 State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 4096 [::ffff:127.0.0.1]:9300 *:* users:(("java",pid=1852,fd=441)) LISTEN 0 4096 *:9200 *:* users:(("java",pid=1852,fd=446)) LISTEN 0 4096 [::1]:9300 [::]:* users:(("java",pid=1852,fd=440)) #可以修改Elasticsearch堆内存分配(改为512m,因为这里是自己测试,改小没事) [root@ubuntu ~]#vim /etc/elasticsearch/jvm.options ## -Xms4g ## -Xmx4g -Xms512m -Xmx512m #关闭连接的安全加密xpack (8版本开始才有的功能,之前版本没有) [root@ubuntu ~]#vim /etc/elasticsearch/elasticsearch.yml xpack.security.enabled: false [root@ubuntu ~]#systemctl restart elasticsearch.service #连接测试 [root@ubuntu ~]#curl 127.0.0.1:9200
2.3.1.2.3 集群配置
范例:8.X 集群配置
#默认配置文件需要以下六行 [root@ubuntu2204 ~]#vim /etc/elasticsearch/elasticsearch.yml cluster.name: my-application #指定集群名称,同一个集群内的所有节点相同 node.name: node-1 #修改此行,每个节点不同 network.host: 0.0.0.0 #集群模式必须修改此行,默认是127.0.0.1:9300,否则集群节点无法通过9300端口通信每个节点相同 #发现集群的node节点列表,可以添加部分或全部节点IP #在新增节点到已有集群时,此处需指定至少一个已经在集群中的节点地址,给予可用性,一般添加所有节点地址 discovery.seed_hosts: ["10.0.0.101","10.0.0.102","10.0.0.103"] #集群初始化时指定希望哪些节点可以被选举为 master,只在初始化时使用,新加节点到已有集群时此项可不配置 cluster.initial_master_nodes: ["10.0.0.101","10.0.0.102","10.0.0.103"] xpack.security.enabled: false #一个集群中的 N 个节点启动后,才允许进行数据恢复处理,默认是1,一般设为为所有节点的一半以上,防止出现脑裂现象 #当集群无法启动时,可以将之修改为1,或者将下面行注释掉,实现快速恢复启动 gateway.recover_after_nodes: 2
安装集群
#准备3台机器,安装elasticsearch,执行以下操作 [root@ubuntu ~]#dpkg -i elasticsearch-8.12.2-amd64.deb #调堆内存大小,防止自己电脑扛不住 [root@ubuntu ~]#vim /etc/elasticsearch/jvm.options -Xms256m -Xmx256m #在一个节点上更改 [root@ubuntu ~]#vim /etc/elasticsearch/elasticsearch.yml cluster.name: my-application #注意这个配置每台机器都不能一样 node.name: node-1 network.host: 0.0.0.0 discovery.seed_hosts: ["10.0.0.151","10.0.0.152","10.0.0.153"] #这里有个坑,下面有一行内容一模一样,而且没有注释,要保证是有一行 cluster.initial_master_nodes: ["10.0.0.151","10.0.0.152","10.0.0.153"] #8版本开始需要改该配置 xpack.security.enabled: false [root@ubuntu ~]#rsync /etc/elasticsearch/elasticsearch.yml 10.0.0.152:/etc/elasticsearch/elasticsearch.yml [root@ubuntu ~]#rsync /etc/elasticsearch/elasticsearch.yml 10.0.0.153:/etc/elasticsearch/elasticsearch.yml #两外两个节点把 /etc/elasticsearch/elasticsearch.yml 下的 node.name 名称改下 #3台机器开机启动 [root@ubuntu ~]#systemctl enable --now elasticsearch.service #在3个节点任意一个执行,查看集群情况 [root@ubuntu ~]#curl http://127.0.0.1:9200/_cluster/health?pretty=true #查看各自情况 [root@ubuntu ~]#curl http://127.0.0.1:9200/ #查看有哪些节点 [root@ubuntu ~]#curl 'http://10.0.0.151:9200/_cat/nodes?v' ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 10.0.0.152 82 70 0 0.24 0.14 0.08 cdfhilmrstw - node-2 10.0.0.153 33 75 1 0.07 0.08 0.04 cdfhilmrstw - node-3 10.0.0.151 58 71 0 0.08 0.08 0.02 cdfhilmrstw * node-1
2.3.1.3 优化 ELK 资源配置
2.3.1.3.1 开启 bootstrap.memory_lock 优化
[root@ubuntu ~]#vim /etc/elasticsearch/elasticsearch.yml # Lock the memory on startup: #启动es时锁住内存,提高性能(内存大可以起来,内存小可能起不来,可追加配置做优化) bootstrap.memory_lock: true #注意:开启 bootstrap.memory_lock: true 需要足够的内存,建议4G以上,否则内存不足,启动会很失败或很慢 #官方说明,如果内存小,但又想启动内存锁,提升性能,可以如下配置 #8.X致集群模式需要修改如下配置 #方法1:直接修改elasticsearch.service [root@node1 ~]#vim /lib/systemd/system/elasticsearch.service [Service] #加下面一行 LimitMEMLOCK=infinity [root@ubuntu ~]#systemctl daemon-reload #重启即可启动 [root@ubuntu ~]#systemctl restart elasticsearch.service
2.3.1.3.2 内存优化
#所有java程序分配堆内存不要超过32G,最好不要超30G, es是java开发的,所以也有这个要求 #推荐使用宿主机物理内存的一半,ES的heap内存最大不超过30G,26G是比较安全的
2.4 Elasticsearch 访问
#访问 ES #查看支持的指令 curl http://127.0.0.1:9200/_cat #查看es集群状态 curl http://127.0.0.1:9200/_cat/health curl 'http://127.0.0.1:9200/_cat/health?v' #列出所有的索引 以及每个索引的相关信息 curl 'http://127.0.0.1:9200/_cat/indices?v'
2.4.1.2 创建和查看索引
#创建索引index1,简单输出 (索引相当于数据库) [root@node1 ~]#curl -XPUT '127.0.0.1:9200/index1' #默认一个主,一个副本(如果单机版不会创副本) {"acknowledged":true,"shards_acknowledged":true,"index":"index1"} #创建3个分片和2个副本的索引 (每个分片1主2副本,如果单机版不会创副本) [root@node1 ~]#curl -XPUT '127.0.0.1:9200/index2' -H 'Content-Type: application/json' -d ' { "settings": { "index": { "number_of_shards": 3, "number_of_replicas": 2 } } }' {"acknowledged":true,"shards_acknowledged":true,"index":"index2"} #如果查出es状态为yellow表示副本不全,数据没丢。如果为红,主分片丢了,数据丢了
2.5 Elasticsearch 插件
2.5.1 Head 插件
git地址:https://github.com/mobz/elasticsearch-head 用浏览器插件最方便, 加载已解压的扩展程序选0.1.5_0文件夹添加 #查看粗的数字和框代表主,细的代表副本
2.5.2 Cerebro 插件
git地址:https://github.com/lmenezes/cerebro #需要在一台机器上部署,然后才能使用 注意:安装cerebro内存建议大于3G以上(基于java,内存消耗稍微大一些) #依赖JDK [root@ubuntu2004 ~]#apt -y install openjdk-11-jdk #Java8实际也支持 [root@ubuntu2004 ~]#apt -y install openjdk-8-jdk #下载包,官方提供了DEB和RPM包 [root@ubuntu2004 ~]#wget https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro_0.9.4_all.deb #安装 [root@ubuntu2004 ~]#dpkg -i cerebro_0.9.4_all.deb #修改配置文件 [root@ubuntu2004 ~]#vim /etc/cerebro/application.conf data.path: "/var/lib/cerebro/cerebro.db" #取消此行注释 #data.path = "./cerebro.db" #注释此行,默认路径是/usr/share/cerebro/cerebro.db #此目录自动生成 [root@ubuntu2204 ~]#ll -d /var/lib/cerebro drwxr-xr-x 2 cerebro cerebro 4096 4月 10 2021 /var/lib/cerebro/ #启动 [root@ubuntu2004 ~]#systemctl start cerebro.service #默认监听9000端口 [root@ubuntu2004 ~]#ss -ntlp|grep 9000 LISTEN 0 100 *:9000 *:* users:(("java",pid=26333,fd=155)) #访问下面链接地址 http://10.0.0.200:9000 #在Node address输入框中输入任意ES集群节点的地址 http://10.0.0.151:9200
2.5.3 其它插件
Edge 浏览器应用中还有其它ES插件,可以使用
2.6 Elasticsearch 集群工作原理
2.6.1 ES 节点分类
Elasticsearch 集群的每个节点的角色有所不同,但都会保存集群状态Cluster State的相关的数据信息 1.节点信息:每个节点名称和地址 2.索引信息:所有索引的名称,配置等
2.6.3.4 数据同步机制
它采取了一 种“最终一致性”(eventual consistency)的模型。
2.6.4 ES 集群故障转移
故障转移指的是,当集群中有节点发生故障时,ES集群会进行自动修复
2.6.5 ES 文档路由
2.6.5.1 ES 文档路由原理
ES文档是分布式存储,当在ES集群访问或存储一个文档时,由算法决定此文档到底存放在哪个主 分片中,再结合集群状态找到存放此主分片的节点主机
2.6.5.3 ES 文档读取流程
可以从主分片或者从其它任意副本分片读取文档
2.7 Elasticsearch 集群扩容和缩容
新加入两个节点node4和node5,变为Data节点
#安装 [root@ubuntu ~]#dpkg -i elasticsearch-8.12.2-amd64.deb #改下虚拟机内存(自己测试扛不住) [root@ubuntu ~]#vim /etc/elasticsearch/jvm.options -Xms256m -Xmx256m #在两个新节点安装 ES,并配置文件如下 [root@ubuntu ~]#vim /etc/elasticsearch/elasticsearch.yml cluster.name: my-application #和原集群名称相同 #当前节点在集群内的节点名称,同一集群中每个节点要确保此名称唯一 node.name: node-4 #第二个新节点为node-5 #集群监听端口对应的IP,默认是127.0.0.1:9300 network.host: 0.0.0.0 #指定任意集群节点即可 discovery.seed_hosts: ["10.0.0.151","10.0.0.152","10.0.0.153"] #8版本开始需要改该配置 xpack.security.enabled: false [root@ubuntu ~]#systemctl enable --now elasticsearch.service #完成扩容,通过插件可以看到,已存在的数据也进行了重新分布
2.7.2 集群缩容
把服务停了,就自动缩容了, 数据会重新挪动到其他节点上(挪动过程状态是黄色, 先关一个, 黄变绿再关另一个)
2.4.2 Python 脚本:集群健康性检查
[root@es-node1 ~]# cat els-cluster-monitor.py #!/usr/bin/python3 #coding:utf-8 import subprocess import json body = "" false="false" #用另外一个进程运行curl返回结果从stdout中读取 obj = subprocess.Popen(("curl -sXGET http://10.0.0.101:9200/_cluster/health? pretty=true"),shell=True, stdout=subprocess.PIPE) # data = obj.stdout.read() #print(type(data)) # 应该是字符串类型或bytes类型 #print(data) # 确认返回的json形式的 es_dict = json.loads(data) if data else {} # 把json字符串解析为字典 status = es_dict.get("status") # 通过字典查找status if status == "green": print("OK") else: print("Not OK")
标签:10.0,集群,elasticsearch,ELK01,ubuntu,Elasticsearch,root,节点 From: https://www.cnblogs.com/ludingchao/p/18490369