热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

日志分析,日志分析工具

作者简介GavinZhu,携程软件技术专家,负责监控系统运维开发、ES系统运维及Clickhouse技术应用推广及运维工作。ElasticSearch是一种基于Lucene的分布

作者简介

 

Gavin Zhu,携程软件技术专家,负责监控系统运维开发、ES系统运维及Clickhouse技术应用推广及运维工作。

ElasticSearch是一种基于Lucene的分布式全文搜索引擎,携程用ES处理日志,目前服务器规模500+,日均日志接入量大约200TB。随着日志量不断增加,一些问题逐渐暴露出来:一方面ES服务器越来越多,投入的成本越来越高;另一方面用户的满意度不高,日志写入延迟、查询慢甚至查不出来的问题一直困扰着用户;而从运维人员的角度看,ES的运维成本较高,运维的压力越来越大。

一、为什么选择ClickHouse

ClickHouse是一款高性能列式分布式数据库管理系统,我们对ClickHouse进行了测试,发现有下列优势:

ClickHouse写入吞吐量大,单服务器日志写入量在50MB到200MB/s,每秒写入超过60w记录数,是ES的5倍以上。在ES中比较常见的写Rejected导致数据丢失、写入延迟等问题,在ClickHouse中不容易发生。

查询速度快,官方宣称数据在pagecache中,单服务器查询速率大约在2-30GB/s;没在pagecache的情况下,查询速度取决于磁盘的读取速率和数据的压缩率。经测试ClickHouse的查询速度比ES快5-30倍以上。

ClickHouse比ES服务器成本更低。一方面ClickHouse的数据压缩比比ES高,相同数据占用的磁盘空间只有ES的1/3到1/30,节省了磁盘空间的同时,也能有效的减少磁盘IO,这也是ClickHouse查询效率更高的原因之一;另一方面ClickHouse比ES占用更少的内存,消耗更少的CPU资源。我们预估用ClickHouse处理日志可以将服务器成本降低一半。

相比ES,ClickHouse稳定性更高,运维成本更低。ES中不同的Group负载不均衡,有的Group负载高,会导致写Rejected等问题,需要人工迁移索引;在ClickHouse中通过集群和Shard策略,采用轮询写的方法,可以让数据比较均衡的分布到所有节点。ES中一个大查询可能导致OOM的问题;ClickHouse通过预设的查询限制,会查询失败,不影响整体的稳定性。ES需要进行冷热数据分离,每天200T的数据搬迁,稍有不慎就会导致搬迁过程发生问题,一旦搬迁失败,热节点可能很快就会被撑爆,导致一大堆人工维护恢复的工作;ClickHouse按天分partition,一般不需要考虑冷热分离,特殊场景用户确实需要冷热分离的,数据量也会小很多,ClickHouse自带的冷热分离机制就可以很好的解决。

ClickHouse采用SQL语法,比ES的DSL更加简单,学习成本更低。

 

结合携程的日志分析场景,日志进入ES前已经格式化成JSON,同一类日志有统一的Schema,符合ClickHouse Table的模式;日志查询的时候,一般按照某一维度统计数量、总量、均值等,符合ClickHouse面向列式存储的使用场景。

偶尔有少量的场景需要对字符串进行模糊查询,也是先经过一些条件过滤掉大量数据后,再对少量数据进行模糊匹配,ClickHouse也能很好的胜任。另外我们发现90%以上的日志没有使用ES的全文索引特性,因此我们决定尝试用ClickHouse来处理日志。

二、用ClickHouse处理日志

2.1 ClickHouse高可用部署方案 2.1.1 容灾部署与集群规划

我们采用多Shards、2 Replicas的方式,通过Zookeeper进行服务器间互相备份,允许一个shard一台服务器down机数据不丢失。为了接入不同规模的日志,我们将集群分成6台、20台两种规模的多个集群。

2.1.2 跨IDC部署

借助于ClickHouse分布式表的特性,我们实现了跨集群搜索。携程有多个IDC,日志分布在不同的IDC,为了避免跨IDC搬迁日志,我们在每个IDC都部署一套ClickHouse,然后配置ClickHouse的跨IDC的Cluster,创建分布式表,实现跨多个IDC数据搜索,如下图所示:

 

