2011-10-11 17 views
23

Phần hiện tại supervisord.conf của tôi trông giống như:Làm thế nào để quản lý đúng cách RabbitMQ với supervisord

[chương trình: RabbitMQ] command =/usr/sbin/RabbitMQ-server

Khi tôi cố gắng để ngăn chặn thỏmq với giám sát (supervisorctl dừng thỏmq), các quy trình thỏmq chỉ đơn giản là không tắt. Các tài liệu hướng dẫn thỏmq cũng đề cập đến không bao giờ sử dụng giết nhưng thay vì sử dụng thỏmqctl dừng lại. Tôi đoán giám sát chỉ đơn giản là giết chết các quy trình - do đó kết quả nghèo với thỏmq. Tôi không thể tìm thấy bất kỳ tùy chọn nào trong giám sát để chỉ định lệnh dừng tùy chỉnh.

Bạn có đề xuất nào không?

Trả lời

2

Bạn đã trả lời câu hỏi của riêng mình. Trong hoạt động bình thường, không bao giờ sử dụng kill trên bất kỳ quy trình nào trừ khi đó là cách quản lý thông thường. Trong trường hợp của RabbitMQ, quá trình được ghi nhận là sử dụng điểm dừng thỏmqctl hoặc sử dụng trạm dừng thỏmqserver.

Không có lý do chính đáng để quản lý RabbitMQ với bất kỳ điều gì phức tạp hơn so với tập lệnh hệ vỏ làm cho một nỗ lực khởi động lại thông qua bắt đầu máy chủ thỏ. Nếu điều đó không hoạt động ngay lập tức, thì RabbitMQ sẽ gặp khó khăn do một cái gì đó như, thiếu RAM, hết dung lượng đĩa hoặc công cụ quản lý hệ thống giả mạo đã xóa một số thành phần nhị phân của thỏmq.

Trong hoạt động bình thường RabbitMQ có một giám sát viên nội bộ sẽ cố gắng tắt máy và khởi động lại RabbitMQ, vì vậy nếu bạn xóa các tệp nhị phân, nó sẽ không khởi động lại được. Khi sử dụng các công cụ như đầu bếp, con rối, cfengine, đừng liên tục đẩy các tệp gói nhị phân. Chỉ cần kiểm tra xem mọi thứ có ở đó không.

37

Giải pháp của tôi là viết một wrapper kịch bản có tên rabbitmq.sh như sau:

# call "rabbitmqctl stop" when exiting 
trap "{ echo Stopping rabbitmq; rabbitmqctl stop; exit 0; }" EXIT 

echo Starting rabbitmq 
rabbitmq-server 

Sau đó, sửa đổi supervisord.conf:

[program:rabbitmq] 
command=path/to/rabbitmq.sh 
+3

này đã làm việc một phần cho tôi. Tôi đã tạo ra một ý chính với giải pháp cuối cùng của mình: https://gist.github.com/caioariede/342a583f75467509ad42 – caio

+1

@caio mặc dù giải pháp của tôi có hiệu quả đối với tôi, tôi nên cảm ơn bạn vì giải pháp của bạn. –

0

