案例概述
日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。
系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因,经常分析日志
可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存在不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法
查阅日志,即繁琐又效率低下。为此,我们可以使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实
现检索和统计,但是对于更高要求的查询、排序和统计等,再加上庞大的机器数量,使用这样的方法依然难免有点力不从心。
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、 Logstash和Kiabana三个开源工具组成。
官方网站: https://www.elastic.co/products Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤,并将其存储,供以后使用(如,搜索)。Kibana 也是一个开源和免费的工具,Kibana可以为Logstash和ElasticSearch提供友好的日志分析Web界面,
可以帮助您汇总、分析和搜索重要数据日志。
ELK工作原理展示图
【APPServer集群】→→【logstash Agent 采集器】→→【ElasticSearch Cluster】→→【[Kibana Server]→→【Browser】
Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,
再返回给Browser。简单来说,进行日志处理分析,一般需要经过以下几个步骤:
- 将日志进行集中化管理(beats)
- 将日志格式化(logstash)
- 对格式化后的数据进行索引和存储(elasticsearch)
- 前端数据的展示
案例
master(20.0.0.11)
###### 关闭防火墙和核心防护 ##############
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
###### 修改主机名 ##############
[root@localhost ~]# hostnamectl set-hostname master
node1(20.0.0.21)
###### 关闭防火墙和核心防护 ##############
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
###### 修改主机名 ##############
[root@localhost ~]# hostnamectl set-hostname node1
###### 做映射 ##############
[root@node1 ~]# vim /etc/hosts
20.0.0.21 node1
20.0.0.22 node2
###### 查看Java技术环境 ##############
[root@node1 ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
###### 部署elasticsearch软件 ##############
1、安装elasticsearch----rpm包
上传elasticsearch-5.5.0.rpm到/opt目录下
[root@node1 ~]# cd /opt
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm
2、加载系统服务
[root@node1 opt]# systemctl daemon-reload #重载系统参数
[root@node1 opt]# systemctl enable elasticsearch.service
3、更改elasticsearch主配置文件
[root@node1 opt]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak #备份
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
17/ cluster.name: my-elk-cluster ####集群名字
23/ node.name: node1 ####节点名字
33/ path.data:/data/elk_data ####数据存放路径
37/ path.logs: /var/log/elasticsearch/ ####日志存放路径
43/ bootstrap.memory_lock: false ####不在启动的时候锁定内存,锁定物理内存地址,防止es内存被交换出去
55/ network.host: 0.0.0.0 ####提供服务绑定的IP地址,0.0.0.0代表所有地址
59/ http.port: 9200 ####监听端口9200
68/ discovery.zen.ping.unicast.hosts: ["node1", "node2"] ####集群发现通过单播实现
4、创建数据存放路径并授权
[root@node1 opt]# mkdir -p /data/elk_data ####创建文件
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/ ####授权
[root@node1 opt]# ll /data/
总用量 0
drwxr-xr-x. 2 elasticsearch elasticsearch 6 10月 28 22:55 elk_data
5、启动elasticsearch是否成功开启
[root@node1 opt]# systemctl start elasticsearch.service
[root@node1 opt]# netstat -antp |grep 9200
tcp6 0 0 :::9200 :::* LISTEN 14397/java
6、查看节点信息 用真机 http://20.0.0.21:9200 下面是节点信息
{
"name" : "node1",
"cluster_name" : "my-elk-cluster",
"cluster_uuid" : "W2OvwcB0TtK5UeC6_MOayw",
"version" : {
"number" : "5.5.0",
"build_hash" : "260387d",
"build_date" : "2017-06-30T23:16:05.735Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
node2(20.0.0.22)
###### 关闭防火墙和核心防护 ##############
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
###### 修改主机名 ##############
[root@localhost ~]# hostnamectl set-hostname node2
###### 做映射 ##############
[root@node1 ~]# vim /etc/hosts
20.0.0.21 node1
20.0.0.22 node2
###### 测试是否映射成功 ##############
[root@node2 ~]# ping node1
PING node1 (20.0.0.21) 56(84) bytes of data.
64 bytes from node1 (20.0.0.21): icmp_seq=1 ttl=64 time=0.898 ms
64 bytes from node1 (20.0.0.21): icmp_seq=2 ttl=64 time=0.369 ms
###### 查看Java技术环境 ##############
[root@node2 ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
###### 部署elasticsearch软件 ##############
1、安装elasticsearch----rpm包
上传elasticsearch-5.5.0.rpm到/opt目录下
[root@node2 ~]# cd /opt
[root@node2 opt]# rpm -ivh elasticsearch-5.5.0.rpm
2、加载系统服务
[root@node2 opt]# systemctl daemon-reload
[root@node2 opt]# systemctl enable elasticsearch.service
3、更改elasticsearch主配置文件
[root@node2 opt]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
[root@node2 opt]# vim /etc/elasticsearch/elasticsearch.yml
17/ cluster.name: my-elk-cluster ####集群名字
23/ node.name: node2 ####节点名字
33/ path.data:/data/elk_data ####数据存放路径
37/ path.logs: /var/log/elasticsearch/ ####日志存放路径
43/ bootstrap.memory_lock: false ####不在启动的时候锁定内存,锁定物理内存地址,防止es内存被交换出去
55/ network.host: 0.0.0.0 ####提供服务绑定的IP地址,0.0.0.0代表所有地址
59/ http.port: 9200 ####监听端口9200
68/ discovery.zen.ping.unicast.hosts: ["node1", "node2"] ####集群发现通过单播实现
4、创建数据存放路径并授权
[root@node2 opt]# mkdir -p /data/elk_data ####创建文件
[root@node2 opt]# chown elasticsearch:elasticsearch /data/elk_data/ ####授权
[root@node2 opt]# ll /data/
总用量 0
drwxr-xr-x. 2 elasticsearch elasticsearch 6 10月 28 23:08 elk_data
5、启动elasticsearch是否成功开启
[root@node2 opt]# systemctl start elasticsearch.service
[root@node2 opt]# netstat -antp |grep 9200
tcp6 0 0 :::9200 :::* LISTEN 14397/java
6、查看节点信息 用真机 http://20.0.0.22:9200 下面是节点信息
{
"name" : "node2",
"cluster_name" : "my-elk-cluster",
"cluster_uuid" : "W2OvwcB0TtK5UeC6_MOayw",
"version" : {
"number" : "5.5.0",
"build_hash" : "260387d",
"build_date" : "2017-06-30T23:16:05.735Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
【集群检查健康和状态】
在浏览器输入http://20.0.0.22:9200/_cluster/health?pretty ##检查群集健康情况
{
"cluster_name" : "my-elk-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 0,
"active_shards" : 0,
"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
}
http://20.0.0.22:9200/_cluster/state?pretty ##检查群集状态信息
{
"cluster_name" : "my-elk-cluster", #集群名
"version" : 3,
"state_uuid" : "5v2xvnWpTW-9l7mSdt6ZPQ",
"master_node" : "-yv33--fSYiBBXM1Jay9xw",
"blocks" : { },
"nodes" : {
"-yv33--fSYiBBXM1Jay9xw" : {
"name" : "node1",
"ephemeral_id" : "ArBmRym8Te2SC44u8vdDPA",
"transport_address" : "20.0.0.21:9300", #9200是es外部端口9300是在集群内部端口
"attributes" : { }
},
"5wbKAEWDRMykeKrfF0yxJw" : {
"name" : "node2",
"ephemeral_id" : "PSDkUePDT-iSKfHxD9tthA",
"transport_address" : "20.0.0.22:9300",
"attributes" : { }
}
},
"metadata" : {
"cluster_uuid" : "W2OvwcB0TtK5UeC6_MOayw",
"templates" : { },
"indices" : { },
"index-graveyard" : {
"tombstones" : [ ]
}
},
"routing_table" : {
"indices" : { }
},
"routing_nodes" : {
"unassigned" : [ ],
"nodes" : {
"5wbKAEWDRMykeKrfF0yxJw" : [ ],
"-yv33--fSYiBBXM1Jay9xw" : [ ]
}
}
}
【安装elasticsearch-head插件】查看集群更加方便
####登录20.0.0.21 node1主机###
yum install gcc gcc-c++ make -y
##编译安装node组件依赖包#耗时比较长
[root@localhost opt]# cd /opt
[root@node1 opt]# tar zxvf node-v8.2.1.tar.gz
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make -j4 (等待时间较长)
[root@node1 node-v8.2.1]# make install
####安装phantomjs####前端框架
上传软件包到根目录
[root@node1 ~]# tar jvxf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 ~]# cd phantomjs-2.1.1-linux-x86_64/bin/
[root@node1 bin]# cp phantomjs /usr/local/bin/
###安装elasticsearch-head###数据可视化工具
[root@node1 ~]# tar xzvf elasticsearch-head.tar.gz
[root@node1 ~]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
####*修改主配置文件##
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml ####下面配置文件,插末尾##
http.cors.enabled: true ##开启跨域访问支持,默认为false
http.cors.allow-origin: "*" ##跨域访问允许的域名地址
[root@node1 ~]# systemctl restart elasticsearch.service
####启动elasticsearch-head启动服务器####
[root@node1 ~]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start & ##切换到后台运行
[2] 61267
[root@node1 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /root/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
创建一个索引
[root@node1 opt]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
{
"_index" : "index-demo",
"_type" : "test",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"created" : true
}