Riak 2 ve Python 3’ün Ubuntu 14.04 Üzerine Kurulumu ve Yapılandırması
Giriş
Günümüzün veri odaklı dünyasında, yüksek ölçeklenebilirlik, erişilebilirlik ve hata toleransı sunan veritabanı çözümleri kritik öneme sahiptir. Riak, Basho Technologies tarafından geliştirilen, dağıtık bir NoSQL anahtar-değer depolama sistemidir. Dynamo prensiplerine dayalı olarak tasarlanmış olan Riak, büyük veri kümelerini yönetmek ve sürekli çalışma süresi sağlamak için mükemmel bir seçenektir. Bu makalede, Riak 2’nin Ubuntu 14.04 işletim sistemi üzerine nasıl kurulacağını, temel yapılandırmasının nasıl yapılacağını ve Python 3 programlama dili ile nasıl entegre edileceğini adım adım inceleyeceğiz. Ubuntu 14.04 (Trusty Tahr) eski bir sürüm olsa da, belirli projeler veya eski sistemlerle uyumluluk gereksinimleri nedeniyle hala kullanılıyor olabilir. Bu rehber, söz konusu spesifik ortam için detaylı bir yol haritası sunmaktadır.
Riak, özellikle IoT (Nesnelerin İnterneti) cihazlarından gelen zaman serisi verileri, oturum yönetimi, kullanıcı profilleri ve içerik depolama gibi sürekli değişen ve yüksek hacimli verilere ihtiyaç duyan uygulamalar için idealdir. Python 3 ise modern yazılım geliştirmede yaygın olarak kullanılan, güçlü ve esnek bir dildir. Riak’ın dağıtık mimarisi ile Python’ın geliştirici dostu yapısını birleştirmek, dayanıklı ve ölçeklenebilir uygulamalar oluşturmanın kapılarını açar.
Bu makale boyunca, Riak 2’nin kurulumundan Python istemcisinin yapılandırmasına, temel veri işlemlerinden kümeleme kavramlarına kadar geniş bir yelpazede bilgi edineceksiniz.
Ön Gereksinimler
Riak 2 ve Python 3 kurulumuna başlamadan önce aşağıdaki ön gereksinimlerin karşılandığından emin olun:
* Ubuntu 14.04 Sunucusu veya Sanal Makinesi: Temiz bir Ubuntu 14.04 (64-bit) kurulumu önerilir.
* Sudo Yetkileri: Kurulum ve yapılandırma adımları için sudo komutunu kullanma yeteneği.
* İnternet Bağlantısı: Gerekli paketleri indirmek için aktif bir internet bağlantısı.
* Temel Linux Komut Satırı Bilgisi: Terminal üzerinden komutları çalıştırma ve dosya düzenleme becerisi.
Riak 2 Kurulumu
Riak 2’nin Ubuntu 14.04 üzerine kurulumu, Basho’nun resmi APT deposunu kullanarak yapılır. Bu, paket yönetimini kolaylaştırır ve bağımlılıkların otomatik olarak çözülmesini sağlar.
Sistem Güncellemesi
Kuruluma başlamadan önce sistem paket listesini güncellemek ve mevcut paketleri yükseltmek iyi bir uygulamadır. Bu, olası bağımlılık sorunlarını önlemeye yardımcı olur.
sudo apt-get update
sudo apt-get upgrade -y
Gerekli Bağımlılıkların Kurulumu
Riak deposunu eklemek için curl ve apt-transport-https gibi bazı temel araçlara ihtiyacımız olabilir.
sudo apt-get install -y curl apt-transport-https
Riak Repository Ekleme
Basho, Riak paketlerini kendi özel deposu üzerinden sunar. Bu depoyu sisteminize eklemek için aşağıdaki komutu kullanın:
curl -s https://packagecloud.io/install/repositories/basho/riak/script.deb.sh | sudo bash
Bu komut, Basho’nun genel anahtarını sisteme ekler ve /etc/apt/sources.list.d/basho_riak.list dosyasına Riak deposu URL’sini yazar. Komutun çıktısını kontrol ederek işlemin başarılı olup olmadığını teyit edebilirsiniz. Bu adım tamamlandıktan sonra, APT paket listesini tekrar güncellemeniz gerekir:
sudo apt-get update
Riak Kurulumu
Depo eklendikten ve paket listesi güncellendikten sonra Riak 2’yi kurabiliriz. Ubuntu 14.04 için Riak 2’nin son kararlı sürümü olan 2.2.3’ü belirtmek, olası uyumluluk sorunlarını önlemek adına iyi bir yaklaşımdır.
sudo apt-get install -y riak=2.2.3-1
Bu komut, Riak 2.2.3 sürümünü ve tüm bağımlılıklarını sisteminize kuracaktır. Kurulum tamamlandıktan sonra, Riak’ın versiyonunu kontrol ederek başarılı olup olmadığını doğrulayabilirsiniz:
riak version
Çıktı olarak riak 2.2.3 veya benzeri bir versiyon numarası görmelisiniz. Ayrıca, Riak servisinin durumunu kontrol etmek için:
sudo riak status
Bu komut, Riak düğümünün çalışıp çalışmadığını ve temel bilgilerini gösterecektir. Henüz yapılandırma yapmadığımız için tam olarak çalışır durumda olmayabilir, ancak komutun tanındığını görmek yeterlidir.
Riak 2 Yapılandırması
Riak’ın düzgün çalışması için bazı temel yapılandırmalar yapılması gerekmektedir. Riak’ın ana yapılandırma dosyaları /etc/riak/ dizini altında bulunur.
Temel Yapılandırma Dosyaları
* /etc/riak/riak.conf: Riak’ın ana yapılandırma dosyasıdır. Ağ ayarları, depolama arka uçları, güvenlik ve diğer birçok Riak özgü ayar burada yapılır.
* /etc/riak/vm.args: Erlang Sanal Makinesi (VM) için argümanları içerir. Düğüm adı, Erlang çerezi ve bellek ayarları gibi Erlang’a özgü yapılandırmalar burada bulunur.
riak.conf Ayarları
riak.conf dosyası, Riak’ın davranışını kontrol eden birçok ayarı içerir. Bu dosya, HOCON (Human-Optimized Config Object Notation) formatındadır. Aşağıda, tek düğümlü bir kurulum için önemli bazı ayarlar ve açıklamaları bulunmaktadır. Dosyayı düzenlemek için favori metin düzenleyicinizi kullanın (örn. nano veya vim):
sudo nano /etc/riak/riak.conf
Önemli Yapılandırma Satırları:
* node: Riak düğümünün Erlang düğüm adını belirtir. Genellikle riak@ formatındadır. Tek düğümlü bir kurulum için riak@127.0.0.1 kullanabilirsiniz. Eğer sunucunuzun belirli bir IP adresi varsa, onu kullanmanız önerilir.
## Erlang Node Name
##
## The Erlang node name of this Riak instance.
##
## Default: riak@127.0.0.1
node = riak@127.0.0.1
* listener.http.internal: Riak’ın HTTP API’si için dinleyeceği adres ve port. Varsayılan olarak 8098 portunu kullanır.
## HTTP listener for Riak
##
## This is the address and port that Riak will listen on for HTTP
## connections from clients.
##
## Default: 127.0.0.1:8098
listener.http.internal = 127.0.0.1:8098
* listener.protobuf.internal: Riak’ın Protobuf API’si için dinleyeceği adres ve port. Protobuf, Python istemcisi gibi birçok Riak istemcisi tarafından tercih edilen daha verimli bir protokoldür. Varsayılan olarak 8087 portunu kullanır.
## Protocol Buffers listener for Riak
##
## This is the address and port that Riak will listen on for Protocol
## Buffers connections from clients.
##
## Default: 127.0.0.1:8087
listener.protobuf.internal = 127.0.0.1:8087
Eğer Riak’a dışarıdan erişim sağlamak istiyorsanız, 127.0.0.1 yerine sunucunuzun genel IP adresini veya 0.0.0.0 (tüm arayüzler) kullanmanız gerekebilir. Güvenlik açısından 0.0.0.0 kullanırken güvenlik duvarı (firewall) kuralları oluşturmayı unutmayın.
* storage_backend: Riak’ın verileri depolamak için kullanacağı arka uç.
* bitcask: Riak 2’nin varsayılan ve önerilen depolama arka ucudur. Yazma ağırlıklı iş yükleri için optimize edilmiştir ve düşük gecikme süresi sunar.
* leveldb: Daha genel amaçlı bir depolama arka ucudur, okuma ve yazma arasında daha dengeli performans sunar.
Tek düğümlü bir kurulum için bitcask genellikle yeterlidir.
## Storage Backend
##
## The storage backend to use for Riak.
##
## Default: bitcask
storage_backend = bitcask
Diğer ayarlar, özellikle kümeleme veya performans ayarlamaları için önemlidir, ancak tek düğümlü temel bir kurulum için yukarıdaki ayarlar yeterlidir. Değişiklikleri kaydedip dosyayı kapatın.
vm.args Ayarları
vm.args dosyası, Erlang VM’sinin başlangıç argümanlarını içerir. Bu dosya, özellikle kümeleme ve performans için önemlidir.
sudo nano /etc/riak/vm.args
Önemli Yapılandırma Satırları:
* -name: Erlang düğüm adını belirtir ve riak.conf dosyasındaki node ayarı ile eşleşmelidir.
-name riak@127.0.0.1
* -setcookie: Erlang düğümleri arasında iletişim kurmak için kullanılan bir “sihirli çerez”dir. Kümedeki tüm Riak düğümlerinin aynı çereze sahip olması GEREKİR. Güvenlik için bu çerezi karmaşık ve tahmin edilemez bir dizeyle değiştirmelisiniz.
-setcookie riak
Örnek: -setcookie my_secret_riak_cookie_12345
* Bellek Ayarları: Erlang VM’sinin ne kadar bellek kullanacağını kontrol eder. Sunucunuzun RAM miktarına göre ayarlanmalıdır.
+K true
+A 64
-smp enable
Bu ayarlar, Erlang’ın işlemci çekirdeklerini daha iyi kullanmasını ve daha iyi performans göstermesini sağlar.
Değişiklikleri kaydedip dosyayı kapatın.
Riak Servisini Başlatma ve Kontrol Etme
Yapılandırma dosyalarında yaptığınız değişikliklerden sonra Riak servisini başlatmanız gerekir:
sudo riak start
Riak’ın başlatılması biraz zaman alabilir. Servisin durumunu kontrol etmek için:
sudo riak status
Çıktıda Node is running ve Riak düğümünüzün temel istatistiklerini görmelisiniz. Ayrıca, Riak düğümüne ping atarak ulaşılabilirliğini test edebilirsiniz:
sudo riak ping
Başarılı bir ping işlemi pong çıktısını verecektir.
Eğer herhangi bir sorunla karşılaşırsanız, /var/log/riak/ dizinindeki log dosyalarını kontrol etmelisiniz. Özellikle console.log ve error.log dosyaları faydalı bilgiler içerebilir.
Tek Düğümlü Küme Oluşturma
Riak, tek bir düğümde bile “küme” kavramını kullanır. Riak’ın düzgün çalışması için düğümün kendi kendine bir kümeye katılması gerekir.
riak-admin cluster join riak@127.0.0.1
Bu komut, düğümü kendi IP adresini kullanarak kümeye katılmaya zorlar. Ardından, küme değişikliklerini planlamanız ve uygulamanız gerekir:
riak-admin cluster plan
riak-admin cluster commit
Bu adımlardan sonra, kümenin durumunu kontrol edebilirsiniz:
riak-admin member-status
Çıktıda düğümünüzün valid durumda olduğunu ve riak@127.0.0.1 olarak listelendiğini görmelisiniz.
Python 3 Kurulumu
Ubuntu 14.04, varsayılan olarak Python 3.4 sürümü ile gelir. Bu sürüm, Riak Python istemcisini çalıştırmak için yeterlidir.
Ubuntu 14.04 Üzerinde Python 3
Sisteminizde Python 3’ün kurulu olup olmadığını ve hangi sürümde olduğunu kontrol edin:
python3 --version
Çıktı olarak Python 3.4.x gibi bir şey görmelisiniz.
pip3 Kurulumu (Gerekliyse)
Python paketlerini yönetmek için pip‘e ihtiyacımız var. Ubuntu 14.04’te pip3 ayrı olarak yüklenmesi gerekebilir.
sudo apt-get install -y python3-pip
Kurulum tamamlandıktan sonra pip3‘ün versiyonunu kontrol edin:
pip3 --version
Riak Python İstemcisinin Kurulumu
Riak ile Python uygulamaları geliştirmek için resmi Riak Python istemcisine ihtiyacımız var. Bu istemciyi pip3 kullanarak kolayca kurabiliriz.
Riak Python İstemcisi
pip3 install riak
Bu komut, Riak Python istemcisini ve gerekli tüm bağımlılıklarını kuracaktır.
Kurulumu Doğrulama
Python istemcisinin başarılı bir şekilde kurulduğunu doğrulamak için bir Python kabuğu açıp riak modülünü içe aktarmayı deneyebilirsiniz:
python3
Python kabuğunda:
import riak
print(riak.__version__)
Eğer herhangi bir hata mesajı almazsanız ve istemcinin versiyon numarasını görürseniz, kurulum başarılı demektir. Çıkmak için exit() yazın.
Riak ile Python 3 Kullanımı: Temel İşlemler
Şimdi Riak sunucumuz çalışır durumda ve Python istemcimiz kurulu olduğuna göre, Riak ile temel veri işlemlerini (yazma, okuma, güncelleme, silme) nasıl yapacağımızı gösteren basit bir Python scripti oluşturalım.
Bağlantı Kurma
Riak istemcisi ile Riak sunucusuna bağlanmak için riak.RiakClient sınıfını kullanırız. Protobuf portu (8087) genellikle tercih edilen ve daha performanslı olan bağlantı yöntemidir.
import riak
Riak sunucusuna bağlantı kurma
pb_port: Protobuf portu (varsayılan 8087)
http_port: HTTP portu (varsayılan 8098)
protocol: 'pbc' (Protobuf) veya 'http'
client = riak.RiakClient(pb_port=8087, protocol='pbc')
Bağlantıyı kontrol etme
if client.ping():
print("Riak'a başarıyla bağlanıldı!")
else:
print("Riak bağlantısı başarısız oldu. Sunucu çalışıyor mu?")
exit()
Kova (Bucket) Oluşturma ve Veri Yazma
Riak’ta veriler kovalar (buckets) içinde saklanır. Her kova, anahtar-değer çiftlerini içerir.
# 'users' adında bir kova (bucket) alalım.
Eğer kova yoksa Riak otomatik olarak oluşturur.
users_bucket = client.bucket('users')
Yeni bir anahtar-değer çifti oluşturalım ve depolayalım.
Anahtar: 'alice'
Değer: Python sözlüğü (Riak otomatik olarak JSON'a dönüştürür)
alice_data = {'name': 'Alice', 'age': 30, 'city': 'New York'}
alice_obj = users_bucket.new('alice', alice_data)
alice_obj.store()
print(f"Veri depolandı: users/alice -> {alice_data}")
Başka bir anahtar-değer çifti
bob_data = {'name': 'Bob', 'age': 25, 'city': 'London'}
bob_obj = users_bucket.new('bob', bob_data)
bob_obj.store()
print(f"Veri depolandı: users/bob -> {bob_data}")
Basit bir string değeri depolama
message_bucket = client.bucket('messages')
hello_obj = message_bucket.new('greeting', 'Hello, Riak!')
hello_obj.store()
print("Mesaj depolandı: messages/greeting -> Hello, Riak!")
Veri Okuma
Depoladığımız verileri anahtar kullanarak geri okuyabiliriz.
# 'alice' anahtarına sahip veriyi okuyalım
fetched_alice = users_bucket.get('alice')
if fetched_alice.exists:
print(f"Okunan veri (alice): {fetched_alice.data}")
else:
print("Alice verisi bulunamadı.")
'greeting' anahtarına sahip mesajı okuyalım
fetched_greeting = message_bucket.get('greeting')
if fetched_greeting.exists:
print(f"Okunan mesaj (greeting): {fetched_greeting.data}")
else:
print("Mesaj bulunamadı.")
Veri Güncelleme
Veri güncellemek için önce mevcut veriyi okur, üzerinde değişiklik yapar ve sonra tekrar depolarsınız. Riak, çatışmaları yönetmek için vektör saatleri (vector clocks) kullanır.
# Alice'in yaşını güncelleyelim
alice_to_update = users_bucket.get('alice')
if alice_to_update.exists:
print(f"Güncellemeden önce (alice): {alice_to_update.data}")
alice_to_update.data['age'] = 31
alice_to_update.data['occupation'] = 'Software Engineer'
alice_to_update.store()
print(f"Veri güncellendi (alice): {alice_to_update.data}")
# Güncellenmiş veriyi tekrar okuyarak kontrol edelim
updated_alice = users_bucket.get('alice')
print(f"Güncellemeden sonra okunan (alice): {updated_alice.data}")
else:
print("Alice verisi güncelleme için bulunamadı.")
Veri Silme
Bir anahtar-değer çiftini Riak’tan silmek için delete() metodunu kullanırız.
# 'bob' anahtarına sahip veriyi silelim
bob_to_delete = users_bucket.get('bob')
if bob_to_delete.exists:
bob_to_delete.delete()
print(f"Veri silindi: users/bob")
# Silme işlemini doğrulamak için tekrar okumaya çalışalım
deleted_bob = users_bucket.get('bob')
if not deleted_bob.exists:
print("Bob verisi başarıyla silinmiş.")
else:
print("Bob verisi silinemedi veya hala mevcut.")
else:
print("Bob verisi silme için bulunamadı.")
Basit Bir Örnek Uygulama
Yukarıdaki tüm işlemleri birleştiren örnek bir Python scripti:
import riak
def run_riak_example():
client = None
try:
# Riak sunucusuna bağlantı kurma
client = riak.RiakClient(pb_port=8087, protocol='pbc')
if not client.ping():
print("Hata: Riak bağlantısı başarısız oldu. Sunucu çalışıyor mu?")
return
print("Riak'a başarıyla bağlanıldı.")
users_bucket = client.bucket('users')
products_bucket = client.bucket('products')
# 1. Veri Depolama
print("\n--- Veri Depolama ---")
user1_data = {'name': 'Ayşe Yılmaz', 'email': 'ayse@example.com', 'age': 28}
user1_obj = users_bucket.new('user_ayse', user1_data)
user1_obj.store()
print(f"Depolanan kullanıcı: user_ayse -> {user1_data}")
product1_data = {'name': 'Dizüstü Bilgisayar', 'price': 1200.00, 'category': 'Elektronik'}
product1_obj = products_bucket.new('prod_laptop', product1_data)
product1_obj.store()
print(f"Depolanan ürün: prod_laptop -> {product1_data}")
# 2. Veri Okuma
print("\n--- Veri Okuma ---")
fetched_user = users_bucket.get('user_ayse')
if fetched_user.exists:
print(f"Okunan kullanıcı (user_ayse): {fetched_user.data}")
else:
print("Kullanıcı user_ayse bulunamadı.")
fetched_product = products_bucket.get('prod_laptop')
if fetched_product.exists:
print(f"Okunan ürün (prod_laptop): {fetched_product.data}")
else:
print("Ürün prod_laptop bulunamadı.")
# 3. Veri Güncelleme
print("\n--- Veri Güncelleme ---")
if fetched_user.exists:
print(f"Güncellemeden önce (user_ayse): {fetched_user.data}")
fetched_user.data['age'] = 29
fetched_user.data['status'] = 'Active'
fetched_user.store()
print(f"Güncellenen kullanıcı (user_ayse): {fetched_user.data}")
# Güncellemeyi doğrulamak için tekrar oku
re_fetched_user = users_bucket.get('user_ayse')
print(f"Güncelleme sonrası tekrar okunan (user_ayse): {re_fetched_user.data}")
else:
print("Kullanıcı user_ayse güncelleme için bulunamadı.")
# 4. Veri Silme
print("\n--- Veri Silme ---")
user_to_delete = users_bucket.get('user_ayse')
if user_to_delete.exists:
user_to_delete.delete()
print("Kullanıcı user_ayse silindi.")
# Silme işlemini doğrula
deleted_user = users_bucket.get('user_ayse')
if not deleted_user.exists:
print("Kullanıcı user_ayse başarıyla silinmiş.")
else:
print("Hata: Kullanıcı user_ayse silinemedi.")
else:
print("Kullanıcı user_ayse silme için bulunamadı.")
except riak.RiakError as e:
print(f"Riak Hatası: {e}")
except Exception as e:
print(f"Beklenmedik bir hata oluştu: {e}")
finally:
if client:
print("\nÖrnek tamamlandı.")
if __name__ == "__main__":
run_riak_example()
Bu scripti riak_example.py olarak kaydedip python3 riak_example.py komutuyla çalıştırabilirsiniz.
Riak Kümeleme Temelleri
Tek düğümlü bir kurulum, Riak’ın yeteneklerini anlamak için harika bir başlangıç noktasıdır, ancak Riak’ın gerçek gücü dağıtık kümeleme yeteneklerinde yatar.
Neden Kümeleme?
* Yüksek Erişilebilirlik: Bir düğüm çökerse, diğer düğümler hizmet vermeye devam eder.
* Hata Toleransı: Veriler birden fazla düğümde çoğaltıldığı için veri kaybı riski azalır.
* Ölçeklenebilirlik: Veri hacmi veya işlem yükü arttıkça kümeye kolayca yeni düğümler ekleyebilir veya çıkarabilirsiniz.
* Coğrafi Dağıtım: Verileri farklı veri merkezlerine veya coğrafi bölgelere dağıtarak felaket kurtarma yeteneklerini artırabilir.
Küme Oluşturma Adımları (Genel Bakış)
Birden fazla Riak düğümünü bir araya getirerek bir küme oluşturmak için genel adımlar şunlardır:
1. Her Düğüme Riak Kurulumu: Her bir sunucuya yukarıdaki adımları takip ederek Riak 2’yi kurun.
2. Yapılandırma: Her düğümdeki /etc/riak/riak.conf ve /etc/riak/vm.args dosyalarını doğru şekilde yapılandırın:
* riak.conf: node = riak@ (her düğüm kendi IP adresini kullanmalı). listener.http.internal ve listener.protobuf.internal ayarlarını da ilgili IP adreslerine veya 0.0.0.0 olarak ayarlayın.
* vm.args: -name riak@ ve tüm düğümlerde aynı -setcookie kullanın.
3. Düğümleri Başlatma: Her düğümde sudo riak start komutunu çalıştırın.
4. Düğümleri Kümeye Katma: İlk düğümü başlatın ve diğer düğümleri bu ilk düğüme katın. Örneğin, node1 ilk düğüm ise ve IP adresi 192.168.1.10 ise, node2‘den aşağıdaki komutu çalıştırın:
riak-admin cluster join riak@192.168.1.10
Bu adımı kümedeki her yeni düğüm için tekrarlayın.
5. Küme Değişikliklerini Uygulama: Düğümler kümeye katıldıktan sonra, herhangi bir düğümden (genellikle ilk düğümden) değişiklikleri planlayın ve uygulayın:
riak-admin cluster plan
riak-admin cluster commit
6. Durumu Kontrol Etme: Kümenin durumunu kontrol etmek için herhangi bir düğümden riak-admin member-status komutunu kullanın. Tüm düğümlerin valid durumda olduğunu ve kümenin bir parçası olduğunu görmelisiniz.
Önemli Kümeleme Kavramları
* VNode’lar (Virtual Nodes): Riak, verileri fiziksel düğümler yerine sanal düğümler (vnodes) arasında dağıtır. Bu, küme boyutunu değiştirirken veya düğümler ekleyip çıkarırken verilerin daha kolay yeniden dengelenmesini sağlar.
* Replika Faktörü (N): Bir verinin kümede kaç kopyasının tutulacağını belirler. Varsayılan değer 3’tür, yani her veri üç farklı düğümde depolanır. Daha yüksek N değeri, daha fazla hata toleransı sağlar ancak depolama alanı ve yazma gecikmesini artırır.
* Okuma (R) ve Yazma (W) Quorum’ları: Bir okuma veya yazma işleminin başarılı sayılması için gereken minimum replika sayısıdır.
* R: Bir okuma işleminin başarılı olması için kaç replikadan yanıt alınması gerektiğini belirtir.
* W: Bir yazma işleminin başarılı olması için kaç replikaya yazma işleminin tamamlanması gerektiğini belirtir.
* RW: Aynı anda hem okuma hem de yazma quorum’u.
* all: Tüm replikalar.
* one: Bir replika.
* quorum: N/2 + 1 replika.
R + W > N olduğunda, “Strong Consistency” (güçlü tutarlılık) elde edilebilir, ancak bu, erişilebilirliği azaltabilir. Riak genellikle “Eventual Consistency” (nihai tutarlılık) sunar.
* Çatışma Çözümü (Conflict Resolution): Riak’ın dağıtık yapısı nedeniyle aynı anahtarın birden fazla kopyası üzerinde eş zamanlı yazma işlemleri çatışmalara yol açabilir. Riak, bu çatışmaları vektör saatleri (vector clocks) kullanarak tespit eder ve varsayılan olarak “son yazan kazanır” (last-write-wins) veya kullanıcı tanımlı kurallar ile çözebilir.
Riak Performans ve Güvenlik İpuçları
Riak dağıtık bir sistem olduğundan, performans ve güvenlik konularına özel dikkat göstermek önemlidir.
Performans İpuçları
* Doğru Depolama Arka Ucunu Seçme:
* Bitcask: Yazma yoğun iş yükleri ve düşük gecikme süresi için idealdir.
* LevelDB: Daha dengeli okuma/yazma performansı sunar ve daha iyi birleştirme (compaction) özelliklerine sahiptir.
* Donanım Optimizasyonu:
* SSD Kullanımı: Özellikle Bitcask için disk I/O performansı kritiktir. SSD’ler, HDD’lere göre önemli bir performans artışı sağlar.
* Yeterli RAM: Riak, Erlang VM üzerinde çalıştığı için bol miktarda RAM’den faydalanır. Erlang VM ayarlarını (vm.args) sunucunuzun RAM’ine göre optimize edin.
* CPU Çekirdekleri: Yeterli CPU çekirdeği, Erlang’ın eşzamanlı işlemleri daha verimli yönetmesini sağlar.
* Erlang VM Ayarları (vm.args):
* -smp enable: Çok çekirdekli işlemcileri kullanmayı etkinleştirir.
* +A: I/O iş parçacığı havuzu boyutunu ayarlar.
* +K true: Erlang’ın kernel poller kullanmasını sağlar.
* Bucket Tipleri ve Özellikleri: Riak 2’de bucket tipleri, kovalar için varsayılan davranışları ve özellikleri tanımlamanıza olanak tanır (örn. N değeri, çatışma çözüm stratejisi). Uygulamanızın gereksinimlerine göre özel bucket tipleri tanımlayarak performansı ve tutarlılığı optimize edebilirsiniz.
* Okuma/Yazma Quorum’larını Ayarlama: Uygulamanızın tutarlılık ve erişilebilirlik gereksinimlerine göre R ve W değerlerini dikkatlice ayarlayın. Daha düşük R ve W değerleri daha hızlı işlemlere yol açabilir ancak veri tutarlılığı riskini artırabilir.
Güvenlik İpuçları
* Ağ İzolasyonu ve Güvenlik Duvarı: Riak düğümlerini sadece güvenli ağlardan erişilebilecek şekilde yapılandırın. HTTP (8098) ve Protobuf (8087) portlarını sadece uygulamanızın veya diğer Riak düğümlerinin erişmesi gereken IP adreslerine açın. UFW (Uncomplicated Firewall) gibi araçlarla güvenlik duvarı kuralları oluşturun.
* Erlang Çerezi (-setcookie): vm.args dosyasındaki Erlang çerezi, düğümlerin birbirine güvenmesini sağlar. Bu çerez güçlü, tahmin edilemez bir dize olmalı ve asla ifşa edilmemelidir.
* Ayrıcalıksız Kullanıcı: Riak’ı root kullanıcısı yerine ayrıcalıksız bir kullanıcı (örn. riak) altında çalıştırmak, güvenlik risklerini azaltır.
* Veri Şifreleme: Hassas verileri Riak’a yazmadan önce uygulama katmanında şifrelemek, veri güvenliğini artırır. Riak 2, veritabanı düzeyinde yerleşik şifreleme sunmaz.
* Erişim Kontrolü: Riak 2’de yerleşik kullanıcı tabanlı kimlik doğrulama veya yetkilendirme sistemi yoktur. Erişim kontrolü, genellikle ağ seviyesinde (güvenlik duvarı) ve uygulama katmanında yönetilir.
Sorun Giderme
Kurulum veya yapılandırma sırasında karşılaşabileceğiniz yaygın sorunlar ve çözümleri:
Sık Karşılaşılan Sorunlar
* Riak Başlatılamıyor:
* Logları Kontrol Edin: /var/log/riak/console.log ve /var/log/riak/error.log dosyalarını inceleyin. Hata mesajları sorunun kök nedenini gösterecektir.
* Yapılandırma Dosyaları: riak.conf ve vm.args dosyalarındaki sözdizimi hatalarını veya yanlış değerleri kontrol edin. Özellikle node ve -name ayarlarının eşleştiğinden emin olun.
* Port Çakışmaları: Riak’ın kullanmaya çalıştığı portların (8087, 8098) başka bir servis tarafından kullanılmadığından emin olun. sudo netstat -tulpn | grep 8087 gibi komutlarla kontrol edebilirsiniz.
* Kümeleme Sorunları:
* Erlang Çerezi: Tüm düğümlerde vm.args dosyasındaki -setcookie değerinin aynı olduğundan emin olun.
* IP Adresleri: riak.conf ve vm.args dosyalarındaki IP adreslerinin doğru ve diğer düğümler tarafından erişilebilir olduğundan emin olun.
* Güvenlik Duvarı: Düğümler arası iletişimi engelleyen güvenlik duvarı kuralları olup olmadığını kontrol edin. Erlang dağıtım portları (genellikle 4369 ve 9100-9150 aralığı) açık olmalıdır.
* Python İstemcisi Bağlantı Hataları:
* Riak Servisi Çalışıyor mu?: Riak düğümünün sudo riak status ile çalıştığından emin olun.
* Doğru Port: Python istemcisinde belirtilen pb_port veya http_port değerinin riak.conf dosyasındaki listener.protobuf.internal veya listener.http.internal ile eşleştiğinden emin olun.
* Güvenlik Duvarı: Python istemcisinin çalıştığı makineden Riak sunucusunun portlarına erişime izin verildiğinden emin olun.
* IP Adresi: Python istemcisinde riak.RiakClient() çağrısında doğru IP adresini kullandığınızdan emin olun.
Log Dosyaları
Riak’ın sorun giderme için en önemli kaynakları log dosyalarıdır.
* /var/log/riak/console.log: Riak düğümünün Erlang VM’sinden gelen genel çıktı ve hata mesajlarını içerir.
* /var/log/riak/error.log: Riak’ın karşılaştığı kritik hataları kaydeder.
* /var/log/riak/current.log: Riak’ın güncel durum ve olay bilgilerini içerir.
Bu dosyaları düzenli olarak kontrol etmek, sorunları erken aşamada tespit etmenize yardımcı olacaktır.
Sonuç
Bu makalede, Ubuntu 14.04 işletim sistemi üzerinde Riak 2’nin kurulumu ve temel yapılandırması ile Python 3 kullanarak Riak ile nasıl etkileşim kurulacağı detaylı bir şekilde açıklanmıştır. Adım adım kurulum talimatları, yapılandırma dosyalarının önemi ve temel veri işlemleri örnekleri ile Riak’ın dağıtık mimarisine giriş yapılmıştır. Ayrıca, Riak kümeleme temelleri, performans ve güvenlik ipuçları ile karşılaşabileceğiniz yaygın sorunların giderilmesine yönelik bilgiler sunulmuştur.
Riak 2, yüksek erişilebilirlik ve ölçeklenebilirlik gerektiren uygulamalar için güçlü bir NoSQL çözümü sunar. Python 3 ile entegrasyonu, geliştiricilere bu gücü kullanmak için esnek ve verimli bir yol sağlar. Ubuntu 14.04 gibi eski bir platformda çalışıyor olsanız bile, bu rehber sayesinde Riak’ı başarıyla kurup yapılandırabilir ve Python uygulamalarınızla kullanmaya başlayabilirsiniz.
Unutulmamalıdır ki, Ubuntu 14.04 artık uzun süreli destek (LTS) almayan eski bir işletim sistemidir. Güvenlik güncellemeleri ve modern özellikler için daha yeni Ubuntu sürümlerine geçiş yapmak genellikle önerilir. Ancak bu makale, belirtilen spesifik ortamda Riak 2 ve Python 3’ü başarılı bir şekilde kurmak için gerekli tüm bilgileri sağlamaktadır. Riak ve Python ekosistemleri sürekli geliştiği için, daha derinlemesine bilgiler ve en güncel uygulamalar için resmi Riak belgelerine ve Python Riak istemcisinin GitHub sayfasına başvurmanız faydalı olacaktır.