tôi sẽ khuyên bạn nên sử dụng Monit (http://mmonit.com/), nó là phù hợp hơn cho daemons như RabbitMQ và nó cũng là tính năng phong phú.

Trước hết, bạn phải cài đặt gói Monit. Nếu bạn đang sử dụng Ubuntu/Debian:

sudo apt-get update 
sudo apt-get install monit 

Sau đó, bạn phải tạo tập lệnh cấu hình. Dưới đây là một kịch bản mẫu để giúp bạn chạy (đặt nó trên /etc/monit/conf.d/):

set daemon 1800 
set logfile /var/log/monit.log 

check process rabbit with pidfile /var/run/rabbitmq/pid 
    start program = "/etc/init.d/rabbitmq-server start" 
    stop program = "/etc/init.d/rabbitmq-server stop" 
    noalert [email protected] 

Sau đó, chỉ cần khởi động lại monit và bạn đã kết thúc:

sudo /etc/init.d/monit restart 
+0

nó không tạo bất kỳ tệp pid nào trong thư mục/var/run/rabbitmq /. –

+0

không phải là lý do để bỏ phiếu cho người nhận xét. trong thực tế, monit có thể là một giải pháp hoàn toàn hợp lệ nếu không cho tệp pid đó (có thể được đặt với một môi trường biến ...) –

3

này script bắt đầu RabbitMQ như là một quá trình nền (sử dụng '&') gây ra một tập tin pid được cập nhật/tạo ra (xem 'chờ' dưới http://www.rabbitmq.com/man/rabbitmqctl.1.man.html).

Sau khi thỏ đã được bắt đầu, một vòng lặp được sử dụng để xác minh rằng pid vẫn đang chạy. Nếu thỏ bị treo hoặc bị tắt bằng tay (bên ngoài người giám sát) thì kịch bản sẽ thoát ra với 1 và người giám sát sẽ tiếp quản.

echo >> ./rmq.txt tập tin là có cho mục đích gỡ lỗi và có thể được nhận xét trong sản xuất (tôi sử dụng này để theo dõi tình trạng khởi động/tắt máy/chết).

người giám sát hài lòng vì nó có thể thấy một quy trình đang chạy và EXIT sẽ kích hoạt chức năng stop_rmq gọi là 'rabbitmqctl stop' để tắt máy.

#!/bin/bash 

# Script to manage RMQ with supervisord 

# Shut down rmq 
function stop_rmq { 

    echo "Stopping RabbitMQ..." 
    echo "Stopping RabbitMQ..." >> ./rmq.txt 
    rabbitmqctl stop 
    echo "RabbitMQ stopped" 
    echo "RabbitMQ stopped" >> ./rmq.txt 
    #exit 0 
} 

# Set up the trap 
#trap stop_rabbit TERM KILL HUP INT SIGTERM SIGKILL SIGHUP SIGINT 
trap stop_rmq exit 

# Start rmq 
echo "Starting RabbitMQ..." 
echo "Starting RabbitMQ..." >> ./rmq.txt 
# Start Rabbitmq in the background (causes the pid file to be updated) 
# Note that the pid file location can be overridden with the rmq 'RABBITMQ_PID_FILE' variable 
/usr/sbin/rabbitmq-server & 
rabbitmqctl wait /var/lib/rabbitmq/mnesia/[email protected]$HOSTNAME.pid 
echo "RabbitMQ Started" 
echo "RabbitMQ Started" >> ./rmq.txt 

while true; do 
    #ps $(cat /var/lib/rabbitmq/mnesia/[email protected]$HOSTNAME.pid) 
    ps -o pid,cmd,etime $(cat /var/lib/rabbitmq/mnesia/[email protected]$HOSTNAME.pid) 
    if (($? > 0)); then 
    echo "RabbitMQ Died" 
    echo "RabbitMQ Died" >> ./rmq.txt 
    exit 1 
    fi 
    #echo "Sleeping..." 
    sleep 10 
done 

Đây là sản lượng tạo ra bởi các kịch bản để supervisord:

[email protected]:/# supervisorctl tail rmq 

Starting RabbitMQ... 
Waiting for [email protected] ... 
pid is 45220 ... 

       RabbitMQ 3.3.5. Copyright (C) 2007-2014 GoPivotal, Inc. 
    ## ##  Licensed under the MPL. See http://www.rabbitmq.com/ 
    ## ## 
    ########## Logs: /var/log/rabbitmq/[email protected] 
    ###### ##  /var/log/rabbitmq/[email protected] 
    ########## 
       Starting broker... completed with 0 plugins. 
...done. 
RabbitMQ Started 
    PID CMD        ELAPSED 
45220 /usr/lib/erlang/erts-6.1/bi  00:05 
    PID CMD        ELAPSED 
45220 /usr/lib/erlang/erts-6.1/bi  00:15 
    PID CMD        ELAPSED 
45220 /usr/lib/erlang/erts-6.1/bi  00:25 
    PID CMD        ELAPSED 
45220 /usr/lib/erlang/erts-6.1/bi  00:35 
    PID CMD        ELAPSED 
45220 /usr/lib/erlang/erts-6.1/bi  00:45 
    PID CMD        ELAPSED 
45220 /usr/lib/erlang/erts-6.1/bi  00:55 
    PID CMD        ELAPSED 
45220 /usr/lib/erlang/erts-6.1/bi  01:05 
    PID CMD        ELAPSED 
45220 /usr/lib/erlang/erts-6.1/bi  01:15 
    PID CMD        ELAPSED 
45220 /usr/lib/erlang/erts-6.1/bi  01:25 
Các vấn đề liên quan