Hangi uygulamalar veya araçlar Veritabanlarının Sürekli Dağıtımını sağlar?


17

Sürekli Dağıtım veya Sürekli Altyapı ve kod dağıtımı, veritabanları, özellikle RDBMS'ler için aynı yaklaşımları denemeye kıyasla nispeten basittir. Dağıtım tamamlandığında kod ve altyapı değişmeyecek veya gelişmeyecektir. Bununla birlikte veritabanlarında, şemanın doğal olarak değiştirilebilir bileşenleri olmasa bile verileri yapan yeni veriler eklenir.

Sadece veritabanı nesneleri ekleme, yani tablo ve sütun ekleme, bunları değiştirme veya kaldırma gibi uygulamaların olduğunun farkındayım - veritabanı şemalarına yaklaşmanın bu tamamen ilave yolu, şemaların arka arkaya daha karmaşık bir maliyetle geriye dönük olarak uyumlu olmalarını sağlama avantajına sahiptir. şemalar.

Aynı şekilde , bir şemanın sürümleri arasında yazılacak taşımaların yazılmasına yardımcı olan Flyway ve Ready Roll gibi ürünler de vardır .

Veri tabanı bütünlüğünün önemli olduğu bir üretim ortamına veritabanı şemalarının sürekli olarak dağıtılmasına izin vermek için şu anda başka hangi uygulamalar ve araçlar mevcuttur?


DB'ye erişen kod değişmezse neden DB şema (ları) değişir ya da taşınır? (manuel DB varsayarak, hangi erişir olabilir açıkla)
Dan Cornilescu

Hey @ DanCornilescu, performans sorunlarını azaltmak / gidermek için "dizinler" eklemeye ne dersiniz?
Pierre.Vriens

Açıkçası geleneksel DB'ler hakkında çok az şey biliyorum - soru onların indeksleri için çok iyi olabilir. Değişen dizinler genellikle uygulama kodu değişiklikleri ile birlikte gelen google'ın bulut veri deposunu kullanıyorum. Benim yorumum dürüst bir sorudur, Richard'ın sorusuyla ilgili herhangi bir şekilde "şikayet" değil (ki ben iptal ettim).
Dan Cornilescu

@DanCornilescu Ayrıca (dürüstçe) önceki yorumunuzda yazdıklarınıza inanıyorum (ve önceki yorumum sadece ilk yorumunuzdaki soruya olası bir cevap sağlama girişimiydi). Sonraki (gerçek?) Soru?
Pierre.Vriens

Flyway ilginç bulabilirsiniz flywaydb.org
Thorbjørn Ravn Andersen

Yanıtlar:



11

Mücadeleler


Yalnızca veritabanı nesneleri, yani tablolar ve sütunlar eklemek, bunları asla değiştirmek veya kaldırmak gibi uygulamalar olduğunu biliyorum.

Çalıştığım bir şirkette, yaklaşık 6 aya eşit ve 10 TB'a kadar yuvarlanan ham veriler penceresi. Daha sonra veriler, yaklaşık 10 yıllık raporlanabilir veriyi oluşturan 6 TB kullanılabilir veriye mal olan bir RDBMS formatında işlendi. Mesele şu ki, bu tür uygulamalar basitçe pratik değildir. Depolama pahalıdır - muhtemelen en büyük işlem masrafı. Bu çeşitli ilginç zorluklar sağlar:

  1. Yedeklemeler - innodb eklentileri harika ve hepsi, ancak bu kadar veri üzerindeki yedekleme süreleri sadece pratik değil
  2. Geri yükleme süreleri - büyük veri kümeleri için - özellikle bir geri yüklemenin çalışma durumuna geri dönmesinin ardından yakalamak için çoğaltmaya ihtiyacınız varsa günler hatta haftalar alabilir
  3. Yeni örnekler oluşturma / tohumlama - Genellikle geliştirme / testte yapabileceğiniz iş veri kümenizdeki ETL (Ayıkla, Dönüştür ve Yükle) işlerini içerir. Bunların KG test üniteleri kullanılarak valide edilmesi gerekir, ancak orijinal üretim veri kümesinin korunması için tahribatsız bir şekilde yapılması gerekir. Bir felaketteyken, yedeklemelerin bir sigorta poliçesi olduğunu ve amaçlardan kaçınmak olduğunu anlamak için uzun bir geri yükleme zamanı ile uğraşmaya istekli olabilirsiniz, DevOps geliştirme iş akışı, esasen bir geri yükleme veya verilerinizin düzenli olarak kopyalanması (belki de günde birkaç kez)
  4. Kapasite - Az önce tanımladığım ölçekte bu kadar veriyi saptırmak çok G / Ç yoğun olabilir. Sadece 1-3'te açıklanan sorunları ele almanız gerekmez, ancak üretim sistemlerinizde kesintilere veya performans yavaşlamalarına neden olmayacak şekilde yapmanız gerekir.

