Làm thế nào để thực hiện công việc cron failover?


8

Sử dụng hai máy chủ Debian, tôi cần thiết lập môi trường chuyển đổi dự phòng mạnh mẽ cho các công việc cron chỉ có thể được gọi trên một máy chủ tại một thời điểm.

Di chuyển một tệp trong /etc/cron.d nên thực hiện thủ thuật, nhưng có một giải pháp HA đơn giản để vận hành hành động như vậy không? Và nếu có thể không bằng nhịp tim;)


Đối với hồ sơ, cuối cùng tôi đã sử dụng nhịp tim để thực hiện công việc. Tuy nhiên, có một giải pháp dễ dàng hơn, nếu các máy của bạn nằm trong cùng một mạng con và có thể thực hiện phát đa hướng, tôi khuyên bạn nên sử dụng ucarp. Đơn
Falken

1
RCron? Gnubatch? Con rối?
symcbean

Tôi thứ hai RCron. Tôi hiện đang sử dụng nó và có thiết lập gần như giống nhau (2 máy chủ Ubuntu phía sau bộ cân bằng tải).
Ali

Câu trả lời:


5

Tôi nghĩ rằng nhịp tim / máy điều hòa nhịp tim sẽ là giải pháp tốt nhất, vì họ có thể chăm sóc rất nhiều điều kiện chủng tộc, đấu kiếm, vv cho bạn để đảm bảo công việc chỉ chạy trên một máy chủ tại một thời điểm. Bạn có thể tự thiết kế một cái gì đó, nhưng có thể nó sẽ không tính đến tất cả các kịch bản mà các gói đó làm, và cuối cùng bạn sẽ thay thế hầu hết, nếu không phải là tất cả, của bánh xe.

Nếu bạn không thực sự quan tâm đến những điều như vậy và bạn muốn thiết lập đơn giản hơn. Tôi đề nghị đáng kinh ngạc các công việc định kỳ trên máy chủ trong vài phút. Sau đó, khi công việc bắt đầu trên chính, bằng cách nào đó, nó có thể để lại một điểm đánh dấu trên bất kỳ tài nguyên được chia sẻ nào mà công việc hoạt động (bạn không chỉ định điều này, vì vậy tôi đang cố tình mơ hồ). Nếu đó là cơ sở dữ liệu, họ có thể cập nhật một trường trong bảng hoặc nếu trên hệ thống tệp được chia sẻ sẽ khóa tệp.

Khi công việc chạy trên máy chủ thứ hai, nó có thể kiểm tra sự hiện diện của điểm đánh dấu và hủy bỏ nếu nó ở đó.


1

Chúng tôi sử dụng hai phương pháp tùy thuộc vào yêu cầu. Cả hai đều liên quan đến việc có những con dơi có mặt và chạy từ tất cả các máy, nhưng với một chút kiểm tra sự tỉnh táo liên quan:

  1. Nếu các máy ở trong mối quan hệ chính và phụ (có thể có nhiều hơn một mối quan hệ phụ) thì các tập lệnh được sửa đổi để kiểm tra xem máy chúng đang chạy có phải là trạng thái chính hay không. Nếu không, sau đó họ chỉ cần thoát ra lặng lẽ. Hiện tại tôi chưa có thiết lập HB nhưng tôi tin rằng bạn có thể truy vấn HB để biết thông tin này.

  2. Nếu tất cả các máy là bản gốc đủ điều kiện (chẳng hạn như trong một cụm) thì một số khóa được sử dụng. Bằng cách cơ sở dữ liệu dùng chung hoặc tệp PID. Chỉ có một máy từng có trạng thái khóa và những máy không thoát ra lặng lẽ.


1

