【问题标题】:Running PostgreSQL with Supervisord使用 Supervisord 运行 PostgreSQL
【发布时间】:2012-06-20 23:37:14
【问题描述】:

我想在 Ubuntu 10.04 上使用 Supervisor 运行 PostgreSQL 9.1。目前,我使用 init 脚本手动启动 PostgreSQL:

/etc/init.d/postgresql start

根据这篇帖子:http://nicksergeant.com/using-postgresql-with-supervisor-on-ubuntu-1010/,我需要修改 PostgreSQL 配置以使其在 TCP 端口而不是 Unix 套接字上运行,以使 PostgreSQL 与 Supervisor 一起工作。

我对这种方法有两个问题:

  1. 考虑到这更像是 hack,这样做是否有任何暗示(例如安全/权限、性能等)?

  2. 为什么我们不能在 Supervisor 配置中运行相同的初始化脚本 postgresql?相反,如上面的链接所示,它运行postmaster?

更新

感谢下面两个答案的有用建议,我已经为 Supervisor 设置了一个脚本来直接调用 PostgreSQL:

#!/bin/sh

# This script is run by Supervisor to start PostgreSQL 9.1 in foreground mode

if [ -d /var/run/postgresql ]; then
    chmod 2775 /var/run/postgresql
else
    install -d -m 2775 -o postgres -g postgres /var/run/postgresql
fi

exec su postgres -c "/usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main -c config_file=/etc/postgresql/9.1/main/postgresql.conf"

我还将配置:/etc/postgresql/9.1/main/start.conf 设置为 manual,这样 PostgreSQL 就不会在启动时自动启动(但是,我不清楚是否加载了此配置)。然后我将 postgres 的 Supervisor 配置设置为:

[program:postgres]
user=root
group=root
command=/usr/local/bin/run_postgresql.sh
autostart=true
autorestart=true
stderr_logfile=/home/www-data/logs/postgres_err.log
stdout_logfile=/home/www-data/logs/postgres_out.log
redirect_stderr=true
stopsignal=QUIT

所以现在,我可以通过 start postgressupervisorctl 中启动 PostgreSQL,它运行良好。 然而,在我发出stop postgres 之后,虽然supervisorctl 声明postgres 已停止,但服务器显然仍在运行,因为我可以psql 进入它。

我想知道这是主管配置问题,还是 PostgreSQL 问题。欢迎提出任何建议!

