[go: up one dir, main page]

Academia.eduAcademia.edu
Şirketimizin en çok mücadele ettiği konu olan Big Data problemini çözmekte önemli bir araç olacağına inandığım NoSQL sistemler içerisinde en yaygın kullanılan MongoDB veritabanını sizler için inceleyip bir derleme meydana getirdim. MongoDB NoSQL Database Ferhat SARIKAYA / Veritabanı Yöneticisi MongoDB 2014 İçindekiler NoSQL Nedir? .......................................................................................................................................... 2 Neden NoSQL?......................................................................................................................................... 2 MongoDB................................................................................................................................................. 3 MongoDB ve SQL Server Karşılaştırmalı Performans Testleri ................................................................. 4 MongoDB Yönetim Araçları ..................................................................................................................... 9 MongoDB ve Business Intelligence ....................................................................................................... 10 MongoDB ve C# ..................................................................................................................................... 11 Ferhat SARIKAYA / Veritabanı Yöneticisi 1 MongoDB 2014 NoSQL Nedir? NoSQL: Not Only SQL’in kısaltmasıdır. İlişkisel veritabanlarına (RDBMS) bir alternatif olarak ortaya çıkmıştır. DDL ve DML işlemleri sırasında Klasik SQL dili kullanılmadığı için bu isimle anılmaya başlanmıştır. Google ve Amazon gibi devler yıllardır bu teknolojiyi kullanmaktadır. Google kendi tasarladığı Big Table, Amazon Dynamo ve Facebook’ta Cassandra’yı kullanmaktadır. İlişkisel veritabanı sistemlerinde temel mantık tekrarlanan verilerin önüne geçilmesidir, bu sebeple de tekrarlanacak veriler ayrı tablolarda tutulur ve sorgu esnasında joinlerle birleştirilirler, bu işleme Normaliazsyon’da denmektedir, ileride değineceğimiz gibi Business Intelligence kısmında ise performans için joinler ortadan kaldırılır ve veriler tekrar halinde tutulur, buna da Denormalizasyon denir. Join sayısının ise üçten fazla olması performans kaybına yol açmaktadır ki kompleks yapılarda rahatlıkla bu sayı üçün üzerine çıkmaktadır. NoSQL sistemlerde ise veriler ilişkisel veritabanı modelinin aksine denormalizasyon halinde tutulurlar, böylece verilere ulaşmak daha hızlı ve daha kolaydır. Ayrıca insert, update, delete işlemleri dosyalarda yapılırken, select işlemi ram üzerine set edilmiş bilgilerden çekildiğinden oldukça hızlı sonuç döndürmektedir. Neden NoSQL? Neden sorusuna cevap verebilmek için İlişkisel Veritabanı (RDBMS) modelini incelemek gerekir. İlişkisel veritabanı modelinde verilerin işlenmesi transaction temellidir. Transactionların stabil çalışması ve veri bütünlüğünün korumak için ACID standartına sıkı sıkıya bağlıdır. ACID’in açılımı şöyledir: Atomicity: Bir transaction sırasında bir işlemin başarısızlığı tüm işlemleri etkiler ve tümü başarısız sayılır. Consistency: Bir transaction, şema içerisinde tanımlanan foreign key, unique check gibi tüm kurallara uymak zorundadır, aksi halde başarısız kabul edilir. Isolaiton: Commit edilmemiş bir transaction içerisindeki işlemler yalnız transaction tarafından bilinir, commit edildikten sonra işlem herkese yansır. Durability: Commit edilen verinin veritabanına yazıldığından muhakkak emin olunmalıdır, commit edildikten sonra veri yok olmaz. Ayrıca İlişkisel veritabanı modelinde Propagation Constraint (PC) algoritmasını da kullanırlar. Bu algoritma temelde tanımlanan veri yapısını korur ve ilişkisel modelde tanımlanmış bir veri üzerinde anlamsız işlemler yapmanızı engeller. Örneğin Foreign Key olarak tanımlanmış ana tablodaki veriyi silmek istediğinizde eğer bu veriyle alakalı bir kayıt ilişkili olduğu tabloda mevcut ise silme işlemini gerçekleştirmenize müsaade edilmez, böylece veri bütünlüğü anlamlı bir şekilde korunmuş olur. NoSQL = No ACID demek doğru olur, elbette bazı istisnalar mevcut. Big Table, HBase, CouchDB her ne kadar NoSQL bir veritabanıysalar da bazı hizmetleri sayesinde ACID desteğini sağlamaktadır. Ferhat SARIKAYA / Veritabanı Yöneticisi 2 MongoDB 2014 NoSQL sistemlerinin SQL-92 gibi bir standardı olmadığı için yukarda yazılanların genel özelliklerin dışında kendi aralarında farklılıklar göstermektedir. Her sistemin veri tutarlılığı ve erişimi ile ilgili farklı özellikleri ve yetenekleri bulunmaktadır. Fakat NoSQL sistemlerini genel olarak 3 grupta toplayabiliriz: Doküman (Document) Tabanlı: Bu sistemlerde bir kayıt doküman olarak isimlendirilir. Dokümanlar genelde JSON formatında tutulur. Bu dokümanların içerisinde sınırsız alan oluşturulabilir. MongoDB, CouchDB, HBase, Cassandra ve Amazon SimpleDB bunlara örnektir. Anahtar / Değer (Key / Value) Tabanlı: Bu sistemlerde anahtara karşılık gelen tek bir bilgi bulunur. Yani kolon kavramı yoktur. Azure Table Storage, MemcacheDB ve Berkeley DB bunlara örnektir. Grafik (Graph) Tabanlı: Diğerlerinden farklı olarak verilerin arasındaki ilişkiyi de tutan, Graph theory modelindeki sistemlerdir. Neo4J, FlockDB bunlara örnektir. NoSQL sistemlerin doğmasındaki sebep yüksek veri kapasitesi sonucunda verilerin daha hızlı işlenebilmesi ve daha hızlı sonuç döndürebilmesidir. Özellikle Petabyte boyutundaki verilerde dahi en iyi performansı sağlamak üzere dizayn edilmişlerdir. DML işlemleri esnasında ilişkisel modelin kontrol mekanizamlarının çoğundan arındırıldığı için oldukça ciddi performans sağlamaktadır ki Google, Amazon ve Facebook gibi devlerin milyarlarca insana aynı anda hizmet verebildiğini düşündüğümüzde performans ve hız açısından oldukça tatmin edicidir. NoSQL sistemler, veritabanı dünyasının geleceği gibi görülmektedir. Her ne kadar ilişkisel modele göre veri tutarlılığı konusunda zayıf olsa da ücretsiz oluşları, yatay genişlemeye müsait olmaları, çok güçlü server konfigürasyonları gerektirmemeleri ve ilişkisel modeldeki cluster zorlukları ve verimsizliklerinden arındırılmış ve oldukça performanslı çalışmaları NoSQL sistemleri cazibe merkezi haline getirmeye başlamıştır. Özellikle büyük boyutlu verilerin saklanması için maliyetleri yüksek ilişkisel veritabanlarından ve serverlardan uzaklaşmak Google, Facebook gibi devlerin dahi tercihleri arasında yer almaktadır. Bu tür sistemler yerine düşük maliyetli ve özellikli çok fazla sayıdaki serverlar üzerinde verilerini saklamak ve cluster yapmak daha cazip hale gelmiştir. NoSQL sistemlerin bir çoğunda binlerce server tek bir küme gibi hareket edebilir ve çok yüksek boyutlu verileri oldukça hızlı bir şekilde yazabilir (İleride performans testlerinde de bu durum açıkça görülecektir). MongoDB MongoDB bir NoSQL veritabanıdır. Özellikle ilişkisel veri tabanlarındaki Big Data problemine çözüm olarak geliştirildi. MongoDB, 10gen firması tarafından açık kaynak bir sistem olarak geliştirildi ve kaynak kodlarına Git Hub üzerinden ulaşmak mümkün. 10gen, MongoDB’yi “Humongus” yani Kocaman, Devasa olarak isimlendirmiştir, zaten ortaya çıkışı da tam da bu maksatladır. C++ yazılım dili ile geliştirildi ve bilinen birçok işletim sistemi üzerinde çalışmaktadır: Windows, Linux, Unix, MacOS. Önemli özelliklerine değinecek olursak: Ferhat SARIKAYA / Veritabanı Yöneticisi 3 MongoDB 2014 • • • • • • • • • • • • • İlişkisel veritabanlarındaki schema yoktur, bu yüzden collation gibi problemlerle uğraşılmaz. Doküman tabanlı veritabanıdır, veriler JSON formatında set edilir, dokümana yazılırken BSON formatında saklar ve karmaşıklıktan kurtulmasını bu şekilde sağlar. Dokümanın her özelliğine ve anahtarına (key) göre indexleme sağlar. Sıkça kullanılan okuma işlemi sorgulamalarında yüksek performans göstermektedir. Verilerin yazılması esnasında yüksek performans göstermektedir. High Availability (Yedeklilik) desteği bulunmaktadır. Auto Sharding özelliği sayesinde aynı verinin birden çok yerde işlenmesi ve bulunabilmesi ile yatay ölçeklendirme yapılabilmektedir. Bunun yanında dikey ölçekleme yapabilmekte mümkün. Ölçeklemeyi sağlayabilmek için Master – Slave Replication desteği sunar. Master: Yazma işleminin yapıldığı sunucudur. Slave: Okuma işleminin yapıldığı ve ölçeklendirmenin sağlandığı sunucudur. Master sunucu herhangi bir şekilde fail olursa Slave sunuculardan biri Master olarak atanır. Doküman tabanlı oldukça kompleks sorgular yazmak mümkündür. Map / Reduce özelliği sayesinde kolay analiz etme ve kolay veri işlemeyi sağlar. Map: Tüm verileri sırayla parametre şeklinde alır, key – value yapısına çevirir. Reduce: Map’in döndürdüğü key – value değerlerini yakalayarak üzerinde işlem yapmamızı sağlar. Fultext search desteği bulunmaktadır. GridFS ile birlikte dosyaları veritabanı içerisinde saklamak mümkündür. Sürekli genişleyen yapılar için oldukça uygun, birden fazla server üzerinde sorunsuz çalışabilmektedir. MongoDB’nin popüler yazılım dillerinin birçoğuna driver desteği bulunmaktadır. Bunlardan bazıları: C#, C++, C, Ruby, PHP, Python, Erlang, Perl. Özellikle artık yaygın bir metot olarak kullanılan ORM tabanlı yazılım geliştirme modeline daha uygun bir yapı. SQL Server kullanılan bir projede LinQ veya Entity Framework gibi ORM tool kullanmak pek avantajlı olmuyor, çünkü SQL Server her sorguyu önce maliyetlendiriyor ve sonra yol hesabı yapıyor, daha sonra buna göre sorgu sonucunu döndürüyor. Bu tür maliyet ve yol hesaplarından sıyrılmak için stored procedure kullanmak daha makul. Her ne kadar ORM tool içinde bu mümkünse de maalesef yazılımcıların çoğu burada stored procedure’den bilgiyi almak yerine ORM tool’un syntax’ını tercih ediyor; fakat yine de ACID yapısından ötürü SQL Server veya diğer ilişkisel veritabanları sonuç döndürmede oldukça yavaş kalıyor. MongoDB ve SQL Server Karşılaştırmalı Performans Testleri Burada birkaç test sonucu ile ilgili verileri paylaşacağım. Temelde amacım şuan kullandığımız sisteme alternatif olarak sunduğum MongoDB’nin bize sağlayacağı artıları gösterebilmek. 1) İlk olarak bakacağımız test SQL Server 2008 ile MongoDB’nin karşılaştırılması üzerine Michael Kennedy’nin yaptığı test sonuçları göreceğiz. Ferhat SARIKAYA / Veritabanı Yöneticisi 4 MongoDB 2014 Web adresi: http://blog.michaelckennedy.net/2010/04/29/mongodb-vs-sql-server-2008performance-showdown/ Insert İşlemi Testi Görüldüğü gibi 1.000 kayıttan sonra ciddi bir fark başlıyor ki 50.000 kayıt SQL Server üzerinde 160 saniye sürerken, aynı işlem MongoDB üzerinde yalnızca birkaç saniye alıyor. Yine insert işlemi için aynı anda 5 kullanıcı üzerinden veri gönderimi yapılıyor ve sonucu: Görüldüğü gibi MongoDB neredeyse 100 kat daha hızlı sonuç veriyor. Yine LinQ ORM aracı kullanılarak basit bir class tanımı ile insert işlemi yapılıyor. Class yapısı SQL Server ve MongoDB’de aynı: Ferhat SARIKAYA / Veritabanı Yöneticisi 5 MongoDB 2014 MongoDB ile işlemi sonucu: SQL Server ile işlem sonucu: Görüleceği üzere yine fark 100 kat. Select İşlem Testi Paralel 5 kullanıcı ile select sorgusu performans sonuçları şöyle: Görüleceği üzere 1/3 oranında bir zamanla MongoDB işlemi gerçekleştiriyor. Ferhat SARIKAYA / Veritabanı Yöneticisi 6 MongoDB 2014 Yine kompleks sorgulara bakıyoruz: MongoDB doküman yapısı: SQL Server tablo yapısı: Sorgu sonucu: Ferhat SARIKAYA / Veritabanı Yöneticisi 7 MongoDB 2014 Görüleceği gibi kompleks sorgularda da MongoDB, SQL Server’a oranla 1/3 oranında bir zamanla işlemi bitirebiliyor. 2) İkinci bakacağımız performans testi ise Windows Server 2012 üzerinde 64 bit edition üzerinde yapılıyor. 4 GB Ram bulunuyor ve bir instance çalışıyor. SQL Server 2012 Developer Edition 64 bit sürümü ile MongoDB 2.4.8 64 bit edition karşılaştırılıyor. Web adresi: http://geekswithblogs.net/EltonStoneman/archive/2013/12/13/theconcurrency-shoot-out-sql-server-versus-mongodb-part-1.aspx SQL Server yapısı: MongoDB Yapısı: Ferhat SARIKAYA / Veritabanı Yöneticisi 8 MongoDB 2014 1.000 ve 10.000 iş akışı ve 100 eş zamanlılık üzerine yapılan test sonucu: Görüleceği üzere MongoDB 6 kat daha hızlı sonuç vermektedir. MongoDB Yönetim Araçları 1) Nucleon Database Master: MongoDB, NuoDB, Oracle, MySQL, PostgreSQL, FireBird, SQLite, SQL Server, SQL Azure, IBM DB2, IBM Informix, Netezza, Ingres sistemlerin yönetimini yapabilen bir yönetim aracı. MongoDB konusunda destekleri: JSON Query Editor, Advanced Data Editing, Collection Manager, Index Manager, GridFS Manager, Visual Map & Reduce Editor, Visual Query Search, Tree and Table style data view and rich data export features to common file formats. Lisans Ücretleri Database Master Ürünü: Professional License: 69 USD Professional License + Subscription: 79 USD Enterprise License: 179 USD Enterprise License + Subscription: 189 USD Ferhat SARIKAYA / Veritabanı Yöneticisi 9 MongoDB 2014 Business Intelligence Studio Ürünü: Professional License: 149 USD Professional License + Subscription: 159 USD Enterprise License: 479 USD Enterprise License + Subscription: 489 USD Ultimate License + Subscription Ürünü: BI Studio and Database Master: 2.000 USD 2) Mongovue: MongoDB ile birlikte SQL Server, MySQL ve PostgreSQL desteği de veriyor. Bu databaselerden MongoDB’ye veri import edebiliyor. Ücretsiz sürümünde Monitoring desteği vermiyor; ama ücretli sürümlerde her destek mevcut. Lisan Ücretleri Standart: 35 USD, yalnız bir kullanıcı lisansı Enterprise: 350 USD, 25 kullanıcı lisansı Enterprise Gold: 500 USD, 100 kullanıcı lisansı Enterprise Platinum: 1.000 USD, 250 kullanıcı lisansı Enterprise Diamond: 2.500 USD, Limitsiz kullanıcı lisansı 3) NoSQL Viewer: MongoDB, Couchbase, Apache CouchDB, Cassandra, HBase databaselerine full destek veriyor. Oldukça profesyonel gözüküyor. Lisans ücretleri ise ihtiyaca ve kullanıcı sayısına göre değişkenlik gösteriyor. 4) Robomongo: Grafik tabanlı bir diğer yönetim aracı da Robomongo. MongoDB Shell Script kullanarak işlemleri gerçekleştirdiği için tam destek veriyor. Kullanımı oldukça kolay ve bir çok platformda çalışıyor. Lisans ücreti olmadığı için tercih edilen bir araç. 5) UMongo: Grafik tabanlı bir yönetim aracı. Robomongo gibi tam hakimiyet sağlıyor ve ücretsiz. 6) RockMongo: PHP 5.5 ile geliştirilmiş bir ara yüze sahip. Bir çok işlemi yapabilmek mümkün ve ücretsiz. MongoDB ve Business Intelligence Business Intelligence (BI) sürecinde verilerin denormalize halde tutulduğunu düşündüğümüzde ve yukarıdaki birçok bilgiyi göz önüne aldığımızda SQL Server’a oranla daha verimli ve daha hızlı bir yaklaşım sergilemek mümkün gözüküyor. Big data konseptinden ötürü MongoDB için oldukça iyi BI araçları bulunmaktadır; ama elbette bunu değerlendirmek hususunda BI Developerlar daha doğru bir tercih yapacaktır. Bu kısımda kullanılabilecek bazı araçları aşağıda sıraladım. 1) Jaspersoft: Müşterileri arasında Ericson, Juniper gibi devler bulunuyor. ETL işlemini yapmaya gerek görmeksizin dönüşüm işlemlerini yapabiliyor. Özellikle ram üzerinde analiz yapabiliyor olması şüphesiz hızlı işlem yapabilme ve ciddi performans kazançları sağlıyor gibi. Raporlamalarda ise HTML5 desteği önemli bir artı gibi duruyor. Ferhat SARIKAYA / Veritabanı Yöneticisi 10 MongoDB 2014 2) Penthano: Önemli ve etkili araçlardan biri de Penthano. Jaspersoft’tan sonra özellikleri açısından gözüme çarpan ikinci araç oldu. 3) Nucleon BI Studio: bir önceki “Yönetim Araçları” bölümünde ayrıntılı bilgi vermiştim. MongoDB ve C# Şirketimizde C# dili kullanıldığı için MongoDB’nin kullanım şekline yönelik basit bir class yapısı örneği geliştireceğim. Böylece MongoDB üzerinde yazılım geliştirme konusunda ufak bir fikir verebilir düşüncesindeyim. Geliştirme ortamımızın Visual Studio 2012 olduğunu varsayıyorum, bunun için MongoDB’nin C# driverını kurmamız gerekiyor. NuGet Packages üzerinde “Official MongoDB C# Driver” yazmak yeterli, kurulum otomatik yapılıyor. Şimdi bir eğitim platformu geliştirdiğimizi varsayıyorum ve Ogrenci class’ımızın metotlarını yazıyorum: static void OgrenciEkle() // öğrenci ekleme fonksiyonumuz { MongoClient client = new MongoClient(); MongoServer server = client.GetServer(); MongoDatabase db = server.GetDatabase("Ogrenciler"); var ogrenciler = db.GetCollection("Ogrenci"); ogrenciler.Insert(new BsonDocument { {"Ad","Ferhat"}, {"Soyad","SARIKAYA"}, {"Yas",36}, {“Numara”, 123456} }); } static void OgrenciDuzenle()// öğrenci bilgilerini düzenleme fonksiyonumuz { MongoClient client = new MongoClient(); MongoServer server = client.GetServer(); MongoDatabase db = server.GetDatabase("Ogrenciler"); var ogrenciler = db.GetCollection("Ogrenci"); var sorgu = new QueryDocument { { "Numara", 123456 } }; var ogr = ogrenciler.Find(sorgu).FirstOrDefault(); var guncelle = new UpdateDocument { { "$set", new BsonDocument("Soyad", "Sarıkaya") } }; ogrenciler.Update(sorgu, guncelle); } static void OgrenciSil()//öğrenci silme fonksiyonumuz { Ferhat SARIKAYA / Veritabanı Yöneticisi 11 MongoDB 2014 MongoClient client = new MongoClient(); MongoServer server = client.GetServer(); MongoDatabase db = server.GetDatabase("Ogrenciler"); var ogrenciler = db.GetCollection("Ogrenci"); var sorgu = new QueryDocument { { "Numara", 123456 } }; ogrenciler.Remove(sorgu); } static void OgrenciListele()//öğrencileri listelediğimiz fonksiyonumuz { MongoClient client = new MongoClient(); MongoServer server = client.GetServer(); MongoDatabase db = server.GetDatabase("Ogrenciler"); var ogrenciler = db.GetCollection("Ogrenci"); var liste = ogrenciler.FindAll(); foreach (var ogr in liste) { Console.WriteLine(ogr["Ad"] + " " + ogr["Soyad"] + " " + ogr["Yas"] + “ ” + ogr[“Numara”]); } } Ferhat SARIKAYA / Veritabanı Yöneticisi 12