NoSQL Database(Not only SQL)
Herkese selamlar bu yazımda sizlere İstanbul Data Science Academy de almış olduğum Data Engineer eğitiminde öğrenmiş olduğum NoSQL veritabanlarını anlatacağım. Nereden başlasam anlatmaya diye çok düşündüm sanırım database kavramından başlamak en doğrusu. O halde başlayalım keyifli okumalar :)
Öncelikle veritabanı nedir kavramıyla başlayacağım ve NoSQL e kadar öğrendiklerimi paylaşacağım.
Veritabanı (Database), çok genel anlamda bilginin saklandığı alanlardır. Örneğin bir kütüphane düşünelim. Kütüphaneler farklı türlerde harika bir kitap koleksiyonuna sahiptir. Bu örneğimizde, kütüphane bir veritabanı; kitaplar ise veridir.
Kullanıcılar veritabanına yeni bilgiler ekleyebilir, bilgileri silebilir, değiştirebilir veya mevcut bilgileri görüntüleyebilir. Örneğin bir okula kaydoldunuz. Okul kayıt defterini düşünün. Öğrencilere ait tüm bilgiler tek bir dosya da tutulur. Öğrencilerle ilgili tüm detayları bu dosyadan ulaşabilirsiniz. Aslında bu dosya, herhangi bir öğrenciye ulaşmak istediğinizde bilgilerine erişebileceğiniz bir veritabanıdır.
Veritabanı kavramı 1960’lı yıllarda ortaya çıkmasına rağmen, veritabanlarının 1960’lı yıllardan bu yana etkileyici bir şekilde geliştiği apaçık ortadadır.
1980’li yıllarda ilişkisel veritabanları (“relational database”)(RDBMS) oldukça popülerken; yakın zamanlarda, NoSQL(Not-only SQL)veritabanları, internet kullanımının hızla artması ve unstructured (yapılandırılmamış verilerin) daha hızlı işlenmesi ihtiyacına bir yanıt olarak ortaya çıkmıştır.
Veritabanında saklayacağımız verilerin türüne ve elbette verilerle ne tür işlemler yapacağımıza bağlı olarak bize en uygun veritabanını seçmemiz oldukça hassas bir konudur.
Veri türlerinden bu noktada bahsetmemiz gerekir:
- yapısal veri(structured)
- yapısal olmayan veri(unstructured)
- yarı-yapısal (semi structured)veri
Nedir structured data( yapısal veri)?
Yapılandırılmış veriler, önceden tanımlanmış bir veri modeline uyan ve bu nedenle analiz edilmesi kolay olan verilerdir. Yapılandırılmış verilerin yaygın örnekleri, Excel dosyaları veya SQL veritabanlarıdır. Her birinin sıralanabilen yapılandırılmış satırları ve sütunları vardır. Yapılandırılmış veriler, farklı satırlar ve sütunlar arasındaki ilişki ile bir tablo biçimine uyar.
Yapılandırılmış bir veride: isimler, adresler, kredi kartı numaraları gibi bilgiler bulunabilir. Structured Data Son derece düzenlidir ve makine dili tarafından kolay anlaşılır. İlişkisel veri tabanı sistemleri ile girdi, çıktı, arama ve manipule etme işlemleri kolaylıkla gerçekleştirilebilir. Bu durum yapılandırılmış verilerin en çekici özelliğidir.
Hepimizin çokça duydu SQL dili de buraya dayanmaktadır.
Unstructured data( yapısal olmayan veri) nedir?
Yapılandırılmamış veriler, önceden tanımlanmış bir veri modeline sahip olmayan veya önceden tanımlanmış bir yapıda düzenlenmemiş bilgilerdir. Yapılandırılmamış bilgiler tipik olarak metin ağırlıklı olmakla birlikte tarihler, sayılar gibi veriler de içerebilir. Yapılandırılmış veritabanlarında depolanan verilere kıyasla yapısal olmayan veriler, içlerinde düzensizlikler barındırır.
Unstructured veriye örnek vermek gerekirse: Yazı, video dosyaları (MP4, AVI, FLV. vs.), ses dosyaları (MP3, WAV, vs.), sosyal medya gönderileri, uydudan çekilmiş görseller vs.. Bu tür verilerin analiz edilmesi ve yapılandırılması zordur çünkü daha önceden tanımlanmış veri modeli bulunmaktadır. Bu yüzden bu tip veriler ilişkisel veri tabanlarında organize edilemezler. Bunun yerine ilişkisel olmayan veya NoSQL denilen veritabanı sistemleri kullanılmaktadır.
Yapılandırılmamış verileri depolama ve işleme yeteneği, yapılandırılmamış veri türlerini depolayabilen pek çok yeni teknoloji ve araçla birlikte son yıllarda büyük ölçüde artmıştır. Yapılandırılmamış verileri analiz etme yeteneği, özellikle büyük veri bağlamında önemlidir, çünkü kuruluşlardaki verilerin büyük bir kısmı yapılandırılmamıştır. Yapılandırılmamış veriler olarak, resimleri, videoları veya PDF belgelerini düşünebilirsiniz.
Yapılandırılmamış veriyi yönetmek için bir diğer yöntem de veriyi bir Data Lake’e göndermek ve burada ham şekilde depolamak. (Data lake nedir bunları bir sonraki yazımda açıklayacağım)
Semi-structured (yarı-yapısal) data nedir?
Semi-Structured veriler, Structured ve Unstructured veri yapıları arasında yer alır. Semi-Structured veriler, ilişkisel veritabanları veya diğer veri tablosu biçimleriyle ilişkili veri modellerinin biçimsel yapısına uymayan, ancak yine de anlamsal öğeleri ayırmak için etiketler veya başka işaretler içeren yapılandırılmış bir veri biçimidir.
Semi-structured veri türlerine JSON ve XML örnek verilebilir. Bu tip verilerin işlenmesi Yapılandırılmış verilere göre daha zor fakat yapılandırılmamış verilere göre daha kolaydır. Bu iki türün arasında bir köprü görevi görür.
Peki şimdiye kadar yazdıklarımın anlaşıldığını düşünüyorum. SQL ve NoSQL dediğimiz kavramlar nelerdir çıkıyor tam da bu noktada. Aslında SQL veri tabanını bir önceki yazımda detaylı bir şekilde anlatmıştım isterseniz https://sila-kazan0626.medium.com/sql-structured-query-language-ea7cda3c2fb5 buradaki yazıma bakabilirsiniz.
Yolumuza devam edelim NoSQL nedir buradan başlıyorum.
NoSQL(Not-only SQL)
NoSQL‘in açılımı Not Only SQL(ilişkisellikten öte) şeklindedir.
NoSQL; ilişkisel veritabanlarına alternatif, ilişkisel olmayan, esnek yapılı, büyük verili ve çok sayıda aktif kullanıcılı sistemlerde yüksek performans ve yönetim kolaylığı sunan veritabanı çözümüdür.
Öncelikle nereden çıktı bu NoSQL diye düşünebilirsiniz. NoSQL in ortaya çıkmasında ki ana sebeplerden biri;
- Veri çeşitliliğinin artması
Elimizde her gün bir şekilde veri ürettiğimizi düşünün. Örneğin üstteki firmaların her hareketlerinde bir veri kümesi oluşmaktadır. Bu veriler kimi zaman standart bir yapıda, genellikle de standart olmayan bir yapıda (unstructured) olmaktadır. Gelen alanlar sürekli değişebilir (artabilir,azalabilir) . Bir veride 100 alan gelirken bir sonrakinde bu sayı 200 e çıkabilir . Eğer böyle bir yapıyı İlişkisel Veritabanı kullanarak kurgularsak sürekli olarak tablo, kolon, index, … güncellemeleri gerekebilir. Bu da çok zahmetli bir iş :(
İşte NoSQL burada işe yarıyor. Bizi büyük bir zahmetten kurtarıyor.
Kısaca NoSQL faydalarını söylemek istersek ,
- Büyük verileri saklayabilmesi
- Verileri birden fazla makina üzerinde saklayarak veri kaybını önlemesi(replication)
- Kullanım kolaylığı
olarak sıralayabiliriz.
Günümüzde ise bildiğimiz sql tabanlı veritabanları dışındaki tüm veritabanları için NoSql terimi kullanılır.
İlişkisel veri tabanlarının (RDBMS) aksine NoSQL veriyi klasik tablolar halinde değilde farklı şekillerde modellememizi ve tutmamızı sağlar. NoSQL veritabanları çoğunlukla big data ve real time (gerçek zamanlı) web uygulamaları için kullanılır.
SQL de verilerimizi tablolar halinde tutuyorduk NoSQL de ise şu şekillerde tutuyoruz.
NoSQL’in bir çok çeşidi bulunmaktadır. Burada verilerin karakteristiği ve analiz türüne göre çeşitlerini sıralarsak,
- Column-familty/Wide Column Store database
- Graph database
- Document database
- Key-Value database
NoSQL veritabanı sistemleri genelde dört başlık altında toplanmıştır, fakat daha fazla kategoriye ayıranlar da mevcut araştırırken görmüştüm. Ben burada dört ana başlığın altında anlatacağım.
Key-Value (Anahtar-Değer) Veritabanları:
Adından da anlaşılabileceği gibi, bu veritabanlarında veri bir anahtar ile temsil edilir ve bu anahtarın değerinde de birden fazla özellik bulunabilir.
Keyler üzerinden hızlı bir şekilde veriye ulaşabiliriz. Bir örnekle açıklayalım;
Çalışanlarımızın isimlerini, yaşlarını, hobilerini ve mesleklerini içeren bir veritabanı düşünelim. Bu veriyi ilişkisel bir veritabanında depolarsak her bir obje, ya da bizim durumumuzda her bir çalışanımız bir sütun olarak tutulacaktır. Değerler kendi anahtarlarıyla beraber saklanır ve düzenli olarak da çoğaltılır. Key-Value veritabanları ise her veriyi anahtar ve değer çifti halinde saklar. Çalışanlara ait oluşturduğumuz Key -Value veritabanında örneğin; isim, yaş, meslek, hobiler kelimeleri birer anahtar olurken SILA, 23, Matematik, binicilik gibi gerçek veriler bu anahtarların değerleri (value) olacaktır. Sanırım kafanızda daha net oturmuştur.
Key-Value veritabanlarına örnek
Redis, Voldemort, Riak, ve Amazon Dynamo örnek verilebilir.
Wide-Column (Kolon-Odaklı) Veritabanları:
Bu sistemlerde veri geleneksel satır bazlı saklama bakış açısı yerine sütun bazlı saklanır.
Aslında ilişkisel veritabanlarına benzemektedir. farkı iseSuper Columnile yapıyı belirleriz ve aşağıdaki gibi alanların altına her kayıt için farklı bir kolon oluşturabiliriz.
Aşağıdaki resimde aslında örnekle anlatmaya çalıştım.
En bilinen örnekleri Hadoop / HBase , Cassandra, Apache HBase, Kudu ve Druid’dir denebilir.
Document (Döküman) Veritabanları:
Document şeklinde kayıt edilen, saklanan verilerdir. JSON formatında saklanan bir veri örnek olarak gösterilebilir. Döküman veritabaları sayesinde her bir nesneyi özelliklerine göre parçalamak yerine, önceden belirlediğimiz bir şemaya uygun bir şekilde bütün halde veritabanına yükleyebiliriz. Bunu programlama yaparken bir class oluşturup daha sonra o class ın özelliklerine uygun nesneler tanımlamaya benzetebiliriz.
Örneğin bazı makaleleri ilişkisel bir veritabanında depolamak istediğimizi düşünelim. Bunun için makaleyi inceleyerek yazar ismi, tarih, başlık ve makalenin kendisi şeklinde bu makaleyi parçalamamız gerekir. Daha sonra bu özellikler için sütunlar oluşturulur ve her biri doğru sütuna denk gelecek şekilde tek tek girilir.
Ancak döküman veritabanları ile yapmamız gereken tek şey yazar adı, tarih, başlık ve makalenin kendinin nerede olması gerektiğini belirten bir şema oluşturup bunu kaydettikten sonra makaleyi olduğu gibi yüklemek olacaktır. Sonrasında veritabanı hangi özelliğin hangi sütuna ait olduğunu otomatik olarak, parçalama ihtiyacı duymadan bilecektir.
Nesneleri parçalamadan ya da birleştirmeden tutabilme özelliği sayesinde bu veritabanları en kullanışlı olanlarıdır diyebiliriz.
- Döküman veritabanlarına MongoDB ,ElasticSearch,CouchDb örnek verilebilir.
Graf (Ağ) Veritabanları:
Graf ya da ağ veritabanları birbiriyle fazlaca bağlı verileri depolamak için kullanılır. Bu veritabanı sistemi nesneleri alır ve onları çizgi kullanarak birbirine bağlar. Nesne türü milyonlarca olabilir: insanlar, şirketler, ürünler… Aradaki çizgi bu nesneler arasındaki ilişkiyi tutar ve çizginin kendisi de, yani bu ilişki de kendine ait bazı özelliklere sahip olabilir. Eğer bu ilişki yönlü bir ilişki ise bu çizgi bir ok olabilir. Her bir nesne bir düğüm(Node), arada ki her bir ilişki bir kenar (edge) olarak adlandırılır.
Bu veritabanlarına örnek olarak Instagram’ın veritabanını düşünebiliriz. Arkadaşlarınız Sıla, Ali, Veli, Mehmet ve kardeşiniz Çınar olsun. Kardeşiniz Çınar ile arkadaş olacağınızdan onların arasında bir edge olacaktır. Eğer Hacettepe , yazarsa siz ve Sıla’ nın beraber eğitim gördüğü üniversite, üzerine öğrencisi yazarsanız sizi ona bağlayan bir edge oluşacaktır. Böylelikle bütün sosyal çevreniz ve hayatınız bir ağ oluşturacaktır.
Bu türden veritabanları büyük miktarlarda, oldukça karmaşık veri ve nesne türleri tutabilir, bunlar kolaylıkla birbirine bağlanır ya da bağlantıs koparılır. Bu türden veritabanları ile tüm dünya git gide birbirine içten bağlanabileceğinden dolayı seçenekler sonsuzdur.
Tablolar, null değerler ve doldurulacak kutucuklar olmadığından daha az hafıza alanı kaplanır. Bu veritabanı tipi ile pek çok şey basitçe, diğer nesne ve bağlantıları bozma riski oldukça düşük bir şekilde eklenebilir ya da değiştirilebilir. Bu sebeple her ne kadar ilişkisel veritabanları günümüzde daha yaygın kullanımda olsa da yakında bu durum ağ veritabanlarının lehine değişecektir.
Graph veritabanlarına örnek olarak;
Neo4J, OrientDB, Allegro, Virtuoso, Sones, Jena, Sesame
NoSQL veritabanları özellikle büyük veri hacmi, düşük gecikme süresi ve esnek veri modelleri gerektiren uygulamalar için optimize edilmiştir.
NoSQL Veritabanlarının Avantajları
- Esneklik(flexibility): NoSQL genellikle daha hızlı ve daha fazla yinelemeli yazılım geliştirmeyi mümkün kılan esnek şemalar sağlar. Esnek veri modeli sayesinde NoSQL veritabanları yarı yapılandırılmış ve yapılandırılmamış veriler için idealdir.
- Ölçeklenebilirlik(Scalability): NoSQL veritabanları genellikle pahalı ve kalıcı sunucular eklenerek ölçeği artırılabilecek şekilde değil, dağıtılmış donanım kümeleri kullanılarak ölçeği genişletilebilecek şekilde tasarlanır. Bazı bulut sağlayıcıları bu işlemleri arka planda, tam olarak yönetilen bir hizmet olarak gerçekleştirir.
- Yüksek performans(High performance): NoSQL veritabanları, benzer işlevlerin ilişkisel veritabanlarıyla gerçekleştirilmesi ile karşılaştırıldığında daha yüksek performansı mümkün kılan belirli veri modelleri ve erişim desenleri için optimize edilmiştir.
- Yüksek oranda işlevsel(Highly functional): NoSQL veritabanları, her biri ilgili veri modeli için özel olarak tasarlanmış yüksek oranda işlevsel API’ler ve veri türleri sağlar.
- Bakım ve yönetimi ilişkisel database’lere kıyasla daha kolaydır ve ucuzdur.
- NoSQL sistemler sabit tablo ve sütunlara bağımlı değildir bu da tasarımda bir değişikliğe gidilmesi gerektiğinde işlerin çok daha kolay olacağı anlamına gelir.
- Genellikle yüksek sorgu hızları sunan NoSQL veritabanları, öngörülemeyen verileri işleme konusunda çok etkilidir, sürekli genişleyen veri türleri ve modellerinin yönetilmesinde başarılıdır.
- Çoğu kaynak open source(açık kaynak)
- SQL verileri dikey büyüme mantığında veritabanına eklerken NoSQL yatay büyüme ile verileri depolamaktadır. Dikey ile yatay arasındaki en büyük farksa dikeyde büyümenin yetersiz kaldığı koşullarda sisteme ek bir donanım eklenmelidir. Fakat yatay büyümede yükleri sunuculara bölebilirsiniz. Bu iki teknolojinin arasındaki en büyük fark budur.
Bu kadar iyi yanı olan NoSQL ‘in eksik yönleri tabiki de var nelermiş bakalım bunlar.
NoSQL Veritabanlarının Dezvantajları
- Nosql yeni gelişmekte olduğu için raporlama, analiz ve performans araçları yeterli değildir.
- RDBMS’deki gibi İlişkisel veri yapısı mevcut değildir.
- RDBMS’de yapılan uygulamaların NoSql sistemlerine taşınması zahmetlidir.
- Transaction kavramı bulunmadığından veri kaybı söz konusu olabilir. Bundan dolayı finansal uygulamalarda (Bankacılıkta)tercih edilmezler.
- Veri güvenliği konusunda RDBMS kadar gelişmiş değildir.
- Doküman ve profesyonel destek konusundan eksiklikleri olabilir.
Kimler Kullanıyor?
NoSQL veri tabanları, e-ticaret, internet arama motorları ve sosyal ağlar gibi büyük ölçekli internet uygulamaları için güvenilirliğini ve performansını ispatlamıştır.
- İnternetin en büyüğü Google, verilerini BigTable isimli NoSQL veritbanında yönetmektedir.
- Amazon’un NoSQL çözümü DynamoDB,
- Amazon‘un yanısıra Airbnb, Samsung, Toyota vb.. pek çok dünya devi kuruluş tarafından da kullanılmaktadır. Facebook, twitter gibi aynı anda çok sayıda kullanıcının aktif olduğu sosyal ağ platformlarında da petabayt’lık nosql veritabanları kullanılmaktadır.
Peki hangi veritabanını seçmeliyim?
Öncelikle şu soruyu sormalıyım ?
- Elimizde ki data(veri) ne tür?(Yani structured , unstructured, semi-structured mı)
Kısaca elimizde ki veriyi bir görelim :)
- Bu veritabanı ile neler yapacaksınız? Küçük bir şirket çalışanlarının özel bilgileri mi tutulacak, yoksa büyük bir şirketin binlerce müşterilerinin bilgileri mi?
- Sitenizi günde kaç kişi ziyaret edecek?
- Aynı anda kaç işlem yapılacak?
- Güvenlik ne ölçüde olacak?
- Verilerinizin güvenliği ne ölçüde olacak?
Vb. sorular daha da artırılabilir. Araştırırken denk geldiğim çok güzel iki resimle bize anlatıyor aslında. Şu şekilde:)
Sanırım şu an her şey daha açık anlaşılmıştır diye umuyorum .
CAP TEOREMi
Sistemlerin büyümesi, sahip olduğumuz veri boyutunun ve öneminin giderek artmasıyla veri tutma ve işlemede tek makine ile çalışmak artık yeterli olmamaya başladı.
Bu yetersizliğin farklı sebepleri olmakla birlikte başlıcaları, tek makine performansının yetersizliği, sistemin herhangi bir çökmede single point of failure oluşturması ve belli localization latencylerine sebebiyet verebilmesi olarak sıralanabilir ve bu da verimizi farklı makinalara dağıtma yani dağıtık sistemler kurma ihtiyacını doğurur . CAP teoremi dağıtık mimarı kurgularken aklımızda bulundurmamız gereken teoremlerin başında gelir.
CAP Teoremi, 1998 yılında California Üniversitesi’nde bilgisayar bilimcisi olarak görev yapan Eric Brewer tarafından ortaya koyulduğu için Brewer Teoremi olarak da bilinir.
CAP Teoremi; Consistency, Availability ve Partition Tolerance kelimelerinin ilk harflerinin kısaltmasından gelir.
Eğer ki bir dağıtık mimari kurgulamak istiyorsanız bu 3 kavramı aynı anda sağlamanız mümkün değildir, bunu sağlayacak bir teknoloji yapamazsınız ve muhakkak birinden feragat edip geri planda bırakmak zorundasınız der.
Her yerde şu üçgenle anlatılır bu teorem;
Benim başta biraz kafam karışmıştı aslında şu küme ile sanki daha net anlaşılıyor;
Teorem basit olarak dağıtık bir sistemde veri üzerinden sunulan hizmet için aynı anda 3 özelliğin sağlanamayacağıdır. Sistem CA, CP veya AP olabilir. CAP olamaz.
Consistency(Tutarlılık): Dağıtık sistemlerde tutarlılık, verinin birden fazla replicası olduğu durumlarda, siz bir veriyi güncellediğinizde verinin diğer tüm makinalardaki kopyaları en güncel halini alıyor mu? konusudur. Eğer tüm makinalar verinin en güncel haline sahipse consistency yani tutarlıdır diyebiliriz.
Örneğin dağıtık bir sistemde bir sunucuya x değeri olarak 8 yazdınız. Aynı sorguyu ağınızdaki başka sunucuya yaptınız ve cevap olarak 8 değerini aldınız. Bu tutarlılıktır.
Availability(Erişebilirlik): Tüm serverlar tüm requestlere doğru ya da hatalı sonuç dönebiliyor mu? Eğer dönebiliyorsa available diyebiliriz.
Örneğin banka sisteminde, şu anda bakım yapılıyor olması yüzünden hesaplara ulaşılamaması, ve sistemin bu şekilde bir hata vermesi sistemin ulaşılabilir olduğu anlamına gelir. O zaman availability’yi bir nevi “server not respond” alıp almamak olarak da değerlendirebiliriz. Alıyorsak available değil almıyorsak available’dır diyebiliriz. Yani x değerini hem yazabildiniz, hemde okuyabildiniz.
Partition Tolarance (Bölünebilme Toleransı): Ağınızdaki sunucuların arasındaki bağlantı gittiğinde yani ağdan koptuğunda çalışmaya devam edebiliyor mu? Eğer ediyorsa partition tolerance var diyebilriz.
CAP Teoremi ne diyor Aynı anda 3ünü birden yapamazsın diyor. Neden ? Bu durumu analiz edelim..
- Consistency & Availability (CA): Tüm değişiklikler aynı anda tüm düğümlerde görünür ve sistem tüm isteklere cevap verir. Ancak bir şekilde düğümler zarar görürse sistem kitlenir. İstemciler bloklanır. Bütün RDBMS’ler bu gruba dahildir. Tabi ki bu tarz durumlar için bazı RDBMS teknolojilerinde sadece okumaya yönelik de olsa hizmet devam edebilmektedir. Çoğunlukla veri tutarlılığının her şeyden daha fazla ön planda olduğu sistemler için ideal durumdur. Mesela para transfer işlemleri böyledir.
- Consistency & Partition Tolerance (CP): Bir kısmı zarar görse de sistem çalışmaya devam eder ve tüm düğümlerde aynı veri görünür. Tutarlı olmayan verinin gösterilmemesi için bazı verilere erişim sağlanamayabilir. Yani ‘Availability’den feragat edilir. Fakat erişilen veride tutarlılık korunur. Çoğunlukla veri yazılan iş modelleri için ideal durumdur. Örneğin bir cihaz veya uygulama hareketlerinin loglanması böyledir.
- Availability & Partition Tolerance (AP): Bir kısmı zarar görse de sistem hizmet vermeye devam eder ve iş yüküne bağlı olarak değişen cevaplar istemciye iletilir. Güncel olmak veya tutarlılık garanti edilmez. Çoğunlukla veri okuma yapılan, tutarlılığın değil de erişilebilirliğin ön planda olduğu iş modelleri için ideal durumdur. Örneğin sosyal medya mesajlaşmaları böyledir.
Şimdilik benden bu kadar . Bir sonra ki yazımda görüşmek üzere:)