ELK日志系统安装和配置


1 Elasticsearch

1.1 部署方式

Elasticsearch为去中心化的分布式架构,由若干节点组成集群。节点中没有固定的主控角色,可以灵活伸缩规模。集群中每台服务器通常只需部署一个Elasticsearch节点,每个节点可以将本机的所有数据盘用于存储索引数据。

Elasticsearch的数据存储和分析基于Lucene,下面是Elasticsearch的一些基本概念:

  • 节点(Node) - 一个Elasticsearch运行的实例。
  • 集群(Cluster) - 具有同一集群名称的节点组成的分布式集群。
  • 索引(Index) - 一个日志记录的集合,类似数据库。须要注意的是索引的名称不能有大写字母。
  • 切片(Shard) - 每个索引的数据可以划分成若干切片,不同切片会被存储到不同的节点上以实现客户端读写条带化。
  • 副本(replica) - 切片的数据冗余,和切片主体的内容相同,保证数据安全和高可用。


1.2 安装

可以直接从官网下载页面下载软件包,然后直接解压到指定目录,即可完成的安装。也可以按照官网教程直接配置yum仓库进行安装和更新。

参考文档:

Setup

Repositories


1.3 主要配置

Elasticsearch的主要配置文件为"config/elasticsearch.yml",下表为一些常用的配置项目说明:

名称

类型

描述

cluster.name

string

集群名称,具有同一集群名称的Elasticsearch节点才能组成一个集群。

node.name

string

节点名称,每个节点必须在集群中有一个唯一的名称以便识别。

index.number_of_shards

int

每个索引数据的默认切片数量,这个值的修改不会影响已创建的索引。默认为5。

index.number_of_replicas

int

每个索引切片默认的副本数量。默认为1。

path.data

string

存储索引数据的目录路径列表,路径之间使用逗号分隔。例如:/data1,/data2,/data3

network.bind_host

string

服务要监听的IP地址。默认为本机所有IP地址。

network.publish_host

string

在集群中公开的IP地址。默认为本机主机名对应的IP地址。如果使用默认值,则需要编辑"/etc/hosts"文件,让Elasticsearch能够解析本机的主机名。

transport.tcp.port

int

供其它节点通讯连接的TCP端口。默认为9300。

http.port

int

供客户端使用的RESTFul API的HTTP端口。默认为9200。


1.4 运行

如果是使用yum安装,系统中已经配置好elasticsearch服务,可按照常规服务的方式进行启动和停止。如果是解压软件包安装,则执行安装目录下的"bin/elasticsearch -d"直接以后台方式运行节点,使用kill停止节点。


1.5 安装插件

kopf插件提供了完善的集群管理功能,使管理员能够使用图形化的方式查看和管理集群中的节点和各种状态数据。在Elasticsearch的目录 下运行"bin/plugin -install lmenezes/elasticsearch-kopf"安装kopf插件,在浏览器的地址栏输入"http://{ip}:{http port}/_plugin/kopf/"即可打开kopf插件的web页面。

文件:ELK-kopf插件.jpg

bigdesk插件能够对机群的各种能够性能数据进行监控。在Elasticsearch的目录下运行"bin/plugin -install lukas-vlcek/bigdesk/2.5.0"安装bigdesk插件,在浏览器的地址栏输入"http://{ip}:{http port}/_plugin/bigdesk/"即可打开bigdesk插件的web页面。

文件:ELK-bigdesk插件.jpg

参考文档:

Plugins


1.6 索引模板

索引模板可以给索引预先设置一些的属性和参数,当一个要创建的索引与模板匹配时,可以直接把模板上的设置应用到索引上,这一特性在须要给不同索引进行区别配置时非常有用。

操作索引模板的RESTFul API为"/_template/{name}",可以向集群中任意一个Elasticsearch服务端节点访问该API接口,"name"表示要操作 的索引模板名称。PUT方法用于设置索引模板内容,GET方法用于获取索引模板内容,DELETE方法用于删除索引模板,HEAD方法用于测试索引模板是 否存在。

索引模板的内容为JSON格式,主要项目如下:

