去哪儿网MySQL日志分析实践,80%数据丢失都给你救回来( 四 )

 
4)扩展性分析
 
由于 SnifferServer 是偏计算类型的服务,并且从 Kafka 到 SnifferServer 到 Clickhouse,需要大量的数据传输,需要较好的 cpu 和网卡才可以充分发挥 SnifferServer 的性能;
 
① SnifferServer 内部扩展性
 
SnifferServer 的每个模块都可以通过设置线程数和缓存大小提高性能;
 
② SnifferServer 级别的扩展性
 
对于单个队列,受限于 Kafka 的 partition 数量,最多有于 partition 数量相等的 SnifferServer 运行,超过 partition 数量时节点不再参与队列消费;
 
③ Kafka 的 Partition
 
单个 Kafka 集群的 partition 理论上没有限制,受限于服务器资源、Zookeeper 和运维的方便性等,需要设置上限;
 
④ 整个服务
 
可以规划针对不同的 IDC,向不同的 Kafka 写入日志数据,这样日志数据将被分区;
 
5)可用性分析
 
SnifferServer 之间通过 consumerGroup 消费 Kafka 队列中的数据 。对于单个队列通过冗余 SnifferServer,即使单个 SnifferServer 挂掉,不会影响整体服务 。
 
5、SnifferAnalyze
 
1)说明
 
按照天级别定时从 Clickhouse 中获取聚合数据,分析、汇总,存储分析之后的结果并提供接口和页面展示结果 。
 
2)设计
 
分析汇总之后的结果大概分为两类数据,第一类是初步聚合的粗粒度数据,数据量比较大 。数据一旦产生不会修改,只有大范围的删除,一般是溯源、分析、下钻查询使用,使用的频率不是很高;第二类是汇总的报告数据 。部分数据会存在大范围的修改,较多的并发查询 。整体数据量相对于第一类数据量较少,一般是展示结果、接口查询较多;
 
Clickhouse 在大规模存储上的单表查询和写入效率较高,压缩效率较高但不擅长做并发查询和频繁的修改数据,官网建议每秒最多查询 100 次 。相比较而言,MySQL 适合存储小体量数据,以及数据的增删改查,并擅长高并发查询 。
 
综合考虑节省存储成本以及各个存储的特性,第一类数据适合存储到 Clickhouse 中,第二类数据适合存储到 MySQL 中 。针对原始日志数据设置合适的过期时间,超过指定时间的数据都予以删除,而汇总数据相较于原始数据量已经大幅度减少,可以保留较长的过期时间 。
 
依托 Clickhouse 的分析能力,对于第一类数据直接将 Clickhouse 中的数据分析出来直接写入到 Clickhouse 中,避免中间转储 。第二类数据需要从 Clickhouse 中获取出来,分析、计算、汇总之后再写入到 MySQL 中 。
 
每个任务执行前都需要获取锁,只有成功获取到锁的任务才可以执行该任务 。SnifferAnalyze 多个节点在执行任务前会通过抢占的方式获取任务锁,仅当成功获取了锁的节点会执行任务,保证了单个节点挂掉不影响分析任务的执行 。但是如果任务执行过成中被终端,目前需要人为介入处理 。
 
3)扩展性分析
 
目前分析类型的任务节点扩展能力有限 。
 
4)可用性分析
 
由于分析类型的任务扩展能力有限,故只能在节点之间保证高可用 。并且一旦任务执行中断需要人为介入处理 。
 
6、Clickhouse
 
1)说明
 
Clickhouse 架构图

去哪儿网MySQL日志分析实践,80%数据丢失都给你救回来

文章插图
 
例如图示 Clickhouse 有两个分片(A 和 B),每个分片有两个副本([A1,A2],[B1,B2]),集群与三节点的 Zookeeper 通讯 。
 
① 同步
 
Clickhouse 集群 Replication 引擎的副本是通过 Zookeeper 实现的,Zookeeper 存储数据块的元数据信息 。分片 A 有 A1 和 A2 两个节点,A1 和 A2 共同监听 Zookeeper 执行目录下节点的数据 。当 A1 节点写入数据块之后,A1 在 Zookeeper 上变更元数据信息 。A2 收到 Zookeeper 的元数据变更之后,向 A1 发起拉取指定数据块的通知,A1 将指定的数据块发送给 A2,完成数据传输 。同理 A2 也可以写入数据,通知 Zookeeper 变更数据,并向 A1 传输数据 。数据同步是异步的,传输数据块时会去重 。更多副本相关的信息请见官网说明 。
 
② 分片
 
分片依靠 Distribute 引擎实现 。Distribute 引擎不存储任何数据,Clickhouse 有 Distribute 引擎支持将数据按照指定的规则(random,hash,range,自定义)将数据分发到各个分片 。


推荐阅读