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;)
Jawaban:
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.
sumber
Kami menggunakan dua pendekatan tergantung pada persyaratan. Keduanya melibatkan memiliki crons hadir dan berjalan dari semua mesin, tetapi dengan sedikit kewarasan yang terlibat:
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.
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.
sumber
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.
sumber
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
sumber
Saya telah menggunakan event handler Nagios sebagai solusi sederhana.
Di server NRPE:
Jangan lupa menambahkan
nagios
pengguna ke grup sudoers:dan nonaktifkan
requiretty
:Di server Nagios:
layanan.cfg
Command.cfg
autostart_crond.sh
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:
kemudian dapat ditambahkan ke Alat Pacu Jantung dengan menggunakan:
crm configure show
status crm
Menguji kegagalan dengan menghentikan Pacemaker dan Corosync pada 3.145:
kemudian periksa status kluster pada 2.93:
sumber
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.
sumber
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.
sumber