Uygulama, sensör, log
Veritabanı
Hatalı kaydı ayıkla
Özet, grafik
Tahmin, karar
Bu sunum ikinci adımla ilgili: veri büyüyünce onu nerede ve nasıl saklarız?
1 zettabayt = 1 milyar terabayt · Kaynak: IDC, Statista
Ocak 2024'te sadece New York sarı taksileri
Gece gündüz durmadan yeni kayıt
Zaman, konum, mesafe, ücret, ödeme…
Hatalı kayıt. Negatif ücretler bile var
En yoğun saat. Talep tahmini buradan çıkar
Veri o kadar büyüdü ki geleneksel sistemler zorlanmaya başladı.
IBM · 1970
"A Relational Model of Data for Large Shared Data Banks" makalesiyle ilişkisel modeli tanımladı. 1981 Turing Ödülü.

IBM · 1974
Raymond Boyce ile birlikte SEQUEL'i, bugünkü SQL'in atasını tasarladı.
ANSI standardı. Bir kez öğren, her veritabanında kullan.
Para transferi yarıda kalmaz.
Dağınık veriyi tek sorguda birleştirir.
Oracle, MySQL, PostgreSQL. Yıllarca test edildi.
Yeni bir sütun eklemek, 2,8 milyon satırı tek tek güncellemek demek. Bizim ölçümümüz.
Yük artınca daha güçlü sunucu alırsın. Pahalı, ve bir tavanı var.
Tablolar farklı makinelere bölününce JOIN ağ üzerinden yapılır.
Log, JSON, sensör verisi: her kaydın şekli farklı.
İki kat güçlü sunucu, iki kattan çok daha pahalı.
Bir makineye takılabilecek işlemci ve bellek sınırlı.
O sunucu düşerse her şey durur.
İtalya · 1998
SQL arayüzü olmayan küçük bir ilişkisel veritabanına "NoSQL" adını verdi. Bugünkü anlamıyla ilgisi yoktu; terim 11 yıl sonra geri dönecekti.

Sanjay Ghemawat ile MapReduce (2004) ve Bigtable (2006) makalelerini yazdı.
HBase ve Cassandra'ya ilham verdi.

Amazon CTO
Ekibiyle Dynamo makalesini yayınladı.
Bir sunucu çökse bile müşteri sepetine ürün ekleyebilmeli.
Facebook, Dynamo + Bigtable fikirleri
10gen, doküman veritabanı
Bellekte anahtar-değer
Johan Oskarsson'un San Francisco buluşması; terim yayılır
SQL'in rakibi değil, tamamlayıcısı.
Her kayıt kendi alanlarını taşır.
Yük artınca makine eklenir.
Veri birçok sunucuya bölünür.
{
pickup: "JFK Airport",
fare: 52.3,
passengers: 1
}
{
pickup: "Harlem",
fare: 18.2,
passengers: 2,
weather: "yağmurlu",
nickname: "Emir"
}
İkinci kayıtta iki yeni alan var. Tabloyu değiştirmeye gerek yok.

Ürün kataloğu, içerik

Önbellek, oturum, sepet

IoT, zaman serisi, log

Sosyal ağ, öneri sistemi
{ _id: 1042,
name: "Kulaklık",
price: 899,
specs: { kablosuz: true, pil: "30 saat" } }
Her ürün kendi özelliklerini taşır. Ayakkabının bedeni, laptopun RAM'i.
session:4821→{ user: "emir", sepet: 3 }views:urun:1042→15 208kur:USD→41,2Anahtarı bil, değeri milisaniyede al. Önbellek ve oturum için.
Bir satır anahtarının altında binlerce sütun. Sürekli yazılan sensör ve log verisi için.
İlişkinin kendisi veri. "Arkadaşımın arkadaşı kim?" sorusu anında cevaplanır.
Tablo, satır, sütun
Doküman, anahtar-değer, sütun, graf
Sabit, önceden tanımlı
Esnek
Dikey: daha güçlü sunucu
Yatay: daha çok sunucu
Standart SQL
Veritabanına özgü
ACID
BASE, ayarlanabilir
Banka, muhasebe, ERP
Katalog, IoT, log, analitik
Tutarlılık · Erişilebilirlik · Bölünme toleransı