Để rút ngắn câu chuyện dài, bạn phải biến tập lệnh cron của mình thành một số loại ứng dụng có khả năng phân cụm. Là việc thực hiện nhẹ hoặc nặng như bạn cần, họ vẫn cần một điều - có thể tiếp tục / khởi động lại đúng hành động (hoặc khôi phục trạng thái của họ) sau khi chuyển đổi nút chính. Trường hợp tầm thường là chúng là các chương trình không trạng thái (hoặc chương trình "không đủ quốc tịch"), có thể được khởi động lại bất cứ lúc nào và sẽ hoạt động tốt. Đây có lẽ không phải là trường hợp của bạn. Lưu ý rằng đối với các chương trình không trạng thái, bạn không cần chuyển đổi dự phòng vì bạn chỉ có thể chạy chúng song song trên tất cả các nút.

Trong trường hợp phức tạp thông thường, tập lệnh của bạn phải ở trên bộ lưu trữ chia sẻ của cụm, nên lưu trữ trạng thái của chúng trong các tệp ở đó, chỉ nên thay đổi trạng thái được lưu trữ trên đĩa và có thể tiếp tục hành động của chúng từ bất kỳ trạng thái nhất thời nào chúng sẽ phát hiện khi khởi động.


1

Trên thực tế không có giải pháp nào thỏa đáng trong lĩnh vực này. Chúng tôi đã thử tất cả. giải pháp kịch bản, cron với nhịp tim / máy tạo nhịp tim và nhiều hơn nữa. Giải pháp duy nhất, cho đến gần đây, là một giải pháp lưới. tự nhiên đây không phải là điều chúng ta muốn thấy vì cách giải pháp lưới nhiều hơn một chút so với mức quá mức cho kịch bản.

Đó là lý do tại sao tôi bắt đầu dự án CronBalancer. hoạt động chính xác như một máy chủ cron bình thường ngoại trừ phân phối, cân bằng tải và HA (khi hoàn thành). Hiện tại 2 điểm đầu tiên đã kết thúc (beta) và hoạt động với tệp crontab tiêu chuẩn.

khuôn khổ HA được đưa ra. tất cả những gì còn lại là tín hiệu cần thiết để xác định các hành động thất bại và phục hồi.

http://sourceforge.net/projects/cronbalancer/

cười thầm


1

Tôi đã sử dụng trình xử lý sự kiện Nagios như một giải pháp đơn giản.

Trên máy chủ NRPE:

command[check_crond]=/usr/lib64/nagios/plugins/check_procs -c 1: -C crond
command[autostart_crond]=sudo /etc/init.d/crond start
command[stop_crond]=sudo /etc/init.d/crond stop

Đừng quên thêm nagiosngười dùng vào nhóm sudoers:

nagios  ALL=(ALL)   NOPASSWD:/usr/lib64/nagios/plugins/, /etc/init.d/crond

và vô hiệu hóa requiretty:

Defaults:nagios !requiretty

Trên máy chủ Nagios:

dịch vụ.cfg

define service{
    use                     generic-service
    host_name               cpc_3.145
    service_description     crond
    check_command           check_nrpe!check_crond
    event_handler           autostart_crond!cpc_2.93
    process_perf_data       0
    contact_groups          admin,admin-sms
}

lệnh.cfg

define command{
    command_name    autostart_crond
    command_line    $USER1$/eventhandlers/autostart_crond.sh $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$ $ARG1$
}

autostart_crond.sh

#!/bin/bash

case "$1" in
    OK)
        /usr/local/nagios/libexec/check_nrpe -H $4 -c stop_crond
        ;;
    WARNING)
        ;;
    UNKNOWN)
        /usr/local/nagios/libexec/check_nrpe -H $4 -c autostart_crond
        ;;
    CRITICAL)
        /usr/local/nagios/libexec/check_nrpe -H $4 -c autostart_crond
        ;;
esac

exit 0

nhưng tôi đã chuyển sang sử dụng Pacemaker và Corosync vì đây là giải pháp tốt nhất để đảm bảo rằng tài nguyên chỉ chạy trên một nút tại một thời điểm.

Đây là các bước tôi đã làm:

Xác minh rằng tập lệnh init crond tuân thủ LSB . Trên CentOS của tôi, tôi phải thay đổi trạng thái thoát từ 1 thành 0 (nếu bắt đầu chạy hoặc dừng dừng) để phù hợp với yêu cầu:

start() {
    echo -n $"Starting $prog: " 
    if [ -e /var/lock/subsys/crond ]; then
        if [ -e /var/run/crond.pid ] && [ -e /proc/`cat /var/run/crond.pid` ]; then
            echo -n $"cannot start crond: crond is already running.";
            failure $"cannot start crond: crond already running.";
            echo
            #return 1
            return 0
        fi
    fi

stop() {
    echo -n $"Stopping $prog: "
    if [ ! -e /var/lock/subsys/crond ]; then
        echo -n $"cannot stop crond: crond is not running."
        failure $"cannot stop crond: crond is not running."
        echo
        #return 1;
        return 0;
    fi

sau đó có thể thêm nó vào Máy tạo nhịp bằng cách sử dụng:

# crm configure primitive Crond lsb:crond \
        op monitor interval="60s"

cấu hình crm hiển thị

node SVR022-293.localdomain
node SVR233NTC-3145.localdomain
primitive Crond lsb:crond \
        op monitor interval="60s"
property $id="cib-bootstrap-options" \
        dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \
        cluster-infrastructure="openais" \
        expected-quorum-votes="2" \
        stonith-enabled="false" \
        no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
        resource-stickiness="100"

tình trạng crm

============
Last updated: Fri Jun  7 13:44:03 2013
Stack: openais
Current DC: SVR233NTC-3145.localdomain - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ SVR022-293.localdomain SVR233NTC-3145.localdomain ]

 Crond  (lsb:crond):    Started SVR233NTC-3145.localdomain

Kiểm tra chuyển đổi dự phòng bằng cách dừng Pacemaker và Corosync vào 3.145:

[root@3145 corosync]# service pacemaker stop
Signaling Pacemaker Cluster Manager to terminate:          [  OK  ]
Waiting for cluster services to unload:......              [  OK  ]

[root@3145 corosync]# service corosync stop
Signaling Corosync Cluster Engine (corosync) to terminate: [  OK  ]
Waiting for corosync services to unload:.                  [  OK  ]

sau đó kiểm tra trạng thái cụm trên 2,93:

============
Last updated: Fri Jun  7 13:47:31 2013
Stack: openais
Current DC: SVR022-293.localdomain - partition WITHOUT quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ SVR022-293.localdomain ]
OFFLINE: [ SVR233NTC-3145.localdomain ]

Crond   (lsb:crond):    Started SVR022-293.localdomain

0

Làm cho nó thực thi / không thực thi trên một máy cụ thể là chuyện nhỏ. Hoặc có một tập lệnh đặt một công việc định kỳ vào /etc/cron.d, như bạn đề xuất hoặc có tập lệnh vĩnh viễn trong /etc/cron.d, nhưng để chính tập lệnh thực hiện kiểm tra chuyển đổi dự phòng và quyết định có thực hiện hay không.

Phần chung (thiếu) trong cả hai phần này là cách tập lệnh kiểm tra xem tập lệnh trên máy kia có đang chạy hay không.

Không có thêm thông tin về những gì bạn đang cố gắng làm, điều này thật khó để trả lời.


0

Tôi thích Rcron cho vấn đề đặc biệt này. Bạn có một tệp trạng thái, đơn giản chỉ nói "hoạt động" hoặc "thụ động" và nếu nó hoạt động, cron của bạn sẽ chạy trên một máy nhất định. Nếu tập tin trạng thái được đặt thành thụ động, nó sẽ không chạy. Đơn giản như thế.

Bây giờ, bạn có thể sử dụng RedHat Cluster Suite hoặc bất kỳ phần mềm trung gian phân cụm nào khác để quản lý các tệp trạng thái trên cụm của bạn hoặc bạn có thể tự kích hoạt hoạt động trên một nút nhất định và đó là nút đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.