Yukarıdaki hususlar daha küçük ölçeklerde endişe kaynağı olmasa da, daha büyük ölçeklerde bunlar büyük sorunlar haline gelir. Bu , gereksinimlerinizi tanımlamanız ve veri kümenizin boyutunu tahmin etmeniz son derece önemlidir .

Gereksinimlerin tanımlanması


Sonuç olarak, birkaç gereksinim tanımlamanız gerekir:

  1. RTO - Yedekleme için RTO veya Geri Yükleme Süresi Hedefi, veritabanı yedekleme çözümlerinin en önemli sürücülerinden biridir. İlk başta, diğer sorunların çoğuyla alakalı görünmese de, "Yeni çözümler oluşturmak veya tohumlamak için yedekleme çözümümü kullanırsam ne olur?" Bir sonraki bölümde bunu yapmak için bazı teknikleri ele alacağım.
  2. RPO - RPO veya Geri Yükleme Noktası Yedekleme hedefi, A) ne kadar geri geri yükleyebileceğinizi (dakika, saat, gün, hafta, ay veya yıl) B) Farklı katmanlardaki yedekleme aralığını ve C) ne kadar ayrıntılı olarak geri yükleyebileceğinizi tanımlar . Örneğin, E-posta veritabanları için, belirli bir E-postayı geri yükleme - genellikle İleti Düzeyi Yedekleri aranır. Benzer şekilde, birkaç gün içindeki verilerin tamamen işe yaramaz olduğunu görebilirsiniz - bu nedenle bir yıl geri yükleme yapmanın bir anlamı yoktur.
  3. Veri kümenizin boyutu - Bu önemlidir, çünkü 1MB'lik bir veritabanı için RTO'nuz çoğu yedek ürün ve çözümle elde edilebilir. Bununla birlikte, 10 TB'lık bir veritabanı için, LTO 3 kasetine tam, satır düzeyinde bir yedeklemenin muhtemelen RTO'nuza ulaşamayacağını ve yedeklemelerin yedekleme pencerenizi aşmaya başladığı için RPO'nuzu etkileyebileceğini göreceksiniz. Bu büyük bir veri kümesinde tam olarak bir mysqldump yapamazsınız, ancak muhtemelen 1MB veritabanında bununla kurtulabilirsiniz.
  4. Veritabanı tutarlılığı - Databses ile çalışırken sürekli dağıtım, site güvenilirliği, ölçeklenebilirlik ve yüksek kullanılabilirlik açısından büyük bir fark yaratan son şey, tutarlılık için gereksiniminizdir (veya eksikliği). Üç temel tür vardır: anında tutarlılık, Tam Zamanında (JIT) tutarlılık ve nihai tutarlılık

Yukarıdaki önemli hususlara ek olarak, lisanslama ve destek gereksinimlerini (açık kaynak veya kapalı kaynak; kurum desteği, üçüncü taraf destek veya satıcı desteği) uygulama / dil gereksinimlerini (birçok veritabanının bağlayıcıları önemli olabilir; kaynak koduna erişiminiz var mı? Kodu yeniden derleyebilir misiniz yoksa bir satıcı tarafından mı sağlanıyor? Yoksa yorumlanmış bir dilde mi çalışıyor?) politik gereksinimler (Kuruluşunuz yalnızca Oracle'a güveniyor mu? ? MySql'e güvenmiyorlar mı? MariaDB veya Postgres hakkında ne düşünüyorsunuz?) Ve veritabanı motoru (innoDB? MyISAM? Kara delik? NDB Kümesi? Örümcek?) Ve geçmiş veya uyumluluk gereksinimleri (PL / SQL yıllarca kodumuzu kullandık oracle motoruna yerleştirilmiştir! MariaDB'ye nasıl geçebiliriz?!?)

Tüm bunlar (sizin için) mevcut araçları önemli ölçüde etkiler.

Şirket içi veri yönetimi için bazı seçenekler


Not: Aşağıdakiler hiçbir şekilde kapsamlı değildir ve diğer SE kullanıcıları ek önerilerle karşılaşmalıdır.

Genel düşünceler yoldan çıktığında, yukarıdakileri ele almak için size bazı teknikler ve teknolojiler sunayım. İlk olarak, kendinize gerçekten bir RDBMS kullanmanız gerekip gerekmediğini veya Hadoop, CouchDB veya hatta Nesneye Dayalı Depolama (hızlı bir şey gibi) ile yapılandırılmamış verilerin bir seçenek olup olmadığını sorun.

İkincisi, bulut tabanlı bir çözüme bakmayı düşünün. Bu, bu baş ağrısının bir kısmını dışa aktarır ve karmaşık sorunları yüksek nitelikli (ve ücretli) kişilere bırakır. Ancak, ölçekte, bunun bütçenize gerçekten uygun olduğunu görebilirsiniz (bulut sağlayıcıları bu konuda kar elde ederler ve belirli bir ölçekte, bu uzmanları kendiniz çalıştırmayı göze alabilirsiniz) veya belirli bir güvenlik veya politik altında çalışıyorsanız gereksinimleri (okuyun: bulutlar yapamayız) hibrit bir NFS / FibreChannel Filer'ı düşünün. NetApp, Pure Storage ve Tegile gibi bu dosyaların çoğu, A) yedek almak, B) Yedekleri geri yüklemek ve C) Yeni yedekleri tohumlamak için çok kullanışlı olabilecek delta tabanlı bir anlık görüntü ve klonlama tekniğini destekler.

Bu noktada, bir yedekleme ve depolama uzmanı olmadığımı not etmeliyim, bu yüzden bu sorunun diğer sorunlara (ve daha yeşil otlaklara) geçmeden önce asla çözemediğim bazı kısımları var.

Ancak bu ürünler, veritabanınızın altında farklı fotoğraflar çekmenizi sağlar. Veritabanı örneklerinizden birine (salt okunur bir slave önerilir) tam bir "okuma kilitli kilit tabloları" komut dosyası yazmanız ve binlog konumunuzu veya GTID'nizi dökmeniz gerekir, ancak bu dosyalamalar için, bu ekleri veritabanınızın yeni örneklerini oluşturmak için kullanma. Binlog'ları ayrı bir bölüme koymak ve bu bölümlere yalnızca veritabanı verilerinizi koymak isteyeceksiniz. Bunu yaptıktan sonra, bu bölümleri klonlayabileceksiniz (NetApps'da, bu bir " FlexClone " olarak bilinir)

Bunun nedeni, her blok için okunan dosyanın verilerin dondurulmuş orijinal anlık görüntüde mi yoksa deltada mı olduğunu belirlemesidir. Birden çok anlık görüntüye sahip birimler / mağazalar için, bunun birden çok kez kontrol edilmesi gerekebilir. Verileri yenileyerek (yani, anlık görüntünüzü atın ve periyodik olarak tekrar klonlayın - bu, iyi bir sürekli dağıtım ortamı için doğal ve organik olarak gerçekleşebilir) veya birimi (NetApp terminolojisinde "Flex Bölme" olarak bilinir) kalıcı olarak bölerek bunun üstesinden gelebilirsiniz. ) deltaları kalıcı olarak çözmek ve tamamen yeni ve ayrı bir birim oluşturmak için biraz zaman alacaktır.

Bu delta klonları, genel depolama gereksiniminizi azaltmanın ek bir avantajına sahiptir - geliştirme, test ve doğrulama işleminizi yapmak için birkaç klon veya üretim veritabanı verilerinizin örneğini oluşturabilirsiniz. Büyük veri kümenizin yalnızca bir kopyasını (küçük olasılıkla) küçük deltaları tutuyorsanız, toplam depolama maliyetinizi ve kapladığı alanı azaltırsınız.

Burada tek hile, "yedekleme" hala dosyalama üzerinde bulunduğu için bunun tam bir yedekleme çözümü oluşturmayabilir olmasıdır. Bunun için NetApp, dosyalayıcılar ve hatta veri merkezleri arasında verileri yansıtacak (rsync tarzı teknolojiyi kullanarak) bir Snap Ayna çağırması veya delta anlık görüntülerinizden birini veya bir bantta yedekleyebileceğiniz bir tür tümleşik yedekleme çözümü kullanmanız gerekebilir. esnek-klonu.

Bununla birlikte, bunun büyük bir kusuru vardır: Tüm verileriniz, test ve prod'unuz hala aynı dosyalayıcı ve depolama kafasında G / Ç kullanıyor. Bu soruna geçici bir çözüm bulmak için, Test ve / veya dev denetleyici için ekim noktası olabilecek ikinci bir dosyalayıcıda bir bağımlı veritabanı örneği oluşturmayı veya üretim katmanınızı üretim isteklerinize yansıtmak için bir yük dengeleyici / uygulama dağıtım denetleyicisi kullanmayı düşünün. test (ve / veya dev) ortamları. Bu, hemen fark edilmeyebilecek sorunlar için üretime geçmeden önce KG / Test ortamınıza üretim trafiğini atmanın ek bir avantajına sahiptir. Daha sonra günlüklerinizi üretim trafiğine ve kullanıcı davranışına göre hatalar için kontrol edebilirsiniz.

Bu daha sonra, sürekli dağıtım yöntemleriyle kullanmak üzere tüm (ve büyük) veri kümelerini programlı olarak oluşturmak ve yok etmek için birkaç komut dosyası kullanmanıza izin vermelidir.

Ölçeklenebilirlik ve Yüksek Kullanılabilirlik

Eğer sürekli dağıtım sorulduğunda da, DevOps daha fazlası ile conserned edilir sadece sürekli dağıtım - Ben fazlalık, ölçeklenebilirlik ve yüksek kullanılabilirliği hakkında bazı bitleri içine gidiyorum yüzden.

JIT'den derhal ve nihai tutarlılıktan bahsettim. Burada varous RDBMS motorları devreye giriyor. Dairesel asenkron çoğaltma yapılandırarak nihai tutarlılık nispeten kolaydır. Ancak bu bazı çakışmalara neden olabilir * (uygulama katmanınız, çoğaltma tamamlanmadan önce kümenin bir tarafındaki ve kümenin diğer tarafındaki verileri güncelleştirirse?) Anında tutarlılık için, eşzamanlı çoğaltmayı zorlayacak Galera kümesine bakın, ancak ölçeklenebilirlik sorunlarına neden oluyor (ağ katmanındaki yayılma gecikmesi nedeniyle önemli gecikmelere neden olmadan Olağanüstü Durum Kurtarma sitenize nasıl kopyalanacak veya bakiyenizi coğrafi olarak nasıl yükleyeceksiniz?) Ayrıca veri merkezi içinde eşzamanlı çoğaltma ve siteler arasında eşzamansız çoğaltma yapıp yapamayacağınızı, ama bu her iki dünyanın en kötüsü gibi görünüyor.

Bununla birlikte, tipik olarak, çoğu insan tam eşzamanlı çoğaltmaya ihtiyaç duymaz - bu genellikle sadece tablo kırma ile çoklu-master'ın gerekli olduğu çok spesifik (ve egzotik) yüksek yazma ortamları için gereklidir. Çoğu uygulama, bir veritabanı proxy'si kullanarak Just-In-Time tutarlılığıyla başa çıkabilir. Örneğin, ScaleArc , Tam Zamanında tutarlılık ve görünüm sağlamak için çoğaltma durumunu izler ve yazma işlemlerinin nereye gittiğini izler (çoğaltma gerçekleşene kadar sonraki okuma isteklerini göndermek için).veritabanı tutarlılığı. ScaleArc, Postgres, MySQL, MariaDB, Oracle ve MSSQL ile uyumludur ve shard tuşlarını kullanamayan uygulamalar için veritabanlarınızı parçalamak / bölümlemek için düzenli ifadeler kullanabilir. Ayrıca, yapılandırma yönetimi yazılımınızın etkileşime girmesi için sağlam bir REST API'sı vardır - ve destek ekibi olağanüstü

Benzer şekilde, MariaDB için MariaDB ekibi tarafından geliştirilen ücretsiz bir alternatif olan MaxScale'i de düşünebilirsiniz . Ancak GUI ve ScaleArc'ın bazı önbellekleme özelliklerinden yoksundur.

Son olarak, MySQL yapısı (ve sadece RAM içi MySQL Kümesi - eğer bu kadar RAM varsa) diğer potansiyellerdir - özellikle MySQL'in yeni vekilinde. Bu, ortamınıza ölçeklenebilirlik ve artıklık bileşeni sağlayabilir.

Postgres ve Oracle, ihtiyacınız olan çoğaltma ve parçalama özelliklerine sahip olmalıdır, ancak proxy'ye ihtiyacınız varsa ScaleArc iyi eşleşecektir.

Sonuçta, tüm bu peices, sadece bulut tabanlı bir ortam kullanamıyorsanız ve bulut sağlayıcınızın yukarıdaki problemleri sizin için halletmesine izin veremiyorsanız, sürekli dağıtım ve geliştirme için uygun oldukça esnek bir ortama katkıda bulunur.


6

Biz kullanmak Flyway Postgres uygulamasında şemaları ve yönetmek için iş yerinde Pillar'ı Cassandra şemaları yönetmek için. Uygulamanın kendi şemasını yönetmesi durumunda en iyi sonucu bulduk.

Uygulamalar kendi şemalarını yönetmeden önce yönetme şemalarına sahip olan korkunç bir deneyim .


6

Şema sorumluluğunu uygulama ekibine kaydırmazsanız, tek başına bir aracın gerçekten yardımcı olmayacağını iddia ediyorum.

Biz kullanan yapmak liquibase veya Flyway uygulama ekibi changesets oluşturmak için sorumludur işin en.

Bununla birlikte, tamamen toplayıcı bir yoldan kaçınabilirsiniz.
Şemada bir değişiklik yapılması gerektiğinde, her uygulamanın emsal sürümü ile uyumlu olması gerekir, daha sonra uygulama şemaya yeni bir sütun entegre edecek, ona yazacak ve önceki sütuna / yazarak ( önceki sürümde hala aynı verilere sahip).
Uygulamanın bir sonraki sürümünün eski sütunu güncellemeyi durdurmasına izin verilir ve yalnızca üçüncü sürümün kullanılmayan sütunu kaldırmasına izin verilir.

Açıkçası, bir şeyler ters gittiğinde düzenli yedeklere ihtiyaç duyulur.
Entegrasyon testlerinde üretimden kaçınmak için sorun yaratabilecek uygun bir veri alt kümesi de iyi bir fikirdir. İdeal durum, üretim verilerinin anonim bir alt kümesini alır.


4

İşimizde likibaz kullanıyoruz ve bunun için çok konuşacağım. Aynı zamanda KG aracımız olan QASymphony tarafından da kullanılır .

Dahili olarak MSSQL ve Oracle veritabanlarına karşı kullanıyoruz ve QASymphony bunu her iki postgres + mysql örneğiyle kullanıyor / kullandı.


4

Bu soruyu anabilgisayar ortamı bağlamında ve DB2® veritabanlarına özgü olarak cevaplamak için, genellikle seçebileceğiniz 2 (ucuz değil ...) alternatif vardır:

  • BMC'den DB2® için Nesne Yönetimi . Bununla ilgili bazı ayrıntılar (bağlantılı sayfadan alıntı):

    Veritabanınızdaki nesnelerde değişiklik yapmak, hatta sadece rutin idari görevleri gerçekleştirmek zor, riskli bir iş olabilir. İzlenmesi gereken onlarca görev vardır ve tek bir yanlış adım kullanılabilirlik ve veri bütünlüğü üzerinde feci bir etkiye sahip olabilir. Size yardımcı olacak bir araç koleksiyonu olan DB2 11 için BMC Nesne Yönetimi ile hem çabayı hem de riski azaltabilirsiniz:

    • Karmaşık ve farklı DB2 ortamlarını yönetmek için gereken süreyi azaltın.
    • Geliştirilmiş bütünlük için uygulama yaşam döngüsü boyunca rutin görevleri otomatikleştirin.
    • Basitleştirilmiş DB2 katalog gezinme ve değişiklik yönetimi ile üretkenliği artırın.
    • Minimum kesinti ile değişiklik ve bakım yaparak uygulama kullanılabilirliğini artırın.
  • IBM'den z / OS için DB2 Yönetim Aracı .

    Uygulama yaşam döngüsü boyunca DB2 nesnelerini ve şemasını güvenli bir şekilde yönetmeyle ilişkili karmaşık görevleri kolaylaştırır.

    • Kullanıcıların DB2 kataloğunda hızlı ve kolay bir şekilde gezinmelerini sağlar
    • Tam SQL sözdizimini bilmeden dinamik SQL ifadeleri oluşturur ve yürütür
    • Yürütmeden önce olası çakışmaları gideren DB2 nesne tanımlarında yapılan değişiklikleri yönetir ve izler
    • Veritabanlarına ve tablolara karşı yürütmek için DB2 komutlarının oluşturulmasına yardımcı olur
    • Kullanıcıların DB2 nesneleri oluşturmasını, değiştirmesini, taşımasını, bırakmasını ve ters mühendislik yapmasını sağlar
    • Yardımcı işler yaratır ve yürütür, böylece kullanıcıların daha fazla üretkenlik için LISTDEF'lerden ve ŞABLONLAR'dan yararlanmalarını sağlar

SCM araçlarıyla entegrasyon

Bir süre önce bir müşteri tarafından BMM alternatifini SCM yaşam döngüsüne ( SERENA ChangeMan ZMF tarafından yönetilen ) "entegre etme" konusunda zorlandım . Bu entegrasyonun ardındaki fikir, " DB2 DBA ekibimizi (DDL'lerle bir şeyler yapmak), yanlışlıkla taşınacak kodu (DDL) üretmek için bazı egzotik düzenleyicileri (BMC aracı) kullanarak özel bir geliştirme ekibi olarak düşünün " olarak düşünmektir .

Bu entegrasyonla ilgili tek (ama gerçek !) Zorluk hakkında, bu DBA aracının en önemli avantajlarından biri olan "yeniden başlatılabilirliği" kolaylaştırmak da vardı:

  • Yeniden çalıştırılabilirlik , bu DBA aracı işini yaparken (bazen tamamlanacak işin doğasına göre uzun süren işlerle), beklenmedik şeylerin (kilitlenmeler, zaman aşımları, vb.) Gerçekleşebileceği anlamına gelir.

  • Bunlardan herhangi biri gerçekleşirse ve yedeklemenizden (başlamadan önce) yeniden başlatmak istemezseniz, DBA aracı, işlerin yanlış gitmeye başladığı (kontrol) noktadan yeniden başlatmanızı bekler (ve her şeyin yeniden yürütülmesini istersiniz).

  • Daha da iyisi (veya "daha da kötüsü" demeliyim?) bir tür kullanıcı hatası ile. Bu da " Son başarısızlık noktamdan sonra nasıl ilerlememi istediğimi anlayana kadar, hiçbir şey yapmayı reddediyorum (işleri daha da kötüleştirmemek) " gibi bir göstergeyle.

  • Sonunda, bu yeniden başlatılabilirliği kullanılan SCM aracında uygulamak için gerçek ipucu, SCM aracının da ayarlanmasını gerektiriyordu. Aslında başarısız SCM prosedürlerini yeniden başlatmak için kullanılmasına izin vermek (genellikle hedef test / ürün ortamlarına teslimatlarla ilgili) ... sadece başarısız SCM prosedürünü tekrar tekrar göndermek yerine ( bu SCM araçları bu gibi durumlardan nasıl kurtarılır ).

Bonus: BMC alternatifinin SCM entegrasyonu tamamlandıktan sonra, müşteri DBA aracını IBM alternatifine değiştirmeye karar verdi. Ve her iki alternatif de gerçekten aynı görünmese de, SCM entegrasyonuna etkisi oldukça azdı: sadece IBM'e eşdeğer çağrılarla BMC alternatifine yapılan bazı çağrıları değiştirme meselesi (sadece yeniden kullanılabilir SCM özelleştirmesinde) alternatif ... hangi (DevOps terminolojisi kullanılarak) / tarafından uygulandı .

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.