Arıza süresine neden olmadan üretim codebase / veritabanı şemasını nasıl güncellersiniz?


42

Bir kesinti süresine neden olmadan bir üretim sunucusunun kod tabanı / veritabanı şemasını güncellemek için bazı teknikler nelerdir?


1
Güzel soru, çünkü birçok insanın bunu görmezden geldiğini görüyorum. Vakit nakittir ve kesinti sebebi ne kadar yasal olursa olsun, son kullanıcılar için asla iyi görünmez.
Dan McGrath

@Dan McGrath: aslında bir aksama süresine sahip olabileceğinizi varsayalım, yılda sadece 4 kez (çeyrek kesinti) ve her seferinde maksimum 15 dakika (trafiğin kuyruğu sırasında) en fazla 15 dakika süren bir sistem için çalışıyorum. .. veritabanı değişiklikleri yoğun biçimde inceleniyor :)
Matthieu M.

2
Bu birkaç saat içinde halka açık beta olan dba.stackexchange.com için harika bir soru olacaktır .
Larry Coleman

Yanıtlar:


20

Genel olarak, üzerinde çalıştığım web sitelerinin bu tür bir gereksinimi vardı, hepsi yük dengeleyicilerin arkasındaydı veya ayrı yük devretme konumlarına sahipti. Bu örnekte, tek bir yük dengeleyicinize, 2 web sunucusuna (A & B) ve 2 veritabanı sunucusuna (M & N - genellikle DB sunucularının logshipping yoluyla bağlı olduğunu - en azından SQL Server dünyasında olduğunu varsayalım. ).

  1. Webserver A'nın yük dengeleyici ile bağlantısı kesilecek (böylece gelen tüm trafik B'ye gidiyor).
  2. Günlük gönderimi durduruldu (DB Server M önce güncellenecek).
  3. Webserver'ı Güncelleyin A. Konfigürasyonu DB Server M'ye yönlendirin.
  4. Güncellemenin işe yarayıp yaramadığını test edin ve doğrulayın (genellikle millet doğrudan IP adresine isabet ediyor).
  5. Yük dengeleyicisini, mevcut oturumlar B'ye devam edecek şekilde ayarlayın. Yeni oturumlar A'ya gider.
  6. B süresinin dolmasıyla ilgili tüm oturumları bekleyin (yarım saat veya daha fazla olabilir, genellikle trafiği izleriz ve 1 saatlik bir mola verdik).
  7. B ve N Güncellemesi
  8. Güncelleştirmenin çalıştığını test edin ve doğrulayın.
  9. Günlük gönderimini yeniden ayarlayın ve çalışıp çalışmadığını test edin.
  10. Yük dengeleyiciyi normal çalışmaya ayarlayın.

Çok karmaşık bir web uygulamasında, 1-5 arasındaki adımlar olarak tanımlananlar bütün gece sürebilir ve zamanları ve acil durum irtibat numaralarını içeren 50 sayfalık bir Excel tablosu olabilir. Bu gibi durumlarda, sistemin yarısının güncellenmesi 6: 00-18: 00 saatleri arasında gerçekleştirilirken, sistem kullanıcılara açık kalmaktadır. DR sitesi güncellemesinin yapılması genellikle ertesi gece için planlanıyor; ilk gün hiçbir şeyin bozulmadığını umuyoruz.

Çalışma süresinin bir gereksinim olduğu durumlarda, yamalar öncelikle ideal olarak üretim ile aynı donanım olan QA ortamında test edilir. Kesinti göstermezlerse, genellikle hafta sonları normal olan programa uygulanabilirler.


7
DB M ve DB N'den yeni verileri nasıl birleştirmeyi öneriyorsunuz? Her ikisinde de, diğerinde olmayan yeni, güncellenmiş ve silinmiş kayıtlar olacaktır.
altmış

@Tangurena, yukarıdaki yorumu cevaplayabilir misiniz?
sino

9

Tipik veritabanları için (örneğin Oracle), sorguları paralel olarak çalıştırırken veritabanı şemasını değiştirmek mümkündür. Yine de bazı ileri planlama gerektirir.