{
	"template": "mysql*", // 匹配的索引名称,可以使用通配符
	"order": 0, // 在多模板匹配时的生效顺序,0表示最优先
	"settings": { // 用于设置索引的一些参数
		"number_of_shards": 1 // 切片数量
	}
	"mappings": { // 用于设置索引的字段
		"_default_": { // 用于所有索引类型的字段设置
			"_source": { // "source"字段的设置
				"enabled": true, // 是否启用
				"compress": true // 是否压缩数据
			},
		},
		"logs": { // 用于"logs"类型的索引的字段设置
			"_source": {
				"compress": false
			},
			"_ttl": { // 自动删除设置
				"default": "90d", // 保留的天数
				"enabled": true // 是否启用自动删除(默认为false)
			},
			"properties": // 其它字段设置
			{
				"message": { // 字段名
					"type": "string" // 数据类型
				},
				"@timestamp": {
					"format": "dateOptionalTime",
					"type": "date"
				},
				"host": {
					"type": "string",
					"index": "not_analyzed" // 表示这个字段的值不进行分词处理(可以加快存储的速度并且数据可用于分组统计)
				},
				"port": {
					"type": "long"
				},
				"request_time": {
					"type": "double"
				}
			}
		}
	},
}

当一个索引匹配多个模板时,如果模板之间的某项设置发生冲突,则以生效顺序最优先的模板为准。

参考文档:

Index Templates

Mapping

Types

1.7 集群动态配置

除了启动时加载配置文件外,Elasticsearch支持在运行时对集群的一些参数进行动态配置。进行集群动态配置的RESTFul API为"/_cluster/settings",可以向集群中任意一个Elasticsearch服务端节点访问该API接口。PUT方法用于设置配 置,GET方法用于获取配置。

配置的内容为如下JSON格式:

{
          "persistent": { // 永久生效的配置项
                   "item1": "value1",
                   "item2": "value2",
                   ...
          },
          "transient": { // 临时生效的配置项,在集群中所有节点停止或重启后将失效
                   "item1": "value1",
                   "item2": "value2",
                   ...
          }
}

下表为一些常用的集群动态配置项目说明:

名称

类型

描述

cluster.routing.allocation.enable

string

制定在集群中的索引分配模式,all表示进行任何有必要的索引存储位置调整;primaries表示只针对索引主体进行调整,不对副本调整;none表示不会进行任何索引存储位置的调整。默认为all。

cluster.routing.allocation.cluster_concurrent_rebalance

int

在集群中可以同时进行的索引重新分配任务数,如果这个值为0,在增加新节点后已有索引将不会重新调整存储的位置。默认为2。

cluster.routing.allocation.node_concurrent_recoveries

int

在集群中可以同时进行的索引数据恢复任务数,如果这个值为0,在一个节点离线后它原有的索引副本将不会重新分配到其它节点上。默认为2。

indices.recovery.max_bytes_per_sec

string

在进行索引恢复时每秒传输的字节数。默认为40MB。

cluster.blocks.read_only

bool

集群中的所有数据是否为只读状态。默认为false。

例如要暂时禁止客户端向集群中写入数据:

curl -XPUT 'http://127.0.0.1:9200/_cluster/settings' -d '{
          "transient": {
                   "cluster.blocks.read_only": true
          }
}'


参考文档:

Cluster Update Settings

1.8 索引动态配置

通过RESTFul API接口"/_cluster/{index/}settings"在运行时对索引的一些参数进行动态配置,其中"index"表示要配置的索引名称, 如果不指定则表示配置所有索引。可以向集群中任意一个Elasticsearch服务端节点访问该API接口。PUT方法用于设置配置,GET方法用于获 取配置。

配置的内容为如下JSON格式:

{
          "index": {
                   "item1": "value1",
                   "item2": "value2",
                   ...
          }

}

下表为一些常用的索引动态配置项目说明:

名称

类型

描述

number_of_replicas

int

每个索引切片的副本数量。

index.blocks.read_only

bool

索引是否为只读状态。

参考文档:

Update Indices Settings


1.9 注意事项

在一个Elasticsearch节点离线时,集群会立即启动数据恢复操作,把副本复制到其它节点上。这一特性在临时停止一个节点进行相关维护时非常不利,因为节点会在一段时间后再次启动,并不须要进行数据恢复,无谓的数据恢复会导致集群的IO资源白白被占用。

