Microservice Architecture

.Net Core

Post Page Advertisement [Top]


     Merhaba Sevgili Okurlar,

     Bu yazımda NoSQL bir veritabanı olan MongoDB'den bahsedeceğim. 2009 yılında C++ kullanılarak açık kaynak kodlu bir NoSQL veritabanı olarak geliştirilmiştir. Bugün Big Data kavramlarının önem kazanması ve social media ya da yüksek transaction alan sistemlerde oldukça performanslı çalışması sonucu tercih edilen bir veri tabanıdır. 



NoSQL veritabanlarında okuma ve yazma hızı Relational Databases (İlişkisel Veritabanları)'na göre çok daha hızlıdır.

Okurken ne dinlemeli ?

 Aşağıdaki görselde sistemimize katmak istediğimiz özelliğe göre seçmemiz gereken veri tabanı türlerini görebiliriz. CAP Teoreminden bir önceki yazımızda da bahsetmiştik. Sistemimizin bu üç özelliğe birden aynı anda sahip olamayacağını söylemiştik. İş özeline göre doğru seçimi yapmamız gerek.


    MongoDB'de her bir kayıt bir Document (Doküman)'ı ifade eder, ilişkisel veri tabanında Row'a karşılık gelir. NoSQL veritabanlarında genelde dokümanlar JSON formatta tutulurken MongoDB'de BSON(Binary JSON) formatta tutulur. Her bir doküman Filed'lerden meydana gelir. Filed'lar da Column'a denk gelir. Relational Database'de tabloya denk gelen yapı ise Collection'dur. Dokümanlar collectionlarda tutulur.


Şimdi MongoDB'nin özelliklerini inceleyelim:



Schema-Less Database:

    MongoDB de veriler document olarak saklandığı için herhangi bir mapping zorunluluğu yoktur. Bir BSON document'nizin filed'ları diğerinden farklı olabilir. Aynı collectionda farklı filed, content ve boyutlarda document'lar olabilir.


Document Oriented:

    İlişkisel veri tabanlarında her bir data ilgili column'da belirtilen veri yapısına uygun olmalıdır. NoSQL veri tabanlarında bunun aksine veri JSON ya da  BSON  formatında tutulduğu için her bir filed diğer dokümandakinden farklı yapıda olabilir. MongoDB'de her bir dokümanın bir unique object id'si vardır.


Indexing

    MongoDB veri üzerinde indexlemeye olank sağlar. Default olarak _id keyi primary key olarak üretirlir. Bunun dışında istediğiniz filed'a secondary index verebilirsiniz. Böylece index veridğiniz filed'a göre sorgunuz daha hızlı çalışacaktır.


Replication

    Eğer sisteminiz için tek veri tabanınız varsa herhangi bir server crash ya da servis interruptions durumunda DB erişiminde sorun yaşayabilirsiniz. Replication işte bu gibi durumdalar bir çok serverde veri tabanınızı barındırarak herhangi bir hata durumunda diğer veri tabanına yönlenerek sistemin kesintisizi işlemesini sağlıyor. Bu da uygulamanıza Availability ve Stability katıyor. 


Horizontal Scalability

    Replication bize doğal olarak yatay bir ölçekleme sağlıyor. Yani load balancing yapıyor. Aynı dataya ulaşmak isteyen bir çok kullanıcı isteği geldiğinde dağıtık olarak sistem kendini ölçekleyip rahatça cevap verebilir hale geliyor.


Sharding

    Database sistemlerinde yatay ve dikey olarak partitioning vardır. Bu konu ile daha detaylı bilgiyi kaynaklar bölümünden edinebilirsiniz. Sharding anlam olarak bir bütünün küçük parçaları demektir. Dikey Partitioning(Vertical Partitioning ( Row Splitting )) veri modelini alt parçalara ayırıp saklarken Sharding (Horizontal Partitioning) bun aksine büyük dataset'i bir çok collection üzerinde dağıtık bir şekilde saklar. Database'ye distiributed bir yapı ve performans katar.


Load Balancing

    MongoDB load balancing'e olanak verir böylece uygulamanız yatay olarak ölçeklenebilir.


Ad-hoc Queries 

    MongoDB ile oluşturduğumuz sorgularda istediğimiz filed'ları sorgulayabiliriz hatta sorgularda Reguler Expression'lar da kullanabiliriz. Ad-hoc latincedir anlam olarak belirli bir amaca yönelik demektir. "on the fly" query ya da "just so" query olarak düşünebilirsiniz. O anda ihtiyaca göre üretilmiş query'lerdir.

SQL Query:

SELECT * FROM Employees WHERE emp_name LIKE '%SEM%';

MongoDB Query:

db.Employees.find({emp_name:/SEM/ });


Aggregation

    İstediğimiz dokümanı bulmak için find({}) operatörünü kullanabiliriz. Fakat find operatörüne verdiğimiz filed'a göre tüm dokümanları tarar ve eşleşen dokümanı bize getirir. Milyonlarca dokümanınız olduğunu düşünürseniz performans sorunları yaşayabilirsiniz. Tam da Aggregation Framework işte burada devreye giriyor dokümanları arama kriterine göre farklı aşamalara sokarak istenilen sonuca ulaşıyor. Aggregation pipeline mantığı ile çalışır bu mantığı aşağıdaki görselde aşamaları ile görebiliriz.



Large Media Storage (GirdSF)

    MongoDB resim, ses, video ya da yüksek boyutta verilerin efektif bir şekilde tutulmasını sağlayan GridFS adında bir özelliğe sahip bu özellik sayesinde large file'ları Chunk adı verilen parçalara ayırarak dağıtık bir şekilde saklar. 16MB'dan büyük datalar için bu özelliğin kullanılması faydalıdır. Her bir Chunk 256K uzunluğundadır.



High Performance

    Sonuç olarak görüldüğü gibi MongoDB bize sunduğu replication, load balancing, indexing gibi özelliklerle High Availability(Yüksek Erişilebilirlik) ve Scalability(Ölçeklenebilirlik) sağlıyor. Big-data ve real-time uygulamaları için güzel bir çözüm sunuyor.

Kaynaklar:
https://www.mongodb.com/what-is-mongodb/features
https://barisvelioglu.net/database-sharding-nedir-6605a1986b27 
https://www.tutorialsjar.com/key-features-of-mongodb/ 
https://data-flair.training/blogs/mongodb-features/
https://studio3t.com/knowledge-base/articles/mongodb-aggregation-framework/
https://docs.mongodb.com/manual/aggregation/
https://paulrohan.medium.com/aggregation-in-mongodb-8195c8624337
https://severalnines.com/database-blog/storing-files-mongodb-gridfs
https://thebytearray.wordpress.com/2016/05/23/cap-theorem/
https://data-flair.training/blogs/hadoop-vs-mongodb/
https://medium.com/@berkekurnaz/nedir-bu-mongodb-994a94a9d1df
https://erhankocabuga.com/nosql-mongodb-nedir-mongodb-nasil-kullanilir
https://docs.mongodb.com/manual/tutorial/query-documents/

Okuduğunuz için teşekkür ederim. Bir sonraki yazımda görüşmek üzere,
Sağlıkla kalın.

Hiç yorum yok:

Yorum Gönderme

Bottom Ad [Post Page]