Bunların uygulanacak değişimin bazı kısıtları vardır:

  • mevcut kodla çalışmalıdır, yani kod şemanın hem eski hem de yeni sürümleriyle ilgilenmelidir.
  • DB üzerinde işlem yapmaz, işlemlerin durmasına neden olur (sana bakıyorum CREATE INDEX)
  • veri kaybına neden olmamalıdır (bir tabloyu bırakıp yeniden oluşturamazsınız)

Şemanın geriye dönük uyumlu olması için, genellikle bir sütunu ekleyebilir veya değiştirebilir, mevcut kodun artık kullanmaması durumunda yalnızca bir şeyi DROP yapabilirsiniz.

Kodunuz değişikliği şeffaf bir şekilde işleyemiyorsa, veritabanını değiştirmeden önce kodu değiştirin.

İleriye yönelik planlama konusunda basit tavsiyeler: DB taleplerinizde her zaman sütun adlarını belirtin (kullanmayın SELECT * FROM). Bu şekilde eski isteklerde ortaya çıkan yeni sütunlarınız olmaz.


1
Aslında, ileri planlama ve uyarlanabilirlik için, * arasından seçim yapmak, sütunların manuel olarak listelenmesinden kesinlikle daha iyidir. Açık sütun adlarının kullanılması çoğu durumda çok fazla teknik borçla sonuçlanır. Kodunuz yeni sütunlardan koparsa, kodunuz zaten bozuldu.
Morg.

@Morg .: Pek değil. Güvenlik için size bağlama değişkenleri kullanmak zorunda olduğu çerçeve I kullanımı (en azından) için yazma değişkenler sağlayarak gerektirir ve dolayısıyla çıkış sütunları olduğu gibi birçok değişkene tam olarak olması gerekir yılında select *araçlarının bu kod aralarının ise yeni sütun eklenir (yazacak değişken olmaması için). Tabii ki, bu kesinlikle yazılan bir dil kullanmanın sonucu olabilir.
Matthieu M.

Evet, gerçekten * seçiminden kaçınmak için ek bir güvenlik yoktur. Çokça yazılmış dillerle ve çok kötü tasarımla ilgili hiçbir şey yapmaz. Çerçeveniz değişimi sorunsuzca yapamıyorsa, işe yaramaz. Bir sütunu değiştirdiğimde uygulamam hiç çalışmayı bırakmıyor. Bunu yaptığınızda kırılıyor. Hangisinin daha güvenilir veya güvenli olduğuna dair herhangi bir soru olduğunu sanmıyorum.
Morg.

@Morg .: Nasıl select *daha güvenilir ve güvenli olduğunu göremiyorum . Eskiden sahip select one, two from ...olsaydın, sadece oneve two; eğer thirdmasaya eklenirse, o zaman (burada) kullanmazsınız, bu nedenle onu almak için hiçbir neden yoktur. Birden kullanmanız gerekiyorsa, kodu değiştireceksiniz, bu nedenle sorguyu bu noktada de değiştirebilirsiniz!
Matthieu M.

@Morg .: Eh, muhtemelen deneyimlerimiz farklı olduğu için birbirimizden konuşuyoruz. Performansın olağanüstü bir özellik olduğu ürünler üzerinde çalışıyorum ve bu select, mümkün olduğu kadar seçici olması gerektiği (ve bir endeks tarafından kapsanan) gerektiği anlamına geliyor, aksi halde tost (zorunluluk olan birleşimlerden önce). Bunu söylediğim için üzgünüm ama açıkladığınız yaklaşım bu ürünlerde tam bir başarısızlıktı.
Matthieu M.

5

Bütün sistemler yapamaz, onu destekleyecek şekilde kurulmalıdır.

