MySQL için ölçeklendirme çözümleri (Replikasyon, Kümeleme)


84

Şu anda çalıştığım başlangıçta , veritabanımız için ölçeklendirme çözümleri düşünüyoruz. MySQL kümesine , çoğaltmaya ve MySQL kümesinin eşzamansız bir sürümü olan MySQL küme çoğaltmasına (ver. 5.1.6'dan) sahip MySQL ile işler (en azından benim için) biraz kafa karıştırıcı hale geliyor . MySQL kılavuzu, kümesindeki SSS'deki bazı farklılıkları açıklar , ancak bunlardan birinin veya diğerinin ne zaman kullanılacağını belirlemek zordur.

Bu çözümler arasındaki farkları ve artıları ve eksileri hakkında bilgi sahibi olan kişilerin tavsiyelerini ve her birini ne zaman kullanmanızı tavsiye edeceğinizi takdir ediyorum.


4
2015'te aynı sorunun cevabı nedir?
Matical

Merhaba, Programlama ne olacak, yani bunu PHP tabanlı uygulamam için yapıyorsam, kodu yazarken dikkat etmem gereken belirli şeylerin bir listesi var mı? Yoksa önemi yok mu?
Salil Momin

2017'de MariaDB, Galera ve MariaDB MaxScale'e bir göz atın.
MattBianco

Yanıtlar:


103

Mevcut seçenekler hakkında ÇOK okuma yapıyorum. Ayrıca kesinlikle tavsiye ettiğim Yüksek Performanslı MySQL 2. sürümüne de sahibim.

Bir araya getirmeyi başardığım şey bu:

Kümeleme

Genel anlamda kümeleme, yükü bir dış uygulamaya tek bir sunucu gibi görünen birçok sunucuya dağıtmaktır.

MySQL NDB Kümesi

MySQL NDB Kümesi, eşzamanlı çoğaltma ve otomatik veri bölümleme özelliğine sahip dağıtılmış, bellek içi, paylaşılmayan bir depolama motorudur (kusura bakmayın, Yüksek Performans kitabından tam anlamıyla ödünç alıyorum, ama oraya çok hoş bir şekilde koydular). Bazı uygulamalar için yüksek performanslı bir çözüm olabilir, ancak web uygulaması genellikle bunun üzerinde iyi çalışmaz.

En büyük sorun, çok basit sorguların (yalnızca bir tabloya dokunan) ötesinde, kümenin genellikle birkaç düğümde veri aramak zorunda kalması ve ağ gecikmesinin sorgular için tamamlanma süresini önemli ölçüde yavaşlatmasıdır. Uygulama, kümeyi tek bir bilgisayar olarak ele aldığından, verileri hangi düğümden alacağını söyleyemez.

Ek olarak, bellek içi gereksinimi birçok büyük veritabanı için uygulanabilir değildir.

Kıta Sekoya

Bu, MySQL sunucusunun üstünde bir ara katman yazılımı görevi gören MySQL için başka bir kümeleme çözümüdür. Eşzamanlı çoğaltma, yük dengeleme ve yük devretme sunar. Ayrıca, isteklerin her zaman verileri en son kopyadan almasını ve yeni verilere sahip bir düğümü otomatik olarak seçmesini sağlar.

Üzerinde güzel şeyler okudum ve genel olarak oldukça umut verici geliyor.

Federasyon

Federasyon kümelemeye benzer, bu yüzden burada da çektim. MySQL, birleşik depolama motoru aracılığıyla federasyon sunar. NDB küme çözümüne benzer şekilde, yalnızca basit sorgularla iyi çalışır - ancak karmaşık olanlar için küme daha da kötüdür (çünkü ağ gecikmesi çok daha yüksektir).

Çoğaltma ve yük dengeleme

MySQL, farklı sunucularda bir veritabanının kopyalarını oluşturmak için yerleşik kapasiteye sahiptir. Bu birçok şey için kullanılabilir - yükü sunucular arasında bölmek, sıcak yedeklemeler, test sunucuları oluşturmak ve yük devretme.

Çoğaltmanın temel kurulumu, çoğunlukla yazma işlemlerini ve yalnızca okumaları işlemeyi bir veya daha fazla ikincil sunucunun işlemesini içerir. Daha gelişmiş bir varyasyon, aynı anda birden fazla sunucu yazarak yazma işlemlerini ölçeklendirmeye izin veren ana-ana yapılandırmanın varyasyonudur .

Her yapılandırmanın avantajları ve dezavantajları vardır, ancak hepsinin paylaştığı bir sorun, çoğaltma gecikmesidir - MySQL çoğaltma eşzamansız olduğundan, tüm düğümler her zaman en yeni verilere sahip değildir. Bu, uygulamanın çoğaltmanın farkında olmasını ve beklendiği gibi çalışması için çoğaltmaya duyarlı sorguları dahil etmesini gerektirir. Bazı uygulamalar için bu bir sorun olmayabilir, ancak her zaman en yeni verilere ihtiyacınız varsa işler biraz karmaşıklaşır.

Çoğaltma, yükü düğümler arasında bölmek için biraz yük dengeleme gerektirir. Bu, uygulama kodunda yapılan bazı değişiklikler veya özel yazılım ve donanım çözümleri kullanmak kadar basit olabilir.

Parçalama ve bölme

Sharding, veritabanı çözümlerini ölçeklendirmek için yaygın olarak kullanılan bir yaklaşımdır. Verileri daha küçük parçalara böler ve farklı sunucu düğümlerine dağıtırsınız. Bu, uygulamanın, ihtiyaç duyduğu bilgileri nerede bulacağını bilmesi gerektiğinden, verimli bir şekilde çalışması için veri depolamasında yapılan değişikliklerin farkında olmasını gerektirir.

Hibernate ORM'nin bir uzantısı olan Hibernate Shards (maalesef Java'da. PHP kullanıyorum) gibi veri parçalama ile başa çıkmaya yardımcı olacak soyutlama çerçeveleri mevcuttur . HiveDB , parça yeniden dengelemesini de destekleyen başka bir çözümdür.

Diğerleri

Sfenks

Sphinx , test aramalarından çok daha fazlası için kullanılabilen tam metin arama motorudur. Birçok sorgu için MySQL'den çok daha hızlıdır (özellikle gruplama ve sıralama için) ve uzaktaki sistemleri paralel olarak sorgulayabilir ve sonuçları bir araya getirebilir - bu da onu parçalama ile kullanımda çok yararlı kılar.

Genel olarak sfenks, mevcut donanım ve altyapının daha fazlasını elde etmek için diğer ölçeklendirme çözümleriyle birlikte kullanılmalıdır. Olumsuz yanı, sfenks'in akıllıca kullanılması için uygulama kodunun farkında olmanız gerektiğidir.

Özet

Ölçeklendirme çözümleri, ihtiyaç duyan uygulamanın ihtiyaçlarına göre farklılık gösterir. Bizim için ve çoğu web uygulaması için, çoğaltmanın (muhtemelen çoklu ana bilgisayar) yükü dağıtan bir yük dengeleyiciyle gitmenin yolu olduğuna inanıyorum. Belirli sorun alanlarının (büyük tablolar) parçalanması da yatay olarak ölçeklenebilmesi için bir zorunluluktur.

Ayrıca Continuent Sequoia'ya bir şans vereceğim ve uygulama kodunda en az miktarda değişiklik içereceği için söz verdiği şeyi gerçekten yapıp yapamayacağına bakacağım.


4
Master-master, yazma işlemlerini ölçeklendirmenize izin vermez - her iki master, senkronize kalmak için tüm yazma işlemlerini yapmak zorundadır. Dahası, aynı anda iki sunucuya yazmak, mysql'nin otomatik olarak çözmediği çoğaltma çakışmaları oluşturabilir (az ya da çok garantilidir).
MarkR

1
1 1/2 yıldan fazla bir süre geçmesine rağmen, 08'de yazılmış bu yanıtı fark ettiniz, Kıta Sequoia için sonucunuz nedir?
Kerry Jones

1
Sonucu / deneyimi Kıta Sekoya ile paylaşabilir misiniz?
conandor


Continuent Sequoia üretimden kaldırıldı ve ücretsiz ürünlerden oluşan bir koleksiyon olan Continuent Tungsten ile değiştirildi. continuent.com/community/tungsten-overview
lo_fye

12

Feragatname: MySQL Cluster kullanmadım, bu yüzden sadece duyduğumdan gidiyorum.

MySQL Cluster, bir HA (yüksek kullanılabilirlik) çözümüdür. Hızlıdır, çünkü hepsi hafızada, ancak asıl satış noktası, kullanılabilirliktir. Tek bir başarısızlık noktası yoktur. Öte yandan, çoğaltma ile, ana birim düşerse, aslında kopyaya geçmeniz gerekir ve az miktarda kesinti süresi olabilir. (DRBD çözümü yüksek kullanılabilirliğe sahip başka bir alternatif olsa da)

Küme, tüm veritabanınızın belleğe sığmasını gerektirir. Bu, kümedeki her makinenin tüm veritabanını depolamak için yeterli belleğe sahip olması gerektiği anlamına gelir. Dolayısıyla bu, çok büyük veritabanları için uygun bir çözüm değildir (veya en azından çok pahalı bir çözümdür).

Bence HA çok önemli olmadıkça (okuyun: muhtemelen değil), değerinden daha fazla güçlük (ve para) olduğunu düşünüyorum. Çoğaltma çoğu zaman daha iyi bir yoldur.

Düzenleme: Ayrıca Cluster'ın yabancı anahtarlara izin vermediğini ve menzil taramalarının diğer motorlardan daha yavaş olduğunu söylemeyi unuttum. İşte MySQL Kümesinin Bilinen Sınırlamalarından bahseden bir bağlantı


Vurgulamaya çalıştığım nokta, eğer performans konusunda endişeleniyorsanız, replikasyona gidin. Yalnızca HA birincil sorunsa Küme'yi seçin. Nasıl karşılaştırdıklarını bilmiyorum ve donanım gereksinimleri o kadar farklı ki muhtemelen yine de elma ve portakalları karşılaştırıyor.
nathan

Bu 4-5 yıl sonra, ancak MySQL Cluster'ın artık tüm db'nin bellekte / RAM'de tutulmasını gerektirmediğini de eklemek isterim: "MySQL 5.1'den itibaren, verilerin artık tamamen bellekte olması gerekmiyor . " dba.stackexchange.com/questions/9357/…
Ted

4

Drupal.org'u yönetenlerin veritabanı sunucularını nasıl yapılandırdıklarına dair bazı güzel tartışmalar var:

Her ikisi de 2007 yılına ait olduğundan Kümeleme desteği şimdi daha güçlü olabilir, ancak o zaman çoğaltmayı seçtiler.


2

Çoğaltma yapmanın en güzel yanı, kolay olmasıdır. Sadece 2 mysql kutusu ayarlayın, ikinci kutudaki sunucu kimliğini değiştirin ve ardından ana kutuyu değiştir komutunu kullanarak ikinci kutuyu ilk kutucuğa işaret edin.

İşte ilgili örnek slave my.cnf yapılandırması

#
#       Log names
#

log-bin=binlog
relay-log=relaylog
log-error=errors.log

#
#       Log tuning
#

sync_binlog = 1
binlog_cache_size = 1M

#
#       Replication rules (what are we interested in listening for...)
#
#       In our replicants, we are interested in ANYTHING that isn't a permission table thing
#

replicate-ignore-db =      mysql
replicate-wild-ignore-table=mysql.%

#
#       Replication server ID
#

server-id      =        2

Bu nedenle, her bir bağımlı birimin 1 artırılmış bir sunucu kimliği aldığından emin olun (böylece sonraki ikincil sunucu 3. sunucu olur)

slave'in bağlanabileceği bir kullanıcı adı ve parola belirleyin, sonra Change master'ı MASTER_HOST = 'xxxx' olarak çalıştırın; master'ı MASTER_PASSWORD = "xxxxx" olarak değiştirin;

ve bunun gibi.

son olarak, "köle başlat" komutunu çalıştırın;

Kölen geliyor ve çoğalmaya başlıyor. tatlı ha!

Bu, 2 boş sunucuyla başladığınızı varsayar. Daha sonra db'nizi ana sunucuya atabilirsiniz ve orada yüklenirken slave'e de yüklenir.

Slave durumunu aşağıdakileri çalıştırarak kontrol edebilirsiniz:

köle durumunu göster \ G

Onunla iyi eğlenceler .. soooo easy ...


1

Yüksek Kullanılabilirlik çalışmasını yaparken birçok çözümle karşılaştım ve muhtemelen yazma yoğun bir sistem olan bizim durumumuzda, DRBD kümesini saniyede daha fazla işlem sayısı sağladığı için NDB kümesinden daha iyi buldum.

Mysql Replication size okuma bağımlısı olarak kullanılabilen veya felaket kurtarma durumunda kullanılabilen bir yedekleme makinesi sağlayabilir.

DRBD tarafından sağlanan işlem yönetiminin farklı modları ile, ağ üzerinden verilerin cihaz düzeyinde çoğaltılmasıyla elde edilen performansı düşüren bir şeyler yapabilirsiniz. Başarısızlık durumunda herhangi bir işlemi kaybetmemesi gereken güvenilir sistem için C modunu kullanın, aksi takdirde B'ye gidin

DRBD kümesini kurarken yaptığım bazı bilgileri http://www.techiegyan.com/?p=132 adresinde listelemeye çalıştım.

Çoğaltma için ayrılmış bağlantıda gerçekten iyi çalışır, yani sadece drbd çoğaltma için her iki makinede de ayrı yüksek hızlı arayüzler ayırın. Heartbeat, kümeyi tüm hizmetlerle tek tek, yani IP adresleri, bölümler, drbd ve mysql ile güzel bir şekilde kontrol edebilir.

DRBD'de Master-Master konfigürasyonunu henüz keşfetmedim. Başarıya ulaştığım zaman güncellenecek.

Teşekkürler.


1

Benim görüşüme göre, buradaki kafa karışıklığı beni Mnesia'ya geri gönderiyor. Dizinleri işlemenin parçalanma, bildirimsel ve pragmatik yolu, Veritabanı Kopyalarının Konum şeffaflığı vb.

Kurulumumuzda hem MySQL Cluster hem de Mnesia'yı çalıştırıyoruz. Verilerimiz biraz mevsimsel. Yani bir süre sonra ne olur, artık kullanılmayan verilerin hafızasını rahatlatır ve MYSQL kümesine atarız. Bu, hafızamızı verimli tutar. Ayrıca doğrudan MySQL'den veri kullanan ana akış dillerinde (Python, Clojure vb.) Uygulanan uygulamalarımız var.

Özetle, MySQL Cluster üzerinde mnesia çalıştırıyoruz. MySQL Kümesi büyük veri kümelerini işleyebilir, bir veritabanı 50 GB'tan fazla büyüyebilir. Erlang / OTP uygulamalarına güç veren mnesia var . Exchange formatları olarak JSON ve XML kullanarak özel REST (son zamanlarda Thrift ) API'leri üzerinden mnesia'dan Java ve PHP erişim verileri .

Veri erişim katmanı, Mnesia'daki verilere soyut erişim ve gerekirse MySQL Cluster'da eski gönderilen verilere sahiptir. Mnesia, esasen Erlang / OTP uygulamalarına güç sağlamak için burada. Verilerle uğraştığı zaman, onu MYSQL Cluster'a atıyoruz. Veri erişim katmanı, tüm uygulamalar adına soyutlanmış bir API'de hem mnesia'daki verilere hem de MySQL'e erişebilir.

Burada söyleyebileceğim şey, Mnesia'nın bizim için en iyi seçenek olduğudur. Tablolar son derece parçalanmış ve dizine alınmış, sorgular çok iyi performans gösteriyor ve veritabanı bir tünel üzerinden birbirine bağlı 2 konumda çoğaltılıyor.

Daha önce, masa boyutu sınırlaması nedeniyle hafızanın mümkün olduğunca çok kaydı işleyemeyeceğinden korkuyorduk. Ancak bu ifadeyi yanlış bulduk. İyi ayarlama (parçalama) ile, mnesia veritabanlarımız yılda ortalama 250 milyon kayıt tutmaktadır.

Erlang'ın karmaşık veri yapısından ve Mnesia'nın onu değişmeden yutabileceği gerçeğinden faydalandık. Erlang / OTP uygulamaları, eski dillerdeki diğer tüm uygulamalardan en verimli olanıdır ve sistemimizle hepsini Erlang / OTP teknolojisine taşımayı planlıyoruz. Erlang'dan MySQL Cluster'dan verilere görünüşte erişiyor ve sunucularında çok harika bir şekilde sorgular yürütüyoruz.Aslında, (Erlang) muazzam eşzamanlılığı nedeniyle MySQL sunucu kaynaklarını tam olarak kullanabilen Erlang / OTP'sini çıkardık.

Mnesia bizim için çok iyi çalıştı.Mnesia, heyecan verici performansı nedeniyle veritabanlarına bakışımızı tamamen değiştirdi. Solaris sunucumuz CPU Çekirdeklerimiz, yoğun saatlerde ortalama% 48 kullanımda meşgul tutulur.

Mnesia'yı kontrol etmenizi tavsiye ederim ve kim bilir, dağıtım veya çoğaltma ihtiyaçlarınızın birçoğunu karşılayabilir.


0

Bunları kullanmadım, ancak belgelerden en büyük yük veritabanından okumaksa replikasyonun tercih edilen çözüm olduğunu söyleyebilirim.


1
Tam olarak nasıl bu sonuca vardınız ... Belirtmiş olsaydınız çok güzel olurdu. Ayrıca belgeler kümelemenin daha güvenilir olduğunu gösteriyor gibi görünüyor
Eran Galperin

0

"Bellek içi" sınırlaması, yaklaşık 50 Gb verilerimiz için MySQL kümesini kullanmamızı engeller, bu nedenle DRBD artı linux Heartbeat kullanıyoruz .

Veritabanlarını / günlükleri / yapılandırmaları senkronize halde tutan iki (veya daha fazla) kutu arasında bir baskın dizisi gibidir (ancak bir seferde yalnızca bir sunucu "canlı" olabilir). Yük devretme otomatiktir, aynı IP adresini kullanır ve mysql yeniden başlatma kadar hızlıdır, bu nedenle bu bizim için iyi bir çözüm olmuştur.


1
Performansa da yardımcı oluyor mu yoksa sadece fazlalık için mi?
Eran Galperin

DRBD, dosya sisteminin her yerinde bir şeyler bozana ve tablolarınızı bozana kadar iyi ve iyidir - o zaman tek bir yerine iki kırık düğümünüz olur. Ben güvenmiyorum.
Jon Topper

+1 @Eric Galperin yük devretme / yedeklilik, site başına bir mysql sunucusu için şirketimizin dahili düzenlemesine uygulanacak fikirler için bu soru sayfasını ziyaret etmemin birincil nedenidir.
therobyouknow

0

MySQL kümesi garip bir canavar ve her değerlendirişimizde ya çok kötü bir şekilde yapıldı ya da güvenilmez oldu.

Kurulumu korkunç derecede karmaşık (en az üç düğüme, muhtemelen daha fazlasına ihtiyacınız var). Ayrıca, istemcilerin yük devretmesi için herhangi bir hüküm yoktur, bu nedenle bunu kendiniz yapmanız gerekir (veya proxy olarak hareket etmek için başka bir şey kullanmanız vb.).

Son derece zekice, çünkü birincil anahtarda otomatik hash bölümleme yaparak yazmaları ölçeklendirmenize izin veriyor ve ayrıca tek bir hata noktası olmadığı için.

Ama gerçekten tasarlandığı çok özel amaçlı vakalara daha uygun olduğunu düşünüyorum. Çoğu durumda ne performans ne de özelliklerde başka bir veritabanı motorunun (örneğin InnoDB) yerini alamaz.


Birkaç Nines'ın kurulumunu kolaylaştıran bir çözümü var: support.severalnines.com/entries/… ... ama kabul ediyorum, MySQL Cluster'ı şirketimde değerlendiriyorum ve yazımları yaymak için harika, ancak çok daha yavaş okur ve yabancı anahtar desteği yoktur, vb.
Suman

yabancı anahtar desteği v7.3'ten beri mevcuttur . İşte InnoDB ile
NDB'nin
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.