码迷,mamicode.com
首页 > 其他好文 > 详细

ELK的搭建

时间:2018-08-17 11:27:45      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:file   position   多少   datetime   replica   云计算   快速   分布   数据集   

ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写。 – Elasticsearch:负责日志检索和储存 – Logstash:负责日志的收集和分析、处理 – Kibana:负责日志的可视化 – 这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,故被简称为 ELK ELK组件在海量日志系统的运维中,可用于解决: – 分布式日志数据集中式查询和管理 – 系统监控,包含系统硬件和应用各个组件的监控 – 故障排查 – 安全信息和事件管理 – 报表功能 Elasticsearch ElasticSearch 是一个基于 Lucene 的搜索服务器。 它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful API 的 web 接口。 Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。 设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便 主要特点 – 实时分析 – 分布式实时文件存储,并将每一个字段都编入索引 – 文档导向,所有的对象全部是文档 – 高可用性,易扩展,支持集群(Cluster)、分片(Shards)和复制 (Replicas) – 接口友好,支持 JSON ES 没有什么 Elasticsearch 没有典型意义的事务. Elasticsearch 是一种面向文档的数据库。 Elasticsearch 没有提供授权和认证特性 相关概念: – Node: 装有一个 ES 服务器的节点。 – Cluster: 有多个Node组成的集群 – Document: 一个可被搜素的基础信息单元 – Index: 拥有相似特征的文档的集合 – Type: 一个索引中可以定义一种或多种类型 – Filed: 是 ES 的最小单位,相当于数据的某一列 – Shards: 索引的分片,每一个分片就是一个 Shard – Replicas: 索引的拷贝 ES 与关系型数据库的对比 – 在 ES 中,文档归属于一种 类型 (type) ,而这些类型 存在于索引 (index) 中,类比传统关系型数据库 – DB -> Databases -> Tables -> Rows -> Columns – 关系型 数据库 表 行 列 – ES -> Indices -> Types -> Documents -> Fields – ES 索引 类型 文档 域(字段) 安装 JDK和elasticsearch-2.3.4.rpm yum -y install elasticsearch-2.3.4.rpm yum -y install java-1.8.0-openjdk 设置主机名称和 ip 对应关系 vim /etc/hosts 192.168.4.20 kibana 192.168.4.15 es2 192.168.4.21 es3 192.168.4.50 es5 192.168.4.11 es1 192.168.4.14 es4 修改配置文件 vim /etc/elasticsearch/elasticsearch.yml cluster.name: es-abc node.name: es1 network.host: 0.0.0.0 discovery.zen.ping.unicast.hosts: ["es1", "es2","es3"] vim /etc/elasticsearch/elasticsearch.yml cluster.name: es-abc node.name: es2 network.host: 0.0.0.0 discovery.zen.ping.unicast.hosts: ["es1", "es2","es3"] ....... clook主机不装包不配置 启动服务,设置自启动 systemctl enable elasticsearch systemctl start elasticsearch 验证: netstat –ltunp |grep :9200 netstat –ltunp |grep :9300 http://192.168.4.12:9200/_cluster/health?pretty { "cluster_name" : "my-es", "status" : "green", ...... ...... ...... "number_of_nodes" : 5, "number_of_data_nodes" : 5, ...... ...... ...... "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 } ES 集群验证 – 返回字段解析 – status“ : ”green“ 集群状态,绿色为正常,×××表示有问题但不是很严重,红色表示严重故障 – “number_of_nodes” : 5, 表示集群中节点的数量 – "number_of_data_nodes" : 5, – ...... ...... ...... – "task_max_waiting_in_queue_millis" : 0, – "active_shards_percent_as_number" : 100.0 – } ES 常用插件 head 插件: – 它展现ES集群的拓扑结构,并且可以通过它来进行索引(Index)和节点(Node)级别的操作 – 它提供一组针对集群的查询API,并将结果以json和表格形式返回 – 它提供一些快捷菜单,用以展现集群的各种状态 kopf 插件: – 是一个ElasticSearch的管理工具 – 它提供了对ES集群操作的API bigdesk 插件: – 是elasticsearch的一个集群监控工具 – 可以通过它来查看es集群的各种状态,如:cpu、内存 使用情况,索引数据、搜索情况,http连接数等 ES 插件安装、查看 – 查看安装的插件 /usr/share/elasticsearch/bin/plugin list – 安装插件 /usr/share/elasticsearch/bin/plugin install ftp://192.168.4.254/head.zip /usr/share/elasticsearch/bin/plugin install file:///tmp/kopf.zip – 这里必须使用 url 的方式进行安装,如果文件在本地,我们也需要使用 file:// 的方式指定路径, 例如文件在/tmp/xxx 下面,我们要写成 file:///tmp/xxx 删除使用 remove 指令。 例: cd /usr/share/elasticsearch/bin ./plugin install http://192.168.4.254/es-plugins/bigdesk-master.zip ./plugin install http://192.168.4.254/es-plugins/elasticsearch-head-master.zip ./plugin install http://192.168.4.254/es-plugins/elasticsearch-kopf-master.zip ./plugin list Elasticsearch提供了一系列RESTful的API – 检查集群、节点、索引的健康度、状态和统计 – 管理集群、节点、索引的数据及元数据 – 对索引进行CRUD操作及查询操作 – 执行其他高级操作如分页、排序、过滤等 POST 或 PUT 数据使用 json 格式 json – JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法, 它是一种基于文本,独立于语言的轻量级数据交换格式。 – json 传输的就是一个字符串 – python 中对应的 字符串,列表,字典都可以转换成对应的 json 格式 Rest API 的简单使用 – _cat API 查询集群状态,节点信息 – v 参数显示详细信息 curl -X GET http://192.168.4.15:9200/_cat/health?v – help 显示帮助信息 curl -X GET http://192.168.4.15:9200/_cat/health?help – nodes 查询节点状态信息 curl -X GET http://192.168.4.15:9200/_cat/nodes?v – 索引信息 curl -X GET http://192.168.4.15:9200/_cat/indices?v HTTP Methods 和 RESTful API 设计 – HTTP Methods 也叫 HTTP Verbs, 它们是 HTTP 协议的一部分, 主要规定了 HTTP 如何请求和操作服务器上的资源,常见的有GET, POST等 – HTTP Methods 一共有九个,分别是 GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,CONNECT,PATCH HTTP Methods – 在RESTful API 设计中,常用的有POST,GET,PUT,PATCH 和 DELETE。分别对应对资源的创建,获取, 修改,部分修改和删除操作。 – 我们默认访问 ES API 的方法是 GET,如果要对数据库增加、删除、修改数据我们还要使用对应的方法。 – GET 查询 – POST 增加 – PUT 更改 – DELETE 删除 RESTful API 增加 – 创建一个 school(Index)(可以认为是库名) 和一个 students (Type)(表名) – 并增加一条信息 curl -XPUT ‘http://192.168.4.11:9200/school/students/1‘ -d ‘{ "title": "devops", "name":{ "first": "guzhang", "last": "wu" }, "age": 25 }‘ RESTful API 更改 – 修改 school 下面 students 的第一个文档中的 age 信 息,从 25 修改为 30 curl -XPOST ‘http://192.168.4.11:9200/school/students/1/_update‘ -d ‘{ "doc":{ #格式 "age": 30 #修改的内容 } }‘ RESTful API 查询 – 查询刚刚创建的文档信息 curl –XGET ‘http://192.168.4.11:9200/school/students/1‘ – 只查询 name 和 age curl -XGET ‘http://192.168.4.11:9200/school/students/1?_source=name,age‘ RESTful API 删除 – 删除刚才创建的文档 curl -XDELETE ‘http://192.168.4.11:9200/school/students/1‘ – 直接删除 school curl -XDELETE ‘http://192.168.4.11:9200/school‘ Kibana 安装 – kibana 的安装非常简单,我们使用 rpm 方式安装 rpm –ivh kibana-4.5.2-1.x86_64.rpm – kibana 默认安装在 /opt/kibana 下面,配置文件在 /opt/kibana/config/kibana.yml – 我们只需要修改少量的配置就可以启动 kibana.yml 的配置 vim /opt/kibana/config/kibana.yml server.port: 5601 server.host: "0.0.0.0" elasticsearch.url: "http://192.168.4.13:9200" kibana.index: ".kibana" kibana.defaultAppId: "discover" elasticsearch.pingTimeout: 1500 elasticsearch.requestTimeout: 30000 elasticsearch.startupTimeout: 5000 – 除 elasticsearch.url 需要配置为我们 ES 集群的地址之外,其他保持默认值就可以了 – 设置开机启动 systemctl enable kibana – 启动服务 systemctl start kibana – web 访问 kibana http://192.168.4.20:5601/ 使用 _bulk 批量导入数据 – 批量导入数据使用 POST 方式,数据格式为 json,url编码使用 data-binary – 导入含有 index 配置的 json 文件 gzip –d logs.jsonl.gz curl -XPOST ‘http://192.168.4.14:9200/_bulk‘ --data-binary @logs.jsonl gzip –d shakespeare.json.gz curl -XPOST ‘http://192.168.4.14:9200/_bulk‘ --data-binary @shakespeare.json – 导入没有有 index 配置的 json 文件 – 我们需要在 uri 里面制定 index 和 type gzip –d accounts.json.gz curl -XPOST ‘http://192.168.4.14:9200/accounts/act/_bulk?pretty‘ --data-binary @accounts.json 数据批量查询 数据批量查询使用 GET curl -XGET ‘http://192.168.4.11:9200/accounts/act/2‘ 或curl -XGET ‘http://192.168.4.11:9200/_mget?pretty‘ -d ‘{ "docs":[ { "_index": "accounts", "_type:": "act", "_id": 1 } { "_index": "accounts", "_type:": "act", "_id": 2 } { "_index": "shakespeare", "_type:": "scene", "_id": 1 } ] }‘ map 映射 mapping: – 映射:创建索引的时候,可以预先定义字段的类型及相关属性。 – 作用:这样会让索引建立得更加的细致和完善。 – 分类:静态映射和动态映射。 – 动态映射:自动根据数据进行相应的映射。 – 静态映射:自定义字段映射数据类型。 kibana 里选择日志 – 支持通配符 * – 我们这里选择 logstash-* – 在下面的 Time-field 选择 @timestramp 作为索引 – 然后点 create 按钮 导入成功以后选择 discover,修改一下时间来显示。 logstash – logstash是一个数据采集、加工处理以及传输的工具 logstash 特点: – 所有类型的数据集中处理 – 不同模式和格式数据的正常化 – 自定义日志格式的迅速扩展 – 为自定义数据源轻松添加插件 logstash 安装 – Logstash 依赖 java 环境,需要安装 java-1.8.0- openjdk – Logstash 没有默认的配置文件,需要手动配置 – logstash 安装在 /opt/logstash 目录下 rpm -ivh logstash-2.3.4-1.noarch.rpm logstash 工作结构 – { 数据源 } ==> – input { } ==> – filter { } ==> – output { } ==> – { ES } input{}=收集数据 filter{}=整理数据 output{}=存放数据到哪儿 logstash 里面的类型 – 布尔值类型: ssl_enable => true – 字节类型: bytes => "1MiB" – 字符串类型: name => "xkops" – 数值类型: port => 22 – 数组: match => ["datetime","UNIX"] – 哈希: options => {k => "v",k2 => "v2"} – 编码解码: codec => "json" – 路径: file_path => "/tmp/filename" – 注释: # logstash 条件判断 – 等于: == – 不等于: != – 小于: < – 大于: > – 小于等于: <= – 大于等于: >= – 匹配正则: =~ – 不匹配正则: !~ – 包含: in – 不包含: not in – 与: and – 或: or – 非与: nand – 非或: xor – 复合表达式: () – 取反符合:!() cat <&0 >&1 从标准输入stdin(0)度入数据,在标准输出stdout(1)显示出来 rpm -ivh logstash-2.3.4-1.noarch.rpm 创建一个配置文件/etc/logstash/logstash.conf cd /etc/logstash vim logstash.conf input{ stdin{} } output{ stdout{} } /opt/logstash/bin/logstash -f logstash.conf 启动 logstash 插件 – 上页的配置文件使用了 logstash-input-stdin 和logstash-output-stdout 两个插件,logstash 还有filter 和 codec 等插件,查看插件的方式是/opt/logstash/bin/logstash-plugin list codec类插件 – 常用的插件:plain、json、json_lines、rubydebug、multiline等 – sincedb_path 记录读取文件的位置 – start_position 配置第一次读取文件从什么地方开始 vim /etc/logstash/logstash.conf input{ file{ #文件格式 start_position => "beginning" #删除sincedb_path路径从头读取数据 sincedb_path => "/var/lib/logstash/sincedb-access" #记录文件数据读到多少行,多少字节。 path => ["/tmp/a.log","/tmp/b.log"] #读取文件的路径 type => ‘filelog‘ #文件类型日志格式 } } filter{} output{ stdout{ codec => "rubydebug" } } vim /tmp/a.log aaaaaaaaaaaa vim /tmp/b.log bbbbbbbbbbbbbbb /opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动 tcp & udp 插件 vim /etc/logstash/logstash.conf input{ tcp{ host => "0.0.0.0" port => 8888 type => "tcplog" } udp{ host => "0.0.0.0" port => 9999 type => "udplog" } } filter{} output{ stdout{ codec => "rubydebug" } } /opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动 使用 shell 脚本,对 tcp 指定端口发送数据 function sendmsg(){ if (( $# == 4 )) && [ $1 == "tcp" -o $1 == "udp" ];then exec 9<>/dev/$1/$2/$3 echo "$4" >&9 exec 9<&- else echo "$0 (tcp|udp) ipaddr port msg" fi } – 发送 tcp 数据 – sendmsg tcp 192.168.4.10 8888 ‘tcp msg’ – 发送 udp 数据 – sendmsg udp 192.168.4.10 9999 ‘udp msg’ syslog 插件 input{ syslog{ host => "192.168.4.10" port => 514 type => "syslog" } } filter{} output{ stdout{ codec => "rubydebug" } } /opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动 – rsyslog.conf 配置向远程发送数据 local0.info @@192.168.4.10:514 – 写 syslog ,查看状态 logger -p local0.info -t testlogs ‘hello word‘ filter grok插件 – 解析各种非结构化的日志数据插件 – grok 使用正则表达式把飞结构化的数据结构化 – 在分组匹配,正则表达式需要根据具体数据结构编写 – 虽然编写困难,但适用性极广 – 几乎可以应用于各类数据 grok{match => [“message”,“%{IP:ip}, (?<key>reg)”]} grok 正则分组匹配 – 匹配 ip 时间戳 和 请求方法 "(?<ip>(\d+\.){3}\d+) \S+ \S+ (?<time>.*\])\s+\"(?<method>[A-Z]+)"] – 使用正则宏 %{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth} [%{HTTPDATE:timestamp}\] \"%{WORD:verb} – 最终版本 %{COMMONAPACHELOG} \"(?<referer>[^\"]+)\" \"(?<UA>[^\"]+)\" cat /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns (宏路径) input redis 插件 – 生产环境往往理由 redis 来做缓冲,这里给出配置 vim /etc/logstash/logstash.conf input{ redis{ host => ‘redis-server‘ port => ‘6379‘ data_type => ‘list‘ key => ‘lb‘ codec => ‘json‘ } filter{ grok{match => [“message”,"(?<ip>(\d+\.){3}\d+)"]} } output{ stdout{ codec => "rubydebug" } } /opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动 output ES 插件 – 调试成功后,把数据写入 ES 集群 vim /etc/logstash/logstash.conf input{ file{ start_position => "beginning" sincedb_path => "/var/lib/logstash/sincedb-access" path => ["/tmp/a.log"] type => ‘filelog‘ } file{ start_position => "beginning" sincedb_path => "/var/lib/logstash/sincedb-access" path => ["/tmp/.log"] type => ‘weblog‘ } } filter{ grok{match => [“message”,"(?<ip>(\d+\.){3}\d+)"]} } output{ if [type] == "filelog"{ elasticsearch { hosts => ["192.168.4.33:9200","192.168.4.12:9200"] #将数据存在elasticsearch集群上 index => "weblog" flush_size => 2000 idle_flush_time => 10 } } cp /etc/httpd/logs/error_log /tmp/a.txt /opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动 filebeat 安装与配置 – 使用 rpm 安装 filebeat rpm -ivh filebeat-1.2.3-x86_64.rpm – 修改配置文件 /etc/filebeat/filebeat.yml vim /etc/filebeat/filebeat.yml paths: - /root/logs.jsonl document_type: weblog ... ... paths: - /root/accounts.json document_type: account output: logstash: hosts: ["192.168.4.10:5044"] – 设置开机运行 systemctl enable filebeat – 开启服务 systemctl start filebeat input filebeats 插件 – 这个插件主要用来接收 beats 类软件发送过来的数据,由于 logstash 依赖 java 环境,而且占用资源非常大,我们往往不希望所有集群的机器都部署 java 环境安装logstash,而使用更轻量的 filebeat 替代。 vim /etc/logstash/logstash.conf input{ beats { port => 5044 codec => "json" } } filter{ grok{match => [“message”,"%{COMMONAPACHELOG}"]} } output{ elasticsearch { hosts => ["192.168.4.33:9200","192.168.4.12:9200"] index => "weblog" flush_size => 2000 idle_flush_time => 10 } } /opt/logstash/bin/logstash -f /etc/logstash/loglogstash.conf 启动

ELK的搭建

标签:file   position   多少   datetime   replica   云计算   快速   分布   数据集   

原文地址:http://blog.51cto.com/13399294/2160983

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!