Bagaimana cara melakukan failover pekerjaan cron?

8

Menggunakan dua server Debian, saya perlu mengatur lingkungan failover yang kuat untuk pekerjaan cron yang hanya dapat dipanggil pada satu server pada suatu waktu.

Memindahkan file di /etc/cron.d harus melakukan trik, tetapi apakah ada solusi HA sederhana untuk mengoperasikan tindakan seperti itu? Dan jika mungkin tidak dengan detak jantung;)

Falken
sumber
Sebagai catatan, saya akhirnya menggunakan detak jantung untuk melakukan pekerjaan itu. Namun ada solusi yang lebih mudah, jika mesin Anda berada di subnet yang sama dan dapat melakukan multicast, saya akan merekomendasikan menggunakan ucarp. Jauh lebih sederhana daripada detak jantung -> ucarp.org
Falken
1
rcron? Gnubatch? Wayang?
symcbean
Saya kedua rcron. Saat ini saya menggunakannya dan memiliki pengaturan yang hampir sama (2 server ubuntu di belakang loadbalancer).
Ali

Jawaban:

5

Saya pikir detak jantung / alat pacu jantung akan menjadi solusi terbaik, karena mereka dapat menangani banyak kondisi balapan, pagar, dll untuk Anda untuk memastikan pekerjaan hanya berjalan pada satu host pada satu waktu. Dimungkinkan untuk merancang sesuatu sendiri, tetapi kemungkinan tidak akan menjelaskan semua skenario yang dilakukan paket-paket itu, dan pada akhirnya Anda akan mengganti sebagian besar, jika tidak semua, roda.

Jika Anda tidak benar-benar peduli tentang hal-hal seperti itu dan Anda menginginkan pengaturan yang lebih sederhana. Saya sarankan beberapa pekerjaan cron mengejutkan di server beberapa menit. Kemudian ketika pekerjaan dimulai pada yang utama, entah bagaimana ia dapat meninggalkan penanda pada sumber daya apa pun yang dibagikan tempat pekerjaan itu beroperasi (Anda tidak menentukan ini, jadi saya sengaja tidak jelas). Jika ini adalah database, mereka dapat memperbarui bidang dalam tabel atau jika itu pada sistem file bersama mengunci file.

Ketika pekerjaan berjalan di server kedua, ia dapat memeriksa keberadaan penanda dan membatalkan jika ada.

Kamil Kisiel
sumber
1

Kami menggunakan dua pendekatan tergantung pada persyaratan. Keduanya melibatkan memiliki crons hadir dan berjalan dari semua mesin, tetapi dengan sedikit kewarasan yang terlibat:

  1. Jika mesin berada dalam hubungan primer dan sekunder (mungkin ada lebih dari satu sekunder) maka skrip dimodifikasi untuk memeriksa apakah mesin yang mereka jalankan adalah keadaan primer. Jika tidak, maka mereka cukup keluar dengan tenang. Saya tidak memiliki pengaturan HB untuk diserahkan saat ini tetapi saya yakin Anda dapat meminta HB untuk informasi ini.

  2. Jika semua mesin adalah primary yang memenuhi syarat (seperti dalam sebuah cluster) maka beberapa penguncian digunakan. Dengan cara baik database bersama atau file PID. Hanya satu mesin yang pernah mendapatkan status kunci dan yang tidak keluar dengan tenang.

Dan Carley
sumber
1

Untuk mempersingkat cerita, Anda harus mengubah skrip cron Anda menjadi semacam aplikasi cluster-mampu. Menjadi implementasi yang ringan atau seberat yang Anda butuhkan, mereka masih memerlukan satu hal - dapat melanjutkan / memulai kembali tindakan (atau memulihkan keadaan mereka) dengan benar setelah kegagalan simpul primer. Kasus sepele adalah bahwa mereka adalah program stateless (atau "stateless cukup" program), yang dapat dengan mudah dimulai kembali kapan saja dan akan baik-baik saja. Ini mungkin bukan kasus Anda. Perhatikan bahwa untuk program stateless Anda tidak perlu failover karena Anda bisa menjalankannya secara paralel di semua node.

