Milyonlarca kullanıcı nasıl yönetilir?


17

Gerçekten büyük bir şey başlatmak üzereyim. Sunucumu ve veritabanımı hazırlamam gerekiyor.

Her 100.000 kullanıcı kümesini ayrı kullanıcı tablolarında gruplandırmak istiyorum, ancak uygun kullanıcı tablosuna giriş yapmaya çalışan bir kullanıcıyı nasıl ilişkilendireceğimizi bilmiyorum.

Örneğin jay@mail.com, kullanıcının 36 numaralı kullanıcı tablosu ile ilişkili olduğunu nasıl bilebilirim ?

Bir kullanıcı tablosunda 10 milyon veya 100.000'den 100'ü olmak aynı mıdır?

Facebook nasıl? 950 milyon girişli bir küresel kullanıcı tablosuna sahip olacaklarına inanamıyorum.


I can't believe they would have one global user table with 950 million entries.Yapabilirim, o kadar büyük değil . Daha büyük tablolarla çalıştım. Oldukça yaygın. Diğer birçok veri varsa dikkate alacağım diğer seçenek bir NoSQL veritabanı.
NimChimpsky

5
Çok sayıda kullanıcı ve çok miktarda veri almayı planlıyorsanız, bunu tasarlamak için bir veritabanı uzmanı tutmanız gerekir. En az on yıl veritabanı deneyimi ve en az 5 yıl büyük veritabanı tasarım deneyimi olmayan kimseye bakmazdım. Bu, kapsamlı bilgi gerektiren karmaşık bir subjetc.
HLGEM

Yanıtlar:


30

Yarın bir milyar kullanıcınız olmayacak ve MySQL sorunsuz bir şekilde birkaç milyon satırı işleyebilir. Kullanıcı masamda 5 milyon kullanıcı var ve bana güven, endişelenecek şeyler radarımda bile değil.

Eğer kadar Sharding endişe etmeyin gerek bunu yapmak için. Hiç var olmayan veya olmayan bir sorun için erken optimizasyon yapmaya çalışıyorsunuz ve bu süreçte, yenilik yapabileceğiniz oranı ciddi şekilde sakatlayacaksınız. Sorunları ortaya çıktıkça başlatmak ve bulmak için hızlı olun. Ölçeklendirme zorluklarınızın ne olacağını önceden tahmin edemezsiniz.

Bu ölçeğe ne zaman ve ulaşırsanız, bu tür bir soruna atmak için biraz paranız ve kaynaklarınız olacaktır.


4
Be fast to launch and find the problems as they comebu bölüm mükemmel. Bu doğru. Sorunları geldikçe bulursak, ilerleyen zamanlarda ciddi bir sorun olmayacaktır. +1
ALH

16

Gerçekten büyük veri kümelerini ele alacaksanız ve yerden başlamanız gerekiyorsa harici danışmanların şirketiniz için daha iyi bir destek olup olmayacağından emin değilim. Lütfen beni yanlış anlamayın, ancak çok fazla müşteriyle bir projeyi mahvederse, şirketiniz üzerinde PR etkisi olacaktır.

Bir tabloda 10M tuples ile ilgili olarak, iyi bir indeksleme varsa iyi olur. Büyük bir kehanette iyi çalışan bir masada birkaç adet 100M tuple (satılan ürünler) saklamamız gerekiyor 11g

İşte facebook db tasarım bir harita 2010 ile bir gönderi: Facebook veritabanı tasarımı

Bunun gibi bölüm türleri ile ilgili mysql belgelerini okumak isteyebilirsiniz: MySQL belgeleri: Partinioning

MySQL şu türleri destekler:

RANGE bölümleme. Bu tür bölümleme, belirli bir aralıktaki sütun değerlerine göre bölümlere satır atar. Bkz. Bölüm 18.2.1, “ARALIK Bölümleme”.

LIST bölümleme. RANGE ile bölümlemeye benzer, ancak bölüm bir dizi ayrık değerden biriyle eşleşen sütunlara dayalı olarak seçilir. Bkz. Bölüm 18.2.2, “LİSTE Bölümleme”.

HASH bölümleme. Bu tür bölümleme ile, tabloya eklenecek satırlardaki sütun değerleri üzerinde çalışan kullanıcı tanımlı bir ifade tarafından döndürülen değere göre bir bölüm seçilir. İşlev, MySQL'de geçerli olan ve negatif olmayan bir tamsayı değeri veren herhangi bir ifadeden oluşabilir. Bu tip bir uzantı olan LINEAR HASH da mevcuttur. Bkz. Bölüm 18.2.3, “HASH Bölümleme”.

ANAHTAR bölümleme. Bu tür bölümleme, değerlendirilecek yalnızca bir veya daha fazla sütunun sağlanması ve MySQL sunucusunun kendi karma işlevini sağlaması dışında HASH tarafından bölümlendirmeye benzer. MySQL tarafından sağlanan sağlama işlevi, sütun veri türünden bağımsız olarak bir tamsayı sonucunu garanti ettiğinden, bu sütunlar tamsayı değerleri dışında değerler içerebilir. Bu tip bir uzantı olan LINEAR KEY de mevcuttur. Bkz. Bölüm 18.2.4, “ANAHTAR Bölümleme”.


