Doküman Tabanlı NoSQL Veritabanları: MongoDB ve CouchDB yatay ölçeklenebilirlik karşılaştırması Süleyman Eken, Fidan Kaya, Ahmet Sayar, Adnan Kavak Bilgisayar Mühendisliği Kocaeli Üniversitesi Umuttepe Kampüsü,41380, Kocaeli-Türkiye {suleyman.eken, fidan.kaya, ahmet.sayar, akavak}@kocaeli.edu.tr Öz–MySQL, Oracle ve Microsoft SQL Server gibi klasik ilişkisel veritabanı yönetim sistemleri (VTYS) uzun zamandır birçok uygulamada veri depolamak ve işlemek için kullanılmaktadır. Bunlar ACID (Atomicity, Consistency, Isolation, Durability) garantisi vermesine rağmen yatay olarak ölçeklemek (çoklu sunucuya dağıtmak) çok zordur. Ayrıca internetin hızla büyümesiyle Facebook ve Twitter gibi içeriğini kullanıcıların oluşturduğu web sitelerinin büyük miktardaki verilerinin üstesinden de gelememektedirler. NoSQL (Not Only SQL) VTYS ise büyük verileri depolayabilmekte, yüksek trafiğe sahip sistemlerin ihtiyacını karşılayabilmekte ve yatay olarak ölçeklenebilmektedirler. Bu çalışmada, doküman tabanlı NoSQL veritabanlarından olan MongoDB ve CouchDB’nin veri okuma ve yazma hızlarının yatay olarak ölçeklemeye karşı davranışları farklı miktardaki dokümanlar üzerinden karşılaştırılmaktadır. Anahtar Kelimeler –NoSQL veritabanları, MongoDB, CouchDB, yatay ölçeklenebilirlik, dokuman tabanlı, JSON. I. GİRİŞ Verileri kalıcı olarak depolayan daha sonra gerektiğinde etkin bir biçimde geri getiren birçok VTYS mevcuttur. Bu sistemler sahip oldukları özellikler ve verileri depolamak için kullandıkları modeller sebebi ile birbirlerinden yarılabilmektedirler. Standart ilişkisel model, verileri tutmak için her satırı eşsiz olarak adreslenebilen tablolar kullanmaktadır. Bu sistemler verileri depolamak, değiştirmek ve geri döndürmek için yapısal sorgulama dilinden (SQL) yararlanmaktadır. Nesneye dayalı programlama paradigmasının yaygın olarak kullanılması ile ilişkisel veritabanlarının nesne tabanlı veritabanlarına transferi popüler hale gelmiştir. Ayrıca Web 2.0’ın gelişimi ile veritabanlarının ölçeklenebilme ihtiyacı ortaya çıkmıştır. Bu ölçekleme işlemi ise iki şekilde: (i) dikey ölçekleme denilen veritabanı içeren sunucunun donanımsal kaynaklarının artırılması ile ki bu çok maliyetlidir, (ii) yatay ölçeklenebilirlik denilen veritabanını birçok sunucuya dağıtmak yolu ile yapılabilmektedir. Yatay ölçeklenebilirliği gerçekleştirmek için ilişkisel olmayan veritabanları geliştiriliştir. Bunlar SQL’i ve ilişkisel modeli kullanmayan NoSQL VTYS’dir. Makalenin düzeni şu şekilde olacaktır: II. bölümde NoSQL veritabanlarının geleneksel olanlarla karşılaştırılması yapılacak ve NoSQL veritabanlarının çeşitleri üzerinde durulacaktır. III. bölümde önce ölçeklenebilirlik kavramından bahsedilecek daha sonra doküman tabanlı veritabanlarından MongoDB ve CouchDB’nin yatay ölçeklemeyi nasıl gerçekleştirdiği anlatılacaktır. IV. bölümde ise tek sunucu kullanıldığında ve yatay ölçekleme yapıldığında veri okuma ve yazma hızlarının bu iki VTYS’ye göre nasıl değiştiği irdelenmiştir. Son bölümde ise sonuçlar tartışılmıştır. II. NOSQL VERİTABANLARI NoSQL kavramı 2009 sonları 2010 başlarında ortaya çıkmıştır. Bu sistemler klasik veritabanlarından büyük verileri kontrol edebilme, ölçeklenebilme, veri formatları, yönetebilme, sorgulara daha hızlı cevap alabilme, eş zamanlı insert ve update işlemlerini gerçekleyebilme, açık kaynak kodlu geliştirme sağlayabilme gibi yönlerden farklılıklar arz etmektedir. Bu bölümde kısaca bu farklılıklar üzerinde durulacaktır. İlişkisel VTYS’leri işlem (transaction) tabanlı çalışan sistemler olup bu işlemlerin düzgün çalışması ve veri bütünlüğü için ACID kurallarını garantilerler. NoSQL sistemleri bu kuralların tamamına uymaz. NoSQL sistemler ACID alternatifi olan BASE (Basically Available, Soft state, Eventually consistent) kurallarını garantiler. Yani dağıtık sistemin düğümlerinden birinde sorun olsa bile sistem çalışmaya devam eder. Sistemin durumu ve veri sürekli olarak değişebilir. Yeterli zaman olması durumunda dağıtık sistemin her düğümünde yer alan veri tutarlı olacaktır, her düğüm aynı veriyi görecektir. BASE’in temelinde CAP Teoremi vardır. CAP teoremine göre herhangi dağıtık bir sistem aynı anda Tutarlılık (Consistency), Erişebilirlik (Availability) ve Parçalanma toleransı (Partition tolerance) kavramlarının hepsini aynı anda sağlayamaz [1]. Bunlardan mutlaka birinde problem çıkmaktadır. NoSQL sistemlerde ise bu kavramlar esnetilerek yatay ölçeklenebilirlik ile performans kazancı amaçlanmıştır. Örneğin veriyi bölerek belirli sayıdaki kopyalarını da dağıtık sistemin farklı parçalarına göndererek tutarlılık sağlanabilir. Bu sayede paket kaybı yaşansa da verinin tamamı kaybedilmez, aynı zamanda veri bölündüğü için her bir parçaya düşen yük dengelenmiş olur. İlişkisel VTYS’lerinde veriler tablolarda bulunurken, NoSQL sistemler sabit tablo tanımlarına bağımlı değillerdir. İlişkisel VTYS’lerde veriler ilişkilerine göre ayrı tablolara düzenli bir şekilde yerleştirilerek normalize edilirken verilere erişim için birleştirme (join) kullanılır. Birleştirilmek istenen veriler farklı parçalarda (partitions) bulunabildiğinden dağıtık sistemlerde birleştirme operasyonu sıkıntılara sebep olur. Bu birleştirme işlemi şu şekilde yapılmaktadır: örneğin “a” verisi bir parçadan çekilir, sonra bununla ilişkili bir başka parçada bulunan “b” verisi çekilip program düzeyinde birleştirme yapılır. Normal sistemlerde bu işlem performans kaybına sebep olurken dağıtık sistemlerde bu kayıp sistemin genel performansı yanında önemsizdir. İşte bu sebeple dağıtık sistemlerde birleştirme operasyonu yapmak yerine veri denormalize tutularak verilere erişim kolaylaştırılır. NoSQL sistemler bu sebeple sabit tablo tanımı içermeyip verilerin denormalize tutulmasını kolaylaştırır. İlişkisel VTYS’lerde verilerin tekil birer anahtar (primary key) ile birbirlerinden ayrılması zorunlu değildir. Ancak NoSQL sistemler temel olarak verilere tekil anahtarlar üzerinden erişir. Her NoSQL sisteminde ikincil indeks (secondary index) yeteneği de bulunmayabilir. Bu yüzden verilere erişim SQL sorguları ile yapıldığı gibi kolay yapılamaz. Uygulamanın özelliğine göre birincil anahtarlar belirli bir mantığa göre verilir ve bu sayede veriye erişmeden önce zaten bu anahtar biliniyor ya da oluşturulabiliyor olur. Örneğin zamana göre artan ön ek (prefix), kaydın anahtarı ile birleştirilerek tek seferde ilgili kaydın belirli bir zaman aralığındaki kayıtlarına erişmek mümkündür. Bu sayede herhangi bir sorguya gerek olmaksızın tamamen anahtarlar üzerinden verilere hızlıca erişim sağlanmış olur. NoSQL sistemlerin bazılarında map-reduce (büyük veri kümeleri üzerinde dağıtılmış programlamayı destekleyen bir yazılım kütüphanesi) yeteneği bulunmaktadır. Bu sayede RDBMS üzerinde SQL ile gerçekleştirilmesi çok karmaşık olan analizler map-reduce ile kolay bir şekilde gerçekleştirilebilir [2]. NoSQL veritabanlarının pek çok farklı çeşidi bulunmaktadır. Bunlardan en temel olanları: (i) sütunlar şeklinde tutulanlar, (ii) anahtar-değer şeklinde depolama yapanlar, (iii) doküman tabanlılar, (iv) graf tabanlılar. Verileri sütun şeklinde tutan sistemlerde her veri saklama bloğu bir kolona ait verileri içerir, bilinen SQL veritabanlarına çok benzemektedir; fakat onlar gibi istenilen sorgular yapılamıyor. Sütun tabanlı kayıt yapan sistemler genelde birçok farklı makine üzerine dağıtılmış oldukça büyük veriler için kullanılır. Böylelikle çok trafik gören sitelerde okuma/yazma işlemleri hızlandırılmış olur. Tablo 1, bu sistemleri özetlemektedir. Tablo 1. Verileri sütun şeklinde tutan sistemler Örnekleri Cassandra [3], HBase [4], BigTable [5], HyperTable [6] Kullanıldığı uygulamalar Dağıtık dosya sistemleri Veri modeli Sütunlar, sütun aileleri Artıları Hızlı arama, verinin dağıtık olarak depolanması iyi Eksileri Çok düşük seviye API Anahtar-değer şeklinde depolama yapanlar sistemlerde ana mantık bir hash tablosu kullanarak her anahtar bir değer ile eşleştirilir. Böylece daha küçük verilere daha hızlı erişim sağlanır. Modeli gerçeklemek ve implemente etmek oldukça basittir. Tablo 2 bu sistemleri özetlemektedir. Tablo 2. Anahtar-değer şeklinde depolama yapanlar Örnekleri Riak [7], Tokyo Cabinet/Tyrant [8], Redis [9], Voldemort [10], [11] Kullanıldığı uygulamalar İçerik ön belleğe alma (özellikle büyük verileri idare etmek için), loglama, arşivleme, vb. Veri modeli Anahtar-değer çiftleri Artıları Hızlı arama, verinin dağıtık olarak depolanması iyi Eksileri Veri karmaşıklığında problem çıkar Doküman tabanlı sistemler Lotus Notes’tan esinlenmişler ve anahtar-değer depolamaya oldukça benzerlik göstermektedirler. Veri tutma modeli, anahtar-değer çiftlerinin toplanmasından oluşan versiyonlanmış haldeki dokümanlardır. Yarı yapılandırılmış dokümanlar JSON (JavaScript Object Notation) formatında tutulur. Sorgulama işlemini verimli bir şekilde sağlarlar. Bu kısımla ilgili detaylı bilgi bölüm 3’te verilecektir. Tablo 3 bu sistemleri özetlemektedir. Tablo 3. Doküman tabanlı sistemler Örnekleri CouchDB [12], [13], MongoDb[14], [15] Kullanıldığı uygulamalar Web uygulamaları (anahtar-değer benzeri uygulamalar; fakat veritabanı değeri bilir) Veri modeli Anahtar-değer koleksiyonlarının koleksiyonu Artıları Tam olmayan verilere karşı dayanıklı Eksileri Standart sorgulama sentaksının olmaması Graf tabanlı sistemler graf teorisini temel alıp düğümlerden oluşur. Düğümler arası ilişkiler saklanır. Graf algoritmaları kolaylıkla kullanılabilir. Tablo 4 bu sistemleri özetlemektedir. Tablo 4. Graf tabanlı sistemler Örnekleri Neo4J [16], InfoGrid [17], Infinite Graph [18] Kullanıldığı uygulamalar Forum veya bloglar yoluyla sosyal hesaplama, öneri içeren sistemler Veri modeli Düğümler Artıları Graf algoritmalarının kullanılabilmesi Eksileri Bir sorgu için cevap araştırılırken tüm grafın taranması ve cluster yapısına uygun olmaması Sonuç olarak yukarıda da anlatıldığı gibi birçok NoSQL VTYS mevcuttur. Uygulamanın içeriğine, yapılması istenen işlere, hız, işlevsellik ve ölçeklemeye göre daha uygun olan VTYS seçilmelidir. Daha önceki çalışmamızda [19] Fatih projesi için geliştirilmekte olan yerel bulut sunucu tabanlı veri saklama ve içerik dağıtımı gerçeklemesinde verilerin senkronizasyonu için kullandığımız CouchDB’yi bu makalede, yine doküman tabanlı olan MongoDB ile yatay ölçeklenebilirlik açısından karşılaştırmaktayız. III. NOSQL VERİTABANLARINDA ÖLÇEKLENEBİRLİK Ölçeklenebilirlikle performans arasındaki farkı bilmek ölçeklenebilirliği daha iyi anlamamızı sağlar. Performans genel olarak bir sistemin yanıt süresi (reponse time) ve tamamlanan işlem sayısı (throughput) gibi özelliklerine refer eder. Dikey ölçekleme ise sistemdeki bir bileşene ekstra donanım ekleyerek hesaplama kapasitesinin artırılmasıdır. Bu işlem daha fazla bellek, daha hızlı CPU veya daha büyük sabit disk ekleme yolu ile yapılır. Yüksek kapasiteli bileşenler elde etmek maliyetli bir iştir. Aslında ölçekleme diye kastedilen şey genelde yatay ölçeklemedir. Yatay ölçekleme denilen şey ise bir sistemin hesaplama kapasitesinin yeni bileşenler devreye sokularak artırılmasıdır. Yatay ölçeklemede her bir bileşenin birbiri ile haberleşmesi sonucunda meydana gelen network aşırı yükü, sistemin toplam hesaplama kapasitesini azaltmaktadır. Ama bu yük ölçekleme yapıldıktan sonra kazanılan performans artışı yanında göz ardı edilebilir. Ölçeklenebilirlikle beraber çoğaltma (replication) ve bölümleme (sharding) işlemleri mümkün hale gelmiştir. Bu kavramları bazı senaryolar üzerinden açıklayabiliriz: İlk senaryo şöyle olsun. Bir kimsenin kitaplarını koyduğu bir kütüphanesi olsun. Bu kimse kitaplarını yok etmek isteyen bir düşmana sahip. Düşmanından kitaplarını korumak için bu kimse farklı lokasyonlarda yeni kütüphane kurar. Her ne zaman bir kitap alsa aynı kitabın bir kopyasını diğer kütüphanelere koyar. Böylelikle düşmanı kütüphanelerden birini yağmalasa diğerlerinde de aynı kitaplar olduğu için kitaplarını korumuş olur. Yani verinin kopyasını farklı sunucularda saklama işi çoğaltmayı ifade eder. Her bir sunucuya replika denir. Şimdi farklı bir senaryo düşünelim. Yine aynı kişi birçok kitaba sahip olsun; fakat düşmanı olmasın. Ama artık tek kütüphane yeterli olmamakta yeni kütüphanelere ihtiyacı vardır. Kitaplarını yazar isimlerine göre “A-H” ile başlayanları bir kütüphaneye, “I-P” arasını bir kütüphaneye, “R-Z” arasını bir kütüphaneye yerleştirmiştir. Yani verileri belirli bölümleme kuralına göre sunuculara dağıtma işi bölümlemeyi ifade eder. Bir başka senaryoda şöyle olsun. Son senaryoda ise aynı kişi hem düşmana sahip olsun hem de kitaplarını tek kütüphaneye sığdıramasın. Bu kimse hem düşmandan kitaplarını korumak hem de kitaplarını kütüphaneye yerleştirmek için artık ilk iki senaryodan çok kütüphaneye ihtiyacı vardır. Yine kitaplarını yazar adlarına göre üçe ayıracak ve düşmandan korumak için her kitaptan üç kopya yapacaksa dokuz sunucuya ihtiyaç vardır (çoğaltma ve bölümleme bir arada). Bu bölümde doküman tabanlı NoSQL VTYS’lerden CouchDB ve MongoDB’de ölçeklenebilirliğin nasıl yapıldığı anlatılmaktadır. A. CouchDB’nin Ölçeklenmesi CouchDB yalnız başına ölçekleme işini destekleyemiyor. CouchDB düğümlerinden (sunucu vs.) bir küme oluşturabilmek için üçüncü parti araçlara ihtiyaç vardır. Bu araçlar BigCouch [20], Lounge [21] ve Pillow’dur [22]. Bu çalışmada BigCouch’tan yararlanılmıştır. BigCouch açık kaynak kodlu, hataya dayanıklı ve Apache CouchDB API’ye uyumludur. BigCouch, Massachusetts merkezli bir şirket olan Cloudant şirketi tarafından piyasaya sürülmüştür. CouchDB yüklü bir sunucu ile nasıl irtibata geçiliyorsa aynı yolla BigCouch yüklü sunucu ile haberleşilir. BigCouch, CouchDB için otomatik olarak bölümleme işini yapmaktadır. Her BigCouch düğümü kümenin parçası olan düğümlerin bir listesini tutar. Her düğüm istekleri eşit olarak değerlendirir. Dokümanlar BigCouch tarafından sunucular (shards) arasında deterministik hash algoritması [23] kullanılarak dağıtılır. Okuma ve yazma işlemleri quorum protokolü [24] kullanılarak gerçeklenir. Bir BigCouch cluster’ını kontrol etmek için dört parametre vardır. Bunlar Tablo 5’te özetlenmiştir [25]. Tablo 5. BigCouch cluster parametreleri Parametre Q N W R Tanımı Dokümanın kaç shard’a bölüneceğini gösterir. Default olarak sekize setlenmiştir. Her shard’ın kaç kez kopyalanacağını gösterir. Default olarak üçe setlenmiştir. Yazma (write) quorum sabiti. W, N’ye eşit veya küçük olmalı. Default olarak ikiye setlenmiştir. Okuma (read) quorum sabiti. R, N’ye eşit veya küçük olmalı. Default olarak ikiye setlenmiştir. B. MongoDB’nin Ölçeklenmesi MongoDB ölçeklenebilir, doküman tabanlı, C++ ile geliştirilmiş açık kaynak kodlu NoSQL bir veritabanıdır. Özellikle hız gerektiren ve klasik VTYS’nin çok yavaş kaldığı yerlerde kullanılmaktadır. Kullanım alanları arasında; yüksek hacim/içerikli problemler, analiz için veri saklanması, caching sistemleri, web içerik yönetim sistemleri, web yorum/etiket saklama ve yönetme yer almaktadır. 10gen şirketi (yeni adı ile MongoDB, Inc.), Google Uygulama Motoru’na benzer bir servis oluşturduğu sırada, MongoDB geliştirmesi de 2007 yılında başlamıştı. Ocak 2014 itibari ile de en son versiyonu 2.4.9’u yayınlamışlardır. Bir MongoDB temel olarak üç tip prosesten oluşmaktadır: (i) verileri depolamak için gerekli olan shard’lar, (ii) doğru Data shards Configservers Mongos Clients Şekil 1. Bir cluster’ın üç bileşeni veriye ulaşmak için yönlendirme yapan mongos birimi ve (iii) cluster’ın durumunu takip etmek için config server’lar (Şekil 1’e bakınız). İstemciden gelen isteğin tipine göre mongos’lar isteği ilgili shard’lara gönderir ve onlardan gelen cevapları birleştirerek tekrar istemciye döner. MongoDB kümesinde dokümanlar kullanıcının belirlediği bölümleme anahtarına (shard key) göre bölümlenmektedir. Bu anahtar indeks yapısına benzemekte ve birden fazla veri alanı içerebilmektedir. Her shard bu bölümleme anahtarına göre dokümanları tutmaktadır. Shard içindeki dokümanlar yığınlar (chunks) şeklinde organize edilmektedir. Config sunucularda her yığının başlangıç ve bitiş anahtarı ve hangi shard’ta tutulduğu bilgisi vardır. Bu bilgiler mongos’lar tarafından istek olduğunda hangi shard’a gidileceğini bulmak için kullanılır. MongoDB’de iyi bir bölümleme anahtarı seçilmesi gerekmektedir. Üç türlü seçme yaklaşımı vardır: a- düşük eleman sayılı anahtar (low-cardinality shard key), b- artan sırada anahtar (ascending shard key) ve c- rasgele anahtar (random shard key). Kötü seçilen bölümleme anahtarı yoğun bir yüke veya uygulamanın beklenmeyen bir zamanda çalışmamasına neden olmaktadır. Bunu bir senaryo üzerinden şu şekilde anlatabiliriz. Kullanıcıların bilgilerini tutan bir uygulamamız var. Her doküman kullanıcının hangi kıtada bulunduğunu gösteren bir alana sahip olsun. Şekil 2’deki gibi bölümleme işlemi kullanıcıların bulundukları kıtalara göre yapılabilir. Bir kıtada veri arttığı zaman tek shard yeterli olmayacak ve yeni bir shard eklenmesi gerecek; ama tek anahtar olduğundan yeni shard’a veri taşımak mümkün olmayacak. Bunun yerine tek anahtar yerine birden fazla anahtar kullanmak gerekiyor (ülke, kıta). seçilmelidir. Uygun anahtar seçiminden sonra veri dağıtıma hazırdır. IV. COUCHDB-MONGODB ÖLÇEKLEME KARŞILAŞTIRMASI Henricsson lisans tezinde Phthon kütüphaneleri yardımıyla MongoDB ve CouchDB’nin ekleme (insert) ve bazı sorgulamalara göre hangisinin daha hızlı olduğunu araştırmıştır. Ayrıca farklı boyutlardaki dokümanların tek bir sunucu kullanıldığında bu VYTS’lerde ne kadar disk alanı kullandığını incelemiştir. Yaptıkları araştırma sonucunda CouchDB’nin MongoDB’den daha yavaş olduğu ve daha fazla disk alanı işgal ettiğini saptamışlardır [27]. Bu makalede ise veriler sunuculara dağıtıldığında MongoDB ve CouchDB’nin farklı doküman boyutlarına göre okuma ve yazma hızları test edilmiştir. Test işlemi için gerekli olan dokümanların ne olduğundan önce bu iki veritabanının kullandığı veri modeli yapılarını bilmekte fayda vardır. CouchDB’de dokümanlar JSON objeleri olarak tutulurlar. JSON [28]; JavaScript tarafından desteklenen sayı, katar, Boole değeri, dizi ve obje gibi veri türlerini desteklemektedir. Her doküman kendisine özgü tekil bir tanımlayıcıya ve revizyon numarasına sahiptir. Doküman revize edildikçe bu numara güncellenmektedir. Örnek bir okul verilerinin JSON formatında tutulması Şekil 3’te gösterilmiştir. { “isim”: “İzmit Lisesi”, “şehir”: “Kocaeli”, “ilçe”: “İzmit”, “lokasyon (lat, long)”: “40.7669, 29.9169”, “başarıları”: [ {“ÖSYM”: “Türkiye 2.”, “yıl”: “2012”}, {“ÖSYM”: “Türkiye 3.”, “yıl”: “2013”}, ] Şekil 2. Kıta başına bir shard [26] RAM’den veri okumak diskten veri okumaktan daha hızlıdır. Bundan dolayı veriye mümkün olduğunca RAM’den erişmek isteriz. Aynı mantıkla sık kullanılan veriyi tutan zaman damgası (timestamp) gibi bir shard anahtarı tasarlanabilir. Örneğin Twitter benzeri bir servisin gönderilen bir mesajı, kimin gönderdiği, ne zaman gönderildiği gibi bilgileri içeren dokümanları tuttuğunu varsayalım. Bu belgeleri ne zaman gönderildi bilgisine göre (artan sıra shard anahtarı olarak) dağıttığımızı düşünelim. Bu zaman bilgisi sonsuza doğru gittikçe problem oluşturmaktadır. Bir diğer anahtar seçme yöntemi ise rastgele olandır. Bu ise sorgulama hızını düşürmektedir. Bütün anahtar seçimlerinin bir yerde tıkandığı görülmektedir. En iyi anahtar seçimi hibrit olanlardır (artan sıra shard anahtarı ve arama anahtarı). Örneğin kullanıcıların veriye erişim analitiğini tutan bir uygulama düşünelim. Burada yukarıda bahsedilen anahtarlara göre bölümleme yaptığımızda sıkıntılar meydana gelmektedir. Bunu önlemek için kullanıcıların veriye erişimlerini (ay, kullanıcı) anahtarına göre küme oluşturmak daha uygundur. Bu anahtar yapısı görüldüğü gibi ikilidir. İkinci kısmı (search key) sorgulama yapıldığı zaman yararlı olacak şekilde kullanıcı id, dosya adı gibi alanlar } Şekil 3. Örnek bir JSON verisi MongoDB ise dokümanları ikili olarak kodlanmış BSON (Binary JSON) [29] objeleri olarak tutmaktadır. Kullanıcı veritabanına veri girişini JSON formatında yapar ve herhangi bir sorgusuna da JSON formatında cevap alır. Diğer bir deyişle kullanıcı hiçbir zaman BSON formatı ile ilgilenmez, ilgili dönüşümler veritabanının kendi içinde halledilir. Javascript sitilinde yazılmış bir dokümanın BSON karşılığı Tablo 6’da verilmiştir. Tablo 6. Javascript ve BSON gösterimi Javascript gösterimi {“hello”:”World”} BSON gösterimi “\x16\x00\x00\x00\x02hello\x00 \x06\x00\x00\x00world\x00\x00” MongoDB ve CouchDB’nin okuma ve yazma performansını test etmek için kişi bilgilerini temsil eden adedi 5-500,000 arasında değişen dokümanlar oluşturulmuştur. Bir kişi Tablo 7’de verilen bilgilere sahiptir. Oluşturulan dokümanların örneği Şekil 4’te verilmiştir. Tablo 7. Test verisindeki anahtar-değerler Anahtar Değer Değerler aralığı İsim Maaş Yaş Telefon numarası Evcil hayvan Katar Tam sayı Tam sayı Katar Önceden tanımlanmış katarlar 5-15 karakter 9000-400000 18-90 10 karakter Kedi, köpek, kuş, hamster, balık Şekil 6 Ölçekleme yapılmadan CouchDB-MongoDB okuma performansları karşılaştırılması Şekil 4. Örnek veri seti Karşılaştırma yapılırken kullanılan donanımların özellikleri aşağıdaki gibidir: yazılım ve Centos GNU/Linux 6.4, kernel 2.6.32-358 Apache CouchDB v1.0.4 MongoDB, Inc. MongoDB v2.4.9 Cloudant BigCouch 3 sunucu: Intel Celeron 1,8 GHz, 2 MB önbellek, 2 çekirdekli; 4 GB DDR3; 320 GB SATA (5400 Rpm) HDD Ölçekleme yapmadan (tek sunucu kullanıldığında) CouchDB ve MongoDB yazma (Şekil 5) ve okuma (Şekil 6) hızları farklı boyuttaki dokümanlar üzerinde karşılaştırılmıştır. BigCouch ile ölçekleme yapabilmek için bazı parametrelerin ayarlanması gerekmektedir. BigCouch sunuculara kurulabilmesi içinse bazı ön yüklemelerin (Erlang, OpenSSL, libcurl vb.) yapılmış olması gerekmektedir [30]. Bu yüklemelerden sonra kümedeki her bir düğüme BigCouch yüklenir ve birbirlerinden haberdar edilir. Bu ayarlamalardan sonra düğümlerin port ve admin portları Tablo 8’de verildiği gibi olmaktadır. Tablo 8. Cluster’daki düğümlerin port ve admin port numaraları Düğüm 1 2 3 Port 15984 25984 35984 Admin port 15986 25986 35986 Quorum protokolündeki parametrelerden Q (kaç shard) üçe, N (kaç kopya) bire, R (okuma) bire ve W (yazma) bire setlenmiştir. MongoDB’de shard işlemi için bölümleme anahtarı olarak kişilere ait “yaş” değeri ele alınmıştır. Kümede toplamda üç düğüm olduğundan shard’lar Şekil 5’te gösterildiği ayarlanmıştır. [18-52) [52, 76) [76-91) Şekil 7. MongoDB shard dizaynı Ölçeklemeden sonra (üç sunucu kullanıldığında) CouchDB ve MongoDB yazma (Şekil 8) ve okuma (Şekil 9) hızları farklı boyuttaki dokümanlar üzerinde karşılaştırılmıştır Şekil 5. Ölçekleme yapılmadan CouchDB-MongoDB yazma performansları karşılaştırılması DrowsyDromedary REST arayüzüne sahiptir. birbirlerine karşı üstünlükleri araştırılabilir. Bunların TEŞEKKÜR Bu çalışma, TÜBİTAK tarafından 1003 Fatih Projesi Çağrısı kapsamında EEEAG 113E033 nolu proje ile desteklenmektedir. Desteğinden dolayı TÜBİTAK’a teşekkür ederiz. KAYNAKLAR Şekil 8. Yatay ölçeklemeden sonra CouchDB-MongoDB yazma performansları karşılaştırılması Şekil 9. Yatay ölçeklemeden sonra CouchDB-MongoDB yazma performansları karşılaştırılması V. SONUÇLAR Verilen şartlar altında tek sunucu üzerinde farklı boyuttaki dokümanları yazma/okuma hızı açısından MongoDB, CouchDB’den daha hızlıdır. Aynı şekilde yatay olarak ölçekleme yapıldığında da MongoDB daha iyi sonuç vermektedir. Her iki durumda da dokümanların boyutlarının doğrusal bir şekilde artması ile okuma/yazma süreleri de artmaktadır. Yatay ölçekleme yapıldığındaki okuma/yazma performansı ise tek sunucu üzerindeki performanstan yaklaşık iki kat daha iyidir. MongoDB’nin daha hızlı olmasının sebebi, veriyi önce RAM’de gruplamakta sonra disk’e topluca yazmaktadır (lazy writes). CouchDB ise her dokümanı tek tek diske yazmaktadır. CouchDB’de dokümanlar her değişiklikte ayrıca versiyonlandığı için hataya dayanıklı ve güçlü uygulamalar için tercih edilebilir. MongoDB için bölümleme anahtarını hibrit oluşturarak ve CouchDB’nin quorum parametrelerini daha verimli çalışmasını sağlayacak şekilde seçerek yeni karşılaştırmalar yapılabilir. CouchDB, HTTP REST üzerinden POST, GET, PUT ve DELETE metotlarını dört temel CRUD (create, read, update, delete) için kullanırlar. MongoDB ise Ruby tabanlı [1] N. Lynch, S. Gilbert, “Brewer's conjecture and the feasibility of consistent, available, partition-tolerant web services”, ACM SIGACT News, vol. 33, no. 2, pp. 51-59 , 2002. [2] L. Yishan, S. Manoharan, “A performance comparison of SQL and NoSQL databases”, In: IEEE Pacific Rim Conference on Communications, Computers and Signal Processing (PACRIM), 27-29 Aug. 2013, Victoria, BC, pp. 15-19. [3] A. Lakshman, M. Avinash, “Cassandra: A Decentralized Structured Storage System”, ACM SIGOPS Operating Systems Review, vol. 44, no. 2, pp. 35-40, 2010. [4] http://wiki.apache.org/hadoop/Hbase, Erişim Tarihi: 20 Şubat 2014. [5] F. Chang; J. Dean, S. Ghemawat, W.C. Hsieh, D.A. Wallach, M. Burrows, T. Chandra, A. Fikes, R.E. Gruber, “Bigtable: A Distributed Storage System for Structured Data”, ACM Transactions on Computer Systems (TOCS), vol. 26, no. 2, 2008. [6] http://hypertable.org/, [Erişim Tarihi: 20 Şubat 2014]. [7] http://docs.basho.com/riak/latest/, [Erişim Tarihi: 20 Şubat 2014]. [8] http://fallabs.com/tokyocabinet/, [Erişim Tarihi: 20 Şubat 2014]. [9] J.L. Carlson, Redis in Action. Manning Publication, 1st edition, NY:U.S.A, 2013. [10] R. Sumbaly, J. Kreps, L. Gao, A. Feinberg, C. Soman, S. Shah, “Serving Large-scale Batch Computed Data with Project Voldemort”, Proceedings of the 10th USENIX conference on File and Storage Technologies, pp. 18-18, 2012. [11] http://www.project-voldemort.com/voldemort/, [Erişim Tarihi: 20 Şubat 2014]. [12] J. Lennon, Beginning CouchDB. Apress Publisher, 1st edition, NY:U.S.A., 2009, [13] S. Unge, “Implementing a eventual consistency job distribution with CouchDB”, Department of Information Technology, Uppsala University, 2011. [14] K. Chodorow, M. Dirolf, MongoDB: The Definitive Guide. O'Reilly Media Publisher; 1st edition, 2010. [15] K. Banker, MongoDB in Action. Manning Publication, 1st edition, NY: U.S.A, 2011. [16] H. Huang, Z. Dong, “Research on architecture and query performance based on distributed graph database Neo4j”, 3rd International Conference on Consumer Electronics, Communications and Networks (CECNet), 20-22 Nov. 2013, Xianning, pp. 533 – 536. [17] http://infogrid.org/trac/, [Erişim Tarihi: 22 Şubat 2014]. [18] http://www.objectivity.com/infinitegraph#.Uxxq6vl_tCY, [Erişim Tarihi: 22 Şubat 2014]. [19] S. Eken, F. Kaya, Z.İlhan, A. Sayar, A. Kavak, U. Kocasaraç, S. Şahin, “Analyzing distributed file synchronization techniques for educational data”, International Conference on Electronics, Computer and Computation (ICECCO), 7-9 Nov. 2013, Ankara, Turkey, pp. 318-321. [20] http://bigcouch.cloudant.com/, [Erişim Tarihi: 22 Şubat 2014]. [21] http://tilgovi.github.io/couchdb-lounge/, [Erişim Tarihi: 22 Şubat 2014]. [22] https://github.com/khellan/Pillow, [Erişim Tarihi: 22 Şubat 2014]. [23] T. Icart. “How to hash into elliptic curves”, In Shai Halevi, editor, CRYPTO, vol. 5677, Lecture Notes in Computer Science, pp. 303-316. Springer, 2009. [24] D. Agrawal, A.J. Bernstein, “A nonblocking quorum consensus protocol for replicated data”, IEEE Transactions on Parallel and Distributed Systems, vol. 2, no. 2, pp. 171 – 179, 1991. [25] B. Holt, Scaling CouchDB. O’Reilly Publisher, 1st edition, 2011. [26] K. Chodorow, Scaling MongoDB. O’Reilly Media Publisher; 1st edition, 2011. [27] R. Henricsson, “Document Oriented NoSQL Databases: A comparison of performance in MongoDB and CouchDB using a Python interface”, Blekinge Institute of Technology, Bachelor thesis, computer science, 2011. [28] D. Crockford, RFC 4627-The application/json Media Type for JavaScript Object Notation (JSON). http://tools.ietf.org/html/rfc4627, 2006. [Erişim Tarihi 5 Mart 2014]. [29] http://docs.mongodb.org/meta-driver/latest/legacy/bson/, [Erişim Tarihi 5 Mart 2014]. [30] http://bigcouch.cloudant.com/develop, [Erişim Tarihi 7 Mart 2014].