Takip et

MySQL’e memcached ile NoSQL Sorguları Ekleme: Ubuntu 14.04 Üzerinde Kapsamlı Bir Rehber

MySQL’e memcached ile NoSQL Sorguları Ekleme: Ubuntu 14.04 Üzerinde Kapsamlı Bir Rehber Modern web uygulamaları ve büyük ölçekli sistemler, v

MySQL’e memcached ile NoSQL Sorguları Ekleme: Ubuntu 14.04 Üzerinde Kapsamlı Bir Rehber

Modern web uygulamaları ve büyük ölçekli sistemler, veri erişiminde hız ve esneklik arayışındadır. Geleneksel ilişkisel veritabanları (RDBMS) olan MySQL, veri tutarlılığı ve karmaşık sorgulama yetenekleri açısından güçlü olsa da, basit anahtar-değer (key-value) tabanlı verilere erişimde veya yüksek okuma yüklerinde performans darboğazları yaşayabilir. İşte bu noktada NoSQL veritabanlarının sunduğu esneklik ve hız devreye girer. Ancak mevcut MySQL altyapısını terk etmek her zaman pratik veya mümkün değildir. Bu makale, MySQL’in memcached eklentisi aracılığıyla, NoSQL benzeri anahtar-değer sorgularını Ubuntu 14.04 işletim sistemi üzerinde nasıl uygulayacağınızı detaylı bir şekilde açıklayacaktır. Bu entegrasyon, MySQL’in kalıcılık ve tutarlılık avantajlarını korurken, memcached’in sağladığı yüksek performanslı anahtar-değer erişiminden faydalanmanızı sağlar.

MySQL ve memcached Entegrasyonunun Temelleri

MySQL, özellikle InnoDB depolama motoruyla birlikte, memcached protokolünü doğrudan destekleyen bir eklenti sunar. Bu eklenti, ayrı bir memcached sunucusu kurma ihtiyacını ortadan kaldırır ve memcached istemcileri tarafından gönderilen anahtar-değer isteklerini doğrudan bir MySQL tablosuna yönlendirir. Bu sayede, SQL sorguları yazmaya gerek kalmadan, GET, SET, ADD, DELETE gibi standart memcached komutlarıyla MySQL verilerine erişim sağlanabilir. Bu yaklaşım, özellikle önbellekleme, oturum yönetimi veya basit anahtar-değer depolama gerektiren senaryolarda önemli performans artışları sunar.

Ubuntu 14.04, artık desteklenmeyen eski bir işletim sistemi olmasına rağmen, bu rehber belirli bir proje veya eski sistem bağlamında bu entegrasyonu gerçekleştirmek isteyenler için hazırlanmıştır. Temel prensipler daha yeni MySQL sürümlerinde de geçerli olsa da, kurulum ve yapılandırma adımlarında küçük farklılıklar olabilir.

Neden MySQL ile memcached Kullanmalı?

1. Performans Artışı: SQL sorgularının ayrıştırma ve optimize edilme maliyeti ortadan kalkar. Doğrudan anahtar-değer erişimi, özellikle yüksek hacimli okuma işlemlerinde milisaniyeler düzeyinde hızlanma sağlar.
2. Veritabanı Yükünün Azalması: Uygulamaların veritabanına doğrudan SQL sorguları göndermek yerine memcached protokolünü kullanması, MySQL sunucusundaki CPU ve I/O yükünü önemli ölçüde azaltır.
3. Basit Uygulama Mimarisi: Belirli veri türleri için NoSQL benzeri bir arayüz sunarken, verilerin kalıcılığı ve tutarlılığı için MySQL’in ACID özelliklerinden faydalanmaya devam edersiniz. Bu, ayrı bir NoSQL veritabanı yönetimi yükünü ortadan kaldırır.
4. Mevcut Altyapıdan Faydalanma: Zaten bir MySQL altyapınız varsa, yeni bir veritabanı teknolojisi öğrenme ve dağıtma maliyetine katlanmadan NoSQL benzeri yetenekler kazanabilirsiniz.
5. Önbellekleme Mekanizması: Entegrasyon, veritabanı tabanlı bir önbellekleme katmanı olarak işlev görebilir. Sık erişilen veriler memcached üzerinden anında alınabilir.

