Saya mencoba untuk mencapai penerapan downtime nol sehingga saya dapat menggunakan lebih sedikit selama jam-jam off dan lebih banyak selama jam-jam "lebih lambat" - atau kapan saja, secara teori.
Setup saya saat ini, agak disederhanakan:
- Web Server A (.NET App)
- Server Web B (Aplikasi .NET)
- Database Server (SQL Server)
Proses penyebaran saya saat ini:
- "Hentikan" situs di Server Web A dan B
- Tingkatkan skema basis data untuk versi aplikasi yang digunakan
- Perbarui Server Web A
- Perbarui Server Web B
- Bawa semuanya kembali online
Masalah saat ini
Ini menyebabkan sejumlah kecil downtime setiap bulan - sekitar 30 menit. Saya melakukan ini di luar jam kerja, jadi itu bukan masalah besar - tapi itu adalah sesuatu yang saya ingin hindari.
Juga - tidak ada cara untuk benar-benar kembali. Saya biasanya tidak membuat skrip DB rollback - hanya skrip upgrade.
Memanfaatkan Load Balancer
Saya ingin sekali dapat meningkatkan satu Server Web sekaligus. Keluarkan Web Server A dari load balancer, tingkatkan, pasang kembali online, lalu ulangi untuk Web Server B.
Masalahnya adalah database. Setiap versi dari perangkat lunak saya perlu dijalankan terhadap versi database yang berbeda - jadi saya agak "mandek".
Kemungkinan Solusi
Solusi saat ini yang saya pertimbangkan adalah mengadopsi aturan berikut:
- Jangan pernah menghapus tabel database.
- Jangan pernah menghapus kolom basis data.
- Jangan pernah mengganti nama kolom basis data.
- Jangan pernah memesan ulang kolom.
- Setiap prosedur yang tersimpan harus diversi.
- Artinya - 'spFindAllThings' akan menjadi 'spFindAllThings_2' saat diedit.
- Kemudian menjadi 'spFindAllThings_3' saat diedit lagi.
- Aturan yang sama berlaku untuk tampilan.
Sementara, ini tampaknya agak ekstrem - saya pikir itu menyelesaikan masalah. Setiap versi aplikasi akan memukul DB dengan cara yang tidak melanggar. Kode mengharapkan hasil tertentu dari tampilan / prosedur tersimpan - dan ini membuat 'kontrak' itu valid. Masalahnya adalah - itu hanya merembes ceroboh. Saya tahu saya bisa membersihkan prosedur lama yang tersimpan setelah aplikasi dikerahkan untuk sementara waktu, tetapi hanya terasa kotor. Juga - itu tergantung pada semua pengembang mengikuti aturan ini, yang sebagian besar akan terjadi, tapi saya membayangkan seseorang akan membuat kesalahan.
Akhirnya - Pertanyaan Saya
- Apakah ini ceroboh atau berantakan?
- Adakah yang melakukannya dengan cara ini?
- Bagaimana orang lain memecahkan masalah ini?