Loading

12、elk的使用(1)


12.0、架构图:

服务器名称

ip地址

controller-node1(主)

172.16.1.90

slave-node1(从)

172.16.1.91



12.1、elk介绍:

(1)ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻

量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。

(2)Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分

片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

1)NRT:

elasticsearch是一个近似实时的搜索平台,从索引文档到可搜索有些延迟,通常为1秒。

2)集群:

集群就是一个或多个节点存储数据,其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一

性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。一个集

群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。

3)节点:

节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机

分配的字符名。当然啦,你可以自己定义。该名字也蛮重要的,在集群中用于识别服务器对应的节点。节点可以通过指定集群名字来加入到集群中。默认情况

下,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticsearch的集群。

4)索引:

索引是有几分相似属性的一系列文档的集合。如nginx日志索引、syslog索引等等。索引是由名字标识,名字必须全部小写。这个名字用来进行索引、搜

索、更新和删除文档的操作。 索引相对于关系型数据库的库。

5)类型:

在一个索引中,可以定义一个或多个类型。类型是一个逻辑类别还是分区完全取决于你。通常情况下,一个类型被定于成具有一组共同字段的文档。如ttlsa

运维生成时间所有的数据存入在一个单一的名为logstash-ttlsa的索引中,同时,定义了用户数据类型,帖子数据类型和评论类型。 类型相对于关系型数据库的表。

6)文档:

文档是信息的基本单元,可以被索引的。文档是以JSON格式表现的。 在类型中,可以根据需求存储多个文档。虽然一个文档在物理上位于一个索引,实际上一个文档

必须在一个索引内被索引和分配一个类型。 文档相对于关系型数据库的列。

7)分片和副本:

在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个十亿文档需1TB空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太

慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索

引,可以位于集群中任何节点上。

A、分片的两个最主要原因:

a、水平分割扩展,增大存储量;

b、分布式并行跨分片操作,提高性能和吞吐量,分布式分片的机制和搜索请求的文档如何汇总完全是有elasticsearch控制的,这些对用户而言是透明的。 网络问题等等

其它问题可以在任何时候不期而至,为了健壮性,强烈建议要有一个故障切换机制,无论何种故障以防止分片或者节点不可用。 为此,elasticsearch让我们将索引分片复

制一份或多份,称之为分片副本或副本。

B、副本也有两个最主要原因:

a、高可用性,以应对分片或者节点故障。出于这个原因,分片副本要在不同的节点上。

b、提供性能,增大吞吐量,搜索可以并行在所有副本上执行。

C、总之,每一个索引可以被分成多个分片。索引也可以有0个或多个副本。复制后,每个索引都有主分片(母分片)和复制分片(复制于母分片)。分片

和副本数量可以在每个索引被创建时定义。索引创建后,可以在任何时候动态的更改副本数量,但是,不能改变分片数。 默认情况下,elasticsearch为每个索引分片5个

主分片和1个副本,这就意味着集群至少需要2个节点。索引将会有5个主分片和5个副本(1个完整副本),每个索引总共有10个分片。 每个elasticsearch分片是一个

Lucene索引。一个单个Lucene索引有最大的文档数LUCENE-5843, 文档数限制为2147483519(MAX_VALUE – 128)。 可通过_cat/shards来监控分片大小。

(3)Logstash主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要

收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

(4)Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

(5)Filebeat隶属于Beats。目前Beats包含四种工具:

1)Packetbeat(搜集网络流量数据);

2)Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据);

3)Filebeat(搜集文件数据);

4)Winlogbeat(搜集 Windows 事件日志数据);

12.2、前期准备:

主从服务器的准备一致;

1、增大系统文件描述符:

echo '* hard nofile 65535' >>/etc/security/limits.conf

echo '* soft nofile 65535' >>/etc/security/limits.conf

2、关闭防火墙:

systemctl stop firewalld.service

systemctl disable firewalld.service

systemctl status firewalld.service

3、关闭selinux:

sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

grep "SELINUX=disabled" /etc/selinux/config

setenforce 0

getenforce

4、保证两台服务器的时间一致:

crontab -e

*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com $>/dev/null

12.3、建立新的磁盘分区:

因为elk存储的数据量比较大对io有一定的影响,所以需要把数据放在新的磁盘分区上;

主节点和从节点配置相同;

1、磁盘分区:

在虚拟机关机的情况下添加20G的虚拟磁盘,开机后使用fdisk工具对磁盘只分一个分区;

2、格式化磁盘;

mkfs.xfs /dev/sdb1

3、挂载磁盘:

mkdir -p /data/

blkid /dev/sdb1

/dev/sdb1: UUID="ff880315-2872-49dd-b867-d80beb66a20f" TYPE="xfs"

vim /etc/fstab

UUID=ff880315-2872-49dd-b867-d80beb66a20f /data xfs defaults 0 0

#使用磁盘分区的uuid挂载磁盘,防止重启服务器后磁盘名称(/dev/sdb...) 发生改变;

mount -a

df -hT

