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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

 

在统计项目中,最难实施的就是日志数据的收集。日志分布在全国各个机房,而且数据量比较大,像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
相关文章
|
2天前
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 的日志管理与分析
【5月更文挑战第11天】MongoDB日志管理与分析至关重要,包括系统日志和操作日志,用于监控、故障排查和性能优化。合理配置日志详细程度、存储位置和保留策略,使用日志分析工具提升效率,发现性能瓶颈和安全性问题。日志分析有助于优化查询、调整配置,确保数据安全,并可与其他监控系统集成。面对日志量增长的挑战,需采用新技术如分布式存储和数据压缩来保障存储和传输。随着技术发展,不断进化日志管理与分析能力,以支持MongoDB的稳定高效运行。
【MongoDB 专栏】MongoDB 的日志管理与分析
|
3天前
|
存储 监控 NoSQL
Redis哨兵&分片集群
Redis哨兵&分片集群
7 0
|
4天前
|
NoSQL 算法 Java
深入浅出Redis(八):Redis的集群模式
深入浅出Redis(八):Redis的集群模式
|
10天前
|
NoSQL Redis
透视Redis集群:心跳检测如何维护高可用性
Redis心跳检测保障集群可靠性,通过PING命令检测主从连接状态,预防数据丢失。当连接异常时,自动触发主从切换。此外,心跳检测辅助实现`min-slaves-to-write`和`min-slaves-max-lag`策略,避免不安全写操作。还有重传机制,确保命令无丢失,维持数据一致性。合理配置心跳检测,能有效防止数据问题,提升Redis集群的高可用性。关注“软件求生”获取更多Redis知识!
115 10
透视Redis集群:心跳检测如何维护高可用性
|
12天前
|
监控 NoSQL 算法
Redis集群模式:高可用性与性能的完美结合!
小米探讨Redis集群模式,通过一致性哈希分散负载,主从节点确保高可用性。节点间健康检测、主备切换、数据复制与同步、分区策略和Majority选举机制保证服务可靠性。适合高可用性及性能需求场景,哨兵模式则适用于简单需求。一起学习技术的乐趣!关注小米微信公众号“软件求生”获取更多内容。
48 11
Redis集群模式:高可用性与性能的完美结合!
|
13天前
|
监控 NoSQL Redis
|
13天前
|
存储 监控 关系型数据库
PHP编写的电脑监控软件:用户登录日志记录与分析
使用PHP编写简单但功能强大的电脑监控软件,记录用户登录日志并进行分析。代码示例展示了如何获取并存储用户IP地址和登录时间到数据库,然后进行登录数据的分析,如计算登录频率和常见登录时间。此外,还介绍了如何通过定时任务自动将监控数据提交到网站,以便实时监控用户活动,提升系统安全性和稳定性。
40 0
|
13天前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理策略
【4月更文挑战第30天】 在微服务架构日益普及的当下,容器化技术与编排工具如Kubernetes成为了运维领域的重要话题。有效的监控和日志管理对于保障系统的高可用性和故障快速定位至关重要。本文将探讨在Kubernetes环境中实施监控和日志管理的最佳实践,包括选用合适的工具、部署策略以及如何整合这些工具来提供端到端的可见性。我们将重点讨论Prometheus监控解决方案和EFK(Elasticsearch, Fluentd, Kibana)日志管理堆栈,分析其在Kubernetes集群中的应用,并给出优化建议。
|
15天前
|
数据可视化
R语言两阶段最小⼆乘法2SLS回归、工具变量法分析股息收益、股权溢价和surfaces曲面图可视化
R语言两阶段最小⼆乘法2SLS回归、工具变量法分析股息收益、股权溢价和surfaces曲面图可视化
|
18天前
|
NoSQL Redis Docker
使用Docker搭建Redis主从集群
使用Docker搭建Redis主从集群
32 1