Örneğin, birkaç yıl önce güncellemeye yardımcı olduğum büyük sistemlerimizden biri 7 gün 24 saat hizmete hazır olmalıdır. Site dışı Kullanıcı Arabirimi Katmanı ve İş Katmanı arasında saf bir iletişim katmanı da dahil olmak üzere birden çok katmandan oluşuyordu. İletişim katmanının kodlanma şekli nedeniyle, İş Katmanına veya DB şemasına gelecekteki herhangi bir değişiklik gerçek bir kesinti olmadan uygulanabilir. En kötü senaryoda, kullanıcı değişikliklerin yürürlüğe girmesiyle 10-30 saniyelik bir duraklama yaşayabilir.

Değişiklikler tamamen iş katmanındaki kod değişiklikleri olsaydı, sıraya alınabilir ve yalnızca milisaniye gecikmeyle 'çevrilebilir'.

Bunu yapabilirdi çünkü:

  • İletişim katmanı mesajları tutabilir. Bu, UI'yi bırakmaya gerek kalmadan UI Katmanı dışındaki katmanların hiçbirinde gerçek bir kesinti olmamıza izin verdi.
  • MVDB tarafından UniData adı verilen İş Katmanı . Bu, tüm kodu bellekte tutar. Kod derledikten sonra, yeni nesne kodunu belleğe zorlamak için eskisini değiştirerek bir komut kullanabilirsiniz.

Diğer teknikler, işlemlerin mevcut sistemin başka bir aynasına çoğaltılmasını içerir. Güncellemeyi bire uygulayarak, güncelleme ve değiştirme arasında yapılan tüm işlemleri değiştirme ve tekrarlama. Yine de sisteminize bağlı olarak YMMV.


1

İşte gömülü veritabanı sistemleri ve gömülü sistemler dünyasından farklı bir bakış açısı. Gömülü sistemler çeşitli ağ / telekomünikasyon altyapı ekipmanlarını içerir ve bu alanda genellikle% 99,999 (beş 9s) çalışma süresi hakkında konuşurlar.

Biz (McObject), eXtremeDB Yüksek Kullanılabilirliği de dahil olmak üzere eXtremeDB gömülü veritabanı sistemi ürün ailesinin satıcısıyız.

Öncelikle, "gömülü veritabanı" nın, veritabanı sisteminin uygulama kodunuzla derlenmiş ve bağlantılı bir kütüphane olduğunu ifade eder; Bu anlamda, uygulamanıza "gömülü" dir.

EXtremeDB Yüksek Kullanılabilirlik ile, uygulamanızın (bir veya birkaç işlem olabilir) MASTER örneği ve uygulamanızın bir veya daha fazla REPLICA örneği vardır. Bir kopya ana ile bağlantı kurduğunda, ana veri tabanının bir kopyasını "ilk senkronizasyon" adı verilen bir işlemle alır. Master uygulama çalışmalarına devam ederken bu yapılabilir. Senkronize edildiğinde, master'in işlemlerini çoğaltma yoluyla alır. Bu nedenle, bir çoğaltma her zaman geçerli verilere sahiptir ve yöneticinin başarısız olması durumunda (yerine çalışma adı verilen bir işlemle) devralabilir.

İlk senkronizasyonun bir özelliği “ikili şema evrimi” olarak adlandırılıyor. Düz İngilizce olarak, bu, kopyaların veritabanını doldurma işleminin kopyaların veritabanı şeması ile ana veritabanı şeması arasındaki farklılıkları barındıracağı anlamına gelir.

Uygulamada bu, uygulamanızın daha yeni bir sürümünü (yeni / bırakılan tablolar, yeni / bırakılan / değiştirilen alanlar, yeni / bırakılan dizinlerle) oluşturabileceğiniz, uygulamanızın bu yeni sürümünü bir ana programa ekleyebileceğiniz ve daha sonra yeni ana kopya olmak için daha yeni bir çoğaltma (yani yeni ana kopyalamaya bir yük devretme zorlar, böylece ana olur ve eski ana kendini kapatır). Voila, sisteminizin kullanılabilirliğini kesmeden başvurunuzu sürüm N'den N + 1'e yükselttiniz. Şimdi eski ana ve diğer kopyaları N + 1 sürümüne yükseltmeye devam edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.