2.1.3 几个重要的参数说明

max_threads:32  # 用于控制一个用户的查询线程数
max_memory_usage:10000000000  #单个查询最多能够使用内存大小9.31G

max_execution_time:30  #单个查询最大执行时间

skip_unavailable_shards:1  # 在通过分布式表查询的时候,当某一个shard无法访问时,其他shard的数据仍然可以查询

 

2.1.4 踩过的坑

我们之前将Cluster的配置放在config.d的目录下,当ClickHouse意外重启后,发现查询分布式表时部分shard访问不到的问题,因此我们现在不再使用config.d配置方式,Cluster配置放在metrika.xml中。

 

2.2 消费数据到ClickHouse

我们使用gohangout消费数据到ClickHouse,关于数据写入的几点建议:

1)采用轮询的方式写ClickHouse集群的所有服务器,保证数据基本均匀分布。

2)大批次低频率的写入,减少parts数量,减少服务器merge,避免Too many parts异常。通过两个阈值控制数据的写入量和频次,超过10w记录写一次或者30s写一次。

3)写本地表,不要写分布式表,因为分布式表接收到数据后会将数据拆分成多个parts,并转发数据到其它服务器,会引起服务器间网络流量增加、服务器merge的工作量增加,导致写入速度变慢,并且增加了Too many parts的可能性。

4)建表时考虑partition的设置,之前遇到过有人将partition设置为timestamp,导致插入数据一直报Too many parts的异常。我们一般按天分partition。

5)主键和索引的设置、数据的乱序等也会导致写入变慢。


2.3 数据展示

我们调研了像Supperset、Metabase、Grafana等几个工具,最终还是决定采用在Kibana3上开发支持ClickHouse实现图表展示。主要原因是Kibana3这种强大的数据过滤功能,很多系统都不具备,另外也考虑到迁移到其他系统成本较高,用户短期内难以适应。

目前K3上几种常用的图表(terms、histogram、percentiles、ranges、table),我们都开发了对应的ClickHouse版本,用户体验与原版基本保持一直,查询效率经过优化大幅提升。

2.4 查询优化

Kibana中的Table Panel用于显示日志的明细数据,一般查询最近1小时所有字段的数据,最终只展示前500条记录。这种场景对于ClickHouse来说非常不友好。

针对这个问题,我们将table Panel的查询分两次进行:第一次查询单位时间间隔的数据量,根据最终显示的数据量计算出合理查询的时间范围;第二次根据修正后的时间范围,结合Table Panel中配置的默认显示的Column查询明细数据。

经过这些优化,查询的时间可以缩短到原来的1/60,查询的列可以减少50%,最终查询数据量减少到原来的1/120;ClickHouse提供了多种近似计算的方法,用于提供相对较高准确性的同时减少计算量;使用MATERIALIZED VIEW或者MATERIALIZED COLUMN将计算量放在平常完成,也能有效降低查询的数据量和计算量。

2.5 Dashboard迁移

因为Kibana3上的Dashboard很多,我们开发了一个Dashboard迁移工具,通过修改kibana-init-*索引中Dashboard的配置来进行Dashboard迁移

 

三、接入ClickHouse的效果

目前我们一个集群的日志量100T左右(压缩前600T左右),ClickHouse服务器主要监控指标如下:

 

ClickHouse相对ES占用更少的内存。ES为了提高查询效率会将很多数据放在内存中,如:segment的索引数据、filter cache、field data cache、indexing buffer等;ES内存的使用量与索引量、数据量、写入量、查询量等成正比。删除(下线)索引、迁移索引或者扩容是应对ES内存问题的常用手段。但是删除(下线)索引导致用户希望保存更长时间数据的需求无法满足,而服务器扩容导致又了成本上升。

ClickHouse的内存消耗主要包括内存型的engine,数据索引,加载到内存中待计算的数据,搜索的结果等。在ClickHouse中日志的数据量和保存时间主要和磁盘有关。