Sınırlamalar

* Sorgu Kısıtlamaları: Bu yöntem, karmaşık SQL sorgularının (JOIN, GROUP BY, ORDER BY vb.) yerine geçmez. Sadece anahtar-değer tabanlı basit CRUD (Oluşturma, Okuma, Güncelleme, Silme) işlemleri için uygundur.
* Tablo Yapısı: Entegrasyon için kullanılacak tablonun belirli bir anahtar-değer yapısına sahip olması gerekir.
* Yapılandırma Karmaşıklığı: İlk kurulum ve yapılandırma, standart bir MySQL kurulumuna göre biraz daha karmaşık olabilir.
* Güvenlik: memcached protokolü genellikle kimlik doğrulama olmadan çalışır. Bu nedenle, memcached eklentisinin yalnızca güvenli, iç ağlardan erişilebilir olması önemlidir.

Ubuntu 14.04 Üzerinde Ön Gereksinimler

Bu rehber için aşağıdaki ön gereksinimlere sahip olduğunuz varsayılmaktadır:

* Ubuntu 14.04 Sunucusu: Temel kurulumu yapılmış bir Ubuntu 14.04 LTS sunucusu.
* MySQL Server: MySQL sunucusunun kurulu ve çalışır durumda olması. Ubuntu 14.04 genellikle MySQL 5.5 veya 5.6 ile gelir. Bu versiyonlar memcached eklentisini destekler.

sudo apt-get update
    sudo apt-get install mysql-server

Kurulum sırasında MySQL root kullanıcısı için bir parola belirlemeniz istenecektir.
* Temel Linux Bilgisi: Komut satırı kullanımı ve dosya düzenleme konularında temel bilgi.
* memcached İstemcisi: Test için bir memcached istemcisine ihtiyacınız olacak. telnet veya libmemcached-tools paketi (içinde memcstat gibi araçlar bulunur) kullanılabilir.

sudo apt-get install telnet libmemcached-tools

MySQL memcached Eklentisinin Kurulumu ve Yapılandırılması

MySQL’in memcached eklentisi, daemon_memcached adı altında bulunur ve InnoDB depolama motoruyla entegre çalışır.

1. MySQL Sunucusuna Bağlanma

İlk olarak, MySQL sunucunuza root kullanıcısı olarak bağlanın:

mysql -u root -p

Parolanızı girmeniz istenecektir.

2. memcached Eklentisini Yükleme

memcached eklentisi, MySQL sunucusunda yüklü gelmeyebilir veya etkinleştirilmemiş olabilir. Yüklü olup olmadığını kontrol etmek için:

SHOW PLUGINS;

Çıktıda daemon_memcached ve innodb_memcache gibi eklentileri arayın. Eğer yoksa, yüklemeniz gerekir:

INSTALL PLUGIN daemon_memcached SONAME 'libmemcached.so';
INSTALL PLUGIN innodb_memcache SONAME 'innodb_memcache.so';

Not: libmemcached.so ve innodb_memcache.so dosyalarının MySQL’in eklenti dizininde (/usr/lib/mysql/plugin/ gibi) bulunduğundan emin olun. Genellikle MySQL sunucu paketiyle birlikte gelirler. Eğer bu komutlar hata verirse, MySQL kurulumunuzun eksik olabileceğini veya eklenti dosyalarının doğru yerde olmadığını kontrol edin.

Eklentiler yüklendikten sonra, tekrar SHOW PLUGINS; komutuyla durumlarını kontrol edin. Status sütununda ACTIVE görmelisiniz.