7

Her şeyden önce, kullanıcıları ayrı tablolara ayırmayın. İşleri karmaşık ve anlamsız hale getirecek. MySQL ve diğerleri gibi veritabanları aynı tabloda milyonlarca kayıt veritabanıyla sorunsuz çalışabilir (doğru PRIMARY KEYS ayarlanmış). Her kullanıcı için (ana kullanıcı tablosunda) AUTO_INCREMENT AND PRIMARY benzersiz anahtar alanını kullanın, böylece her kayıt benzersizdir (UID). Sonra diğer tablolarda bu benzersiz kimliği kullanarak başvuruyorsunuz. Ardından, her tabloda PRIMARY KEY olarak ayarladığınızdan, veritabanı sunucusundaki bilgilerin işlenmesini hızlandıracağından emin olun. Drupal CMS'den kullanıcı bilgilerini nasıl sakladığını öğrenebilirsiniz. Milyonlarca kullanıcı ve çok büyük şirketler (büyük medya şirketleri, hükümet, hatta dünyanın en büyük bankaları tarafından kullanılan) tarafından 10 yıldan fazla bir sürede test edilmiştir. Www.drupal üzerinde. org, aynı tabloda depolanan 1,6 milyondan fazla sayfa (düğüm) bulacaksınız ve ayda milyondan fazla benzersiz ziyaretçiye sahiptir ve web sitesi sorunsuz çalışır. Her şey uygun optimizasyon ve yapılandırma ile ilgilidir.

10 milyon kayıttan sonra, performanstan memnun değilseniz (uygun optimizasyon ve db yapılandırma değişikliklerinden sonra), kullanıcıları gerçekten farklı tablolarla ayırmak isteyip istemediğinize karar verebilirsiniz. Böylece, kullanıcı kayıtlarının nerede tutulduğu hakkında bilgi sahibi olan yeni tablo ekleyerek işlevselliği genişletebilirsiniz: UID ve table_name. Sonra diğer tablolarda bu bilgileri talep, bu tablo doğru tablo arayacaktır. Ancak, 10-100 milyondan fazla kaydınız olmadığı sürece, kullanıcılar için büyük bir masanız olmasını tavsiye ederim. Ancak performansı çok fazla geliştirmeyecektir (veritabanları büyük verilerle başa çıkmak için tasarlanmıştır). Bilgiyi basit tutmak daha iyidir. Genellikle şirketler sadece başka bir veritabanı sunucusuna (master ve slave) ve başka bir veritabanına karar verir. yük dengeleme işlevselliği ile birlikte çalışıyoruz. Bu 10 milyon kullanıcıya sahipseniz, başka bir db sunucusu için ödeme yapabilirsiniz, değil mi?

User.install dosyasındaki usertablo şeması örneğine bakın .


3

Diğer cevapların önerdiği gibi, kullanıcıları birden çok tabloya bölmek iyi bir fikir değildir. Kullanıcı kimliği üzerinde dizinlere sahip veritabanlarının çoğu milyon satır işleyebilir. Ancak, sorgu başına gecikme dizindeki toplam giriş sayısına bağlı olarak artabilir. Veri kümesi küçük olduğu sürece, normal veritabanlarında tek tablo ile yönetebilirsiniz.

Milyonlarca kayıttan çok daha fazla büyürseniz, gelecekteki düşünceleriniz için de farklı bir fikir ortaya koymaya çalışacağım. Böyle çok sayıda müşteri ile, herhangi bir kesinti istemiyorum vb. Yani, bakmak isteyebileceğiniz nosql veritabanları demet vardır. Parçalamayı uygulamadan kendiniz yönetmeniz yerine sizin için parçalamayı yapacaklar. Ayrıca veri yedekliliği ve dolayısıyla daha fazla çalışma süresi sağlarlar. Facebook ve hepsi çok fazla önbellek için memcache vb kullanın. Ama kalıcı dükkanları için ne kullandıklarından emin değilim.

Dikkat etmeniz gereken önemli bir şey, nosql veritabanlarıyla birleşimler vb. Yapamazsınız. Yani, kullanıcı tabanınızı planlayın ve karar verin. Eğer birleştirme ve çoklu kayıt işlemleri sizin için bir gereklilikse nosql veritabanları sizin için değildir.


-3

neden alfabetik aralığa göre bölünmüyorsunuz? Milyonlarca kullanıcınız olacaksa, her harf veya harf çifti için ayrı bir tablo oluşturun ('a' ile başlayan kullanıcı adı olan kullanıcılar için 'a' tablosu). İlk başta çok fazla yük olacak, ancak büyük bir veritabanı beklediğinizden ve belirli bir kullanıcı için hangi tablonun kullanılması gerektiğini ayırt etmek istediğinizden - sanırım alfabetik sıra açık ve en kolay seçimdir.


9
Bu çok kötü bir fikir. Örneğin, kullanıcılar soyadını değiştirirse yazılımınızın otomatik olarak satırları taşıması gerekir .... tutarlılık konusunda bakım yapmayı bırakmazsanız. Bu strateji bu tür olasılıkları davet eder.
randomx
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.