利用Supervisor管理Redis进程的方法教程

前言

Supervisor 是一个用 Python 实现的进程管理工具,可以很方便地启动,关闭,重启,查看,以及监控进程,当进程由于某种原因崩溃或者被误杀后,可以自动重启并发送事件通知。Supervisor 可谓运维利器,使用 Supervisor 来管理进程,可以提高系统的高可用特性。

随着 Redis 越来越流行,越来越多的公司都使用上了 redis,因此 Redis 的进程管理就成了很多公司都需要面临的问题,本文介绍如何使用 Supervisor 来管理 Redis 进程。

Supervisor 简介

Supervisor 包括以下四个组件。

1、supervisord

服务端程序,主要功能是启动 supervisord 服务及其管理的子进程,记录日志,重启崩溃的子进程,等。

2、supervisorctl

命令行客户端程序,它提供一个类似 shell 的接口,通过 UNIX 域套接字或者 TCP 套接字并使用 XML_RPC 协议与 supervisord 进程进行数据通信。它的主要功能是管理(启动,关闭,重启,查看状态)子进程。

3、Web Server

实现在界面上管理进程,还能查看进程日志和清除日志。

4、XML-RPC 接口

可以通过 XML_RPC 协议对 supervisord 进行远程管理,达到和 supervisorctl 以及 Web Server 一样的管理功能。

进程被 Supervisor 管理后,其运行状态的转化图如下图 1 所示:

图 1 :子进程状态转移图

我们挑几个重要的进程状态来说明。

  • running:进程处于运行状态
  • starting:Supervisor 收到启动请求后,进程处于正在启动过程中
  • stopped:进程处于关闭状态
  • stopping:Supervisor 收到关闭请求后,进程处于正在关闭过程中
  • backoff:进程进入 starting 状态后,由于马上就退出导致没能进入 running 状态
  • fatal:进程没有正常启动
  • exited:进程从 running 状态退出

没有接触过 Supervisor 的朋友可能对上面的描述感到有些抽象,不用担心,经过下面的实践后,会快速理解 Supervisor 涉及的这些名词的。

Supervisor 初体验

我们以 CentOS 平台下为例,说明如何使用 Supervisor 这一强大的进程管理工具。

1. 安装

可以使用easy_intall来安装 Supervisor:

easy_install supervisor

也可以使用pip来安装 Supervisor:

pip install supervisor

安装过程比较简单,此处我们不再赘述。

安装完毕后,可以使用以下命令来测试安装是否成功:

echo_supervisord_conf

echo_supervisord_conf将会在终端输出 Supervisor 配置的样例。

2. 创建配置目录以及主配置文件

为了将 Supervisor 的配置放置到独立的目录中,我们先创建目录:

cd /etc
mkdir supervisor

接着,可以继续使用echo_supervisord_conf命令,将 Supervisor 样例配置重定向输出到文件文件中:

echo_supervisord_conf > /etc/supervisor/supervisord.conf

这样,我们便生成了 Supervisor 的主配置文件supervisord.conf。

为了将 Supervisor 管理的进程配置与主配置文件区分开来,我们创建独立的目录来存放进程配置。

cd /etc/supervisor
mkdir conf.d

然后,修改主配置文件 supervisord.conf,添加以下配置,将 conf.d 目录下的进程配置引入 Supervisor 管理:

[include]
files = ./conf.d/*.ini

3. 创建管理进程

为方便测试 Supervisor 的功能,我们编写以下 python 脚本,并保存为 hello.py。

import time
import sys
while True:
  print("hello\n")
  sys.stdout.flush()
  time.sleep(1)

hello.py 的主要功能是往标准输出中不断地输出 “hello” 字符串。

4. 创建进程配置

为将 hello.py 脚本被 Supervisor 接管,我们在 /etc/supervisor/conf.d 目录创建其配置 hello.ini:

[program:hello]
command=python /home/lihao/codes/python/hello.py
stdout_logfile=/home/lihao/codes/python/hello.log
stderr_logfile=/home/lihao/codes/python/hello_error.log
  • command:运行进程使用的命令
  • stdout_logfile:指定标准输出文件
  • stderr_logfile:标准错误输出文件

需要指出的是,被 Supervisor 管理的进程,不能使用 daemon 模式,而必须在前台运行,否则会报错。

5. 运行 supervisord

由于我们需要使用指定目录下的 Supervisor 主配置文件,在运行 Supervisord 时,需要使用-c参数来指定主配置文件的路径:

supervisord -c /etc/supervisor/supervisord.conf

6. 使用 supervisorctl 管理进程

使用 supervisorctl 可以查看监控的进程状态:

supervisorctl -c /etc/supervisor/supervisord.conf

输出:

hello RUNNING pid 8475, uptime 7:59:46
supervisor>

可以看到,脚本 hello.py 已经运行了起来(当然使用 ps aux | grep hello也可以看到其进程信息)。打开文件 /home/lihao/codes/python/hello.log,可以看到文件中不断有”hello”输出。

在 supervisorctl 命令行下,也可以使用start,stop,restart,status,等命令来启动,关闭,重启,查看状态监控的进程,也可以输入help来查看命令帮助。限于篇幅,此处不再展开,详细的 supervisorctl 命令可以参考:http://www.supervisord.org/running.html#running-supervisorctl

Supervisor 管理 Redis 进程

在说完 Supervisor 的基本使用后,我们来看下如何使用 Supervisor 来管理 Redis 进程。

Redis 的 Supervisor 配置

有了上面的基础,我们很容易写出 Redis 服务进程的 Supervisor 配置:

[program:redis]
command=/usr/local/bin/redis-server
autostart=true
autorestart=true
startsecs=3

使用 supervisorctl reload 载入新的 Redis 配置后,Redis 进程便让 Supervisor 启动了起来。如果需要指定 Redis 的输出日志,可以通过stdout_logfile配置选项指定,具体也可以参考上述的 hello 例子。

由于 Supervisor 管理的进程不能设置为 daemon 模式,故如果 Redis 无法正常启动,可以查看一下 Redis 的配置,并将daemonize选项设置为 no。

daemonize no

Supervisord 开机启动

为了处理机器宕机重启的情况,Redis 服务进程需要实现机器重启后自动重启的功能。 为此,需要配置 supervisord 进程随着机器启动而启动。要实现这一目的 ,可以在 /etc/init 目录下添加 supervisord.conf 文件:

description  "supervisord"
start on runlevel [2345]
stop on runlevel [!2345]

respawn

exec supervisord -n -c /etc/supervisor/supervisord.conf

这样,每当机器重启后,supervisord 进程都会自动启动起来,避免机器每次重启后都需要手工启动 supervisord 进程的操作。Supervisord 进程启动后,接下来会将其管理的进程自动地启动起来。这样,便实现了被 Supervisor 管理的进程随着机器启动而启动的效果。读者可以自行在测试机器上测试一下。

Supervisor Web 管理界面

如果需要开启 Web 管理界面功能,需要在supervisord.conf配置中添加以下配置:

[inet_http_server]
port=*:9001
username=user
password=123

然后,打开浏览器,输入地址 http://127.0.0.1:9001,这时,会弹出输入框,要求输入用户名和密码(用户名:user,密码:123),便可以进入 Supervisor 提供的进程管理界面。

图 2 :Supervisor Web 管理界面

在此界面下,可以对单个进程进行重启,关闭,查看日志等操作,也可以对所有的进程进行重启,关闭等操作。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

参考资料

  • http://www.supervisord.org/
  • Python Web 开发实战,董伟明著,电子工业出版社
  • http://www.jianshu.com/p/9abffc905645
  • http://www.supervisord.org/running.html#running-supervisorctl
  • http://supervisord.org/configuration.html
  • http://www.supervisord.org/subprocess.html
  • https://lincolnloop.com/blog/automatically-running-supervisord-startup/
  • https://serverfault.com/questions/96499/how-to-automatically-start-supervisord-on-linux-ubuntu
  • https://segmentfault.com/a/1190000003955182
(0)

相关推荐

  • python进程管理工具supervisor的安装与使用教程

    前言 在一个分布式环境中,每台机器上可能需要启动和停止多个进程,使用命令行方式一个一个手动启动和停止非常麻烦,而且查看每个进程的状态也很不方便.如果有一个工具能够实现每台机器上多个进程的简单高效中心化管理将是非常方便的.于是Supervisord工具应运而生.与Supervisord类似的工具包括monit, daemontools和runit.下面话不多说了,来一起看看详细的介绍吧. 安装 Supervisord是运行在Python环境下的服务监控程序,所以在安装supervisord之前必须

  • PHP程序员玩转Linux系列 使用supervisor实现守护进程

    PHP程序员玩转Linux系列文章: 1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转Linux系列-备份还原MySQL 5.PHP程序员玩转Linux系列-自动备份与SVN 6.PHP程序员玩转Linux系列-Linux和Windows安装nginx 7.PHP程序员玩转Linux系列-nginx初学者引导 8.PHP程序员玩转Linux系列-N

  • 使用Python的Supervisor进行进程监控以及自动启动

    做服务器端开发的同学应该都对进程监控不会陌生,最近恰好要更换 uwsgi 为 gunicorn,而gunicorn又恰好有这么一章讲进程监控,所以多研究了下. 结合之前在腾讯工作的经验,也会讲讲腾讯的服务器监控是怎么做的.同时也会讲下小团队又该怎么敏捷的解决. 下面按照监控的方法依次介绍. 一.按照进程名监控 在腾讯内部所有server都是要打包发布的,而在打包过程中是需要填写要监控的进程名,然后在crontab中定时通过ps查询进程是否存在. 这种方法是比较简单的方法,但是考虑到很多进程会在启

  • 基于Python 的进程管理工具supervisor使用指南

    Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上.Supervisor 官方版目前只能运行在 Python 2.4 以上版本,但是还无法运行在 Python 3 上,不过已经有一个 Python 3 的移植版 supervisor-py3k. 什么情况下我们需要进程管理呢?就是执行一些需要以守护进程方式执行的程序,比如一个后台任务,我最常用的是用来启动和管理基于 Tornado 写的 Web 程序. 除此之

  • Mac下Supervisor进程监控管理工具的安装与配置

    Supervisor是一个类 unix 操作系统下的进程监控管理工具. 安装 Supervisor Supervisor是由 Python 写成,可用 Python 的包安装管理工具 pip(Python Package Index) 直接安装: 复制代码 代码如下: sudo pip install supervisor 配置 Supervisor Supervisor 的配置文件命名为 supervisord.conf,它为 supervisord(Supervisor 的主服务命令) 和

  • Python使用Supervisor来管理进程的方法

    本文实例讲述了Python使用Supervisor来管理进程的方法.分享给大家供大家参考.具体分析如下: Supervisor可以启动.停止.重启*nix系统中的程序.也可以重启崩溃的程序. supervisord的一个守护进程,用于将指定的进程当做子进程来运行. supervisorctl是一个客户端程序,可以查看日志并通过统一的会话来控制进程. 看例子: 我们写了一个py脚本,用于往log文件中记录一条当前的时间. root@ubuntu:/home/zoer# cat daemon.py

  • PHP框架Laravel中实现supervisor执行异步进程的方法

    问题描述 大家在使用Laravel框架实现动态网页时,若有些操作计算量较大,为了不影响用户体验,往往需要使用异步方式去处理.这里使用supervisor和laravel自带的queues实现.下面来看看详细的介绍: Supervisor Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(不仅仅是 Python 进程).除了对单个进程的控制,还可以同时启动.关闭多个进程,比如很不幸的服务器出问题导

  • python进程管理工具supervisor使用实例

    平时我们写个脚本,要放到后台执行去,我们怎么做呢? 复制代码 代码如下: nohup python example.py 2>&1 /dev/null & 用tumx或者screen? 但是用着可能都不爽,今天就看看python里面的一个进程管理工具supervisor: 官方说:Supervisor: A Process Control System 说白了他就是一个demon程序,他来帮助我们完成对我们想要托管的脚本也好程序也好,好好的照料: 1.安装 python的东西就是好安

  • 利用Supervisor管理Redis进程的方法教程

    前言 Supervisor 是一个用 Python 实现的进程管理工具,可以很方便地启动,关闭,重启,查看,以及监控进程,当进程由于某种原因崩溃或者被误杀后,可以自动重启并发送事件通知.Supervisor 可谓运维利器,使用 Supervisor 来管理进程,可以提高系统的高可用特性. 随着 Redis 越来越流行,越来越多的公司都使用上了 redis,因此 Redis 的进程管理就成了很多公司都需要面临的问题,本文介绍如何使用 Supervisor 来管理 Redis 进程. Supervi

  • 微信小程序利用co处理异步流程的方法教程

    本文主要介绍的是关于微信小程序利用co处理异步流程的方法教程,分享出来供大家参考学习,需要的朋友们下面来看看详细的介绍: co co是一个基于ES6 Generator特性实现的[异步流程同步化]写法的工具库. co需要使用Promise特性,所以,我们先来创建一个使用Promise来处理的异步方法: function myAsyncFunc() { return new Promise(function (resolve, reject) { setTimeout(function () {

  • iOS利用AVPlayer播放网络音乐的方法教程

    前言 假如你现在打算做一个类似百度音乐.豆瓣电台的在线音乐类APP,你会怎样做? 首先了解一下音频播放的实现级别: (1) 离线播放:这里并不是指应用不联网,而是指播放本地音频文件,包括先下完完成音频文件再进行播放的情况,这种使用AVFoundation里的AVAudioPlayer可以满足 (2) 在线播放:使用AVFoundation的AVPlayer可以满足 (3) 在线播放同时存储文件:使用AudioFileStreamer + AudioQueue 可以满足 (4) 在线播放且带有音效

  • Oracle 10g利用amdu抽取数据文件的方法教程

    前言 本文主要给大家介绍的是关于Oracle 10g利用amdu抽取数据文件的相关内容,下面话不多说了,来一起看看详细的介绍吧 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 需求:实验在Oracle 10g环境使用amdu抽取数据库文件 本文主要目的是介绍3个知识点: 1.使amdu可以在oracle 10g环境中使用 2.使kfed可以在oracle 10g环境中使用 3.amdu如何抽取损坏的ASM磁盘组数据 1.使amdu可以在oracle 10g环境中使用 在Orac

  • 利用Lua定制Redis命令的方法详解

    前言 Redis作为一个非常成功的数据库,提供了非常丰富的数据类型和命令,使用这些,我们可以轻易而高效地完成很多缓存操作,可是总有一些比较特殊的问题或需求需要解决,这时候可能就需要我们自己定制自己的 Redis 数据结构和命令. Redis命令问题 线程安全问题 我们都知道 Redis 是单线程的,可是它怎么会有 线程安全 问题呢? 我们正常理解的线程安全问题是指单进程多线程模型内部多个线程操作进程内共享内存导致的数据资源充突.而 Redis 的线程安全问题的产生,并不是来自于 Redis 服务

  • WPF利用RPC调用其他进程的方法详解

    前言 如果在 WPF 需要用多进程通信,一个推荐的方法是 WCF ,因为 WCF 是 RPC 计算.先来讲下 RPC (Remote Procedure Call) 远程过程调用,他是通过特定协议,包括 tcp .http 等对其他进程进行调用的技术.详细请看百度 现在不会告诉大家如何使用 WCF ,下面讲的是使用 remoting 这个方法.需要知道 dotnet remoting 是已经过时的技术,建议使用 wcf 但是 wcf 部署难度比较高,对于性能要求比较高或想快速使用,建议使用 re

  • 利用C#守护Python进程的方法

    背景# 目前我主要负责的一个项目是一个 C/S 架构的客户端开发,前端主要是通过 WPF 相关技术来实现,后端是通过 Python 来实现,前后端的数据通信则是通过 MQ 的方式来进行处理.由于 Python 进程是需要依赖客户端进程来运行,为了保证后端业务进程的稳定性,就需要通过一个 守护进程 来守护 Python 进程,防止其由于未知原因而出现进程退出的情况.这里简单记录一下我的一种实现方式. 实现# 对于我们的系统而言,我们的 Python 进程只允许存在一个,因此,对应的服务类型要采用单

  • redis执行redis命令的方法教程

    Redis 命令 Redis 命令用于在 redis 服务上执行操作.所以我们必须要启动Redis服务程序,也就是redis安装目录下的redis-server.exe,你可以双击执行,也可以打开cmd窗口,将路径定位到Redis安装目录下,通过redis-server命令执行. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中,也就是redis-cli.exe,同理,可以双击执行也可以通过命令执行. 语法 Redis 客

  • 利用Spring Boot操作MongoDB的方法教程

    MongoDB MongoDB作为一种NoSQL数据库产品,其实已经非常著名了.去年,由于MongoDB安全认证的薄弱,上万家公司中招.虽然是一则负面新闻,但是也从侧面说明了MongoDB的流行程度. 下图是DB-Engines统计的2017年5月全球数据库引擎使用排名.从图中可以看出,mongoDB位列总榜第五,非关系数据库第一,非常靠前的排名. 我个人对mongoDB并不是非常熟悉,但是经过一段时间的了解,对mongoDB的特性还是有了一些简单的理解,这里记录一二. 首先,mongoDB作为

随机推荐