【问题讨论】:

    标签: postgresql ubuntu postgresql-9.1 supervisord


    【解决方案1】:

    这篇博文写得很糟糕。没有“TCP 模式”:帖子建议的方法仍将侦听 Unix 套接字,只是在不同的目录中。帖子中的“外部 pid 文件 - TCP 模式不需要”等评论非常具有误导性。

    postmaster 是 postgresql 可执行文件的传统名称(用于区分主调度进程和后端从属进程)。一段时间以来,没有单独的可执行文件,现在它被简单地安装为“postgres”。

    假设 Supervisor 与 qmail/daemontools supervise 方案大致相似,完全有可能(事实上,很正常)让它运行一个设置目录和环境的脚本,然后执行 postgres必要的参数(或传播给包装脚本的参数,这对于监督来说是不寻常的,但当你有一个配置文件可以放入参数时更有意义)。

    supervise 的工作方式(我将继续假设“主管”是相同的)是让主管进程按照指定运行一个子进程,如果它退出,只需重新启动一个新的子进程。这是基于这样的想法,即正在启动的进程是一个长期存在的守护进程,只有在出现严重错误时才会退出,并且简单地重新启动它是一个有效的修复。相比之下,/etc/init.d 中的 init 脚本运行子进程并将其分离,然后将控制权返回给它们的调用者——如果子进程退出,则不会发生任何特殊情况,必须手动重新启动它。如果您尝试简单地从 supervise 运行 /etc/init.d/postgresql start,它将不断产生 postgresql 守护进程,因为从 init 脚本返回的结果将被解释为守护进程已经退出,而实际上它已经启动并分离。

    【讨论】:

    • 感谢您指出我的第二个问题,这很好解释!关于我的第一个问题(以及您对链接中脚本实际发生的情况的解释),您是否建议我应该编写一个脚本,为 postgresql 创建必要的目录,然后运行postmaster(或postgres?)使用原始 postgresql 配置,并在主管配置文件中调用此脚本?
    • 对,您可以拥有一个基本上执行[ -d /run/postgresql ] || make_rundir ; exec /usr/lib/postgresql/9.1/postgres "$@" 的shell 脚本,如果需要,它将创建目录,然后链接postgres 可执行文件(postmaster 现在是一个过时的名称)。使用监督,这将在服务目录中被称为run
    • 您认为supervisordsupervise 工作方式相同的假设是正确的;它会在它的职责范围内为守护进程启动并重新生成一个子进程。
    【解决方案2】:

    为避免使用 /etc/init.d 脚本自动启动服务,postgresql 9.1 的软件包提供了一个文件 /etc/postgresql/9.1/main/start.conf,其中包含:

    # 自动启动配置 # auto:在初始化脚本中自动启动/停止集群 # 手动:不要在初始化脚本中启动/停止,但允许手动启动 # pg_ctlcluster # disabled: 不允许使用 pg_ctlcluster 手动启动(这很容易 # 被规避了,只是为了对 # 事故)。 汽车

    这是要修改的文件以避免自动启动,而不是像博客文章所建议的那样移开/etc/init.d/postgresql

    此外,由于缺少 /var/run/postgresql 而更改 unix 套接字参数看起来不是最好的主意,因为它是与 libpq 链接的任何程序的默认设置,并且因为创建具有适当权限的目录并不困难,只需就像它是由 /usr/share/postgresql-common/init.d-functions 中的包的启动序列完成的:

    # create socket directory
    if [ -d /var/run/postgresql ]; then
        chmod 2775 /var/run/postgresql
    else
    install -d -m 2775 -o postgres -g postgres /var/run/postgresql
    fi
    

    虽然默认值不会造成问题,但请注意,postmaster 最终是留在前台还是分叉并在后台运行是由postgresql.conf 中的silent_mode 参数控制的。确保它已关闭。

    【讨论】:

    • 感谢您的冗长解释。两个问题:1.为什么我们要避免自动启动/etc/init.d/postgresql?这在原始文章中对我来说并不清楚; 2.根据您上面的回答,似乎只需要更改两件事即可使其与Supervisor一起使用:首先,在/etc/postgresql/9.1/main/start.conf中更改为manual,其次,设置'silent_mode'参数在/etc/postgresql/9.1/main/postgresql.conf 关闭。对吗?
    • 1:如果 postgresql 在启动时启动,它将不受主管的控制,这与目标相矛盾:将守护进程保持在主管的控制之下。 2:是的
    • 我明白了。那太棒了!但是我确实需要创建一个包含您上面引用的部分的脚本,以创建必要的目录和设置权限,然后调用 postresql 可执行文件(顺便说一句,我应该使用哪个可执行文件:/usr/lib/postgresql/9.1/bin/postgres/usr/lib/postgresql/9.1/bin/pg_ctl?)?然后用 Supervisor 运行这个脚本?再次感谢!
    • 是的,您需要创建该脚本。它应该启动/usr/lib/postgresql/9.1/bin/postgres(不是pg_ctl),至少带有数据目录的-D参数。
    • @MLister 我想你只想要su postgres -c ... 而不是su - postgres -c ...(额外的破折号试图设置一个新的登录shell,这在这种情况下并不合适)
    【解决方案3】:

    我正在尝试让 tomcat 和 postgres 在主管下运行,并在这里找到了一些提示:https://serverfault.com/questions/425132/controlling-tomcat-with-supervisor

    这是我修改后的run_postgresql.sh,使用 bash :

    #!/bin/bash
    
    # This script is run by Supervisor to start PostgreSQL 9.1 in foreground mode
    
    function shutdown()
    {
        echo "Shutting down PostgreSQL"
        pkill postgres
    }
    
    if [ -d /var/run/postgresql ]; then
        chmod 2775 /var/run/postgresql
    else
        install -d -m 2775 -o postgres -g postgres /var/run/postgresql
    fi
    
    # Allow any signal which would kill a process to stop PostgreSQL
    trap shutdown HUP INT QUIT ABRT KILL ALRM TERM TSTP
    
    exec sudo -u postgres /usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main --config-file=/etc/postgresql/9.1/main/postgresql.conf
    

    使用此脚本,postgresql 在supervisorctl stop postgres 之后正确停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2017-01-13
      相关资源
      最近更新 更多