3. Hedef Veritabanı ve Tablo Oluşturma

memcached eklentisi, anahtar-değer verilerini depolamak için belirli bir MySQL tablosuna ihtiyaç duyar. Bu tablo, InnoDB depolama motorunu kullanmalıdır. Örnek olarak, test_db adında bir veritabanı ve cache_data adında bir tablo oluşturalım:

CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;

CREATE TABLE cache_data (
    cache_key VARCHAR(250) NOT NULL PRIMARY KEY,
    cache_value MEDIUMBLOB,
    cache_flags INT UNSIGNED,
    cache_cas BIGINT UNSIGNED,
    cache_expiration INT UNSIGNED
) ENGINE=InnoDB;

* cache_key: memcached anahtarlarını depolamak için kullanılır. PRIMARY KEY olmalıdır.
* cache_value: memcached değerlerini (veri) depolamak için kullanılır. BLOB veya MEDIUMBLOB gibi ikili veri tipleri genellikle tercih edilir.
* cache_flags: memcached istemcisinin isteğe bağlı olarak ayarlayabileceği bayrakları depolamak için kullanılır.
* cache_cas: “Check And Set” (CAS) işlemi için kullanılan benzersiz bir sayaçtır. Optimistik kilitleme sağlar.
* cache_expiration: Anahtarın ne zaman sona ereceğini belirten Unix zaman damgası veya göreceli saniye sayısı.

4. memcached Eklentisini Yapılandırma: containers Tablosu

memcached eklentisi, hangi MySQL tablosunun memcached istekleri için kullanılacağını innodb_memcache.containers tablosu aracılığıyla öğrenir. Bu tablo, eklenti yüklendiğinde otomatik olarak oluşturulur.

Öncelikle, innodb_memcache veritabanına geçin ve containers tablosunun yapısını inceleyin:

USE innodb_memcache;
DESCRIBE containers;

Çıktı aşağıdaki gibi olacaktır:

+------------------+---------------------+------+-----+---------+-------+
| Field            | Type                | Null | Key | Default | Extra |
+------------------+---------------------+------+-----+---------+-------+
| name             | varchar(128)        | NO   | PRI | NULL    |       |
| db_schema        | varchar(128)        | NO   |     | NULL    |       |
| db_table         | varchar(128)        | NO   |     | NULL    |       |
| key_columns      | varchar(128)        | NO   |     | NULL    |       |
| value_columns    | varchar(128)        | NO   |     | NULL    |       |
| flags_columns    | varchar(128)        | YES  |     | NULL    |       |
| cas_columns      | varchar(128)        | YES  |     | NULL    |       |
| expire_columns   | varchar(128)        | YES  |     | NULL    |       |
| unique_key_name  | varchar(128)        | YES  |     | NULL    |       |
+------------------+---------------------+------+-----+---------+-------+

Şimdi, test_db.cache_data tablomuzu memcached eklentisine tanıtmak için bu tabloya bir kayıt eklememiz gerekiyor. memcached eklentisi varsayılan olarak default adlı bir konteyner kullanır. Bu konteyneri kendi tablomuzla eşleştirelim:

INSERT INTO containers (name, db_schema, db_table, key_columns, value_columns, flags_columns, cas_columns, expire_columns)
VALUES ('default', 'test_db', 'cache_data', 'cache_key', 'cache_value', 'cache_flags', 'cache_cas', 'cache_expiration')
ON DUPLICATE KEY UPDATE
db_schema='test_db', db_table='cache_data', key_columns='cache_key', value_columns='cache_value', flags_columns='cache_flags', cas_columns='cache_cas', expire_columns='cache_expiration';

Bu komut, default adlı konteyneri test_db veritabanındaki cache_data tablosuna bağlar ve memcached alanlarını (anahtar, değer, bayraklar, CAS, sona erme) tablonun ilgili sütunlarıyla eşleştirir. ON DUPLICATE KEY UPDATE ifadesi, eğer default konteyneri zaten varsa, mevcut kaydı güncelleyecektir.

