需求:

为了准确监控每个服务器的内部状态,而且也不影响现有业务逻辑的情况,需要快速部署一个简单的

服务器集中监控系统。经过考虑,可以使用Redis的Pub/Sub功能来实现一个监控系统是非常好合适的。

当然我们也可以通这个来做批量的管理。

Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值

进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能可以用作实时消息系统。

  1. 发布和订阅机制

  2.   当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher)。

  3.   而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候,我们称这个客户端为订阅者(subscriber)。

  4.   为了解耦发布者(publisher)和订阅者(subscriber)之间的关系,Redis 使用了 channel (频道)作为两者的中介 —— 发布者将信息直接发布给 channel ,而 channel 负责将信息发送给适当的订阅者,发布者和订阅者之间没有相互关系,也不知道对方的存在

下面这个图适合批量管理,每个客户端的服务器都要有个redis-cli ,安装redis自然就有了,然后定义sub ,在管理端就可以通过pub发布一些个指令,客户端收到后,可以执行,也可以做些相应别的操作。

下面这个适合监控,把自己的业务指标pub过去,服务端可以进行相应的处理, 可以是写到mysql里面,可以是和页面进行交互。

其实说白了,用socket也是可以实现的,但是redis已经是较成熟的产品,内部实现采用epoll封装,有多路复用特性,非阻塞IO,而且绝大部分请求是纯粹的内存操作。    有这些个特性,咱们没必要还费劲给socket写个并发异步的重构,逼近太麻烦了。

那咱们现在就搞吧~

这个是订阅者

这个是发布者

实现不间断的收集数据,可以用php的redis模块直接进行操作~~~~

但是直接用php对咱们来说,颇有点难度,可以先考虑用下shell  ~

google到了一些个资料,但是不能用起来不爽,在这里改了接收的判断和端口的重定向

redis-bash-cli

  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. exec6<>/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. exec6>&- #close fd

redis-bash-lib

  1. #!/bin/bash

  2. function redis-client() {

  3. FD=${1}

  4. shift;

  5. if [ ${#} -ne 0 ]; then # always use unified protocol and let the server validate the number of parameters

  6. local ARRAY=( "${@}" )

  7. local CMD=("*$[${#ARRAY[@]}]")

  8. local i=0

  9. for ((i=0;i<${#ARRAY[@]};i++)); do

  10. CMD=( "${CMD[@]}" "\$${#ARRAY[${i}]}" "${ARRAY[${i}]}" )

  11. done

  12. printf "%s\r\n" "${CMD[@]}" >&${FD}

  13. fi

  14. local ARGV

  15. read -r -u ${FD}

  16. REPLY=${REPLY:0:${#REPLY}-1}

  17. case ${REPLY} in

  18. -*|\$-*) # error message

  19. echo "${REPLY:1}"

  20. return 1;;

  21. \$*) # message size

  22. [ ${BASH_VERSINFO} -eq 3 ] && SIZEDELIM="n"

  23. [ ${REPLY:1} -gt 0 ] && read -r -${SIZEDELIM:-N} $[${REPLY:1}+2] -u ${FD} # read again to get the value itself

  24. ARGV=( "${REPLY:0:$[${#REPLY}-$[${BASH_VERSINFO}-2]]}" );;

  25. :*) # integer message

  26. ARGV=( "${REPLY:1}" );;

  27. \**) # bulk reply - recursive based on number of messages

  28. unset ARGV

  29. for ((ARGC="${REPLY:1}";${ARGC}>0;ARGC--)); do

  30. ARGV=("${ARGV[@]}" $(redis-client ${FD}))

  31. done;;

  32. +*) # standard message

  33. ARGV=( "${REPLY:1}" );;

  34. *) # wtf? just in case...

  35. ARGV=( "${ARGV[@]}" "${REPLY}" );;

  36. esac

  37. printf "%s\n" "${ARGV[@]}"

  38. }

redis-publish-test

  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

这边是订阅者,大家会发现我在订阅者那边发布的信息,这边都接收了,而且执行了linux的命令

这边是发布者

下面是php的例子,在这里咱们可以把php当做脚本用。

首先是编译安装phpredis扩展,扩展的地址和api手册可见:https://github.com/nicolasff/phpredis

发布者

  1. $redis = new Redis();

  2. $redis->connect('127.0.0.1',6379);

  3. $channel = $argv[1];  // channel

  4. $msg = $argv[2]; // msg

  5. $redis->publish('channel'.$channel, $msg);

订阅者
  1. $redis = new Redis();

  2. $redis->connect('127.0.0.1',6379);

  3. $channel = $argv[1];  // channel

  4. $redis->subscribe(array('channel'.$channel), 'callback');

  5. function callback($instance, $channelName, $message) {

  6. echo $channelName, "==>", $message,PHP_EOL;

  7. }

可以分别开三个终端窗口

在终端1中执行:

php redis-sub.php 1

在终端2中执行:
php redis-sub.php 2

在终端3中执行:

php redis-pub.php 1 hello

此时在终端1中可以打印出hello;

执行

php redis-pub.php 2 world

则在终端2中打印出world。

通过Redis的Pub/Sub实现对服务器群的监控管理相关推荐

  1. 网络映射iscsi服务器,群晖iSCSI管理器连接网络硬盘详细介绍和配置使用说明

    群晖科技日前已经正式推出DSM 6.2版操作系统, 作为重大版本更新的DSM 6.2已经为我们带来诸多新功能. 本文将介绍对于家庭和中小企业非常实用的iSCSI功能,通过该功能加载群晖服务器的存储空间 ...

  2. Redis的Pub/Sub模式

    为什么80%的码农都做不了架构师?>>>    Redis同样支持消息的发布/订阅(Pub/Sub)模式,这和中间件activemq有些类似.订阅者(Subscriber)可以订阅自 ...

  3. 远程访问 Linux 服务器中的 redis 数据库(腾讯云服务器 CentOS 8.0)

    远程访问 Linux 服务器中的 redis 数据库(腾讯云服务器 CentOS 8.0) 1. 开放腾讯云服务器防火墙端口 2. 修改 redis.conf 文件配置 3. 设置服务器防火墙状态 4 ...

  4. redis通过6379端口无法连接服务器(redis-server.exe闪退)

    redis通过6379端口无法连接服务器(redis-server.exe闪退) redis通过6379端口无法连接服务器(redis-server.exe闪退) 程序中报错:Unable to co ...

  5. 我拍了拍 Redis,没想到被移出了群聊......

    作者 | 轩辕之风O 来源 | 编程技术宇宙(ID:xuanyuancoding) Redis的新烦恼 你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上. 自从上次被拉入群聊之后( ...

  6. Redis进阶-5.x 单节点 及Redis Cluster 3主3从集群部署

    文章目录 Redis 下载地址 Redis 5.x 单节点 编译安装 Redis 启停 Redis Cluster 4.x VS Redis Cluster 5.x 演进之路 ( Master/Sla ...

  7. redis专题:redis的主从、哨兵、集群架构的配置和部署详情、以及问题分析

    文章目录 1. 在linux下安装redis 2. redis主从架构 2.1 redis主从架构搭建步骤 2.2 redis主从架构数据同步原理 2.3 如果在主从传输过程中,从节点挂了怎么办? 2 ...

  8. 局域网中服务器群配置ssh免密

    笔者以前配置ssh免密登陆,基本两步就可以了, ssh-keygen删除密钥对, ssh-copy-id公钥复制到远程主机,完成密钥对部署. 但是笔者寻思,在服务器群里面怎么来配置ssh免密呢?生成密 ...

  9. 缓存加速------Redis主从复制,哨兵模式,集群

    目录 前言 一.Redis主从复制 1.Redis主从复制概述 2.Redis主从复制作用 3.Redis主从复制流程 4.搭建Redis主从复制 ①环境准备 ②安装Redis ③修改Redis配置文 ...

最新文章

  1. 全国大学生智能汽车竞赛-讯飞赛道规则解读
  2. 计算机能力应用免考证明,青岛学信NIT认证可以免考《管理系统中计算机的应用》笔试+实践...
  3. STM32 usb 设备实现自动重枚举
  4. code css怎么拿不到div_不会“编程”拿不到初中毕业证?听北京海淀教委怎么说...
  5. 介绍一个欧神写的剪贴板多端同步神器
  6. fastdfs 一个group内实现按照不同的项目,指定路径存储.
  7. php二进制保存到本地,C# 将二进制字符串保存到本地
  8. 协同过滤算法_利用数据分析量化协同过滤算法的两大常见难题
  9. 基于单片机的数字电子钟简单
  10. 远程控制计算机软件有哪些,支持远程控制电脑的工具有哪些?这几款软件值得一试!...
  11. 酒店管理系统java实现
  12. 有关彩虹猫病毒的一些小小的分析
  13. windows 内网域电脑无法ntp时间同步
  14. mindmanager2020许可密钥永久激活破解安装教程非破解手机版下载
  15. little endian c语言,endian.h这个头文件里面的宏可以直接用么?
  16. 弹幕视频播放app案例分析
  17. 中转网关 (Transit Gateway) Connect连接类型集成FortiGate安全服务
  18. 农村信用社答题小程序
  19. 微信小程序开发笔记——wsdchong
  20. 安装zookeeper看我就行了

热门文章

  1. 使用Spire.Barcode程序库生成二维码
  2. 一维数组和二维数组创建,输出,Arrays.fill()替换
  3. 微软发布Surface平板电脑 再度挑战苹果
  4. SUSE LINUX系统文件句柄限制的修改
  5. POJ3349 哈希算法
  6. ceph基本架构及数据分布原理
  7. mysql innodb_data_file_path_MySQL修改innodb_data_file_path参数的一些注意事项
  8. Mysql探究与学习大纲--主要是为了自己复习方便
  9. Mysql数据库常用分库和分表方式
  10. 性能调优从哪方面入手?