Dalam kasus yang biasanya rumit, skrip Anda harus berada di penyimpanan bersama cluster, harus menyimpan statusnya dalam file di sana, harus mengubah status yang disimpan pada disk hanya secara atomik, dan harus dapat melanjutkan tindakan mereka dari keadaan sementara apa pun yang akan mereka deteksi pada startup.

kubanczyk
sumber
1

Sebenarnya tidak ada solusi yang memuaskan di bidang ini. Kami sudah mencoba semuanya. solusi scripting, cron dengan detak jantung / alat pacu jantung dan banyak lagi. Satu-satunya solusi, sampai saat ini, adalah solusi grid. tentu saja ini bukan yang kita inginkan melihat bagaimana solusi grid sedikit lebih banyak daripada skenario untuk skenario.

Itu sebabnya saya memulai proyek CronBalancer. bekerja persis seperti server cron normal kecuali didistribusikan, load-balance dan HA (saat selesai) Saat ini 2 poin pertama selesai (beta) dan berfungsi dengan file crontab standar.

kerangka kerja HA sudah ada. yang tersisa hanyalah pensinyalan yang diperlukan untuk menentukan tindakan gagal-atas dan memulihkan.

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

membuang

Charles Williams
sumber
1

Saya telah menggunakan event handler Nagios sebagai solusi sederhana.

Di server 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

Jangan lupa menambahkan nagiospengguna ke grup sudoers:

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

dan nonaktifkan requiretty:

Defaults:nagios !requiretty

Di server Nagios:

layanan.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
}

Command.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

tetapi saya telah beralih untuk menggunakan Pacemaker dan Corosync karena ini adalah solusi terbaik untuk memastikan bahwa sumber daya hanya berjalan pada satu simpul pada satu waktu.

Inilah langkah-langkah yang telah saya lakukan:

Pastikan skrip init crond sesuai dengan LSB . Pada CentOS saya, saya harus mengubah status keluar dari 1 ke 0 (jika mulai menjalankan atau menghentikan yang berhenti) agar sesuai dengan persyaratan:

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

kemudian dapat ditambahkan ke Alat Pacu Jantung dengan menggunakan:

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

crm configure show

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"

status 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

Menguji kegagalan dengan menghentikan Pacemaker dan Corosync pada 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  ]

kemudian periksa status kluster pada 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
kuanta
sumber
0

Membuatnya mengeksekusi / tidak mengeksekusi pada mesin tertentu itu sepele. Entah memiliki skrip yang meletakkan pekerjaan cron di /etc/cron.d, seperti yang Anda sarankan, atau minta skrip secara permanen di /etc/cron.d, tetapi minta skrip itu sendiri untuk memeriksa failover dan memutuskan apakah akan mengeksekusi.

Bagian umum (hilang) dalam kedua ini adalah bagaimana skrip memeriksa untuk melihat apakah skrip di mesin lain sedang berjalan.

Tanpa informasi lebih lanjut tentang apa yang Anda coba lakukan, ini sulit dijawab.

Schof
sumber
0

Saya lebih suka Rcron untuk masalah khusus ini. Anda memiliki file status, yang hanya mengatakan "aktif" atau "pasif", dan jika itu aktif, cron Anda akan berjalan pada mesin tertentu. Jika file status disetel ke pasif, file itu tidak akan berjalan. Sederhana seperti itu.

Sekarang, Anda dapat menggunakan RedHat Cluster Suite atau middleware pengelompokan lainnya untuk mengelola file status di seluruh cluster Anda, atau Anda dapat secara manual mengatur aktif pada node tertentu dan hanya itu.

Jakov Sosic
sumber