UC Berkeley. Dağıtık sistemde üçü aynı anda olmaz.
Gerekirse bekle ya da hata ver. MongoDB
Veri birkaç saniye eski olabilir. Cassandra
Tek makineyi büyüt.
Yeni makine ekle.
Veriyi böl: her sunucu farklı bir parçayı tutar.
Veriyi kopyala: her sunucu aynısını tutar.

Kurucu

Kurucu, CTO
Kayıtlar BSON olarak saklanır: tarih ve sayı tiplerini de taşıyan ikili JSON.
1042 · 132 · 236 · 99.40 · 1132 · JFK Airport · Queens1 · cardSELECT … JOIN zones … JOIN zones … JOIN payment_types
{
pickup: { zone: "JFK Airport", borough: "Queens" },
dropoff: { zone: "Upper East Side", borough: "Manhattan" },
passengers: 1,
fare: { total: 99.4, payment: "card" }
}
{ zone: "JFK Airport",
borough: "Queens" }Ne zaman: Birlikte okunan, az değişen veri. Okuma tek seferde.
Bedeli: aynı bilgi binlerce kez tekrarlanır.
{ zone_id: 132 } // zones koleksiyonundaNe zaman: Çok büyüyen ya da sık değişen veri. $lookup ile birleştirilir.
Bedeli: okurken ikinci bir sorgu.
Kural: "Birlikte okunan birlikte saklanır." · Bir doküman en fazla 16 MB
INSERT INTO trips … VALUES (…)
db.trips.insertOne({ … })SELECT * FROM trips WHERE total > 50
db.trips.find({ "fare.total": { $gt: 50 } })UPDATE trips SET tip = 10 WHERE …
db.trips.updateOne({ … }, { $set: { … } })DELETE FROM trips WHERE …
db.trips.deleteMany({ … })Hangi ilçede kartla ödeyenler daha çok bahşiş bırakıyor?
yolculuk
kartla ödenen
ilçe
2.839.623 doküman tek tek okundu
sadece 2.343 doküman okundu
Sorgu: 15 Ocak, 08:00–09:00 arası yolculuklar · demoda canlı
1 Her yazma primary'ye gider.
2 Secondary'ler değişiklikleri oplog üzerinden kopyalar.
3 Primary düşerse kalanlar oylar, yeni primary saniyeler içinde seçilir.
Sorgu tek sunucuya gider · 45 ms
Sorgu her sunucuya gider · 100 ms
Eşit değil, çünkü Manhattan bölgeleri çok yoğun.
MongoDB 4.0'dan beri çok dokümanlı ACID transaction da var.
Uygulama, IoT, Kafka
MongoDB, veri gölü
Aggregation
pandas, Spark
Model, dashboard
Spark Connector ile Hadoop/Spark'a bağlanır · Kafka Connector ile akan veriyi alır
NYC TLC, Ocak 2024: 2.964.624 yolculuk
Python ile 125.001 hatalı kayıt ayıklandı
MongoDB, 3 shard; şimdilik tek bilgisayarda simüle
Aynı veri PostgreSQL'de de: 9 farklı test
Canlı panel, sorgu laboratuvarı, telefondan veri ekleme
NoSQL ölçek sorunundan doğdu.
JOIN'de SQL, esnek veri ve yatay ölçekte MongoDB.
Dağıtmak güç verir ama bir bedeli var.
QR'ı okutun, bir taksi yolculuğu ekleyin. Kaydınızın üç sunucudan hangisine gittiğini göreceksiniz.
10 soru, 20'şer saniye.