5. memcached Eklentisi Parametrelerini Ayarlama

memcached eklentisinin davranışını kontrol eden bazı sistem değişkenleri vardır. Bunları my.cnf (Ubuntu 14.04’te genellikle /etc/mysql/my.cnf veya /etc/mysql/conf.d/ altındaki bir dosya) dosyasına ekleyerek veya dinamik olarak ayarlayarak yapılandırabilirsiniz. my.cnf dosyasına eklemek, MySQL yeniden başlatıldığında ayarların kalıcı olmasını sağlar.

sudo nano /etc/mysql/my.cnf

[mysqld] bölümünün altına aşağıdaki satırları ekleyin:

[mysqld]
...

memcached eklentisini otomatik yükle

plugin-load-add=daemon_memcached.so plugin-load-add=innodb_memcache.so

memcached dinleme portu (varsayılan 11211)

daemon_memcached_option='-p 11211'

memcached maksimum bağlantı sayısı

daemon_memcached_option='-c 1024'

memcached dinleme IP adresi (güvenlik için localhost veya özel IP)

daemon_memcached_option='-l 127.0.0.1'

memcached okuma ve yazma işlemlerinin toplu iş boyutları

daemon_memcached_r_batch_size=1 daemon_memcached_w_batch_size=1

* plugin-load-add: MySQL sunucusu başlatıldığında eklentilerin otomatik olarak yüklenmesini sağlar.
* daemon_memcached_option: memcached eklentisine komut satırı seçenekleri iletmenizi sağlar. -p portu, -c maksimum bağlantıyı ve -l dinleme IP adresini belirler. Güvenlik nedeniyle, 127.0.0.1 (localhost) olarak ayarlamanız şiddetle tavsiye edilir. Eğer dışarıdan erişim gerekiyorsa, bir güvenlik duvarı ile erişimi kısıtladığınızdan emin olun.
* daemon_memcached_r_batch_size ve daemon_memcached_w_batch_size: memcached okuma ve yazma işlemlerinin toplu iş (batch) boyutunu ayarlar. Performans için bu değerleri optimize etmek gerekebilir, ancak başlangıç için 1 yeterlidir.

Değişiklikleri kaydettikten sonra MySQL servisini yeniden başlatın:

sudo service mysql restart

MySQL yeniden başlatıldıktan sonra, eklentinin doğru şekilde çalıştığını kontrol etmek için MySQL istemcisine tekrar bağlanın ve aşağıdaki komutu çalıştırın:

SHOW STATUS LIKE 'Innodb_memcache_num_ops%';

Eğer çıktıdaki değerler sıfırdan farklıysa veya daemon_memcached ile ilgili başka durum değişkenleri görünüyorsa, eklenti büyük olasılıkla başarılı bir şekilde çalışıyordur. Ayrıca, sistem günlüklerini (/var/log/mysql/error.log veya syslog) kontrol ederek herhangi bir hata olup olmadığını görebilirsiniz.

MySQL’e memcached Protokolü ile Erişim

Artık memcached eklentisi MySQL ile entegre ve yapılandırılmış durumda. Standart bir memcached istemcisi kullanarak MySQL’deki cache_data tablosuna erişebiliriz.

1. telnet ile Test Etme

telnet komutu, memcached protokolünü manuel olarak test etmek için basit bir yoldur:

telnet 127.0.0.1 11211

Bağlantı başarılı olursa, boş bir satır göreceksiniz. Şimdi memcached komutlarını girebilirsiniz.

* Veri Ekleme (set):

set mykey 0 60 11
    Hello World
    STORED

