Tuesday, March 29, 2016

Hangi MySQL Sunucusunu Kullanmalıyım?

   MySQL açık kaynak kodlu, (Oracle, MariaDB, Percona gibi) firmalardan desteğini alabileceğiniz, yaygın ve çok ölçekli (Facebook, Google, TwitterLinkedin ve Alibaba gibi) kullanımı olan ilişkisel bir veri tabanıdır. 
   MySQL sunucusunun mimarisi Şekil-1'de verilmiştir. MySQL mimarisinde en önemli bileşen saklama motorudur. Verileri kalıcı olarak diske kaydeden, SQL sorgularını çalıştıran ve verileri diskten ya da bellekten derleyip getiren gerçekte saklama motorlarıdır. Üstelik saklama motorları eklenip çıkarılabilen bir yapıya sahiptir. MySQL için yazılmış özel kullanım alanları olan çok sayıda üçüncü parti saklama motorları mevcuttur: TokuDB (Percona tarafından satın alındı), Aria (MariaDB), Spider.
Şekil-1 MySQL sunucusunun mimarisi
   MySQL içinde iki temel saklama motoru bulunuyor: MyISAM ve InnoDB. İki saklama motoru arasında önemli farklar bulunuyor:
  1. Oracle MySQL 5.5'den itibaren varsayılan saklama motoru InnoDB'dir. Öncesinde varsayılan saklama motoru MyISAM'dır.
  2. InnoDB Transactional bir motordur, MyISAM ise değildir. InnoDB Multi-version Concurrency Control (MVCC)'yi gerçekler.
  3. InnoDB veri tutarlılığını (=referential integrity) gözetir, MyISAM ise gözetmez.
  4. InnoDBkayıt seviyesinde kilitleme (Row-Level Locking) yapılabilir, MyISAM ile ancak tablo seviyesinde kilitleme (Table-level Locking) yapılabilir.
  5. InnoDB'nin otomatik kendini onarma yeteneği vardır. MyISAM'ın ise bu tür bir yeteneği bulunmuyor. Hata durumlarında kesin bir kurtarma stratejisi MyISAM'da bulunmuyor.
  6. Oracle MySQL 5.6 ile birlikte InnoDB'de Full-Text Search özelliği var.
  7. Oracle MySQL 5.7 ile birlikte InnoDB'de Spatial Data ile çalışmak mümkün.
   Bugün MySQL kullanmaya karar verdiğinizde, karşınıza birden fazla MySQL çözümü çıkacaktır:
MySQL'in asıl geliştiricileri tarafından oluşturulmuştur. MySQL, Michael Widenius (Monty), David Axmark ve Allan Larsson tarafından 1995 yılında geliştirilmeye başlanmıştır. Proje başlangıçta TCX (Allan), Monty Program Kb (Michael) ve Detron HB (David) isimli firmalar tarafından ticari olarak temsil edilmiştir. Kurucularından Michael Widenius Finlandiya'lı, diğerleri ise İsveç'lidir. Daha sonra 1998'in sonlarına doğru bu üç firma MySQL AB çatısı altında birleşmişlerdir. 2000 yılında proje GPL lisansı ile yayınlanan açık kaynak kodlu bir projeye dönüşmüştür. Ancak açık kaynak kodlu projeye dönüştükten sonra satışlar önemli ölçüde düşmüştür. Daha sonraları yatırımcı bularak yoluna devam edebilmeyi başarmışlardır. Şu an kullanımda olan MySQL 5 sürümü 2005 yılında duyurulmuştur. MySQL 5, kurumsal kullanıma yönelik önemli yenilikler barındırıyordu: tetikleyici (=trigger), saklı yordamlar (=stored procedure), imleç (=cursor), görüş (=view), Federated Storage EngineDistributed Transaction. Sun firması 2008 yılında MySQL'i satın almıştır. Yaklaşık bir yıl sonrasında ise Oracle firması Sun'ı satın almıştır ve bugün MySQL, Oracle çatısı altında geliştirilmektedir. MySQL geliştiricileri bir süre Sun firması altında çalışmışsalar da yönetimsel anlaşmazlıklar nedeni ile ayrılmışlardır. Ayrıldıktan sonra MariaDB'yi MySQL'i fork ederek geliştirmeye başlamışlardır. Michael Widenius veri tabanına kızlarının isimlerini vermiştir: My ve Maria. MariaDB, bir süre MySQL versiyonlarını takip etmiştir: İlk versiyon MariaDB 5.1 2009 yılında, 5.2 2011 yılında, 5.3 2012 yılında ve 5.5 2013 yılında çıkmıştır. 5.5 sürümünden itibaren Oracle MySQL sürümlerini takip etmemeye karar verdiler ve bu önemli kararı yeni sürümlerini 10 ile numaralandırarak duyurdular. 10.0 2012 yılında ve 10.1 2014 yılında duyurulmuştur. MariaDB 5.x versiyonları Oracle MySQL ile uyumludur: data dizini kopyalayarak ve başka bir hiç bir değişiklik yapmadan MariaDB'ye geçiş yapabilirsiniz. MariaDB 10.0, Oracle MySQL 5.6'ya, MariaDB 10.1 ise Oracle MySQL 10.1'e karşı düşüyor olsa da uyumlu olmadıklarını, sadece data dizini kopyalayarak MySQL 5.7'den MariaDB 10.1'e geçemeyeceğinizi bilmelisiniz. Oracle MySQL 5.7 ile ciddi yenilikler getiriyor olsa da MariaDB 10.1'in gerisinde kaldığını söylemeliyim. Başarım testlerinde herkes kendisinin daha hızlı olduğunu iddia ediyor. MariaDB 10.1'in özellikleri için bu bağlantıya göz atabilirsiniz. DB-Engines sıralamasında MariaDB, 2016 Mart ayı rakamlarına göre 22. sırada yer alıyor:
MariaDBDB-Engines sıralamasında Mart 2016 rakamlarına göre 22. sırada yer alıyor.
MariaDB Enterprise Edition, MariaDB Corporation AB firmasından desteğini alabileceğiniz ve kurumsal kullanımda ihtiyaç duyacağınız ve MariaDB'de bulunmayan eklentileri içeren ücretli sürümüdür.
Oracle, Sun'ı satın aldığında MySQL'i de satın almış oldu. Oracle, MySQL'i satın almadan daha önce InnoDB saklama motorunu geliştiren InnoBase firmasını satın almıştı. Bu nedenle OracleMySQL'i geliştirme taktiğini, InnoDB üzerine kurmuştur. Oracle, InnoBase üzerinden, MySQL'e yatırım yapmaya ve MySQL'i geliştirmeye devam ediyor. Satın almadan sonraki ilk sürüm olan 5.5 ve daha sonrasında çıkardığı 5.6 sürümlerinde çok sayıda yeni özellik geldi. Bu yeniliklerin önemli bir kısmının InnoDB ile ilgili ve başarımı arttırmaya yönelik olduğunu görüyoruz:
  1. MySQL çok çekirdekli sistemlerdeki ölçeklenebilirlikte yaşanan dar boğazların aşıldığını görüyoruz.
  2. audit_log isimli denetleme (=Auditing) eklentisi geldi.
  3. Kimlik doğrulama ile ilgili iki yeni eklenti geldi: PAM (Pluggable Authentication Module) eklentisi ve Windows kullanıcısı ile kimlik doğrulama yapmayı sağlayan eklenti.
  4. İplik (=thread) havuzu: Şekil-1'deki MySQL mimarisinde, farklı istemcilerden gelen bağlantı isteklerini karşılayan katmanda, 5.5 öncesinde her bağlantı için bir iplik yaratılıyordu. 5.5 versiyonunda artık bir iplik havuzu kullanılarak başarımın arttığını ve daha fazla sayıda istemciye hizmet verildiğini görüyoruz.
  5. Bölümleme (=partitioning) ile ilgili önemli yenilikler geldi. Bölümleme ile ilgili 5.5 ve 5.6'da gelen bu yeniliklerin detaylar için günlüğümdeki bu yazıyı okuyabilirsiniz.
  6. Yarı eş zamanlı yineleme geldi. Yinelemede, çıraklarda artık SQL cümlelerini çalıştırmak için birden fazla iş parçası tanımlayabiliyoruz. Çok çekirdekli sistemlerde çalışan MySQL sunucusu için başarımın artacağı anlamına gelmektedir. Bunun için iplik sayısını slave_parallel_workers değişkenine atamak yeterli olmaktadır. Aksi belirtilmez ise varsayılan değeri sıfırdır. Bu durumda 5.6 öncesinde olduğu gibi birer iş parçası çalışır. Değişkenin değeri için makinadaki sanal işlemci sayısı kadar değer vermek uygun olur:
    mysql> set global slave_parallel_workers=4;
    Query OK, 0 rows affected (0.00 sec)

    Yineleme ile ilgili özellikler için günlüğümdeki bu yazıyı okuyabilirsiniz.
  7. sunucunun davranışını ve performansını izlemeye olanak sağlayan performance_schema veri tabanıdır. Sunucuyu başlattıktan sonra show databases komutu çalıştırıldığında, artık karşımıza performance_schema isimli yeni bir veritabanı çıkıyor:

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | performance_schema |
    | test               |
    | world              |
    +--------------------+
    4 rows in set (0.00 sec)


    performance_schema veritabanıyla beraber, aynı isimli yeni bir saklama motoru ile de tanışıyoruz: PERFORMANCE_SCHEMA. performance_schema içindeki tablolarda, veri tabanında gerçekleşen olaylar ile ilgili bilgiler saklanıyor. Bu tablolar görüş ya da bellekte depolanan geçici tablo olarak tanımlı olduklarından kalıcı değillerdir. performance_schema ile ilgili detaylar için günlüğümdeki bu yazıyı okuyabilirsiniz.
   Oracle'ın MySQL'de en fazla geliştirme yaptığı ve katkısını hissettirdiği sürüm 5.7 sürümüdür. Bu sürümde gelen özellikleri bu bağlantıdan okuyabilirsiniz. Bu değişiklikler içinde kişisel olarak en değer verdiğim yenilik, MySQL 5.7.8 ile birlikte JSON desteğidir. Böylelikle MySQL, NoSQL dünyasına adımını atmıştır ve melez (=hybrid) bir veri tabanına dönüşmüştür. 
   DB-Engines sıralamasında Oracle MySQL2016 Mart ayı rakamlarına göre 2. sırada yer alıyor:
Oracle MySQLDB-Engines sıralamasında Mart 2016 rakamlarına göre 2. sırada yer alıyor.
Ücretsiz olarak kullanabileceğiniz Oracle MySQL sürümüdür. Oracle MySQL Enterprise Edition'da yer alan ve kurumsal kullanımda ihtiyacınız olacak bir çok araç bu versiyon içinde bulunmuyor. Örneğin tutarlı sıcak yedek (=consisten hot backup) alabileceğiniz bir araç Oracle MySQL Community Edition içinde bulunmuyor. Benzer şekilde yukarıda sıralanan 2. ve 3. başlıklarda yer alan eklentiler yine bu sürümde yok.  MySQL Enterprise Edition'da yönetiminiz altındaki MySQL sunucularını izlemek, sorunları saptamak, alarm üretmek ve en sonunda çözüm üretmek için web tabanlı bir ürünü bulunuyor: MySQL Enterprise Monitor. Eğer yineleme kullanıyorsanız, yinelemede yer alan sunuculardan biri çöktüğünde, yinelemenin sorunsuz devam etmesini ve sistemin kendini toparlaması için genellikle elle araya girmeniz gerekir. Oracle MySQL Enterprise Edition içinde yer alan MySQL Fabric yinelemede ortaya çıkan problemleri anında ve otomatik olarak giderir. Burada görüldüğü gibi kurumsal kullanımda sadece yedeklemek için bile mutlaka Oracle MySQL Enterprise Edition sürümüne ihtiyacınız bulunuyor. Fiyatlandırma için bu bağlantıya bakabilirsiniz.
Percona MySQL, Oracle MySQL sürümlerini takip eden ve onunla tamamen uyumlu, yüksek başarımlı, InnoDB'nin iyileştirilmiş bir sürümü olan XtraDB saklama motorunu kullanan gelişmiş bir MySQL sunucusudur. Desteğini Percona firmasından alabilirsiniz. MariaDB, saklama motoru olarak InnoDB yerine XtraDB'yi kullanır. Başarım karşılaştırması için bu bağlantıya bakabilirsiniz. Percona MySQL'in öne çıkan özelliği hem başarımı hem de çeşitli kolaylıklar sağlayan komut satırı araçlarıdır: Percona MySQL Toolkit. Daha iyi bir ölçeklenebilirlik ve her zaman erişebilirlik için kümeleme (=cluster) çözümleri de bulunuyor: Percona XtraDB Cluster. MySQL Destek hizmetleri için bu dokümana bakabilirsiniz. Percona MySQL kullanıyor olsanız da olmasanız da Percona'nın başarıma yönelik ip uçları alacağınız kurumsal günlüğünü mutlaka takip etmelisiniz: Percona Data Performance Blog.
DB-Engines sıralamasında Percona, 2016 Mart ayı rakamlarına göre 92. sırada yer alıyor:
Percona MySQLDB-Engines sıralamasında Mart 2016 rakamlarına göre 92. sırada yer alıyor.
MySQL'in büyük ölçekli kullanımını FacebookGoogleTwitterLinkedin gibi şirketlerde görüyoruz. Bu şirketler MySQL'i büyük ölçeklerde kullanırken karşılaştıkları problemleri aşmak için geliştirmelerde bulunuyorlar ve daha sonra biri birleri ve MySQL topluluğuyla paylaşıyorlar. Bu paylaşımı ve işbirliklerini daha verimli kılmak için WebscaleSQL'i kurdular. Yakın zamanda bu işbirliğine Alibaba'da katıldı. WebscaleSQL kodu şu an MySQL 5.6 sürümü üzerine kurulu ve büyük ölçekli Web uygulamalarındaki kullanımına ve  başarımı yönelik geliştirmeler içeriyor. Kaynak koda Github üzerinden bu bağlantıdan ulaşabilirsiniz. Sadece Unix platformu için bir çözüm sunuyor. Kurumsal tarafta Windows Server işletim sistemini en başta başarımı ve başka bir çok nedenden dolayı tercih etmiyoruz. Hazır bir dağıtımları yok. Bu nedenle gcc 4.7 ya da uyumlu bir derleyeci kullanarak sizin derlemeniz gerekecektir.
   DB-Engines sıralamasında WebscaleSQL, 2016 Mart ayı rakamlarına göre 218. sırada yer alıyor:
WebScaleSQLDB-Engines sıralamasında Mart 2016 rakamlarına göre 218. sırada yer alıyor.
WebscaleSQL katılımcı şirketlerin (FacebookGoogleTwitterLinkedin) kendi ihtiyaçlarına ve iç planlarına göre özelliklerine karar verdikleri ve daha çok işbirliği için oluşturdukları bir platform. Bu nedenle üretim ortamında tercih etmeyeceğimiz ve desteğini alamayacağınız bir sürüm. Ancak MySQL'i geliştiren diğer şirketlerin (MariaDBOracle ve Percona), WebscaleSQL üzerindeki geliştirmelerden faydalandıklarını biliyoruz. Bu nedenle WebscaleSQL'in varlığı MySQL'in geleceği açısından güzel bir gelişme.

No comments:

Post a Comment