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:
- Yedeklemeler - innodb eklentileri harika ve hepsi, ancak bu kadar veri üzerindeki yedekleme süreleri sadece pratik değil
- 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
- 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)
- 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:
- 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.
- 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.
- 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.
- 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.