Sıfır Kesinti Dağıtımının başarılması aynı konuya değindi ancak düşündüğüm bir strateji hakkında tavsiyeye ihtiyacım var.
bağlam
Sunucu tarafı işleme için Apache / PHP ve kalıcılık için MySQL DB / dosya sistemi ile web tabanlı bir uygulama.
Şu anda altyapıyı inşa ediyoruz. Tüm ağ donanımlarında artıklık olacaktır ve tüm ana ağ kabloları hataya dayanıklılık için bağlı çiftlerde kullanılacaktır. Sunucular, donanım hata toleransı için yüksek kullanılabilirlik çiftleri olarak yapılandırılmaktadır ve hem sanal makine hata toleransı hem de genel performans için yük dengeli olacaktır.
Amacım, herhangi bir kesinti olmadan uygulamaya güncellemeler uygulayabilmektir. Altyapıyı tasarlarken% 100 çalışma süresi sağlayabilmem için büyük özen gösterdim; her güncelleme uygulandığında 10-15 dakika kesinti süresi olması son derece hayal kırıklığı yaratacaktır. Bu çok hızlı bir salım döngüsüne sahip olmayı planladığımız için özellikle önemlidir (bazen günde bir veya daha fazla sürüme ulaşabilir.
Ağ topolojisi
Bu ağın bir özetidir:
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
Not: DB sunucuları ana-ana çoğaltma kullanır
Önerilen Strateji
Bunu başarmak için şu anda DB şeması yükseltme komut dosyalarını iki parçaya bölmeyi düşünüyorum. Yükseltme şöyle görünecektir:
- A düğümündeki Web Sunucusu çevrimdışı alınır; trafik B düğümünde web sunucusu tarafından işlenmeye devam eder.
- Geçiş Şeması değişiklikleri DB sunucularına uygulanır
- Web Sunucusu Kod tabanı güncellenir, önbellekler temizlenir ve diğer tüm yükseltme işlemleri gerçekleştirilir.
- Web Sunucusu A çevrimiçi duruma getirilir ve Web sunucusu B çevrimdışı duruma getirilir.
- Web sunucusu B kod tabanı güncellenir, önbellekler temizlenir ve diğer yükseltme işlemleri gerçekleştirilir.
- Web sunucusu B çevrimiçi duruma getirildi.
- Son Şema değişiklikleri DB'ye uygulanır
'Geçiş Şeması', sürümler arası uyumlu bir DB oluşturmak için tasarlanacaktır. Bu çoğunlukla tablonun kendisi yeni şemaya değiştirilirken eski sürüm şemasını simüle eden tablo görünümlerinden faydalanır. Bu, eski sürümün DB ile normal şekilde etkileşime girmesini sağlar. Tablo adları, hangi tabloya yazılacağı konusunda karışıklık olmamasını sağlamak için şema sürüm numaralarını içerir.
'Nihai Şema' geriye doğru uyumluluğu kaldıracak ve şemayı düzenleyecektir.
Soru
Kısacası, bu işe yarar mı?
daha spesifik olarak:
Geçiş şeması değişikliğinin belirli noktasında eşzamanlı yazma potansiyeli nedeniyle sorunlar olacak mı? Tabloyu değiştiren ve geriye dönük uyumlu görünüm oluşturan sorgu grubunun art arda yürütüldüğünden emin olmanın bir yolu var mı? yani şema değişiklikleri tamamlanıncaya kadar arabellekte tutulan diğer sorgularla (genellikle yalnızca milisaniye olacaktır).
Kesinti olmadan güncellemelere izin verirken aynı zamanda bu derece kararlılığı sağlayan daha basit yöntemler var mı? Geriye doğru şema uyumluluğuna kilitlenmek istemediğim için 'evrimsel' şema stratejisinden kaçınmak da tercih edilir.