ElasticSearch配置滚动更新

起因 最近Logstash经常打印如下日志内容,虽然只是INFO级别的错误但还是引起了我的注意,大概意思是ES的bulk thread pool大小为32已经满负荷,队列也满了,所以拒绝了Logstash的bulk请求 [2018-06-23T08:00:47,281][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 429 ({"type"=>"es_rejected_execution_exception", "reason"=>"rejected execution of org.elasticsearch.transport.TransportService$7@177d229b on EsThreadPoolExecutor[bulk, queue capacity = 1000, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@66a1a8c3[Running, pool size = 32, active threads = 32, queued tasks = 1019, completed tasks = 832616617]]"}) 解决思路 扩大处理bulk的thread pool线程数量 当前使用的服务器CPU核数为176(cat /proc/cpuinfo),而在ES源码中为了避免引起Java oom线程数会取min(32, 核数),所以造成默认的thread_pool.bulk.size为32,为了扩大线程容量需在ES中添加以下配置 processors: 96 thread_pool.bulk.size: 96 增加等待队列长度 thread_pool.bulk.queue_size: 3000 更新配置 这些配置不能通过ES Setting API来更改,只能通过滚动重启的方式,下面简单记录下过程 禁止分配分片 curl -X PUT "ES_HOST:9200/_cluster/settings" -H 'Content-Type: application/json' -d' { "transient": { "cluster.

阅读全文

ELK集群2.x到5.6升级记录

考虑到目前使用的ELK集群版本与开源版本的版本差距有点大,而ELK5.6相较2.3版本性能有较大提升,尤其是Logstash grok插件,最近对测试环境的两个ELK集群进行了升级,对升级过程进行一个记录;升级主要参考了官方文档 当前系统运行版本 filebeat:1.2.3 kibana:4.5.1 logstash:2.3.2 elasticsearch:2.3.3 JVM: 1.7 升级顺序 jvm(略) elasticsearch kibana logstash beats 升级Elasticsearch 升级之前 升级前使用Elasticsearch Migration Plugin查看潜在问题 最好先在测试环境升级ELK 在升级之前先备份数据 升级(跨大版本整个集群需重启) 禁止自动分配分片,在停止elasticsearch时减少不必要的I/O curl -XPUT 'localhost:9200/_cluster/settings?pretty' -H 'Content-Type: application/json' -d' { "persistent": { "cluster.routing.allocation.enable": "none" } }' 同步刷新以加快分片恢复 curl -XPOST 'localhost:9200/_flush/synced?pretty' 停止并升级各个节点(安装新的rpm或deb,更新配置文件,配置文件有较大改动) /etc/init.d/elasticsearch stop apt-get pruge elasticsearch(所有deb包已在本地apt源中,删除原配置文件) apt-get install elasticsearch=5.6.5 升级插件(需删除旧的插件) /usr/share/elasticsearch/bin/elasticsearch-plubin remove license /usr/share/elasticsearch/bin/elasticsearch-plubin remove marvel /usr/share/elasticsearch/bin/elasticsearch-plubin install x-pack 启动集群各个节点,保证所有节点均加入集群(优先启动master node)

阅读全文

ElasticSearch索引类型映射

最近接手维护了几个ELK集群,对接的是IaaS、PaaS服务日志,简单的ELK架构,通过filebeat采集日志,发送到logstash结构化日志然后发送到ElasticSearch,用户可以通过Kibana查看服务日志定位问题、做一些性能分析图表等,同时利用elastalert做日志报警。 在ElasticSearch须要对用户的索引建立合适的类型映射(尤其是int类型),才可以在kibana中对数据进行分析,关于ES的映射类型可以看这里,需指出的是一旦某个field字段类型确定就很难更改该字段的类型(需reindex)。 Logstash将非结构化数据转化为结构化数据,通过JSON将数据发送给ElasticSearch,所有字段都会被当作string来处理,而ElasticSearch在自动判断字段类型建立映射这方面做的不足,与我们需求不符,那么如何正确建立索引类型映射呢? 一、通过Logstash的grok、mutate确定字段类型 grok 根据grok官方文档,在grok正则表达式后可以添加一个数据类型,默认是string类型,如果你想使字段类型为int,你可以在表达式后加int,例如%{NUMBER:num:int},那么num字段会从string类型变为int类型,目前只支持int和float。 mutate 通过mutate可以将field转化为integer、float、string,例如: filter { mutate { convert => { "num" => "integer" } } } 二、ElasticSearch mapping template 映射(mappings)决定了一个字段(field)如何被ElasticSearch解释、存储,例如数据{“ip”:“223.5.5.5”}发送给ES,ES会将ip字段存储为string类型,而不是ip类型,不能做IP范围查询同时造成存储空间浪费、查询效率低等。**不管在Logstash如何转换类型,ElasticSearch不会知道你的用意除非你正确映射。**所有整型会存为long,小数会存为float或double,关于最小类型可以看这里,使用integer而不是long会有效的减少ELasticSearch负担。 映射模版 编写模版文件my_template.json { "index_patterns" : "index*", "version" : 1, "settings" : { "index.refresh_interval" : "5s" }, "mappings" : { "_default_" : { "properties":{ "host": { "type" : "string"}, "ip": {"type" : "ip"}, .... } } } } 上传template.

阅读全文

Logstash过滤插件grok正则解析

Logstash过滤插件grok正则解析 一、grok介绍 grok是Logstash中用来解析非结构化日志数据,将日志转化为可查询的结构化数据的最佳方法,可以用来处理syslog日志、apache等webserver日志、mysql日志以及用户自定义日志。 Logstash自带有120多种预定义好的正则表达式方便用户使用,你可以在这里查看这些正则表达式,你也可以添加自己的匹配规则。 有两个网站可以帮助我们来构建正则表达式去匹配我们的日志: http://grokdebug.herokuapp.com http://grokconstructor.appspot.com (推荐) 二、grok基础 grok匹配模式语法为:%{SYNTAX:SEMANTIC:TYPE} SYNTAX: 正则表达式、预定义的正则表达式名称 SEMANTIC: 标识符,标识匹配后的数据 TYPE: 可选的类型,目前支持int、float 例如:NUMBER可以匹配3.44,IP可以匹配:192.168.21.2 一个复杂的日志格式如下: 192.168.21.2 GET /index.html 15823 0.023 grok匹配模式可以为: ${IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} 更加实际的,该条日志可能来自一个文件: input { file { path => "/var/log/http.log" } } filter { grok { match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } } } 在grok过滤后,可以得到额外一下字段: client: 192.168.21.2 method: GET request: /index.html bytes: 15823 duration: 0.023 grok中的正则表达式 Grok采用了Oniguruma正则表达式库,在on the Oniguruma site看到支持的正则语法。

阅读全文

Ext2设计与实现(译)

Ext2设计与实现 1、介绍 Linux第一版只支持Minix文件系统,Minix文件系统有两大亟待解决的限制:块地址存储在16位整型,最大文件大小为64MB;另外目录和文件名长度最大支持14个字符。 我们设计与实现了两种新的文件系统:EXT 、 EXT2 在这篇论文中,我们将简述Linux文件系统的历史,简单介绍Unix文件系统的基础概念;介绍Linux VFS层的实现并详细介绍EXT2内核代码与用户工具;最后,是Linux、BSD下EXT2性能测试对比。 2、Linux文件系统历史(略) 3、文件系统概念 Linux文件系统的实现基于Unix操作系统通用概念:文件通过inodes来表示,目录是一种简单的文件包含许多列表项,设备是可以发起I/O请求的特殊文件。 3.1 Inode 每个文件都使用inode结构体来表示,每个inode包含了描述文件元数据:文件类型、访问权限、所有者、时间戳、大小、数据块指针。分配给文件的数据块地址存储在文件的inode节点中,当用户对文件发起I/O请求时,内核代码将当前文件偏移量转为块号,使用该数字作为块地址表的索引来读写物理块,如下图所示: 3.2 目录 目录按层次树结构组织,每一个目录可以包含文件和子目录。 目录实现为一种特殊的文件。事实上,目录是一种包含列表项的文件,每一项包含一个inode号和一个文件名,当一个进程使用一个路径名时,内核代码会搜索目录查找对应的inode号,在路径文件名被转换为inode号后,inode结构会被存储到内存中用以后序请求。目录如下图: 3.3 链接 Unix文件系统提出了链接的概念,若干个文件名可以关联到一个inode节点,inode节点包含一个存储链接数的域。增加一个链接会创建一个目录项并增加inode链接计数。当删除链接时,内核会递减链接计数,为0时删除inode。 这种类型的链接称为硬链接,只能在一个文件系统中使用,且不能链接到一个目录,避免引起环路。 另一种链接存在于大多数Unix系操作系统,符号链接:只包含文件名的简单文件,当内核inode转换时遇到符号链接,会将软链接文件内容替换链接名。因为软链接不包含inode,它可以跨文件系统,可以指向任何类型的文件,甚至不存在的文件。但软链接会占用磁盘空间、inode、在路径名到inode转换时引起额外消耗。 3.4 设备文件 在Unix系操作系统,设备被当作特殊文件访问。一个设备文件并不占用文件系统空间,只作为设备驱动访问接口。 有两类特殊文件:字符设备、块设备。主设备号决定类型,次设备号决定哪一个设备。 4 VFS VFS是一个文件系统抽象层,定义了一个文件系统应该实现的操作,对上层屏蔽了底层不同文件系统的实现,一图概之: 5 EXT2 5.1 起因 修复EXT文件系统问题,提供一个强大的文件系统,实现unix文件语义并提供高级特性 5.2 标准 ext2fs特性 支持标准Unix文件类型:普通文件、目录、设备文件、符号链接 支持最大4TB文件系统 长文件名:255字节,可扩展至1012 为root保留空间以便修复 5.3 高级 ext2fs特性 属性继承 软链接:目标名存储在inode中 创建文件系统时可选择逻辑块大小 fsck mount options Append-only files 5.4 物理结构 受BSD文件系统的影响,文件系统由块组构成,但块组并没有与磁盘的物理结构块绑定,因为现代驱动趋势是优化顺序访问和对操作系统隐藏物理结构。 文件系统物理结构: 每一个块组包含一份冗余的文件系统控制信息(超级块和文件系统描述信息),并包含一部分文件系统(块位图、inode位图、inode表、数据块): 使用block group提高系统可靠性,冗余超级块信息可以简化文件系统恢复;inode表与数据块一起存储提高寻道时间,提高性能。 在ext2fs中,目录使用链表管理变长目录项,每一项包含inode号、记录项长度、文件名和文件名长度。通过变长目录项可以实现长文件名同时减少磁盘空间浪费,目录项结构如下: 5.5 性能优化 预读:当读取一个块时,内核会请求连续的若干块,当读取下一个块时会从buffer cache读取 分配优化: 块组的inode、data分配会在当前组中以减少寻道时间 写时预分配 6 Ext2fs library (略) 译自:http://e2fsprogs.

阅读全文

springmvc实现导出数据excel

springmvc实现导出数据excel 最近在项目中要实现将数据导出为excel的功能,研究了下目前springmvc框架下excel导出的方式,在spring 4.3中使用AbstractXlsView来实现,AbstractExcelView已被弃用;但这里介绍的是直接用apache poi实现的一种方式。 model如下 package red.itech.blog.dao.model; import java.util.Date; /** * Created by you on 16/10/28. */ public class Blog { private String author; private Date createdAt; private String title; private long count; public Blog(){} public Blog(String author, Date createdAt, String title, long count){ this.author = author; this.count = count; this.createdAt = createdAt; this.title =title; } public void setAuthor(String author) { this.author = author; } public void setCreatedAt(Date createdAt) { this.

阅读全文

Spring+Mybatis+Velocity项目搭建

Spring+Mybatis+Velocity项目搭建 一、开发工具 JDK 1.8.0_91 Intellij IDEA 15.0.6 Mysql 5.5.44 Maven 3 二、新建工程 新建Maven工程,不选Create from archtype提供的工程模版,为了学习从头开始配置工程,点击next设置工程坐标,然后一路到finish。 <groupId>red.itech</groupId> <artifactId>blogDemo</artifactId> <version>1.0-SNAPSHOT</version> 如果使用git开发,可以新建.gitignore文件,使git忽略idea自动生成的文件(.ignore插件可以帮助生成.gitignore),项目git初始化 # Created by .ignore support plugin (hsz.mobi) .gitignore ### OSX template *.DS_Store # IntelliJ project files .idea *.iml out target gen### Java template *.class # Package Files # *.jar *.war *.ear ` 三、Spring MVC 编辑pom.xml添加Spring MVC、servlet依赖如下: <dependencies> <!-- spring --> <dependency> <groupId>org.

阅读全文

作者的图片

沉下心,多坚持

SRE

杭州