Mencapai Zero Downtime Deployment menyentuh pada masalah yang sama tetapi saya memerlukan beberapa saran tentang strategi yang saya pertimbangkan.
Konteks
Aplikasi berbasis web dengan Apache / PHP untuk pemrosesan sisi server dan MySQL DB / sistem file untuk kegigihan.
Kami sedang membangun infrastruktur. Semua perangkat keras jaringan akan memiliki redundansi dan semua kabel jaringan utama akan digunakan dalam pasangan terikat untuk toleransi kesalahan. Server dikonfigurasikan sebagai pasangan ketersediaan tinggi untuk toleransi kesalahan perangkat keras dan akan seimbang beban untuk toleransi kesalahan mesin virtual dan kinerja umum.
Adalah maksud saya bahwa kami dapat menerapkan pembaruan ke aplikasi tanpa down-time. Saya telah bersusah payah ketika merancang infrastruktur untuk memastikan bahwa saya dapat menyediakan 100% up-time; akan sangat mengecewakan untuk memiliki downtime 10-15 menit setiap kali pembaruan diterapkan. Ini sangat penting karena kami bermaksud memiliki siklus rilis yang sangat cepat (kadang-kadang dapat mencapai satu atau lebih rilis per hari.
Topologi Jaringan
Ini adalah ringkasan dari jaringan:
Load Balancer
|----------------------------|
/ / \ \
/ / \ \
| Web Server | DB Server | Web Server | DB Server |
|-------------------------|-------------------------|
| Host-1 | Host-2 | Host-1 | Host-2 |
|-------------------------|-------------------------|
Node A \ / Node B
| / |
| / \ |
|---------------------| |---------------------|
Switch 1 Switch 2
And onward to VRRP enabled routers and the internet
Catatan: Server DB menggunakan replikasi master-master
Strategi yang Disarankan
Untuk mencapai ini, saya saat ini sedang berpikir untuk memecah skrip upgrade skema DB menjadi dua bagian. Upgrade akan terlihat seperti ini:
- Web-Server pada node A diambil secara off-line; lalu lintas terus diproses oleh web-server pada node B.
- Perubahan Skema Transisi diterapkan ke server DB
- Web-Server Basis kode diperbarui, cache dihapus, dan tindakan pemutakhiran lainnya diambil.
- Web-Server A dibawa online dan web-server B diambil offline.
- Basis-kode-B server-web diperbarui, cache dihapus, dan tindakan pemutakhiran lainnya diambil.
- Web-server B dibawa online.
- Perubahan Skema Akhir diterapkan ke DB
'Skema Transisi' akan dirancang untuk membuat DB yang kompatibel dengan versi silang. Ini sebagian besar akan menggunakan tampilan tabel yang mensimulasikan skema versi lama sementara tabel itu sendiri akan diubah ke skema baru. Ini memungkinkan versi lama untuk berinteraksi dengan DB seperti biasa. Nama tabel akan menyertakan nomor versi skema untuk memastikan bahwa tidak akan ada kebingungan tentang tabel yang akan ditulis.
'Skema Akhir' akan menghapus kompatibilitas ke belakang dan merapikan skema.
Pertanyaan
Singkatnya, akankah ini berhasil?
lebih spesifik:
Apakah akan ada masalah karena potensi untuk menulis bersamaan pada titik tertentu dari perubahan skema transisi? Apakah ada cara untuk memastikan bahwa grup kueri yang memodifikasi tabel dan membuat tampilan yang kompatibel mundur dijalankan secara berurutan? yaitu dengan kueri lain yang disimpan dalam buffer hingga perubahan skema selesai, yang umumnya hanya dalam milidetik.
Apakah ada metode yang lebih sederhana yang memberikan tingkat stabilitas ini sementara juga memungkinkan pembaruan tanpa down-time? Ini juga lebih disukai untuk menghindari strategi skema 'evolusi' karena saya tidak ingin menjadi terkunci dalam kompatibilitas skema mundur.