通过shell和redis来实现集群业务中日志的实时收集分析

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
日志服务 SLS,月写入数据量 50GB 1个月
简介:

 

在统计项目中,最难实施的就是日志数据的收集。日志分布在全国各个机房,而且数据量比较大,像rsync+inotify这种方式显然不能满足快速日志同步的要求。 当然大家也可以用fluentd和flume采集日志数据,除了这个我们也可以自己写一套简单的。

 

我写的这个日志分析系统 流程是:


 
 
  1. 1   在客户端收集数据,然后通过redis pub方式把数据发给服务端 
  2.  
  3. 2   服务器端是redis的sub    他会把数据统一存放在一个文件,或者当前就过滤出来 

 

客户端收集日志的更新数据


 
 
  1. #!/bin/bash 
  2.  
  3. DATE=`date +%s` 
  4. LOGFILE=$1 
  5. if [ ! -f $1 ];then 
  6.  echo "LOG file did not give or it's not a file" 
  7. fi 
  8. sleep_time="2" 
  9.  
  10. count_init=`wc -l ${LOGFILE}|awk '{print $1}'
  11. while true 
  12. do 
  13. DATE_NEW=`date +%s` 
  14. #    DATE=$(date +%s) 
  15.     count_new=`wc -l ${LOGFILE}|awk '{print $1}'
  16.     add_count=$((${count_new} - ${count_init})) 
  17.     count_init=${count_new} 
  18.         if [ ! -n "${add_count}" ] 
  19.         then 
  20.             add_count=0 
  21.         fi 
  22.      QPS=$((${add_count}/${sleep_time})) 
  23.      info=`tail -n ${add_count} ${LOGFILE}`     
  24.      echo $info      
  25. #    我们可以把info这个值传出去 
  26.      echo " Then QPS at `date -d "1970-01-01 UTC ${DATE_NEW} seconds" +"%Y-%m-%d %H:%M:%S"` is "${QPS} 
  27. #    echo " DATE_NEW: " $DATE_NEW " DATE_PLUS :" $DATE_PLUS 
  28. sleep $sleep_time 
  29. done 

 

把实时的日志也打印出来

 

想传到服务端,我们只需要在脚本里面加下面这命令就ok了~ 

/root/redis-bash-cli -h 10.10.10.61 PUBLISH rui "$info"

 

redis-bash-cli  这个是客户端的脚本,可以把数据publish过去


 
 
  1. #!/bin/bash   
  2. source /usr/share/redis-bash/redis-bash-lib 2> /dev/null  
  3. if [ $? -ne 0 ]; then  
  4.   LIBFOLDER=${0%/${0##*/}}  
  5.   source ${LIBFOLDER}/redis-bash-lib 2> /dev/null  
  6.   if [ $? -ne 0 ]; then  
  7.     echo "can't find redis-bash-lib in /usr/share/redis-bash or ${LIBFOLDER}"  
  8.     exit 127   
  9.   fi  
  10. fi  
  11. REDISHOST=localhost  
  12. REDISPORT=6379  
  13. REPEAT=1  
  14. DELAY=0  
  15. while getopts ":h:n:p:r:a:i:" opt  
  16. do  
  17.     case ${opt} in  
  18.         h) REDISHOST=${OPTARG};;  
  19.         n) REDISDB=${OPTARG};;  
  20.         p) REDISPORT=${OPTARG};;  
  21.         r) REPEAT=${OPTARG};;  
  22.         a) AUTH=${OPTARG};;  
  23.         i) DELAY=${OPTARG};;  
  24.     esac  
  25. done  
  26. shift $((${OPTIND} - 1))  
  27. if [ "${REDISHOST}" != "" ] && [ "${REDISPORT}" != "" ]  
  28. then  
  29.     exec 6<>/dev/tcp/${REDISHOST}/${REDISPORT} # open fd  
  30.     if [ $? -ne 0 ]; then  
  31.         exit 1  
  32.     fi  
  33. else  
  34.     echo "Wrong arguments"  
  35.     exit 255  
  36. fi  
  37. [ "${AUTH}" != "" ] && redis-client 6 AUTH ${AUTH} > /dev/null  
  38. [ "${REDISDB}" != "" ] && redis-client 6 SELECT ${REDISDB} > /dev/null  
  39. for ((z=1;z<=${REPEAT};z++))  
  40. do  
  41.     redis-client 6 "${@}"  
  42.     if [ $? -ne 0 ]; then  
  43.         exit 1  
  44.     fi  
  45.     [ ${DELAY} -gt 0 ] && sleep ${DELAY}  
  46. done  
  47. exec 6>&- #close fd  

 