/dev/sdb1 xfs 20G 33M 20G 1% /data

12.4、安装elasticsearch:

主从服务器安装方法一致;

1、下载软件包:

mkdir /tools/

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.0-x86_64.rpm

#说明:因为该版本的rpm包中自带版本适应性jdk,所以不需要另下jdk rpm包;

2、安装:

cd /tools/

rpm -ivh elasticsearch-7.0.0-x86_64.rpm

3、配置elasticsearch主配置文件:

grep "^[a-z]" /etc/elasticsearch/elasticsearch.yml

cluster.name: elk-cluster

#集群的名称,一个集群中唯一;

node.name: elk-node1

#节点名称,每个节点唯一;

path.data: /data/elkdata

#节点存放索引的目录;

path.logs: /data/logs

#节点存放日志的目录;

bootstrap.memory_lock: true

#开启内存锁;

network.host: 172.16.1.90

#监听的网卡;

http.port: 9200

#9200作为Http协议,主要用于外部通讯;9300作为Tcp协议,jar之间就是通过tcp协议通讯,集群之间是通过9300进行通讯;

discovery.seed_hosts: ["172.16.1.90", "172.16.1.91"]

#集群中节点列表;

cluster.initial_master_nodes: ["172.16.1.90"]

#集群中的主节点;

http.cors.enabled: true

http.cors.allow-origin: "*"

#授权跨域访问,因为从另外一个域的浏览器访问ES服务器数据,会出现跨域的问题;

4、创建数据和日志存放目录并授权:

mkdir -p /data/{elkdata,logs}

chown -R elasticsearch.elasticsearch /data/

5、修改内存限制:

因为在上面的主配置文件中开启了bootstrap.memory_lock: true内存锁,不修改以下配置文件会导致elasticsearch启动失败;

(1)修改内存锁定的大小:

vim /etc/elasticsearch/jvm.options

-Xms2g

-Xmx2g

#说明: 默认锁定内存是1GB,该参数是锁定elasticsearch内存防止其用尽系统的内存,一般设置为服务器内存的50%最好,但是最大不能超过32G;

(2)开启内存锁定:

vim /usr/lib/systemd/system/elasticsearch.service

LimitMEMLOCK=infinity

#说明:改参数需要自己添加,要放到[install]标签的上面,不然启动不了;

6、启动elasticsearch服务并加入开机自启动:

systemctl enable elasticsearch.service

systemctl start elasticsearch.service

netstat -tunlp | egrep "9200|9300"

tcp6 0 0 172.16.1.90:9200 :::* LISTEN 5888/java

tcp6 0 0 172.16.1.90:9300 :::* LISTEN 5888/java

7、登录验证:

12.5、安装elasticsearch的插件:

该插件作为单独的服务运行,主要是监控集群的作用,该插件装在主节点上;

1、下载插件:

yum install git -y

cd /tools/

git clone https://github.com/mobz/elasticsearch-head.git

2、安装:

mkdir -p /application/

cd /tools/

cp -a elasticsearch-head/ /application/

cd /application/elasticsearch-head/

yum install npm -y

npm install grunt -save

ll node_modules/grunt

npm install

提示:修改监听的网卡地址:

vim /application/elasticsearch-head/Gruntfile.js

connect: {

server: {

options: {

hostname: '服务器ip',

port: 9100,

base: '.',

keepalive: true

}

}

}

3、启动:

cd /application/elasticsearch-head/

npm run start & &>/dev/null

netstat -tunlp | grep 9100

tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 9645/grunt

4、网页访问:

(1)

(2)连接说明:

在上面的箭头框内输入http://172.16.1.90:9200后点击连接,连接的是elk-node1节点上由于是集群且在节点上都授予

了跨域访问的权限,所以其它的节点也会显示出来并且知道整个集群的健康状态,同理输入其它节点也是一样的道理;

(3)集群健康颜色说明 :

绿色——最健康的状态,代表所有的主分片和副本分片都可用;

黄色——所有的主分片可用,但是部分副本分片不可用;

红色——部分主分片不可用,此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好;

(4)使用命令查看集群健康状态:

curl http://172.16.1.90:9200/_cluster/health?pretty=true

{

"cluster_name" : "elk-cluster",

"status" : "green",

"timed_out" : false,

"number_of_nodes" : 2,

"number_of_data_nodes" : 2,

"active_primary_shards" : 5,

"active_shards" : 10,

"relocating_shards" : 0,

"initializing_shards" : 0,

"unassigned_shards" : 0,

"delayed_unassigned_shards" : 0,

"number_of_pending_tasks" : 0,

"number_of_in_flight_fetch" : 0,

"task_max_waiting_in_queue_millis" : 0,

"active_shards_percent_as_number" : 100.0

}

(5)将服务加入到开机自启动:

chmod +x /etc/rc.d/rc.local

echo 'cd /application/elasticsearch-head/ && /usr/bin/npm run start & &>/dev/null' >>/etc/rc.local

(6)通过脚本判断集群健康状态:

此脚本方便zabbix进行监控;

[root@controller-node1 ~]# vim /scripts/elastic-health.py

#!/usr/bin/env/ python

#coding:utf-8

import subprocess

false="false"

obj=subprocess.Popen(("curl -sXGET http://172.16.1.90:9200/_cluster/health?pretty=true"),shell=True,stdout=subprocess.PIPE)

data=eval(obj.stdout.read())

status=data.get("status")

if status == "green":

print "0"

else:

print "1"

#在elasticsearch集群正常的情况下:

[root@controller-node1 ~]# python /scripts/elastic-health.py

0

#在elasticsearch集群损坏的情况下:

[root@controller-node1 ~]# python /scripts/elastic-health.py

1

12.6、安装logstash:

logstash是日志收集工具,这里将其装在从节点上,在实际的环境中是装在需要收集日志的服务器上的;

1、安装java环境:

cd /tools/

wget https://download.oracle.com/otn/java/jdk/8u202-b08/1961070e4c9b4e26a04e7f5a083f551e/jdk-8u202-linux-x64.rpm

rpm -ivh jdk-8u202-linux-x64.rpm

2、安装:

cd /tools/

wget https://artifacts.elastic.co/downloads/logstash/logstash-7.0.0.rpm

rpm -ivh logstash-7.0.0.rpm

3、配置主配置文件:

vim /etc/logstash/logstash.yml

http.host: "172.16.1.91"

4、测试logstash:

1)普通测试:

/usr/share/logstash/bin/logstash -e 'input { stdin {} } output { stdout { codec => rubydebug } }'

......

2

{

"host" => "slave-node1",

#标记时间发生的位置;

"@version" => "1",

#事件版本号,一个事件就是一个ruby对象;

"@timestamp" => 2019-05-09T16:18:12.377Z,

#当前事件发生的时间;

"message" => "2"

#消息的具体内容;

}

2)压缩测试:

/usr/share/logstash/bin/logstash -e 'input { stdin {} } output { file { path => "/tmp/test-%{+YYYY.MM.dd}.log.gz" gzip => "true" } }'

hello

[INFO ] 2019-05-10 01:24:49.984 [[main]>worker0] file - Opening file {:path=>"/tmp/test-2019.05.09.log.gz"}

[INFO ] 2019-05-10 01:25:07.098 [[main]>worker0] file - Closing file /tmp/test-2019.05.09.log.gz

ls -l /tmp/test-2019.05.09.log.gz

-rw-r--r-- 1 root root 115 5月 10 01:25 /tmp/test-2019.05.09.log.gz

gzip -d /tmp/test-2019.05.09.log.gz

cat /tmp/test-2019.05.09.log

{"@version":"1","@timestamp":"2019-05-09T17:24:49.324Z","host":"slave-node1","message":"hello"}

3)写入到elasticsearch测试:

/usr/share/logstash/bin/logstash -e 'input { stdin {} } output { elasticsearch { hosts => ["172.16.1.90:9200"] index => "logstash-test-%{+YYYY.MM.dd}" } }'

#在界面中查看集群收到的索引:

#索引在节点上存放的位置:

ll /data/elkdata/nodes/0/indices/

总用量 0

drwxr-xr-x 4 elasticsearch elasticsearch 29 5月 10 01:33 7yFKJD2NTHG91O-N71rGqw

#提示:在删除索引时,要在集群的监控界面(动作选项)删除;切勿在节点上存放索引的物理目录中删除,因为集群节点上每个都有这样的数据,删除某一个,可能会导致elasticsearch无法启动。

5、启动logstash服务并加入开机自启动:

chown -R logstash.logstash /usr/share/logstash/data/queue/

#权限更改为logstash用户和组,否则启动时日志报错;

systemctl start logstash

systemctl enable logstash

netstat -tunlp | grep 9600

tcp6 0 0 172.16.1.91:9600 :::* LISTEN 791/java

12.7、安装kibana:

kibana为elasticsearch集群提供一个友好的web界面(和上面安装的elasticsearch插件类似,只是功能更多),我们将其装在主节点上;

1、安装:

cd /tools/

wge thttps://artifacts.elastic.co/downloads/kibana/kibana-7.0.0-x86_64.rpm

rpm -ivh kibana-7.0.0-x86_64.rpm

2、配置主配置文件:

grep "^[a-z]" /etc/kibana/kibana.yml

server.port: 5601

#kibana服务端口号;

server.host: "172.16.1.90"

#kibana监听的ip地址;

elasticsearch.hosts: ["http://172.16.1.90:9200"]

#kibana连接elasticsearch的url地址;

3、启动kibana服务并加入开机自启动:

systemctl enable kibana.service

systemctl start kibana.service

netstat -tunlp | grep 5601

tcp 0 0 172.16.1.90:5601 0.0.0.0:* LISTEN 3014/node

4、使用浏览器进行访问:

posted @ 2020-02-17 12:54  云起时。  阅读(604)  评论(0编辑  收藏  举报