相比ES,ClickHouse后至少可以节省60%的磁盘空间。如下图所示,Netflow 的日志占用的磁盘空间ClickHouse是ES的32%,CDN日志占用磁盘空间ClickHouse是ES的18%,Dblog的日志ClickHouse是ES的22.5%。

 

比较查询速度提升,ClickHouse比ES提升了4.4倍到38倍不等,原来ES上查询不出来的问题基本得到了解决,查询慢的问题有了很大的提升。

Netflow由于数据量非常大,导致ES无法查询,ClickHouse中经过优化,查询耗时29.5s,CDN的查询CK和ES快38倍,dbLog的查询CK比ES快 4.4倍;关于查询速度的对比,因为在生产环境,无法保证ES和ClickHouse的环境一样,ES使用的是40核256G的服务器,一台服务器部署一个ES实例,单服务器数据量3T左右。ClickHouse采用的是32核128G的服务器,单服务器数据量大约18T左右,一台服务器部署一个ClickHouse实例。

 

 

用ClickHouse处理日志查询速度得到了很大的提升,基本解决了数据保存时间短的问题,用户使用体验也得到了提升。我们预估使用现在ES日志集群50%的服务器资源就能就能够完成现有ES日志的处理,并能提供比现在更好的用户体验。

四、ClickHouse基本运维

总体来说ClickHouse的运维比ES简单,主要包括以下几个方面的工作:

1)新日志的接入、性能优化;

2)过期日志的清理,我们通过一个定时任务每天删除过期日志的partition;

3)ClickHouse的监控,使用ClickHouse-exporter+VictoriaMetrics+Grafana的实现;

4)数据迁移,通过ClickHouse分布式表的特性我们一般不搬迁历史数据,只要将新的数据接入新集群,然后通过分布式表跨集群查询。随着时间的推移,历史数据会被清理下线,当老集群数据全部下线后,新老集群的迁移就完成了。确实需要迁移数据时,采用ClickHouse_copier或者复制数据的方式实现。

5)常见问题处理:

慢查询,通过kill query终止慢查询的执行,并通过前面提到的优化方案进行优化

Too many parts异常:Too many parts异常是由于写入的part过多part的merge速度跟不上产生的速度,导致part过多的原因主要包括几个方面:

a. 设置不合理

b. 小批量、高频次写ClickHouse

c. 写的是ClickHouse的分布式表

d. ClickHouse设置的merge线程数太少了

无法启动:之前遇到过ClickHouse无法启动的问题,主要包括两个方面:

a. 文件系统损坏,通过修复文件系统可以解决

b. 某一个表的数据异常导致ClickHouse加载失败,可以删除异常数据后启动,也可以把异常的文件搬到detached目录,等ClickHouse起来后再attach文件恢复数据

五、总结

将日志从ES迁移到ClickHouse可以节省更多的服务器资源,总体运维成本更低,而且提升了查询速度,特别是当用户在紧急排障的时候,这种查询速度的成倍提升,对用户的使用体验有明显的改善。

我们将继续致力于将ES的日志迁移到ClickHouse,并优化日志查询性能,让ClickHouse在日志分析领域为用户提供更大的价值。

但是ClickHouse毕竟不是ES,在很多业务场景中ES仍然不可替代;ClickHouse也不仅只能处理日志,进一步深入研究ClickHouse,让ClickHouse在更多领域发挥更大的价值,是我们一直努力的方向。  

【推荐阅读】

携程一次Dubbo连接超时问题的排查携程容器偶发性超时问题案例分析携程云原生基础设施演进之路
《携程技术2019年度合辑》,送给爱学习的你

 “携程技术”公众号

  分享,交流,成长


推荐阅读
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
  • 像跟踪分布式服务调用那样跟踪Go函数调用链 | Gopher Daily (2020.12.07) ʕ◔ϖ◔ʔ
    每日一谚:“Acacheisjustamemoryleakyouhaven’tmetyet.”—Mr.RogersGo技术专栏“改善Go语⾔编程质量的50个有效实践” ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • Windows简单部署Exceptionless
    部署准备Elasticsearch、Exceptionless.API、Exceptionless.UI、URLRewrite、.NET运行时 1、安装ElasticSearch1 ... [详细]
author-avatar
新闻联播有没有大结局__742
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有