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 · 12630 次点击
    这是一个创建于 3294 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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   ·   实用小工具   ·   2713 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 07:43 · PVG 15:43 · LAX 23:43 · JFK 02:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.