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、使用浏览器进行访问: