Redis 负载监控redis-monitor - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
50vip
V2EX    Python

Redis 负载监控redis-monitor

  •  
  •   50vip 2015-11-25 10:19:27 +08:00 13027 次点击
    这是一个创建于 3617 天前的主题,其中的信息可能已经有所发展或是发生改变。

    redis-monitor

    一个 web 可视化的 redis 监控程序。

    欢迎 issue 和 pr 。https://github.com/hustcc/redis-monitor

    使用 Flask 来开发的,代码结构非常简单,适合移植到公司内网使用。

    Demo

    http://www.atool.org:7259/

    What

    1. redis 服务器信息,包括 redis 版本、上线时间、 os 系统信息等等
    2. 实时的消息处理信息,例如处理 command 数量、连接总数量等
    3. 联通时间动态图表
    4. ops 时间动态图表
    5. 内存占用、 cpu 消耗实时动态图表
    6. 内存缓存 1 秒数据,防止监控程序造成 redis 负荷

    为啥要做这个?

    1. 之前 git 上搜了一堆,包括 osc 上推荐的 redis 项目,都配置不起来,有一个配置起来了但是 2.6 和 2.8 不兼容!
    2. 有一个可以运行起来,但是每次都是直接连接 redis ,非常耗,如果同时 10 个人看监控图表,那么每秒造成 10 个 redis 连接,十分坑爹
    3. 还有就是 git 上的一些配置起来太麻烦

    如何使用?

    • 首先安装 Flask Web 需要得库

    pip install -r requirements.txt

    • 运行 web 程序即可

    ./run_monitor

    或者

    python run_monitor.py

    • 本地打开 127.0.0.1:7259 就可以看完网页了。截图见下方!

    screenshot

    shot_1

    shot_2

    shot_3

    第 1 条附言    2015-11-25 13:06:01 +08:00
    PS :我觉得后续改成 websocket 很有必要,不知道大家觉得如何,现在是每秒轮询请求一次,然后图表重绘。
    第 2 条附言    2015-11-25 15:09:59 +08:00
    PS1 :增加一些基本的 db 操作,比如 set , del , flushall 等,现在有些 redis 的 gui 客户端真心做的好差,删除 keys ,都不能批量删除,只能使用 redis-cli 去做。
    第 3 条附言    2015-12-03 18:25:47 +08:00
    最新的 demo 地址: http://redis-monitor.atool.org/
    第 4 条附言    2016-12-08 15:45:20 +08:00

    最近重构了一下,安装使用更加简单了。

    1. 首先安装python库

      pip install redis-monitor

    2. 初始化配置和数据库

      redis-monitor init

    3. 启动 webserver

      redis-monitor start

    然后访问 127.0.0.1:9527(端口:LZSB,你懂的) 即可。

    52 条回复    2016-12-08 18:06:06 +08:00
    forever139
        1
    forever139  
       2015-11-25 10:50:34 +08:00
    已 star
    jokaye
        2
    jokaye  
       2015-11-25 10:53:33 +08:00
    支持,加上报警功能就更棒了,加油!
    moyaya
        3
    moyaya  
       2015-11-25 11:19:48 +08:00
    前几天正在找类似的工具啊,后面用了 redis-PAPA
    50vip
        4
    50vip  
    OP
       2015-11-25 11:28:38 +08:00
    @jokaye 预警功能是需要做的,邮件字段都有了,但是没有写阈值,不知道阈值是根据联通时间还是 ops 来确定!
    50vip
        5
    50vip  
    OP
       2015-11-25 11:31:22 +08:00
    @moyaya 我之前也是因为要用 redis 监控工具看看 redis 情况, git 上找了好多,死都配置不好~~~有一个可以用,但是 2.6 和 2.8 不兼容,而且配置都好复杂,并且开多个浏览器窗口,会增加 redis 请求数,太 low 了!
    xujif
        6
    xujif  
       2015-11-25 11:33:49 +08:00
    @50vip 把数据缓存交给 nginx 如何? 这样如果想降低负载,就增加缓存时间,想看最新的,就 ctrl+f5
    50vip
        7
    50vip  
    OP
       2015-11-25 12:34:32 +08:00
    @xujif 既然是监控,如果需要 ctrl+f5 来刷新数据,那不是太麻烦了吗?另外如果配置 nginx 缓存,会不会又走进了 github 上其他的一些 redis 监控项目的怪圈:配置部署麻烦!
    raingolee
        8
    raingolee  
       2015-11-25 12:45:01 +08:00
    楼主,数据是从 redis monitor command 上调用的吗?听说 monitor 会对 redis 性能有影响
    50vip
        9
    50vip  
    OP
       2015-11-25 12:48:34 +08:00
    @raingolee 使用的 info 命令,然后解析。应该使用的不是你说的 redis monitor command ,另外,对于 info 命令结果会有服务器缓存,也就是不管你开多少浏览器监控,多少人在同时看这个监控数据,每秒钟仅仅执行一次 info 命令,也就是 ops 每秒钟增加一次,这个负荷几乎可以忽略,如果觉得还打了,可以增加缓存的时间。
    50vip
        10
    50vip  
    OP
       2015-11-25 13:06:22 +08:00
    @forever139 感谢 z
    wikimore
        11
    wikimore  
       2015-11-25 13:13:59 +08:00
    看上去很不错
    go2sleep
        12
    go2sleep  
       2015-11-25 13:15:25 +08:00
    已 Star ,我是来看头像的……
    lizhenda
        13
    lizhenda  
       2015-11-25 13:17:11 +08:00
    不错不错, mark
    50vip
        14
    50vip  
    OP
       2015-11-25 13:18:54 +08:00
    @wikimore 比较适合公司内使用~因为没有做登录验证啥的~最简洁的状态,如果需要可以自己加~
    50vip
        15
    50vip  
    OP
       2015-11-25 13:19:08 +08:00
    @lizhenda 感谢,哈哈~
    50vip
        16
    50vip  
    OP
       2015-11-25 13:19:20 +08:00
    @go2sleep 要我打包发给你吗?
    50vip
        17
    50vip  
    OP
       2015-11-25 13:21:02 +08:00
    @go2sleep 你是滨江的?握爪~
    go2sleep
        18
    go2sleep  
       2015-11-25 13:26:33 +08:00
    @50vip 哈哈,打包就不用了……
    我是滨江的,没想到 V2EX 滨江众这么多~ 握爪
    iyaozhen
        19
    iyaozhen  
       2015-11-25 13:32:34 +08:00
    非常好的东西,赞!
    carilove
        20
    carilove  
       2015-11-25 13:51:02 +08:00
    已 star, 正在试用
    @50vip
    有个很基本的问题, Python 用的是 2.7 ,还是 3.X
    50vip
        21
    50vip  
    OP
       2015-11-25 14:07:39 +08:00
    @carilove python2.7 ,这个一点没有在 md 里说明~使用的基本语法,感觉 3.0 应该问题不大~我抽时间弄个 3.0 试试~
    50vip
        22
    50vip  
    OP
       2015-11-25 14:07:53 +08:00
    @iyaozhen 感谢感谢~
    inFinityzc
        23
    inFinityzc  
       2015-11-25 14:10:12 +08:00
    已 Star ,晚上试用~
    50vip
        24
    50vip  
    OP
       2015-11-25 14:13:58 +08:00
    @go2sleep 写 go 的,好牛逼的感觉~
    carilove
        25
    carilove  
       2015-11-25 14:22:01 +08:00
    @50vip
    有个 bug
    Python 2.7, 模块 RedisMonitor.py 的类 RedisMonitor 中的 new_request 方法连接 Redis , port 参数需要转化为 int 。不然会报错
    ```
    r = redis.Redis(host='127.0.0.1', port='6379')
    TypeError: an integer is required

    ```
    carilove
        26
    carilove  
       2015-11-25 14:23:41 +08:00
    @50vip

    同理,项目中其他的 redis 连接都需要转一下 int
    50vip
        27
    50vip  
    OP
       2015-11-25 15:00:46 +08:00
    @carilove 为什么我的环境也是 2.7 毫无压力,我再测试一下~
    50vip
        28
    50vip  
    OP
       2015-11-25 15:08:11 +08:00
    @carilove 我这边 int 和 string 都可以,看了下源码, python redis 自己会转换类型,可以 redis py 版本不同,为了兼容,已经修改代码并且提交了
    carilove
        29
    carilove  
       2015-11-25 15:40:56 +08:00
    @50vip

    哦哦,是 redis 版本的问题,我本地的 2.7 环境很久没升了,
    redis 是 2.8.0 ,所以会报错
    2.10.5 正常。

    另外,这个监控蛮好用的。赞
    50vip
        30
    50vip  
    OP
       2015-11-25 15:45:10 +08:00
    @carilove 嗯,我的也是 2.10 的~~~现在有两个待做的东西:
    1. websocket 代替 js 轮询
    2. redis db 的一些操作,例如 set , del , flush 等简单操作,可以代替一些 redis 的 gui 客户端
    go2sleep
        31
    go2sleep  
       2015-11-25 15:48:21 +08:00
    @50vip 这么快就换头像了!
    ericls
        32
    ericls  
       2015-11-25 15:52:24 +08:00
    已 star 同类中最好的 (我用过的、开源的里面)

    可以翻译个英文
    50vip
        33
    50vip  
    OP
       2015-11-25 15:54:50 +08:00
    @go2sleep 绝对是管理员帮我弄的,我绝对没有换头像啊~
    50vip
        34
    50vip  
    OP
       2015-11-25 15:56:56 +08:00
    @ericls 是说我这个吗?求推荐你用的哪个~
    6IbA2bj5ip3tK49j
        35
    6IbA2bj5ip3tK49j  
       2015-11-25 16:15:15 +08:00
    虽然还没用过 redis ,但是觉得看起来好厉害。
    ericls
        36
    ericls  
       2015-11-25 16:18:23 +08:00
    @50vip 是你这个。。 抱歉 我断句有歧义
    tangthis
        37
    tangthis  
       2015-11-25 16:42:06 +08:00
    安装报错了。
    Downloading requests-2.8.1-py2.py3-none-any.whl (497kB)
    2% | | 12kB 12.1MB/s eta 0:00:01 Exception:
    Traceback (most recent call last):
    File "C:\Python34\lib\site-packages\pip\_vendor\requests\packages\urllib3\re
    sponse.py", line 186, in read
    data = self._fp.read(amt)
    File "C:\Python34\lib\site-packages\pip\_vendor\cachecontrol\filewrapper.py"
    , line 49, in read
    data = self.__fp.read(amt)
    File "C:\Python34\lib\http\client.py", line 500, in read
    return super(HTTPResponse, self).read(amt)
    File "C:\Python34\lib\http\client.py", line 539, in readinto
    n = self.fp.readinto(b)
    File "C:\Python34\lib\socket.py", line 374, in readinto
    return self._sock.recv_into(b)
    File "C:\Python34\lib\ssl.py", line 751, in recv_into
    return self.read(nbytes, buffer)
    File "C:\Python34\lib\ssl.py", line 623, in read
    v = self._sslobj.read(len, buffer)
    socket.timeout: The read operation timed out

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "C:\Python34\lib\site-packages\pip\basecommand.py", line 232, in main
    status = self.run(options, args)
    File "C:\Python34\lib\site-packages\pip\commands\install.py", line 339, in r
    un
    requirement_set.prepare_files(finder)
    File "C:\Python34\lib\site-packages\pip\req\req_set.py", line 355, in prepar
    e_files
    do_download, session=self.session,
    File "C:\Python34\lib\site-packages\pip\download.py", line 782, in unpack_ur
    l
    session,
    File "C:\Python34\lib\site-packages\pip\download.py", line 667, in unpack_ht
    tp_url
    from_path, content_type = _download_http_url(link, session, temp_dir)
    File "C:\Python34\lib\site-packages\pip\download.py", line 843, in _download
    _http_url
    _download_url(resp, link, content_file)
    File "C:\Python34\lib\site-packages\pip\download.py", line 615, in _download
    _url
    for chunk in progress_indicator(resp_read(4096), 4096):
    File "C:\Python34\lib\site-packages\pip\utils\ui.py", line 46, in iter
    for x in it:
    File "C:\Python34\lib\site-packages\pip\download.py", line 580, in resp_read

    decode_cOntent=False):
    File "C:\Python34\lib\site-packages\pip\_vendor\requests\packages\urllib3\re
    sponse.py", line 256, in stream
    data = self.read(amt=amt, decode_cOntent=decode_content)
    File "C:\Python34\lib\site-packages\pip\_vendor\requests\packages\urllib3\re
    sponse.py", line 201, in read
    raise ReadTimeoutError(self._pool, None, 'Read timed out.')
    pip._vendor.requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnec
    tionPool(host='pypi.python.org', port=443): Read timed out.


    C:\Users\Administrator\Documents\GitHub\redis-monitor>python run_monitor.py
    Traceback (most recent call last):
    File "run_monitor.py", line 8, in <module>
    from app import app
    File "C:\Users\Administrator\Documents\GitHub\redis-monitor\app\__init__.py",
    line 12, in <module>
    from app.views import main_views
    File "C:\Users\Administrator\Documents\GitHub\redis-monitor\app\views\main_vie
    ws.py", line 9, in <module>
    from app.utils import RequestUtil, OtherUtil
    File "C:\Users\Administrator\Documents\GitHub\redis-monitor\app\utils\OtherUti
    l.py", line 9, in <module>
    from CJsonEncoder import CJsonEncoder
    ImportError: No module named 'CJsonEncoder'
    raingolee
        38
    raingolee  
       2015-11-25 16:58:33 +08:00
    @50vip 是这样的, monitor 的信息会多很多,可以参考一下 redis-live
    50vip
        39
    50vip  
    OP
       2015-11-25 17:43:28 +08:00
    @raingolee 嗯,是的,但是 monitor 毕竟的调试的,如果用到线上环境,会造成性能问题,对于线上 monitor 过的,可以仅仅关注一些简单的指标。
    50vip
        40
    50vip  
    OP
       2015-11-25 17:43:43 +08:00
    @ericls 哈哈,感谢~~~
    50vip
        41
    50vip  
    OP
       2015-11-25 17:45:15 +08:00
    @tangthis 可以到 github 上提 issue ,安装报错是因为你没有翻墙。。。建议使用 pip 加豆瓣源吧~
    wong2
        42
    wong2  
       2015-11-25 18:38:35 +08:00
    我科
    50vip
        43
    50vip  
    OP
       2015-11-25 19:03:26 +08:00
    @wong2 华中饥渴大学的。。。你好~
    50vip
        44
    50vip  
    OP
       2015-11-25 19:31:06 +08:00
    @wong2 原来是小黄鸡作者,致敬...
    zhkzyth
        45
    zhkzyth  
       2015-11-26 09:56:11 +08:00
    @50vip 已 star ,感觉可以用得上~~谢谢哇~~
    sevncz
        46
    sevncz  
       2015-11-26 10:21:15 +08:00
    已 star
    seerhut
        47
    seerhut  
       2015-11-26 17:17:18 +08:00
    已 star
    mingyun
        48
    mingyun  
       2015-12-15 23:30:36 +08:00
    star
    iyaozhen
        49
    iyaozhen  
       2016-03-08 20:56:28 +08:00
    楼主,你这项目咋又没了呢?
    iyaozhen
        50
    iyaozhen  
       2016-03-08 20:57:38 +08:00
    @iyaozhen 额,好吧,看见你首页头像了,项目都没了。
    50vip
        51
    50vip  
    OP
       2016-03-09 09:35:32 +08:00
    @iyaozhen github 全部清空了
    50vip
        52
    50vip  
    OP
       2016-12-08 18:06:06 +08:00
    @iyaozhen 重构之后,又开源了,之前是因为没有得到公司允许,~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2306 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 15:59 PVG 23:59 LAX 08:59 JFK 11:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86