要避免数据恢复,可以在节点停止前先通过集群动态配置RESTFul API接口设置" cluster.routing.allocation.node_concurrent_recoveries "为0,等节点启动后,再设置" cluster.routing.allocation.node_concurrent_recoveries "为原来的值即可。


2 Logstash

2.1 部署方式

每台服务器上通常只须部署一个Logstash实例,用于采集服务器上各种服务产生的日志并发送到Elasticsearch集群。


2.2 安装

官网下载页面下载Logstash的软件包,直接解压到指定目录,即可完成安装。

参考文档:

Getting Started with Logstash


2.3 主要配置

Logstash的配置文件语法类似json。

主要的配置文件格式参考:

input
{
	# 从文件输入
	file
	{
		# 要采集的日志文件路径,可以使用通配符
		path => "/var/log/mysql/*.error.log"
		# 通过自定义字段来指定Elasticsearch的索引
		add_field => { "@__index_name" => "mysql_error" }
	}

	# 从文件输入
	file
	{
		# 指定多个日志文件路径
		path => ["/var/log/mysql1/*.slow.log","/var/log/mysql2/*.slow.log"]
		# 通过自定义字段来指定Elasticsearch的索引
		add_field => { "@__index_name" => "mysql_slow" }
		# 多行编码器,用于将多行日志内容合并为一条记录
		# 下面配置表示将开头不包含"# User"字样的行都与之前包含"^# User"字样的行合并
		# 匹配的日志内容样例:
		# # User foo
		# # Time 1s
		# select * from table1
		#     where field1=1;
		codec => multiline
		{
			# 要匹配的字符串模型
			pattern => "^# User"
			# true表示选中不匹配pattern的行进行操作,false表示选中匹配pattern的行进行操作,这个字段默认为false
			negate => true
			# previous表示选中的行向之前的行合并,next表示选中的行向之后的行合并
			what => previous
		}		
	}
}

# 过滤器配置,用于在输出前进行一些数据处理
# 每个过滤器都可以指定add_field、add_tag、remove_field、remove_tag属性来对字段和标记进行添加删除
filter
{
	# 按照csv文件格式过滤内容,通常用于按照固定分隔符来提取字段
	csv
	{
		# 在日志内容中用于分隔字段的分隔符,默认为","
		separator => " "
		# 指定各字段的名称,如果不指定则默认为column1 column2 ...
		# 下面语法将按照空格来分隔字段,并且把前三个字段命名为"col1"、"col2"和"col3"
		# 匹配的日志内容样例:"debug 10.1.1.1 /primary/second?param=foo"
		columns => ["col1","col2","col3"]
	}
	
	# 按照grok规则过滤结构化内容,通常用于按照正则表达式来提取字段
	grok
	{
		# 指定字段匹配的规则
		# 下面语法将按照单词、IP地址、URI、整数、浮点数和字符串来匹配6个字段
		# 匹配的日志内容样例:"debug 10.1.1.1 /primary/second?param=foo 777 1.5 hellow world"
		match => { "message" => "%{WORD:col_str} %{IP:col_ip} %{URIPATHPARAM:col_uri} %{NUMBER:col_num:int} %{NUMBER:col_float:float} %{GREEDYDATA:col_text}" } }
	}
	
	# 使用Ruby脚本处理数据
	ruby
	{
		# 要执行的代码,event对象表示当前处理的文档记录
		# 下面的语法将创建一个字段"f3",它的值是字段"f1"加上字段"f2"的结果
		code => "event['f3'] = event['f1'] + event['f2']"
	}
	
	# 过滤存放日期时间内容的字段为时间戳类型
	date
	{
		# 用于存放过滤结果的字段名,默认为"@timestamp"
		target => "my_timestamp"
		# 要过滤的字段以及其日期格式(可匹配多个格式)
		# 下面语法将匹配的内容:"2000-09-01 02:03:04" or "9/Sep/15 02:03:04"
		match => [ "datetime", "yyyy-M-d H:m:s", "d/MMM/yy H:m:s" ]
	}
	
	# 进行一些字段的常规数据处理
	mutate
	{
		# 对字段进行类型转换
		# 目前支持的类型:integer, float, string, boolean
		convert => { "field1" => "integer" }
		# 使用正则表达式对字符串字段的内容进行替换
		# 数组中的每3个元素表示一组"字段名,原值,新值"
		gsub => [ "field1", "[0-9]+", "number", "field2", "s", "x" ]
		# 把字符串字段内容中的大写字母替换为小写字母
		lowercase => [ "field1", "field2" ]
		# 将两个字段的内容生成为数组并存放到第一个字段中
		merge => { "field1" => "field2" }
		# 给字段改名
		rename => { "field1" => "field2" }
		# 给字段指定新的值
		replace => { "field1" => "new value" }
		# 根据指定的分隔符把字符串字段拆分为数组
		split => { "field1" => "," }
		# 给字符串字段的内容去除头尾空格
		strip => [ "field1", "field2" ]
		# 更新一个已存在字段的内容
		update => { "field1" => "new value" }
		# 把字符串字段内容中的小写字母替换为大写字母
		uppercase => [ "field1", "field2" ]
	}
}

# 输出配置
output
{
	# 输出到Elasticsearch
	elasticsearch
	{
		# 使用的索引名称,不能有大写字母
		# 下面语法将字段"@__index_name"加上"当前日期"组成可变的索引名称
		index => "%{@__index_name}-%{+YYYY.MM.dd}"
		# 要连接的Elasticsearch集群名称
		cluster => "sdp-elk"
		# Logstash实例在Elasticsearch集群中的节点名称
		node_name => "mysql-host1"
		# 加入集群时可连接的Elasticsearch服务器IP地址列表
		# 如果客户端和服务器在同一子网内,没有网关隔离,可以不设置此项
		# Logstash 1.5.0在打开调试日志后必须设置此项
		host => ["10.1.1.1:9300","10.1.1.2:9300"]
		# 进行网络通讯时要绑定的本机IP地址
		bind_host => "10.1.1.100"
		# 进行网络通讯时要绑定的本机TCP端口
		bind_port => 9300
	}
}


参考文档:

Configuring Logstash

Input plugins - file

Codec plugins - multiline

Output plugins - elasticsearch

Filter plugins

Filter plugins - csv

Filter plugins - grok

logstash-patterns-core - patterns

Filter plugins - ruby

Filter plugins - date

Filter plugins - mutate

2.4 运行

在安装目录中执行"bin/logstash -f {conf_file} -l {log_file} &"直接以后台方式运行Logstash实例,使用kill停止。

主要命令行参数说明:

-f, --config CONFIGFILE

  配置文件的路径,可以使用通配符来表示多个文件,也可以是一个存放配置文件目录路径。这个参数没有默认值。

-l, --log FILE

  日志文件的路径。日志默认输出到控制台。

--debug

  开启调试日志。


参考文档:

Command-line flags


3 Kibana

3.1 部署方式

Kibana是一个图形化的Elasticsearch客户端,提供了丰富的数据查询和统计功能。由于Kibana的自身数据也存储于 Elasticsearch集群中,所以每个实例都是轻量级和无状态的。一个Kibana实例可以和Elasticsearch节点部署在同一服务器上, 通常在Elasticsearch集群中任选2台服务器部署即可实现主备模式的高可用访问。


3.2 安装

官网下载页面下载Kibana的软件包,直接解压到指定目录,即可完成的安装。

参考文档:

Getting Kibana Up and Running


3.3 主要配置

Kibana配置文件为安装目录下的"conf/kibana.yml"。,下表为一些常用的配置项目说明。

选项名

类型

描述

port

int

服务的HTTP端口。默认为5601。

host

string

服务要监听的IP地址。默认为本机所有IP地址。

elasticsearch_url

string

Elasticsearch的RESTFul API地址。默认为本机地址。

kibana_index

string

在Elasticsearch集群中存储自身数据的索引名。默认为".kibana"。

pid_file

string

存放Kibana进程ID的文件路径。默认为空表示不保存进程ID。

log_file

string

存放Kibana日志的文件路径。默认为空表示不保存日志。

3.4 运行

在安装目录中执行"bin/kibana >> {log_file} &"直接以后台方式运行Kibana实例,使用kill停止。

在浏览器的地址栏输入"http://{ip}:{http port}"即可打开Kibana的页面。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM