Arka plan :
Makul bir şekilde ölçeklendirmek istediğim bir web uygulaması oluşturdum. Google veya Twitter olmadığımı biliyorum, ancak uygulamam her kullanıcı için oldukça büyük miktarda veri kullanıyor ve bu nedenle oldukça yüksek veri gereksinimleri var. Daha sonra her şeyi yeniden tasarlamak zorunda kalmadan makul derecede iyi ölçeklendirmeye hazır olmak istiyorum.
Kendimi bir veritabanı uzmanı değil, bir yazılım geliştiricisi olarak görüyorum. Bu yüzden buraya gönderiyorum. Umarım çok daha fazla veritabanı uzmanlığına sahip biri bana tavsiyelerde bulunabilir.
Nispeten çok sayıda kullanıcıyla, ancak Facebook numaraları gibi bir şey olmadan, şöyle bir DB olmasını bekliyorum:
Bir "Büyük masa":
- 250 milyon kayıt
- 20 sütun
- Yaklaşık 100 GB veri
- Endeksli bigint (20) yabancı anahtar var
- Dizine alınmış bir varchar (500) string_id sütunu var
- İnt (11) "değer" sütununa sahiptir
Diğer 4 tablo:
- Her biri 10 milyon kayıt
- Her biri yaklaşık 2 - 4 GB veri
- bu tabloların her birinde 4 - 8 sütun bulunur
- bir sütun datetime date_created
- bir sütun varchar (500) string_id sütunudur
- bu tabloların her birinden bir veya iki sütun bir birleştirmede seçilecektir
Bu tablolardan biri ortalamaları depolamak için kullanılır - şeması bigint (20) id, varchar (20) string_id, datetime date_created, float average_value
Ne yapmak istiyorum - iki nispeten pahalı sorgu:
Yeni ortalama değerleri hesapla:
- Yabancı anahtar kullanarak büyük tablodan birkaç milyona kadar ayrı kayıt seçin.
- String_id öğesine göre gruplayarak yeni bir ortalama hesaplayın.
- Sonuçları ortalamalar tablosuna ekleyin.
- Şu anda oluşturulduğu gibi, bu sorgu iki birleşim kullanır.
Sunum yapan kullanıcılar için normalleştirilmemiş, salt okunur kayıtlar oluşturun:
- Büyük tablodan 1.000-40.000 kayıt arasından seçim yapmak için yabancı bir anahtar kullanın.
- Dize kimliği sütunu ile en yeni kayıttaki diğer dört tablonun her birine katılın.
- Sonuçları normalleştirilmemiş bir tabloya ekleyin.
- Bu kayıtlar kullanıcılara bilgi görüntülemek için kullanıcı arabirimi tarafından kullanılır.
- Şu anda oluşturulduğu gibi, bu sorgu dört birleşim kullanır.
Bu pahalı sorguların her birini, sonuçlarını kullanıcılardan gelen istekleri işleyen gerçek zamanlı bir ön uç DB sunucusuna gönderecek bir toplu iş arka uç veritabanında çalıştırmayı planlıyorum. Bu sorgular düzenli aralıklarla çalıştırılacaktır. Ne sıklıkta karar vermedim. Ortalama sorgu günde bir kez yapılabilir. Normalleştirmeyi kaldır sorgusunun daha sık olması gerekir - belki birkaç dakikada bir.
Bu sorguların her biri şu anda MySQL'de birkaç saniye içinde çok büyük bir makinede “büyük tabloda” 100K kayıtlı bir veri kümesiyle çalışır. Hem ölçeklendirme yeteneğim hem de ölçeklemenin maliyeti konusunda endişeliyim.
Sorular :
- Bu yaklaşım kulağa hoş geliyor mu? Büyük resim açısından açıkça yanlış olan bir şey var mı?
- RDBMS doğru araç mı, yoksa Hadoop ailesindeki bir şey gibi diğer "büyük veri" çözümlerine mi bakmalıyım? Eğilimim RDBMS kullanmaktır çünkü veriler yapılandırılmıştır ve ilişkisel modele güzelce uyar. Yine de belli bir noktada, artık bir RDBMS kullanamayacağım anlaşılıyor. Bu doğru mu? Bu anahtar ne zaman gereklidir?
- Çalışacak mı? Bu sorgular makul bir sürede çalıştırılabilir mi? Sorgu # 1 için belki de saat bekleyebilirim, ancak # 2 numaralı sorgu dakikalar içinde bitmelidir.
- Donanım açısından nelere dikkat etmeliyim? RAM ve CPU darboğazlarım nelerdir? Dizinleri RAM'de tutmanın önemli olduğunu düşünüyorum. Dikkate almam gereken başka bir şey var mı?
- Bir noktada muhtemelen verilerimi bölümlere ayırıp birden çok sunucu kullanmam gerekecek. Kullanım durumum zaten bu kategorideymiş gibi mi görünüyor yoksa tek bir makineyi bir süre dikey olarak ölçeklendirebilecek miyim? Bu veriler 10 kat daha fazla olacak mı? 100x?