日志服务端

 

redis-publish-test  这个是日志服务端,可以收到publish的数据

 


 
 
  1. #!/bin/bash   
  2. source /usr/share/redis-bash/redis-bash-lib 2> /dev/null  
  3. if [ $? -ne 0 ]; then  
  4.   LIBFOLDER=${0%/${0##*/}}  
  5.   echo $LIBFOLDER  
  6.   source ${LIBFOLDER}/redis-bash-lib 2> /dev/null  
  7.   if [ $? -ne 0 ]; then  
  8.     echo "can't find redis-bash-lib in /usr/share/redis-bash or ${LIBFOLDER}"  
  9.     exit 127   
  10.   fi  
  11. fi  
  12. REDISHOST=localhost  
  13. REDISPORT=6379  
  14. while getopts ":h:p:" opt  
  15. do  
  16.     case ${opt} in  
  17.         h) REDISHOST=${OPTARG};;  
  18.         p) REDISPORT=${OPTARG};;  
  19.     esac  
  20. done  
  21. shift $((${OPTIND} - 1))  
  22. while true  
  23. do  
  24.     exec 5>&-  
  25.     if [ "${REDISHOST}" != "" ] && [ "${REDISPORT}" != "" ]  
  26.     then  
  27.         exec 5<>/dev/tcp/${REDISHOST}/${REDISPORT} # open fd  
  28.     else  
  29.         echo "Wrong arguments"  
  30.         exit 255  
  31.     fi  
  32.     redis-client 5 SUBSCRIBE ${1} > /dev/null # subscribe to the pubsub channel in fd 5  
  33.     while true  
  34.     do  
  35.         unset ARGV  
  36.         OFS=${IFS};IFS=$'\n' # split the return correctly  
  37.         ARGV=($(redis-client 5))  
  38.         IFS=${OFS}  
  39.         if [ "${ARGV[0]}" = "message" ] && [ "${ARGV[1]}" = "${1}" ]  
  40.         then  
  41.         echo ${ARGV[2]}  
  42.         a=${ARGV[2]}  
  43.             echo $($a)  
  44.             echo "Message from pubsub channel: ${ARGV[2]}"  
  45.         elif [ -z ${ARGV} ]  
  46.         then  
  47.             sleep 1  
  48.             break  
  49.         fi  
  50.     done  
  51. done  

 



 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1191926,如需转载请自行联系原作者



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
27天前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
33 1
|
12天前
|
存储 SQL 监控
|
12天前
|
运维 监控 安全
|
15天前
|
监控 关系型数据库 MySQL
分析慢查询日志
【10月更文挑战第29天】分析慢查询日志
35 3
|
15天前
|
监控 关系型数据库 数据库
怎样分析慢查询日志?
【10月更文挑战第29天】怎样分析慢查询日志?
32 2
|
20天前
|
缓存 监控 NoSQL
Redis 缓存穿透的检测方法与分析
【10月更文挑战第23天】通过以上对 Redis 缓存穿透检测方法的深入探讨,我们对如何及时发现和处理这一问题有了更全面的认识。在实际应用中,我们需要综合运用多种检测手段,并结合业务场景和实际情况进行分析,以确保能够准确、及时地检测到缓存穿透现象,并采取有效的措施加以解决。同时,要不断优化和改进检测方法,提高检测的准确性和效率,为系统的稳定运行提供有力保障。
48 5
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1630 14
|
1月前
|
存储 消息中间件 大数据
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
35 4
|
1月前
|
存储 分布式计算 NoSQL
大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge
大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge
40 0
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6