Burada:
* mykey: Anahtar
* 0: Bayraklar (flags)
* 60: Sona erme süresi (saniye cinsinden, 60 saniye sonra bu veri sona erecek)
* 11: Değerin bayt cinsinden uzunluğu (Hello World 11 karakterdir)
* Hello World: Değer

* Veri Alma (get):

get mykey
    VALUE mykey 0 11
    Hello World
    END

* Veri Güncelleme (replace):

replace mykey 0 60 13
    New Value Here
    STORED

* Veri Silme (delete):

delete mykey
    DELETED

telnet oturumundan çıkmak için quit yazın ve Enter’a basın.

2. MySQL İçinde Veriyi Kontrol Etme

telnet ile yaptığınız işlemlerin MySQL tablosuna yansıyıp yansımadığını kontrol edelim:

mysql -u root -p
USE test_db;
SELECT * FROM cache_data;

set komutuyla eklediğiniz mykey ve Hello World değerlerini görmelisiniz. replace sonrası güncellenmiş değeri, delete sonrası ise kaybolduğunu gözlemleyeceksiniz. Özellikle cache_cas sütununun her set veya replace işleminde arttığını ve cache_expiration sütununda Unix zaman damgasını göreceksiniz.

3. Programlama Dilleriyle Erişim

Modern programlama dilleri (PHP, Python, Java, Node.js vb.) memcached istemci kütüphaneleri sunar. Bu kütüphaneler, memcached protokolü üzerinden veri ekleme, alma, güncelleme ve silme işlemlerini kolayca yapmanızı sağlar.

Örnek Python Kodu:

import memcache

memcached sunucusuna bağlan (MySQL'in memcached eklentisi)

mc = memcache.Client(['127.0.0.1:11211'])

Veri ekleme/güncelleme (set)

if mc.set("python_key", "Bu Python'dan gelen bir değerdir.", time=300): print("Veri başarıyla eklendi.") else: print("Veri eklenirken bir hata oluştu.")

Veri alma (get)

value = mc.get("python_key") if value: print(f"Alınan değer: {value}") else: print("Anahtar bulunamadı veya süresi doldu.")

Veri silme (delete)

if mc.delete("python_key"): print("Veri başarıyla silindi.") else: print("Veri silinirken bir hata oluştu.")

Bu Python örneği, python-memcached kütüphanesini kullanarak set, get ve delete işlemlerini gösterir. Diğer diller için de benzer kütüphaneler ve kullanım şekilleri mevcuttur.

Gelişmiş Yapılandırma ve Optimizasyon

innodb_memcache.containers tablosunu kullanarak birden fazla MySQL tablosunu memcached aracılığıyla erişilebilir hale getirebilirsiniz. Her tablo için ayrı bir “konteyner adı” tanımlayarak, memcached istemcisi üzerinden farklı tabloları hedefleyebilirsiniz. Ancak, MySQL’in memcached eklentisi varsayılan olarak yalnızca default konteynerini kullanır. Farklı konteynerleri kullanmak için istemcinin prepend komutunu veya özel bir memcached istemci kütüphanesini kullanması gerekebilir. Genellikle tek bir default konteyneri yeterli olur.

Toplu İş Boyutları (daemon_memcached_r_batch_size, daemon_memcached_w_batch_size): Bu parametreler, memcached eklentisinin bir seferde kaç okuma veya yazma işlemini gruplandıracağını belirler. Daha büyük değerler, ağ gecikmesini azaltarak performansı artırabilir, ancak aynı zamanda bireysel isteklerin gecikmesini de artırabilir. Uygulamanızın iş yüküne göre bu değerleri test ederek optimize etmelisiniz. Genellikle 100-1000 arası değerler denenebilir.

Güvenlik: memcached protokolü varsayılan olarak kimlik doğrulama sağlamaz. Bu nedenle, daemon_memcached_option='-l 127.0.0.1' ile yalnızca yerel makineden erişime izin vermek en güvenli yaklaşımdır. Eğer uygulamanız farklı bir sunucuda çalışıyorsa, yalnızca uygulamanızın çalıştığı sunucunun IP adresine erişim izni vermeli ve bir güvenlik duvarı (ufw) kullanarak diğer tüm bağlantıları engellemelisiniz.

# Sadece localhost'a izin ver
sudo ufw default deny incoming
sudo ufw allow from 127.0.0.1 to any port 11211
sudo ufw enable

İzleme: MySQL’in SHOW STATUS LIKE 'Innodb_memcache%'; komutu ile memcached eklentisinin performansını ve istatistiklerini izleyebilirsiniz. Bu, hata ayıklama ve performans optimizasyonu için önemlidir.

Yaygın Sorunlar ve Çözümleri

* Eklenti Yüklenmiyor:
* libmemcached.so veya innodb_memcache.so dosyalarının MySQL’in eklenti dizininde (/usr/lib/mysql/plugin/) olup olmadığını kontrol edin.
* MySQL sunucusunun hata günlüklerini (/var/log/mysql/error.log) kontrol edin.
* MySQL sürümünüzün memcached eklentisini desteklediğinden emin olun.
* telnet ile Bağlanamama:
* memcached eklentisinin doğru portta (11211 varsayılan) ve doğru IP adresinde (127.0.0.1 önerilir) dinlediğinden emin olun. my.cnf ayarlarını kontrol edin.
* MySQL servisini yeniden başlattığınızdan emin olun.
* Güvenlik duvarı (ufw) kurallarını kontrol edin.
* Veriler MySQL Tablosunda Görünmüyor:
* innodb_memcache.containers tablosundaki eşleşmenin doğru olduğundan emin olun (tablo adı, sütun adları vb.).
* Hedef MySQL tablonuzun (cache_data) InnoDB depolama motorunu kullandığından emin olun.
* cache_key sütununun PRIMARY KEY olduğundan emin olun.
* ON DUPLICATE KEY UPDATE Hatası: Eğer MySQL sürümünüz bu sözdizimini desteklemiyorsa, önce DELETE FROM containers WHERE name = 'default'; komutuyla mevcut kaydı silip, ardından INSERT komutunu çalıştırabilirsiniz.

Sonuç

MySQL’e memcached protokolü ile NoSQL benzeri sorgu yetenekleri eklemek, özellikle Ubuntu 14.04 gibi eski sistemlerde bile, mevcut altyapınızı modernize etmek ve belirli iş yükleri için performansı artırmak adına güçlü bir yöntemdir. Bu entegrasyon, MySQL’in güvenilirliğini ve kalıcılığını korurken, memcached’in sağladığı düşük gecikmeli anahtar-değer erişiminden faydalanmanızı sağlar.

Ancak, bu çözümün bir NoSQL veritabanının tüm yeteneklerini sunmadığını unutmamak önemlidir. Karmaşık sorgular, belge tabanlı depolama veya grafik veritabanı gibi özel NoSQL özelliklerine ihtiyacınız varsa, ayrı bir NoSQL çözümü düşünmeniz gerekebilir. Bu yöntem, daha çok önbellekleme, oturum yönetimi veya basit anahtar-değer depolama gerektiren senaryolarda MySQL’e NoSQL benzeri bir hız katmanı eklemek için idealdir.

Ubuntu 14.04’ün yaşam döngüsünün sona erdiğini ve güvenlik güncellemeleri almadığını belirtmekte fayda var. Yeni projeler için daha güncel işletim sistemleri ve MySQL sürümleri kullanılması önerilir. Ancak mevcut bir Ubuntu 14.04 ortamında bu entegrasyonu gerçekleştirmek isteyenler için bu rehber, adım adım bir yol haritası sunmaktadır. Doğru yapılandırma ve güvenlik önlemleriyle, MySQL’in memcached eklentisi, uygulamanızın performansını önemli ölçüde artırabilir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version