Mayıs 22 2026

HAProxy ile Yüksek Erişilebilirlik: Keepalived ve Health Check

Modern mikroservis mimarilerinde veya yüksek trafikli web uygulamalarında kesintisiz hizmet sunmak artık bir lüks değil, zorunluluk. Tam da bu noktada, haproxy ve keepalived ikilisi, linux sunucularınız üzerinde kurabileceğiniz, kurumsal sınıfta, maliyetsiz ve son derece güvenilir bir aktif-pasif ha (high availability) loadbalancer çözümü olarak imdadımıza yetişiyor. Peki ama bu iki canavarı prod ortamında birbirine küstürmeden, arkadaki servislerin sağlık durumlarına (health check) ve gelen isteğin içeriğine (ACL) göre nasıl kusursuzca dans ettireceğiz? Bu yazıda lafı hiç dolandırmadan, doğrudan production ortamında hırpalanmış senaryolardan süzülen pratik bir mimariyi ayağa kaldıracağız.

Neden Sadece HAProxy Yetmiyor? (SPOF Nedir?)

HAProxy, performansına ve stabilitesine şapka çıkardığımız harika bir load balancer. Ancak ne kadar güçlü olursa olsun, tek bir sunucu üzerinde çalıştığı sürece sisteminizde bir SPOF (Single Point of Failure) yani tek hata noktası oluşturur. HAProxy’nin üzerinde çalıştığı Linux sunucunun donanımı çökerse, network kartı yanarsa ya da kernel panik yaparsa tüm sisteminiz karanlığa gömülür.

İşte bu riski bertaraf etmek için Keepalived devreye giriyor. Keepalived, VRRP (Virtual Router Redundancy Protocol) protokolünü kullanarak iki farklı load balancer sunucusunun tek bir Sanal IP (Virtual IP – VIP) arkasında çalışmasını sağlar. Aktif olan sunucu çöktüğünde, pasif durumdaki yedek sunucu VIP’yi milisaniyeler içinde üzerine alır. Kullanıcılar bu failover sürecini ruhları bile duymadan atlatırlar.

Altyapı Hazırlığı ve Olmazsa Olmaz Kernel Parametresi

Kuruluma başlamadan önce topolojimizi netleştirelim. Elimizde iki adet Linux (Ubuntu/Debian tabanlı kabul ediyoruz) sunucu olduğunu varsayalım:

  • LB01 (Master): 192.168.1.10
  • LB02 (Backup): 192.168.1.11
  • Sanal IP (VIP): 192.168.1.100

Şimdi kıdemli bir sistemcinin asla atlamayacağı o kritik kernel ayarına gelelim: net.ipv4.ip_nonlocal_bind. Varsayılan olarak Linux, sunucu üzerinde fiziksel olarak tanımlanmamış bir IP adresine servislerin bind olmasını (yani o IP’yi dinlemesini) engeller. VIP, pasif sunucuda o an aktif olmadığı için backup sunucudaki HAProxy servisi başlatılamaz ve çöker. Bunun önüne geçmek için her iki sunucuda da şu komutu koşturuyoruz:

echo "net.ipv4.ip_nonlocal_bind=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Bu sihirli dokunuş sayesinde HAProxy, sunucuda henüz tanımlanmamış olan 192.168.1.100 IP’sini hiç çekinmeden dinlemeye başlayacaktır.

Keepalived ile Aktif-Pasif VIP Kurulumu

Her iki sunucuya da keepalived paketini kuralım:

sudo apt update && sudo apt install keepalived -y

Şimdi konfigürasyon zamanı. En kritik nokta, master sunucu çöktüğünde VIP’nin pasif sunucuya geçmesi, ancak master geri geldiğinde (eğer istemiyorsak) gereksiz yere VIP’yi geri alıp ufak da olsa bir kesinti yaratmamasıdır. Buna “non-preemptive” yapılandırma denir. Ancak biz bu örnekte klasik aktif-pasif öncelik yapısını kuracağız.

Master (LB01) Konfigürasyonu

/etc/keepalived/keepalived.conf dosyasını oluşturun ve aşağıdaki gibi düzenleyin:

vrrp_script check_haproxy {
    script "killall -0 haproxy" # HAProxy çalışıyor mu kontrol et
    interval 2                  # Her 2 saniyede bir çalıştır
    weight 2                    # Başarılıysa önceliğe (priority) 2 ekle
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0              # Network arayüzünüzün adı (ip a ile kontrol edin)
    virtual_router_id 51        # İki sunucuda da AYNI olmalı
    priority 101                # Master daha yüksek önceliğe sahip
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass GizliSifre123  # İki sunucuda da aynı olmalı
    }

    virtual_ipaddress {
        192.168.1.100/24         # Paylaşılan Sanal IP (VIP)
    }

    track_script {
        check_haproxy
    }
}

Backup (LB02) Konfigürasyonu

Backup sunucumuzda ise dosya neredeyse aynıdır, sadece state ve priority değerleri değişir:

vrrp_script check_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100                # Master'dan daha düşük
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass GizliSifre123
    }

    virtual_ipaddress {
        192.168.1.100/24
    }

    track_script {
        check_haproxy
    }
}

Konfigürasyonları kaydettikten sonra her iki sunucuda da servisi başlatalım:

sudo systemctl enable --now keepalived

Eğer her şey yolunda gittiyse, LB01 üzerinde ip a show eth0 komutunu verdiğinizde secondary IP olarak 192.168.1.100 adresini görmelisiniz. LB02’de ise bu IP görünmemelidir.

HAProxy Kurulumu ve Sağlık Kontrolü (Health Check) Sanatı

Sıra geldi yük dengeleme katmanımıza. HAProxy’yi kuralım:

sudo apt install haproxy -y

Bir load balancer’ı akıllı kılan şey, arkasındaki uygulama sunucularının (backend) gerçekten yaşayıp yaşamadığını bilmesidir. Sadece TCP portunun açık olması (Layer 4) uygulamanın sağlıklı çalıştığı anlamına gelmez. Uygulama veritabanına bağlanamadığı için HTTP 500 hatası veriyor olabilir ama TCP portu hala ayaktadır. Bu yüzden her zaman HTTP tabanlı (Layer 7) health check tercih etmelisiniz.

Gelin, hem gelişmiş health check mekanizmasını hem de VIP binding konseptini barındıran örnek bir /etc/haproxy/haproxy.cfg dosyası hazırlayalım:

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000ms
    timeout client  50000ms
    timeout server  50000ms

frontend http_front
    bind 192.168.1.100:80 # Sadece VIP üzerinden gelen istekleri dinle
    mode http
    default_backend app_backend

backend app_backend
    mode http
    balance roundrobin
    
    # Layer 7 Health Check Yapılandırması
    option httpchk GET /healthz HTTP/1.1\r\nHost:\ myapp.local
    http-check expect status 200
    
    # Backend Sunucuları
    server app01 192.168.1.20:8080 check inter 3000 rise 2 fall 3
    server app02 192.168.1.21:8080 check inter 3000 rise 2 fall 3

Burada Neler Döndü? (Detaylı “Neden” Analizi)

  • bind 192.168.1.100:80: HAProxy’ye sadece VIP adresini dinlemesini söyledik. Bu, trafiğin kontrolsüz şekilde doğrudan nodeların kendi IP’leri üzerinden akmasını engeller.
  • option httpchk GET /healthz: HAProxy, backend sunucularına her 3 saniyede bir (inter 3000) HTTP GET isteği gönderir.
  • http-check expect status 200: Gelen yanıtın HTTP 200 OK olması durumunda sunucu “sağlıklı” kabul edilir.
  • rise 2 fall 3: Bir sunucu ardışık 3 kez başarısız health check yanıtı verirse (fall), trafik ona gönderilmez (out of rotation). Ne zaman ki ardışık 2 başarılı yanıt verir (rise), o zaman tekrar gruba dahil edilir.

Gelişmiş ACL (Access Control List) Tabanlı Routing

Prod ortamlarında genellikle tek bir domain arkasında birden fazla mikroservis barındırırız. Örneğin /api ile başlayan isteklerin API servislerine, statik dosyaların ise başka bir backende gitmesini isteriz. HAProxy’nin ACL mekanizması bu konuda tam bir canavardır.

Aşağıdaki konfigürasyon örneğinde, path ve domain bazlı yönlendirmeyi nasıl yapacağımızı görelim:

frontend http_front_advanced
    bind 192.168.1.100:80
    mode http

    # ACL Tanımları
    acl is_api path_beg -i /api
    acl is_static path_end -i .jpg .png .css .js
    acl host_admin hdr_beg(host) -i admin.

    # Yönlendirme Kuralları (Routing Rules)
    use_backend api_backend if is_api
    use_backend static_backend if is_static
    use_backend admin_backend if host_admin
    
    # Varsayılan Backend
    default_backend web_backend

backend web_backend
    server web01 192.168.1.30:80 check

backend api_backend
    server api01 192.168.1.40:8080 check

backend static_backend
    server storage01 192.168.1.50:80 check

backend admin_backend
    server admin01 192.168.1.60:80 check

Bu yapıyla birlikte, tek bir load balancer IP’si üzerinden gelen istekleri, url path’ine veya HTTP host header’ına göre ayıklayıp tamamen farklı sunucu gruplarına sıfır performans kaybıyla dağıtabiliyoruz.

Failover Testi: Fişi Çektiğimizde Ne Oluyor?

Kurulumumuzu tamamladık ve servislerimizi başlattık (sudo systemctl enable --now haproxy). Peki sistemimiz gerçekten yüksek erişilebilir mi? Bunu test etmenin en vahşi (ve keyifli) yolu canlı ortamda simülasyon yapmaktır.

Öncelikle master sunucumuzda (LB01) IP adresini izleyelim:

ip addr show eth0

Burada 192.168.1.100 IP’sini görmeliyiz. Şimdi master sunucu üzerinde HAProxy servisini durdurarak Keepalived’ın bu durumu fark etmesini sağlayalım:

sudo systemctl stop haproxy

Hemen ardından pasif sunucuya (LB02) geçip logları izleyelim:

tail -f /var/log/syslog | grep Keepalived

Loglarda şuna benzer bir satır görmelisiniz:

Keepalived_vrrp[1234]: VRRP_Instance(VI_1) Entering MASTER STATE

Ve ip addr show eth0 çalıştırdığınızda, VIP’nin saniyeden daha kısa bir sürede LB02’ye göç ettiğini göreceksiniz. Kullanıcılarınız, veritabanına veri yazmaya ve web sitenizde gezinmeye kesintisiz olarak devam edecektir. İşte gerçek HA kalitesi!

Sonuç ve Pro-Tip

HAProxy ve Keepalived ikilisi, karmaşık cloud mimarilerine veya pahalı donanımsal load balancer cihazlarına ihtiyaç duymadan, Linux’un gücüyle scale olabilen harika bir çözümdür.

Son bir prod tavsiyesi: Keepalived loglarını mutlaka merkezi bir izleme aracına (Elasticsearch, Loki vb.) yönlendirin ve VIP geçişlerinde (state transitions) ekibinize Slack veya Teams üzerinden alert atacak bir script tetikleyin (bunun için Keepalived’ın notify_master ve notify_backup direktiflerini araştırabilirsiniz). VIP’nin sessiz sedasız sürekli yer değiştirmesi, altyapınızda sinsi bir network dalgalanması olduğunun habercisi olabilir.

Category: Genel | LEAVE A COMMENT
Mayıs 22 2026

Zabbix + Alertmanager: PagerDuty ve Slack Entegrasyonu

Gece saat 03:00. Cep telefonunuz ardı ardına titriyor. Zabbix size “CPU usage high on prod-db-01” başlıklı tam 142 adet SMS göndermiş. Gözlerinizi oğuşturarak bilgisayarı açıyorsunuz ve durumun aslında sadece planlı bir veritabanı yedeğinden (backup job) ibaret olduğunu, diskin veya veritabanının çökmediğini görüyorsunuz. Bu esnada sinirden köpürürken kendinize şu soruyu soruyorsunuz: “Neden bu alarmları gruplayamadım? Neden nöbetçi arkadaşım yerine tüm ekip ayağa kalktı?”

İşte tam bu noktada, geleneksel izleme canavarımız zabbix ile modern bulut dünyasının alarm yönetim standardı olan alertmanager‘ı evlendirmenin vakti gelmiş demektir. Bu makalede, Zabbix’in topladığı metrik ve trigger’ları Alertmanager’a köprüleyecek, oradan da slack ve pagerduty entegrasyonları ile akıllı, gürültüsüz ve insan odaklı bir oncall yönetim yapısı kuracağız.

Neden Doğrudan Zabbix Değil de Alertmanager?

Zabbix, metrik toplama (polling), agent yönetimi ve esnek trigger tanımlama konularında harika bir araçtır. Ancak iş alarm yönetimine (alert routing, deduplication, inhibition ve silencing) geldiğinde Zabbix’in aksiyon (Action) arayüzü hantal kalır. GitOps felsefesine uygun değildir, sürüm kontrolü (version control) zordur ve karmaşık eskalasyon senaryolarında konfigürasyon cehennemine dönüşebilir.

Alertmanager ise Prometheus ekosisteminin kalbidir ancak sadece Prometheus ile sınırlı olmak zorunda değildir. Bize sunduğu avantajlar şunlardır:

  • Deduplication (Tekilleştirme): Aynı anda patlayan 50 benzer alarmı tek bir Slack mesajında birleştirir.
  • Inhibition (Bastırma): Eğer bir veri merkezi (datacenter) çöktüyse, o veri merkezinin içindeki 100 makine için “Node Down” alarmı göndermez; sadece “Datacenter Offline” alarmını geçirir, diğerlerini bastırır.
  • Dynamic Routing (Dinamik Yönlendirme): Alarma basılan etiketlere (labels) göre alarmı anında doğru ekibe (DBA, Network, Frontend) yönlendirir.

Adım 1: Zabbix Webhook ile Alertmanager API Köprüsü Kurmak

İlk yapmamız gereken iş, Zabbix’te bir trigger tetiklendiğinde bunu Alertmanager’ın /api/v2/alerts endpoint’ine gönderecek bir “Media Type” tanımlamaktır. Alertmanager, kendisine gönderilen JSON payload’unda belirli standartlar bekler.

Zabbix arayüzünde Administration -> Media Types sekmesine gidin ve “Create media type” butonuna tıklayın. Tipi Webhook olarak seçin ve aşağıdaki parametreleri ekleyin:

// Zabbix Webhook Script içeriği
try {
    var params = JSON.parse(value),
        req = new HttpRequest(),
        payload = [];

    if (typeof params.AlertmanagerURL === 'undefined') {
        throw 'AlertmanagerURL parametresi eksik.';
    }

    // Alertmanager API v2 formatı
    var alert = {
        "labels": {
            "alertname": params.AlertName,
            "severity": params.Severity,
            "instance": params.HostName,
            "service": params.Service || "infrastructure",
            "environment": params.Environment || "production"
        },
        "annotations": {
            "summary": params.TriggerDescription,
            "value": params.TriggerValue,
            "zabbix_url": params.ZabbixURL + "/tr_events.php?triggerid=" + params.TriggerID
        }
    };

    // Zabbix alarm durumuna göre durumu eşle (Eğer OK ise çözüldü olarak gönder)
    if (params.TriggerStatus === 'OK') {
        alert["endsAt"] = new Date().toISOString();
    } else {
        alert["startsAt"] = new Date().toISOString();
    }

    payload.push(alert);

    req.addHeader('Content-Type: application/json');
    var response = req.post(params.AlertmanagerURL + '/api/v2/alerts', JSON.stringify(payload));

    if (req.getStatus() !== 200 && req.getStatus() !== 201) {
        throw 'HTTP hatası: ' + req.getStatus() + '\nResponse: ' + response;
    }

    return 'OK';
} catch (error) {
    Zabbix.log(3, 'Alertmanager webhook hatası: ' + error);
    throw error;
}

Bu JS kodu, Zabbix trigger’ı tetiklendiğinde ya da çözüldüğünde (OK durumuna geçtiğinde) Alertmanager’a RFC3339 formatında zaman damgasıyla birlikte durumu iletir. Böylece Alertmanager alarmın çözüldüğünü (resolved) anlar ve Slack/PagerDuty üzerindeki açık alarmı otomatik olarak kapatır.

Adım 2: Alertmanager Konfigürasyonu (`alertmanager.yml`)

Şimdi Alertmanager tarafında bu alarmları nasıl karşılayacağımızı ve nereye yönlendireceğimizi tanımlayalım. production ortamlarında genellikle kritik alarmların PagerDuty’ye (ve dolayısıyla nöbetçi mühendisin telefonuna), uyarı seviyesindeki alarmların ise sadece Slack kanalına gitmesini isteriz.

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'instance', 'environment']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'slack-default'
  routes:
    # Kritik üretim alarmları hem Slack'e hem PagerDuty'ye gitsin
    - match:
        severity: 'disaster'
        environment: 'production'
      receiver: 'pagerduty-critical'
      continue: true
    
    # Tüm üretim alarmları Slack kanalına düşsün
    - match:
        environment: 'production'
      receiver: 'slack-production'

receivers:
- name: 'slack-default'
  slack_configs:
  - api_url: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
    channel: '#ops-alerts-test'
    send_resolved: true
    text: "Alarm: {{ .CommonAnnotations.summary }}\nSeverity: {{ .CommonLabels.severity }}\nHost: {{ .CommonLabels.instance }}"

- name: 'slack-production'
  slack_configs:
  - api_url: 'https://hooks.slack.com/services/T00000000/B00000000/YYYYYYYYYYYYYYYYYYYYYYYY'
    channel: '#prod-alerts'
    send_resolved: true
    title: "[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}"
    text: "Host: {{ .CommonLabels.instance }}\nDetay: {{ .CommonAnnotations.summary }}\nZabbix Linki: {{ .CommonAnnotations.zabbix_url }}"

- name: 'pagerduty-critical'
  pagerduty_configs:
  - service_key: 'YOUR_PAGERDUTY_INTEGRATION_KEY_HERE'
    severity: 'critical'
    send_resolved: true
    client: 'Alertmanager'
    client_url: 'https://alertmanager.kertenkerem.net'
    description: "{{ .CommonAnnotations.summary }} - Host: {{ .CommonLabels.instance }}"

Adım 3: PagerDuty Üzerinde Akıllı On-Call ve Eskalasyon Politikaları

Alertmanager entegrasyonunu tamamladıktan sonra topu pagerduty tarafına atıyoruz. PagerDuty üzerinde bir servis (Service) oluşturup entegrasyon tipini “Prometheus/Alertmanager” olarak seçtiğinizde size yukarıdaki YAML dosyasında kullandığımız service_key (Integration Key) değerini verecektir.

Ancak iş sadece entegrasyonla bitmiyor. Gerçek bir oncall kültüründe şu üç yapıyı kurmanız gerekir:

1. Schedules (Nöbet Takvimleri)

Haftalık rotasyonlar tanımlayın. Örneğin, her Salı günü saat 09:00’da nöbet bir sonraki mühendise devretsin. PagerDuty üzerinde Primary ve Secondary (yedek) olmak üzere iki farklı takvim oluşturmak hayat kurtarır. Eğer Primary nöbetçisi o an ulaşılamaz durumdaysa (örneğin uçaktaysa), sistem otomatik olarak yedek nöbetçiyi arar.

2. Escalation Policies (Eskalasyon Politikaları)

Alarmların sahipsiz kalmaması için eskalasyon zinciri şarttır. Örnek bir kurumsal politika şu şekilde olmalıdır:

  • Adım 1: Alarm tetiklendiğinde o anki nöbetçiyi (Primary) ara ve SMS gönder. (0. dakika)
  • Adım 2: Eğer 10 dakika içinde “Acknowledge” (onay) gelmezse, yedek nöbetçiyi (Secondary) ara. (10. dakika)
  • Adım 3: Eğer hala ses çıkmıyorsa, tüm DevOps ekibine push notification at ve takım liderini devreye sok. (20. dakika)

3. Slack Entegrasyonu ve ChatOps

PagerDuty Slack uygulamasını kurarak, Slack kanalı üzerinden tek tıkla alarmı üstlenebilir (Acknowledge) veya çözebilirsiniz (Resolve). Bu, gece yarısı telefondan PagerDuty uygulamasına girmeye çalışırken harcayacağınız 30 saniyeyi size geri kazandırır.

Alert Fatigue (Alarm Yorgunluğu) ile Savaşmak

Sistemi kurduk ancak her gün 500 defa çalan bir pager sistemi, bir süre sonra mühendislerin uyarıları görmezden gelmesine (alert fatigue) sebep olur. Bunu engellemek için şu taktikleri uygulayın:

  • Sadece aksiyon alınabilir alarmları PagerDuty’ye gönderin: “Disk doluluğu %81 oldu” bir PagerDuty alarmı değildir, sadece Slack’e gitmelidir. Ancak “Disk doluluğu %95 ve 10 dakika içinde tamamen dolacak” alarmı nöbetçiyi yataktan kaldırmalıdır.
  • Inhibit Rules kullanın: Switch çöktüğünde arkasındaki 30 sunucu için tek tek “ping down” alarmı almamak için Alertmanager inhibit kurallarını tanımlayın.
  • Susturma (Silences): Planlı bakım çalışmalarından önce Alertmanager veya PagerDuty arayüzünden ilgili servisleri mutlaka susturun (Silence).

Özet

Zabbix’in köklü izleme yeteneklerini Alertmanager’ın modern yönlendirme mimarisiyle birleştirmek, altyapı yönetiminde adeta çağ atlatır. Bu sayede hem production ortamınızdaki anomalileri saniyeler içinde yakalarsınız, hem de ekibinizin akıl sağlığını gereksiz gürültülü alarmlardan korumuş olursunuz.

Bir sonraki yazımızda Alertmanager üzerinde gelişmiş inhibit_rules yazımını inceleyeceğiz. O zamana kadar, alarmınız az, uykunuz bol olsun!

Category: Genel | LEAVE A COMMENT
Mayıs 8 2026

Pomodoro Değil: Derin Çalışma İçin Cal Newport Yöntemi

Gün boyu durmaksızın çalışıyor ama günün sonunda hiçbir şeyi tam olarak bitirememiş gibi mi hissediyorsunuz? Bildirimler, e-postalar ve bitmek bilmeyen toplantılar arasında kaybolurken, geleneksel yöntemler de yetersiz kalabiliyor. İşte tam bu noktada, modern dünyada kaybolan zihinsel gücümüzü geri kazanmak için harika bir life hack olarak karşımıza çıkan deep work (derin çalışma) kavramı devreye giriyor. Cal Newport’un popülerleştirdiği bu yöntem, sadece bir zaman yönetimi aracı değil; aynı zamanda beynimizin odak kasını geliştirmek için tasarlanmış, zihinsel sağlığımızı koruyan bir antrenman metodudur.

Neden Pomodoro Her Zaman Yetmez? (Zihinsel Isınma Süresi)

Birçoğumuz 25 dakika çalışıp 5 dakika dinlenmeyi öngören Pomodoro tekniğini denemiştir. Ancak karmaşık, derin düşünme gerektiren yaratıcı veya teknik işlerde bu süre henüz “ısınmamıza” bile yetmez. Beynimiz karmaşık bir probleme odaklanırken adeta bir motor gibi yavaş yavaş ısınır. Araştırmalar gösteriyor ki, bölünmeden bir konuya odaklanmak ve gerçek verimliliğe ulaşmak için beynin en az 20-30 dakikalık kesintisiz bir süreye ihtiyacı vardır.

Burada devreye giren en büyük düşmanımız ise “dikkat kalıntısı” (attention residue). Yapılan bilimsel araştırmalar, odağımızı bir işten diğerine (örneğin gelen bir mesaja bakmak için) her kaydırdığımızda, dikkatimizin bir kısmının önceki işte kaldığını kanıtlıyor. Sonuç mu? Sürekli bölünen, gün sonunda ise yorgun ama hiçbir şey üretememiş bir zihin.

Deep Work Nedir ve Beynimize Ne Yapar?

Deep work, dikkatinizin dağılmadığı bir ortamda, bilişsel yeteneklerinizin sınırlarını zorlayarak gerçekleştirdiğiniz profesyonel çalışma faaliyetleridir. Bu süreç sadece daha fazla iş yapmanızı sağlamaz, aynı zamanda beyninizin biyolojik yapısını da korur.

Nörobilimsel araştırmalar gösteriyor ki, bir konuya yüksek odaklanma ile yoğunlaştığımızda, beynimizdeki ilgili sinir yollarının etrafında miyelin adı verilen koruyucu bir kılıf oluşur. Miyelin tabakası kalınlaştıkça, sinirsel sinyaller daha hızlı iletilir ve o konuda daha hızlı uzmanlaşırız. Yani derin çalışma yapmak, beyninizi fiziksel olarak daha akıllı ve hızlı hale getiren bir zihinsel spordur.

Derin Çalışmayı Hayatınıza Entegre Etmek İçin 4 Adım

Cal Newport’un stratejilerini hayatımıza uygulamak, her gün saatlerce kendimizi odaya kilitlemek anlamına gelmez. İşte eyleme geçirilebilir pratik adımlar:

1. Kendi Ritüelinizi Yaratın

Derin çalışmaya başlamadan önce beyninize “Şimdi odaklanma zamanı” sinyali gönderecek küçük ritüeller belirleyin. Bu, masanızı temizlemek, belirli bir çalma listesini açmak veya kendinize bir fincan kahve yapmak olabilir. Beyin bu rutinleri gördüğünde otomatik olarak vites yükseltmeye başlar.

2. Can Sıkıntısını Kucaklayın

Modern insan olarak en büyük sorunumuz, en ufak bir boşlukta (kuyrukta beklerken, asansörde) telefona sarılmak. Beynimiz sürekli dopamin bombardımanına alışırsa, derin çalışmanın gerektirdiği “sakin ve sıkıcı” ilk 15 dakikaya tahammül edemez. Gün içinde bazen sadece durun ve hiçbir şey yapmayın. Bırakın zihniniz can sıkıntısıyla baş etmeyi öğrensin.

3. Dijital Minimalizm Uygulayın

Çalışırken telefonunuzu sadece sessize almak yetmez, odanın dışına çıkarın. Görüş alanınızda duran bir telefon, kapalı olsa bile beynimizin bir kısmını meşgul etmeye (onu kontrol etme dürtüsünü bastırmaya çalışırken zihinsel enerji harcamaya) devam eder.

4. Time-Blocking (Zaman Bloklama) Yöntemini Kullanın

Günlük planınızı yaparken sadece yapılacaklar listesi hazırlamayın. Hangi saatte hangi işi yapacağınızı takviminize bloklar halinde işleyin. Aşağıda basit bir zaman bloklama şablonu görebilirsiniz:


# Günlük Odak ve Çalışma Blokları
09:00 - 11:30 | [Derin Çalışma] - Telefonsuz, İnternetsiz Odaklanma
11:30 - 12:00 | [Sığ Çalışma] - E-postalar ve Slack Mesajları
12:00 - 13:00 | [Öğle Arası] - Ekran Yok, Zihinsel Dinlenme
13:00 - 15:00 | [Derin Çalışma] - Zor Projeler
15:00 - 17:00 | [Sığ Çalışma] - Toplantılar ve Rutin İşler
17:00 - 17:15 | [Kapatma Ritüeli] - Günü Bitir, Kafayı Boşalt

Önemli Uyarı: Deep work, yüksek düzeyde zihinsel enerji gerektirir. Günde 4 saatten fazla tam odaklanma gerçekleştirmek insan limitlerinin üzerindedir. Eğer kendinizi kronik olarak yorgun, tükenmiş hissediyorsanız veya odaklanma sorununuz günlük hayatınızı sekteye uğratacak boyuttaysa, bu durum kronik stres veya tıbbi bir durumun belirtisi olabilir. Lütfen bir doktora veya uzmana danışmayı ihmal etmeyin.

Sonuç: Kaliteli Üretim, Huzurlu Zihin

Günün sonunda deep work, sadece daha çok iş üretmenizi sağlayan soğuk bir verimlilik taktiği değildir. Aksine, işinizi bitirip bilgisayarı kapattığınızda, aklınızın arkasında yarım kalmış işlerin dönmediği, sevdiklerinize ve kendinize gerçekten vakit ayırabildiğiniz huzurlu bir yaşamın anahtarıdır. Bugün kendinize sadece 60 dakikalık kesintisiz bir blok ayırarak başlayın. Beyninizin bu zihinsel antrenmana nasıl olumlu yanıt verdiğini görünce şaşıracaksınız.

Category: Genel | LEAVE A COMMENT
Ocak 16 2026

Bütçeyle Avrupa: Ucuza Seyahat Etmenin Gerçekçi Yolları

Avrupa sokaklarında kaybolmak, tarihi bir meydanda kahve yudumlamak her gezginin rüyasıdır. Ancak son yıllarda Euro kurunun aldığı hal ve yükselen enflasyon ortada. Yine de moral bozmaya gerek yok; doğru stratejilerle bütçe seyahat planlamak ve avrupa genelinde ucuz tatil yapmak hâlâ mümkün. Klişe turistik turları bir kenara bırakıp, yereller gibi yaşamayı öğrendiğinizde, cüzdanınızın üzerindeki o ağır baskının hafiflediğini göreceksiniz. Bu yazıda, kendi deneyimlerimden yola çıkarak, konfor alanınızdan ufak tavizler vererek yollara düşmenizi sağlayacak gerçekçi yöntemleri paylaşıyorum.

Uçuş Radarını Ayarlamak: Ucuz Biletin Sırrı

Her şey o ilk biletle başlar. Çoğu insan uçak biletini aylar öncesinden almanın her zaman en ucuz yol olduğunu düşünür. Oysa bu her zaman doğru değil. Havayolu şirketlerinin dinamik fiyatlandırma algoritmaları vardır ve genellikle uçuş gününden 6 ila 8 hafta öncesi, fiyatların en makul seviyeye indiği altın penceredir. Hafta sonu uçuşları yerine Salı veya Çarşamba günlerini tercih etmek, bilet fiyatını yarı yarıya düşürebilir. Ayrıca, sadece ana havalimanlarına değil, şehrin biraz dışındaki ikincil havalimanlarına uçmayı düşünmelisiniz. Örneğin Brüksel yerine Charleroi Havalimanı’na uçmak bütçenizi ciddi anlamda rahatlatır. Bu havalimanlarından şehir merkezine ulaşım otobüslerle genellikle 10-15 Euro civarındadır ve yaklaşık 45 dakika sürer.

Uçuş ararken tarayıcınızın gizli sekmesini kullanmak klasik ama eksik bir bilgidir. Gerçek tasarruf için VPN kullanarak kendinizi bilet aldığınız ülkedeymiş gibi göstermek veya farklı para birimlerinde ödeme seçeneğini değerlendirmek bazen şaşırtıcı indirimler sağlayabilir.

Gezgin ruhlu yazılımcılar ve terminalden vazgeçemeyenler için ufak bir terminal numarasıyla bilet sorgulamayı ve API üzerinden anlık fiyat çekmeyi de buraya iliştirelim:

curl -s "https://api.skypicker.com/flights?fly_from=IST&to=BUD&partner=picky" | grep -o '"price":[0-9]*' | head -n 5

Konaklamada Yeni Paradigmalar: Sadece Uyumak İçin mi?

Bileti hallettikten sonra en büyük gider kalemi konaklamadır. İşte burada modern hostel kültürü devreye giriyor. Birçok insan için hostel kelimesi, eski korku filmlerini veya hijyenden uzak odaları çağrıştırır. Oysa günümüz hostelleri, otellerden çok daha canlı, sosyal ve modern alanlar sunuyor. Sadece uyumak ve eşyalarınızı bırakmak için geceliğine 150 Euro ödemek yerine, 20-35 Euro bandında temiz bir hostel odasında kalabilirsiniz. Üstelik bu mekanların ortak mutfakları, kendi yemeğinizi pişirerek günlük gıda harcamalarınızı minimize etmenin en kolay yoludur. Airbnb ise artık eskisi kadar ucuz değil; temizlik ve hizmet ücretleri eklendiğinde genellikle bütçe dostu olmaktan çıkıyor.

Rayların Üzerinde Bir Ömür: Interrail Gerçekten Gerekli mi?

Avrupa içi ulaşımda ise klasik bir efsane olan interrail seçeneğini masaya yatırmak gerek. Eğer bir ay boyunca her gün farklı bir ülkeye gitmek gibi son derece yoğun ve dinamik bir rotanız varsa, tren pass biletleri kesinlikle mantıklıdır. Ancak daha esnek ve ağırdan alan bir seyahat planlıyorsanız, Flixbus gibi otobüs firmaları veya RegioJet gibi bölgesel trenler çok daha hesaplıdır. Örneğin, Prag’dan Viyana’ya otobüsle geçmek yaklaşık 4 saat sürer ve bilet fiyatları bazen 12 Euro’ya kadar düşer. Trenle gitmekten sadece bir saat daha uzun sürer ama cebinizde kalan para bir sonraki günün akşam yemeğini karşılar.

Otobüs yolculuklarını gece saatlerine denk getirmek, hem bir gecelik konaklama ücretinden tasarruf etmenizi sağlar hem de gün ışığından tam kapasite yararlanmanıza önayak olur.

Turistik Tuzaklardan Kaçınarak Karın Doyurmak

Gelelim en keyifli ama en hızlı para harcanan konuya: yemek. Turistik meydanlardaki restoranların menülerinde birden fazla dilde çeviri görüyorsanız, oradan koşarak uzaklaşın. Yerel halkın nerede yediğini gözlemleyin. Üniversite yakınlarındaki ara sokaklar, yerel fırınlar ve semt marketleri en büyük dostunuzdur. İtalya’da bir dilim pizza ve içecek için ara sokaktaki bir büfede 4 Euro öderken, ana meydanda aynı öğün için 20 Euro hesap ödeyebilirsiniz. Ayrıca, Avrupa’da birçok şehirde musluk suyu içilebilirdir. Yanınızda taşıyacağınız bir matara ile su masrafını tamamen sıfırlayabilirsiniz. Paris’te her köşe başında göreceğiniz tarihi çeşmelerden su doldurmak, size kendinizi gerçek bir Parisli gibi hissettirecektir.

Kültür Sanata Beleş Giriş: Ücretsiz Müze Günleri

Son olarak, kültürel aktiviteleri ücretsiz veya çok ucuza getirmek mümkün. Paris’teki Louvre Müzesi de dahil olmak üzere birçok dünya çapındaki müze, ayın belirli günlerinde kapılarını ücretsiz açar. Genellikle her ayın ilk pazar günü yapılan bu etkinlikleri önceden araştırmak, size ciddi miktarda Euro tasarrufu sağlayacaktır. Ayrıca neredeyse her büyük Avrupa şehrinde “Free Walking Tour” yani Ücretsiz Yürüyüş Turları düzenlenir. Bu turlar yerel rehberler eşliğinde şehri tanımanın en samimi yoludur. Turun sonunda rehbere vereceğiniz 5-10 Euro bahşiş, resmi acente turlarının çeyrek fiyatına denk gelir ve size şehir hakkında hiçbir rehber kitapta bulamayacağınız lokal tüyolar kazandırır.

Category: Genel | LEAVE A COMMENT
Kasım 7 2025

Elasticsearch ILM ile Disk Tasarrufu: Hot-Warm-Cold-Delete Yapılandırması

DevOps dünyasının en acı verici maliyet kalemlerinden biri, her gün çığ gibi büyüyen log verileridir. Elasticsearch üzerinde koşan log kümelerinin kontrolsüz büyümesi, disk doluluk alarmları ve şişen bulut faturalarıyla sonuçlanır. İşte tam bu noktada, akıllı bir elasticsearch ilm (Index Lifecycle Management) stratejisi kurmak, disk ve donanım maliyetlerinizi kalıcı olarak optimize etmenin en efektif yoludur. Sadece eski verileri silmek bir çözüm değildir; verinin yaşlandıkça daha ucuz kaynaklara taşınması, sıkıştırılması ve segmentlerinin birleştirilmesi gerekir. Bu rehberde, production ortamında doğrudan uygulayabileceğiniz, shrink ve force-merge adımlarıyla desteklenmiş agresif bir hot-warm-cold-delete mimarisini nasıl kuracağınızı inceleyeceğiz.

1. Altyapının Hazırlanması: Node Rollerinin Dağıtımı

ILM mekanizmasının veriyi doğru katmanlar arasında taşıyabilmesi için öncelikle Elasticsearch cluster üyelerinin rollerini net bir şekilde tanımlamalıyız. Eski node.attr.box_type yaklaşımı yerine, modern Elasticsearch mimarisinde (7.x/8.x) yerleşik veri rollerini kullanıyoruz. Node’larınızın elasticsearch.yml dosyalarında şu tanımlamaların yapıldığından emin olun:

Hot Node Konfigürasyonu (Yüksek IOPS NVMe Diskler)

node.roles: [ master, data_hot, ingest ]

Warm Node Konfigürasyonu (Orta Segment SSD / Standart Diskler)

node.roles: [ data_warm ]

Cold Node Konfigürasyonu (Ucuz, Yüksek Kapasiteli HDD / Object Storage)

node.roles: [ data_cold ]

Neden böyle? Yazma (ingest) yükü her zaman CPU ve I/O canavarıdır. Hot node’ları pahalı ve hızlı disklerde tutarken, artık arama sıklığı düşmüş eski verileri barındıran warm ve cold node’larda daha ucuz depolama birimleri kullanarak maliyetleri ciddi oranda dengeliyoruz.

2. Agresif Bir ILM Policy Tanımlama

Şimdi disk tasarrufunu asıl optimize edecek olan ILM policy yapısını kuralım. Senaryomuzda:

  • Hot Fazı: Veri yazılır. Primary shard boyutu 50 GB’a ulaştığında veya 7 gün geçtiğinde rollover tetiklenir.
  • Warm Fazı: Rollover olan veri warm node’lara taşınır. Shard sayısı 1’e düşürülür (shrink) ve segment birleştirmesi (force-merge) yapılarak diskte maksimum sıkıştırma sağlanır.
  • Cold Fazı: Veri cold node’lara taşınır, replica sayısı 0 veya 1’e çekilerek alan kazanılır.
  • Delete Fazı: 90 günün ardından veri cluster’dan tamamen silinir.

Bu akışı tetikleyecek API çağrısını aşağıdaki gibi cluster’a uygulayalım:

curl -X PUT "localhost:9200/_ilm/policy/log_maliyeti_opt_policy" -H 'Content-Type: application/json' -d'
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_primary_shard_size": "50gb",
            "max_age": "7d"
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "0ms",
        "actions": {
          "shrink": {
            "number_of_shards": 1
          },
          "forcemerge": {
            "max_num_segments": 1
          },
          "allocate": {
            "number_of_replicas": 1
          },
          "set_priority": {
            "priority": 50
          }
        }
      },
      "cold": {
        "min_age": "30d",
        "actions": {
          "allocate": {
            "number_of_replicas": 0
          },
          "set_priority": {
            "priority": 0
          }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}'

3. Neden Shrink ve Force Merge?

Burada “Neden böyle yaptık?” sorusunu yanıtlayalım. Birçok DevOps mühendisi sadece rollover ve delete adımlarını kullanır. Ancak asıl disk tasarrufu warm fazındaki iki kritik adımda gizlidir:

  1. Shrink: Hot fazda yazma performansını optimize etmek için muhtemelen 5 primary shard kullandınız. Veri salt okunur (read-only) olduğunda, bu kadar çok shard’a ihtiyacınız kalmaz. Shard sayısını 1’e düşürerek hem Elasticsearch JVM Heap bellek tüketimini azaltırız hem de metadata overhead’ini sıfırlarız.
  2. Force Merge (max_num_segments: 1): Elasticsearch arkada verileri sürekli segmentler halinde yazar. Silinen veya güncellenen dökümanlar fiziksel olarak hemen silinmez, sadece silindi olarak işaretlenir. Force merge operasyonu ile tüm segmentleri tek bir segmente indirgeriz. Bu işlem, silinmiş tüm verileri diskten fiziksel olarak kazır ve sıkıştırma algoritmasının (LZ4/DEFLATE) maksimum verimle çalışmasını sağlayarak ortalama %20 ila %40 arasında anlık disk tasarrufu sağlar.

4. Index Template ve Bootstrap Oluşturma

ILM politikasının otomatik olarak yeni index’lere uygulanabilmesi için bir index template tanımlamamız gerekiyor. Burada önemli olan nokta, verilerin yazılacağı ilk “bootstrap” index’ini elle oluşturup alias’ı bağlamaktır.

Index Template Tanımlanması

curl -X PUT "localhost:9200/_index_template/log_template" -H 'Content-Type: application/json' -d'
{
  "index_patterns": ["app-logs-*"],
  "template": {
    "settings": {
      "index.lifecycle.name": "log_maliyeti_opt_policy",
      "index.lifecycle.rollover_alias": "app-logs",
      "index.number_of_shards": 3,
      "index.number_of_replicas": 1,
      "index.routing.allocation.include._tier_preference": "data_hot"
    }
  }
}'

Burada index.routing.allocation.include._tier_preference: "data_hot" satırı çok kritiktir. Yeni oluşturulan tüm index’lerin öncelikli olarak hot node’lara yazılmasını garanti altına alır.

İlk Bootstrap Index’inin Tetiklenmesi

Rollover mekanizmasının çalışabilmesi için alias’ın işaret ettiği fiziksel bir index’in bulunması şarttır. İlk index’i write_index olarak tanımlayarak döngüyü başlatıyoruz:

curl -X PUT "localhost:9200/%3Capp-logs-%7Bnow%2Fd%7D-000001%3E" -H 'Content-Type: application/json' -d'
{
  "aliases": {
    "app-logs": {
      "is_write_index": true
    }
  }
}'

Artık uygulamanız logları doğrudan app-logs alias’ına yazabilir. Elasticsearch, arka planda ILM kurallarını işleterek index boyutlarını izleyecek ve eşikler aşıldığında rollover yaparak süreci warm katmanına devredecektir.

5. SRE Gözünden Production Sorunları ve Çözümler

Production ortamlarında bu yapıyı koştururken karşınıza çıkabilecek bazı tipik tıkanma noktaları ve bunları aşma yöntemleri şunlardır:

Shrink Operasyonunun Askıda Kalması

Bir index’in shrink edilebilmesi için, o index’e ait tüm primary shard kopyalarının cluster içinde tek bir node üzerine toplanması gerekir. Eğer cluster’ınızda disk doluluğu nedeniyle allocation engelleri varsa, shrink işlemi AWAITING_REALLOCATION durumunda takılır.

Çözüm: Warm node’larınızda tek bir node’un index’in tamamını (örneğin 150 GB) tek başına barındırabilecek kadar boş disk alanına sahip olduğundan emin olun. Gerekirse geçici olarak disk limit sınırlarını (watermark) esnetin:

curl -X PUT "localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "95%"
  }
}'

Force Merge Sırasında IOPS Tavan Yapması

Force merge işlemi, diski yoğun şekilde okuyup yazan (I/O intensive) ağır bir operasyondur. Aynı anda onlarca index warm faza geçip force merge olmaya başlarsa cluster yanıt veremez hale gelebilir.

Çözüm: ILM policy’nizdeki rollover tetikleyicilerini zamansal olarak yaymaya çalışın (örneğin tüm servislerin rollover’ını aynı gece saatinde tetiklemeyin, boyut bazlı rollover tercih edin) ve force merge limitlerini sınırlandırın.

Özet

Bu makalede kurguladığımız hot-warm-cold-delete yapısı sayesinde, aktif yazılan taze log verilerinizi yüksek performanslı disklerde tutarken, geriye dönük analizler için sakladığınız eski verileri minimum kaynak tüketecek şekilde optimize ettik. Shrink ile heap bellek ayak izini düşürdük, force-merge ile diskteki boşlukları temizledik ve soğuk katmanda replikaları azaltarak donanım maliyetlerimizi kalıcı olarak aşağı çektik. Bu kurgu, doğru uygulandığında Elasticsearch log altyapınızın sürdürülebilirliğini katbekat artıracaktır.

Category: Genel | LEAVE A COMMENT
Ocak 10 2025

Grafana Tempo ile Distributed Tracing: Mikroservislerde Samanyolu Rehberi

Selamlar kertenkerem.net okurları! Monolitik uygulamaların gözünü seveyim dediğiniz o günleri hatırlıyor musunuz? Hani tek bir log dosyasına tail -f atıp, hata anında tüm akışı tereyağından kıl çeker gibi süzdüğümüz o konforlu günleri… Ne yazık ki o günler geride kaldı. Modern yazılım dünyasında artık baş tacımız microservices mimarisi. Ancak bu mimarinin beraberinde getirdiği en büyük baş ağrısı, bir isteğin (request) sistem içinde kaybolup gitmesi. İşte tam bu noktada, grafana ekosisteminin parlayan yıldızı tempo ve endüstri standardı haline gelen opentelemetry ikilisi devreye giriyor. Bu yazıda, maliyet dostu ve yüksek performanslı tracing dünyasına adım atacağız.

Neden Grafana Tempo? Elasticsearch’ün Gözü Yaşlı

Piyasada Jaeger veya Zipkin gibi rüştünü ispatlamış tracing çözümleri zaten var. Peki neden Tempo? Cevap basit: Maliyet ve Operasyonel Kolaylık.

Geleneksel tracing araçları, trace verilerini hızlıca arayabilmek için Elasticsearch, Cassandra veya Jaeger-ingester gibi devasa ve yönetimi zor veritabanlarına ihtiyaç duyar. Bu da prod ortamında ciddi bir disk ve RAM maliyeti demektir. Tempo ise ezber bozan bir felsefeyle geldi: “Ben trace index’lemiyorum.”

Tempo, trace verilerini doğrudan S3, GCS veya Azure Blob Storage gibi ucuz object storage çözümlerinde saklar. “Peki index yoksa trace’leri nasıl bulacağız?” dediğinizi duyar gibiyim. Tempo, keşif (discover) sürecini loglara ve metriklere devreder. Siz loglarınızda (örneğin Grafana Loki üzerinde) bir trace_id bulursunuz, bu ID’yi Tempo’ya sorarsınız ve Tempo nesne depolama alanından ilgili trace objesini saniyeler içinde çeker. Index yok, devasa Elasticsearch cluster yönetme derdi yok, sadece saf Trace ID araması var!

Büyük Resim: Distributed Tracing Mimarisi Nasıl Çalışır?

Kuruluma geçmeden önce mimariyi kafamızda netleştirelim. Uygulamamızdan çıkan trace verileri doğrudan Tempo’ya gidebileceği gibi, en doğru pratik araya bir ajan (collector) koymaktır.

[Uygulama (OpenTelemetry SDK)] 
       │ (gRPC / HTTP - OTLP)
       ▼
[OpenTelemetry Collector] 
       │ (Batching, Filtering)
       ▼
[Grafana Tempo] ───> [Object Storage (S3 / Local Disk)]
       ▲
       │ (Query via Trace ID)
[Grafana Explore]

Adım 1: Oyun Alanını Kuralım (Docker Compose)

Lokalinizde bu mimariyi ayağa kaldırmak için minimal bir Docker Compose dosyası hazırlayalım. Bu setup içerisinde Tempo, OpenTelemetry Collector ve görselleştirme için Grafana yer alıyor.

Öncelikle projenizin kök dizininde docker-compose.yml dosyasını oluşturalım:

version: '3.8'

services:
  # 1. Grafana Tempo (Trace Deposu)
  tempo:
    image: grafana/tempo:latest
    command: [ "-config.file=/etc/tempo.yaml" ]
    volumes:
      - ./tempo-config.yaml:/etc/tempo.yaml
      - ./tempo-data:/var/tempo
    ports:
      - "3200:3200"   # Tempo API
      - "4317:4317"   # OTLP gRPC portu

  # 2. OpenTelemetry Collector (Trafik Polisi)
  otel-collector:
    image: otel/opentelemetry-collector-contrib:latest
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    ports:
      - "4318:4318"   # OTLP HTTP portu
    depends_on:
      - tempo

  # 3. Grafana (Görselleştirme)
  grafana:
    image: grafana/grafana:latest
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
    ports:
      - "3000:3000"
    depends_on:
      - tempo

Şimdi de Tempo’nun local diskte çalışabilmesi için basit bir konfigürasyon dosyası olan tempo-config.yaml dosyasını tanımlayalım:

stream_over_http: true
server:
  http_listen_port: 3200

distributor:
  receivers:
    otlp:
      protocols:
        grpc:
          endpoint: 0.0.0.0:4317
        http:
          endpoint: 0.0.0.0:4318

ingester:
  max_block_duration: 5m

storage:
  trace:
    backend: local
    local:
      path: /var/tempo/wal
    wal:
      path: /var/tempo/wal

compactor:
  compaction:
    block_Retention: 24h

Son olarak OpenTelemetry Collector’ın gelen trace’leri alıp Tempo’ya yönlendirmesini sağlayacak otel-collector-config.yaml dosyasını hazırlayalım:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:

exporters:
  otlp:
    endpoint: tempo:4317
    tls:
      insecure: true

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp]

Adım 2: Uygulama Enstrümantasyonu (Go ile OpenTelemetry SDK)

Sıra geldi en heyecanlı kısma. Uygulamamızın içinden nasıl trace üreteceğiz? Bu örnekte Go dilini kullanacağız, ancak mantık Java, Node.js veya Python’da da tamamen aynıdır. Uygulamanın amacı, bir HTTP isteği aldığında arka planda “db-query” adında sanal bir alt işlem (span) başlatıp bunu trace etmektir.

İşte main.go içeriğimiz:

package main

import (
	"context"
	"log"
	"net/http"
	"time"

	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
	"go.opentelemetry.io/otel/sdk/resource"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
	"go.opentelemetry.io/otel/trace"
	"google.golang.org/grpc"
)

const (
	serviceName = "kertenkerem-order-service"
	collectorURL = "localhost:4317"
)

func initTracer() (*sdktrace.TracerProvider, error) {
	ctx := context.Background()

	// OTLP gRPC exporter kurulumu (OTel Collector'a göndermek için)
	exporter, err := otlptracegrpc.New(ctx,
		otlptracegrpc.WithInsecure(),
		otlptracegrpc.WithEndpoint(collectorURL),
		otlptracegrpc.WithDialOption(grpc.WithBlock()),
	)
	if err != nil {
		return nil, err
	}

	resources, err := resource.New(ctx,
		resource.WithAttributes(
			semconv.ServiceNameKey.String(serviceName),
		),
	)
	if err != nil {
		return nil, err
	}

	tp := sdktrace.NewTracerProvider(
		sdktrace.WithSampler(sdktrace.AlwaysSample()), // Prod ortamında oran düşürülmeli!
		sdktrace.WithBatcher(exporter),
		sdktrace.WithResource(resources),
	)
	otel.SetTracerProvider(tp)
	return tp, nil
}

func main() {
	tp, err := initTracer()
	if err != nil {
		log.Fatalf("Tracer başlatılamadı: %v", err)
	}
	defer func() {
		if err := tp.Shutdown(context.Background()); err != nil {
			log.Printf("Tracer kapatılırken hata oluştu: %v", err)
		}
	}()

	tracer := otel.Tracer("http-server")

	http.HandleFunc("/order", func(w http.ResponseWriter, r *http.Request) {
		// Parent span başlatılıyor
		ctx, span := tracer.Start(r.Context(), "ReceiveOrderRequest")
		defer span.End()

		// DB sorgusunu simüle eden alt span (child span)
		queryDatabase(ctx, tracer)

		w.Write([]byte("Sipariş başarıyla alındı!"))
	})

	log.Println("Server 8080 portunda çalışıyor...")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

func queryDatabase(ctx context.Context, tracer trace.Tracer) {
	_, span := tracer.Start(ctx, "QueryDatabaseSpan")
	defer span.End()

	// Veritabanı gecikmesini simüle edelim
	time.Sleep(150 * time.Millisecond)
}

Bu kodu çalıştırmadan önce docker-compose servislerinizi ayağa kaldırın:

docker-compose up -d

Ardından Go uygulamanızı çalıştırın ve curl ile birkaç istek göndererek trace üretin:

go run main.go
# Başka bir terminalden istek atın:
curl http://localhost:8080/order

Adım 3: Grafana Explore Üzerinde Trace Görselleştirme

Trace verilerimizi ürettik, Collector bunu aldı ve Tempo’ya başarıyla iletti. Şimdi bu verileri görselleştirme zamanı.

  1. Tarayıcınızdan http://localhost:3000 adresine giderek Grafana’ya giriş yapın.
  2. Sol menüden Connections -> Data Sources sekmesine gidin.
  3. Add data source butonuna tıklayın ve listeden Tempo‘yu seçin.
  4. URL kısmına http://tempo:3200 yazın. Başka hiçbir ayara dokunmadan sayfanın altındaki Save & Test butonuna basın. “Data source is working” onayını görmelisiniz.
  5. Sol menüden Explore sekmesine geçin ve veri kaynağı olarak üst kısımdan oluşturduğunuz Tempo’yu seçin.

Trace ID ile Sorgulama Yapmak

Eğer uygulamanızın loglarında basılan bir Trace ID varsa, bunu doğrudan arama çubuğuna yazıp aratabilirsiniz. Ancak şu an elimizde ID yoksa ne yapacağız? Tempo veri kaynağında “Search” sekmesini kullanarak sistemdeki son trace’leri listeleyebilirsiniz.

Listeden bir trace seçtiğinizde, sağ tarafta harika bir şelale grafiği (waterfall chart) belirecektir. Bu grafikte ReceiveOrderRequest işleminin toplamda ne kadar sürdüğünü ve alt işlemi olan QueryDatabaseSpan‘ın 150ms boyunca sistemi nasıl beklettiğini milisaniye hassasiyetinde görebilirsiniz.

DevOps Pratikleri: Prod Ortamında Dikkat Edilmesi Gerekenler

Distributed tracing kurmak kolaydır, ancak onu prod ortamında ayakta tutmak tecrübe ister. İşte kulağınıza küpe olması gereken birkaç kıdemli DevOps tavsiyesi:

  • Sampling (Örnekleme) Oranını İyi Ayarlayın: Kodumuzda AlwaysSample() kullandık. Bu, gelen her isteğin kaydedilmesi demektir. Saniyede 5000 istek alan bir prod ortamında bunu yaparsanız diskleri elinize alırsınız. Prod ortamında bu oranı %1 ile %5 arasına çekmelisiniz. Ya da tail-based sampling kullanarak sadece hata alan (5xx status code dönen) trace’leri kaydetmesini Collector seviyesinde yapılandırabilirsiniz.
  • Context Propagation’ı Unutmayın: Mikroservisler birbirini HTTP ya da gRPC ile ararken Trace ID bilgisini header’da taşımalıdır (W3C Trace Context standardı). Go tarafında otel.SetTextMapPropagator kullanarak bu akışın kesilmemesini sağlayın.
  • Logs-to-Traces Bağlantısı: Loki ve Tempo’yu birbirine bağlayın. Grafana’da log satırındaki Trace ID’ye tıklandığında doğrudan yan panelde Tempo trace grafiğinin açılması, operasyon ekibinizin hata çözme süresini (MTTR) saatlerden saniyelere indirecektir.

Mikroservis mimarisindeki karanlık noktaları aydınlatmak işte bu kadar kolay! Tempo ile hem bütçenizi koruyun hem de observability dünyasının nimetlerinden faydalanın. Bir sonraki teknik yazıda görüşmek üzere, sistemleriniz ayakta, gecikmeleriniz (latency) düşük olsun!

Category: Genel | LEAVE A COMMENT
Aralık 27 2024

30 Dakikada Ev Yapımı Ramen: Paketten İyi Tarif

Dışarıda saatlerce kaynatılmış kemik sularıyla yapılan o derin lezzetli ramen kasesini hepimiz çok seviyoruz. Ancak evde canımız çektiğinde mutfakta 12 saat harcamak istemiyoruz. İşte tam da bu anlar için, kedi maması kokulu hazır paketleri çöpe attıracak, hazırlaması son derece kolay ve pratik bir ev yapımı ramen tarifi ile karşınızdayız. Bu yemek, yoğun bir günün ardından kendinizi şımartmanın en kestirme ve en sıcak yolu olacak.

Porsiyon: 2 Kişilik
Hazırlık Süresi: 10 Dakika
Pişirme Süresi: 20 Dakika

Neden Paketten Daha İyi?

Süpermarketlerde satılan hazır ramen paketleri pratik görünse de içlerindeki sodyum ve koruyucu miktarı korkutucu boyutta. Üstelik o paketlerden çıkan yapay aroma tozları asla gerçek bir çorba derinliği sunmuyor. Bu tarifte, taze sarımsak ve zencefili susam yağında hafifçe soteleyerek kendi hızlı broth (çorba suyu) bazımızı oluşturuyoruz. Bu sayede hem taze hem de derinliği olan bir lezzet elde ediyoruz. Yani hem hızlı hem de ne yediğinizi biliyorsunuz!

Malzemeler

Ramen esnektir. Evde ne varsa ona göre şekil alabilir. İşte bizim önerdiğimiz temel liste ve pratik alternatifleri:

  • Ramen Eriştesi: 2 paket (Bulamazsanız düz noodle, hatta ince spagetti bile olur.)
  • Tavuk Suyu: 4 su bardağı (Gerçek tavuk suyu lezzeti katlar ama organik bulyon da iş görür.)
  • Sarımsak: 2 diş (Ezilmiş)
  • Taze Zencefil: 1 başparmak büyüklüğünde (İnce dilimlenmiş veya rendelenmiş)
  • Soya Sosu: 3 yemek kaşığı (Tuz oranını ayarlayan ana unsurumuz)
  • Susam Yağı: 1 yemek kaşığı (Asya mutfağının o karakteristik kokusunu veren gizli kahraman)
  • Toppings (Üzeri için): 2 adet yumurta, ince kıyılmış taze soğan, sotelenmiş mantar ve isteğe göre haşlanmış tavuk dilimleri.

Adım Adım Ev Yapımı Ramen

Karmaşık mutfak jargonlarını bir kenara bırakalım. Adımları sırayla takip ettiğinizde yarım saat içinde masada dumanı tüten bir kase olacak.

  1. Sihirli Suyu Hazırlayın (Broth): Derin bir tencerede susam yağını ısıtın. Sarımsak ve zencefili ekleyip kokusu çıkana kadar yaklaşık 1 dakika soteleyin. Üzerine tavuk suyunu ve soya sosunu ekleyin. Kaynama noktasına geldikten sonra altını kısıp 15 dakika boyunca tüm aromaların birbirine geçmesi için tıngırdatın.
  2. Mükemmel Yumurtayı Pişirin: Ramen’in olmazsa olmazı içi hafif akışkan yumurtadır. Küçük bir sos tenceresinde suyu kaynatın. Yumurtaları yavaşça suya bırakın ve tam 6 dakika 30 saniye haşlayın. Süre dolar dolmaz yumurtaları buzlu suya alın. Bu işlem pişmeyi durdurur ve soymayı kolaylaştırır.
  3. Erişteleri ve Mantarları Halledin: Ayrı bir tencerede erişteleri paket talimatına göre haşlayın (genelde 3 dakika yeterlidir) ve süzün. Erişteleri doğrudan çorbanın içinde haşlamayın; çünkü nişastaları çorbanın berraklığını bozar. Bu sırada küçük bir tavada mantarları yüksek ateşte az yağla soteleyin.
  4. Kaseleri Birleştirin: Geniş ve derin iki kase alın. Önce haşlanmış erişteleri paylaştırın. Üzerine süzgeç yardımıyla zencefil ve sarımsak tanelerinden arındırdığınız sıcak çorba suyunu dökün.
  5. Görsel Şölen (Toppings): Eriştelerin üzerine sotelenmiş mantarları, tavuk dilimlerini ve ince kıyılmış bolca taze soğanı yerleştirin. En son, ortadan ikiye kestiğiniz o mükemmel kayısı kıvamındaki yumurtaları yerleştirerek servis yapın.

Püf Noktası

Ramen yerken çorbanın sıcaklığı çok önemlidir. Kaselerinizi birleştirmeden önce, boş kaselerin içine biraz sıcak su koyup bekleterek kaseleri ısıtın. Çorbayı dökmeden hemen önce bu suyu dökün. Böylece soğuk kase, binbir emekle hazırladığınız sıcak çorbanızın ısısını saniyeler içinde düşürmez. Afiyet olsun!

Category: Genel | LEAVE A COMMENT
Aralık 20 2024

Prompt Engineering: ChatGPT’den En İyi Yanıtı Almanın Formülü

Yapay zeka (AI) dünyasında son dönemde en çok duyduğumuz kavramlardan biri şüphesiz prompt engineering (istemi mühendisliği). Birçoğumuz ChatGPT ya da diğer LLM (büyük dil modeli) araçlarının karşısına geçip sanki Google’da arama yaparmış gibi tek cümlelik sorular soruyoruz. Sonuç? Genellikle ruhsuz, ansiklopedik ve tam olarak işimize yaramayan yanıtlar. Peki, bu araçlardan maksimum verimlilik elde etmek gerçekten mümkün mü? Evet, ama bunun yolu yapay zekaya nasıl hitap edeceğimizi bilmekten geçiyor. Bu yazıda, “goygoy” yapmadan, bizzat test ettiğim ve çalışan pratik formülleri paylaşıyorum.

Prompt Engineering Nedir ve Neden Önemlidir?

Kısaca açıklayalım: Prompt engineering, yapay zekaya neyi, nasıl yapacağını doğru kelimelerle anlatma sanatıdır. LLM’ler (Large Language Models) aslında birer sihirbaz değil, gelişmiş birer kelime tahmin motorudur. Siz bir kelime yazarsınız, o da arkasından gelebilecek en mantıklı kelimeyi matematiksel olarak hesaplar.

Eğer yapay zekaya “Bana bir e-posta yaz” derseniz, internetteki milyonlarca ortalama e-postadan bir karma sunar. Ama ona bağlam, rol ve format verirseniz, tam olarak sizin kaleminizden çıkmış gibi duran bir metin elde edersiniz. Yani mesele “akıllıca sormak”.

Sihirli Formüller: En İyi Teknikleri Test Ediyoruz

Lafı uzatmayalım ve doğrudan test edip onayladığım, günlük işlerinizi kolaylaştıracak üç temel tekniğe bakalım.

1. Rol Atama (Persona Prompting)

Yapay zekanın en sevdiği şey bir role bürünmektir. Ona kim olduğunu söylemezseniz, her konuda yarım yamalak fikri olan bir lise öğrencisi gibi davranır. Ona bir uzmanlık yükleyin.

Kötü Prompt: “Yeni mobil uygulamam için pazarlama fikirleri ver.”

İyi Prompt:

Sen, bütçesi kısıtlı startup'lar konusunda uzmanlaşmış, 10 yıllık kıdemli bir büyüme pazarlamacısı (growth marketer) gibisin. 
Senden yeni geliştirdiğimiz meditasyon uygulaması için 3 adet yaratıcı ve sıfır bütçeli büyüme stratejisi üretmeni istiyorum. 
Format: Başlık, Uygulama Adımları ve Beklenen Sonuç şeklinde olsun.

Bu şekilde sorduğunuzda ChatGPT, genel pazarlama klişelerini bir kenara bırakıp doğrudan hedef odaklı gerilla pazarlama taktiklerine odaklanacaktır.

2. Örneklerle Eğitme (Few-Shot Prompting)

Yapay zekanın sizin tarzınızı anlamasını istiyorsanız, ona “ne istediğinizi” tarif etmek yerine “nasıl yapıldığını” gösterin. Buna literatürde Few-Shot Prompting denir. Hiç örnek vermezseniz buna da Zero-Shot deniyor ki, genellikle hüsranla sonuçlanır.

Örnek Prompt Şablonu:

Girdi: Kitap okuma alışkanlığı kazanmak.
Çıktı: Sayfalar arasında kaybolmak, her gün kendinize yapacağınız en entelektüel yatırımdır.

Girdi: Erken uyanmak.
Çıktı: Güneşten önce uyananlar, günün ritmini kendi belirler.

Girdi: Sağlıklı beslenmek.
Çıktı: [Lütfen bu formata göre doldur]

Bu yöntemi kullandığınızda, modelin çıktıyı tamamen sizin istediğiniz edebi tonda yazdığını göreceksiniz.

[Görsel: Few-shot prompting tekniği kullanılarak elde edilen özel tonlama ve standart bir prompt ile alınan sıradan yanıtın yan yana ekran görüntüsü karşılaştırması]

3. Adım Adım Düşündürme (Chain-of-Thought)

Özellikle matematik, mantık veya karmaşık analiz gerektiren konularda yapay zeka aceleci davranıp saçmalayabilir (buna halisünasyon diyoruz). Onu yavaşlatın. Promptun sonuna ekleyeceğiniz sihirli bir cümle her şeyi değiştirir: “Adım adım düşünelim.”

Bu cümle, LLM’nin cevabı üretirken ara adımları da hesaplamasını sağlar ve hata payını neredeyse sıfıra indirir.

Hangi Görev İçin Hangi LLM Modelini Seçmeli?

Her iş için aynı aracı kullanmak, her vidayı çekiçle çakmaya çalışmaya benzer. Güncel modellerin güçlü oldukları alanlar farklıdır:

  • Yaratıcı Yazarlık ve Türkçe Esneklik: Claude 3.5 Sonnet şu an Türkçe nüansları anlama ve doğal yazma konusunda ChatGPT’den bir tık önde.
  • Kodlama ve Teknik Analiz: GPT-4o ve Claude 3.5 Sonnet başa baş yarışıyor ancak GPT-4o’nun veri analiz aracı (Advanced Data Analysis) hala rakipsiz.
  • Hızlı ve Güncel Bilgi Tarama: Perplexity AI veya Google Gemini, güncel web aramaları konusunda standart ChatGPT’den daha verimli sonuçlar sunuyor.

Prompt Tekniklerinin Karşılaştırması

Aşağıdaki tabloda, denediğimiz tekniklerin pratik hayattaki artı ve eksilerini derledim:

Teknik En İyi Kullanım Alanı Artıları Eksileri
Rol Atama İçerik üretimi, mentorluk Tonu ve bakış açısını anında özelleştirir. Bazen çok klişe “uzman” dili kullanabilir.
Few-Shot (Örnekleme) Veri formatlama, marka dili oluşturma Tam olarak istediğiniz şablonu ve üslubu verir. Prompt uzunluğunu (token tüketimini) artırır.
Chain-of-Thought Mantık, matematik, kod analizi Hataları ve mantık dışı uydurmaları engeller. Yapay zekanın daha uzun ve bazen sıkıcı yazmasına neden olur.

Fiyatlar ve Ücretsiz Alternatifler

Bu işi profesyonel boyuta taşımak istiyorsanız cebinizden biraz para çıkması gerekiyor. Ancak ücretsiz yollar da yok değil.

  • Ücretli Seçenekler: ChatGPT Plus ve Claude Pro aylık $20 + KDV civarında bir abonelik ücretine sahip. Eğer günde 2-3 saatten fazla yapay zekayla çalışıyorsanız bu parayı kesinlikle hak ediyorlar.
  • Ücretsiz Alternatifler:
    • ChatGPT Free: GPT-4o mini modelini ücretsiz sunuyor, günlük basit işler için fazlasıyla yeterli.
    • Microsoft Copilot: Arka planda ücretsiz olarak GPT-4 modelini kullanıyor ve internet erişimi var.
    • Hugging Face Chat: Llama 3 gibi en güçlü açık kaynaklı (open-source) modelleri tamamen ücretsiz deneyebileceğiniz harika bir platform.

Son Söz: Denemekten Korkmayın

Prompt engineering bir programlama dili değil, bir uzlaşma sanatıdır. Karşınızda dünyanın en geniş kütüphanesine sahip ama ne yapacağını bilemeyen bir stajyer olduğunu hayal edin. Ona ne kadar net yönergeler verirseniz, o kadar iyi bir asistan kazanmış olursunuz. Klavyenizin başına geçin, yukarıdaki şablonları kopyalayıp kendi işinize uyarlayın ve aradaki farkı kendiniz görün!

Category: Genel | LEAVE A COMMENT
Aralık 20 2024

Prompt Engineering: ChatGPT’den En İyi Yanıtı Almanın Formülü

Yapay zeka hayatımıza girdiğinden beri hepimiz birer “yapay zeka fısıldayıcısı” olduk. Ancak chatgpt ekranının karşısına geçip “Bana bir diyet listesi yaz” veya “Şu e-postayı profesyonelce yanıtla” dediğimizde aldığımız yanıtlar genellikle can sıkıcı derecede genel ve ruhsuz oluyor. İşte tam bu noktada, ai dünyasından maksimum verimlilik elde etmemizi sağlayan sihirli değnek devreye giriyor: prompt engineering. Peki ama bu kavram sadece yapay zeka gurularına özel bir teknik mi, yoksa günlük işlerimizi kolaylaştıracak pratik bir formülü var mı? Lafı uzatmadan, kendi deneyimlerimizle test ettiğimiz yöntemleri masaya yatıralım.

Neden Doğrudan Sormak Yetmiyor? (İşin Arkasındaki Mantık)

Bir llm (Büyük Dil Modeli), sizin ne düşündüğünüzü veya şirketinizin kültürünü tahmin edemez. O, özünde devasa bir “sonraki kelime tahmin motorudur”. Ona ne kadar çok bağlam (context) ve sınır verirseniz, olasılık havuzunu o kadar daraltır ve tam hedefi vuran bir yanıt üretir. Yani kötü yanıt aldığınızda suç yapay zekada değil, büyük ihtimalle ona verdiğiniz eksik talimatlardadır.

[Görsel: Sıradan ve yüzeysel bir prompt ile detaylı yapılandırılmış bir promptun ürettiği sonuçların yan yana karşılaştırması]

En Etkili 3 Prompt Engineering Tekniği ve Test Sonuçlarımız

1. Rol Atama (Role Prompting)

Yapay zekaya bir kimlik kazandırmak, alacağınız yanıtın tonunu ve derinliğini tamamen değiştirir. Sadece “Sosyal medya için başlık yaz” demek yerine, ona bir rol verin.

Denediğimiz Şablon:

"Sen 10 yıllık kıdemli bir dijital pazarlama uzmanısın. Hedef kitlen teknolojiye meraklı genç profesyoneller. Yeni bir üretkenlik uygulaması için merak uyandıran 3 farklı Instagram başlığı yaz."

Neden işe yarıyor?: Yapay zeka, “dijital pazarlama uzmanı” rolünü üstlendiğinde sıradan kelimeleri eliyor ve hedef kitleye uygun, sektörel jargona hakim bir dil kullanıyor.

2. Few-Shot Prompting (Örnekleme)

Modelin nasıl bir çıktı üretmesini istediğinizi anlatmakta zorlanıyorsanız, ona birkaç örnek gösterin. Bu teknik, özellikle veri formatlama veya belirli bir üslubu yakalama konusunda hayat kurtarır.

Denediğimiz Şablon:

Müşteri yorumlarını analiz etmeni istiyorum.
Örnek 1: "Kargo çok hızlı geldi, ürün harika." -> [Durum: Olumlu, Kategori: Lojistik]
Örnek 2: "Arayüzü hiç beğenmedim, çok karışık." -> [Durum: Olumsuz, Kategori: UX/Tasarım]
Şimdi bu yorumu analiz et: "Ödeme adımında sürekli hata alıyorum, kartımı kabul etmedi." ->

Neden işe yarıyor?: Yapay zeka kuralları tahmin etmek yerine verdiğiniz şablonu doğrudan kopyalar. Sonuç sıfır hata!

3. Chain-of-Thought (Düşünce Zinciri)

Eğer mantık yürütme, matematik veya karmaşık kodlama gerektiren bir iş yapıyorsanız, yapay zekaya doğrudan cevabı sormayın. Ondan “adım adım düşünmesini” isteyin.

Denediğimiz Şablon:

"Şirketimiz bu ay %15 büyüdü. Geçen ayki gelirimiz 120.000 TL ise, bu ayki net kârımızı bulmak için önce yeni geliri hesapla, ardından %20 vergi oranını düşerek adım adım açıkla."

Neden işe yarıyor?: LLM’ler işlem sırasını atladıklarında saçmalayabilirler (buna halüsinasyon diyoruz). Adım adım gitmesini söylediğinizde, kendi yaptığı hataları işlem sırasında fark edip düzeltir.

Hangi Görev İçin Hangi Modeli Seçmeli?

Her iş için aynı modeli kullanmak, her çiviyi aynı çekiçle çakmaya çalışmaya benzer. İşte sahada yaptığımız testlere göre en iyi modeller:

  • Yaratıcı Yazarlık ve Metin Tonlama: Claude 3.5 Sonnet. Türkçe dil hakimiyeti ve insan benzeri yazım tonu konusunda şu an ChatGPT’nin bir adım önünde.
  • Hızlı Bilgi Arama ve Kod Yazma: GPT-4o. Hızı ve mantıksal problem çözme yeteneği inanılmaz düzeyde.
  • Büyük Doküman Analizi: Google Gemini 1.5 Pro. Dev devasa bağlam penceresi sayesinde yüzlerce sayfalık PDF’leri tek seferde yutup analiz edebiliyor.

Prompt Engineering Artı ve Eksi Analizi

Avantajları (Artılar) Zorlukları (Eksiler)
Yapay zekadan alınan yanıtların kalitesini %80’e kadar artırır. Doğru promptu yazmak ilk başta zaman alır ve deneme-yanılma gerektirir.
Tekrar eden işleri (raporlama, formatlama) tamamen otomatize eder. Modeller güncellendikçe bazen aynı prompt farklı sonuçlar verebilir.
Halüsinasyon (uydurma bilgi) oranını minimuma indirir. Uzun promptlar, API kullanımında daha fazla token tüketimi (maliyet) demektir.

Maliyetler ve Ücretsiz Alternatifler

Prompt engineering yeteneğinizi geliştirmek tamamen ücretsizdir. Bu bir yazılım değil, bir düşünme biçimidir. Ancak bu teknikleri uygulayabileceğiniz platformların maliyet durumları şöyle:

  • Ücretli Seçenekler: ChatGPT Plus (aylık 20$) veya Claude Pro (aylık 20$). En gelişmiş modellere (GPT-4o, Claude 3.5 Sonnet) sınırsız erişim sağlarlar.
  • Ücretsiz Alternatifler:
    • ChatGPT Free: GPT-4o mini modelini ücretsiz sunar. Günlük basit işler ve prompt denemeleri için fazlasıyla yeterli.
    • Microsoft Copilot: Arka planda ücretsiz GPT-4 kullanır ve güncel internet erişimi vardır.
    • Hugging Face & LM Studio: Bilgisayarınızın gücü yetiyorsa, Llama 3 gibi açık kaynaklı modelleri tamamen ücretsiz ve internetsiz olarak lokalde çalıştırabilirsiniz.

Son Söz: Denemekten Korkmayın

Prompt engineering gözünüzü korkutmasın. Yapay zeka ile konuşurken karşınızda stajyer bir üniversite öğrencisi varmış gibi hayal edin. Ona görevi ne kadar net anlatır, ne kadar çok örnek gösterir ve sınırları ne kadar iyi çizerseniz, akşam masanıza gelecek olan rapor o kadar kusursuz olur. Şimdi ChatGPT ekranını açın ve ilk rol tanımlamanızı yaparak farkı kendi gözlerinizle görün!

Category: Genel | LEAVE A COMMENT
Aralık 13 2024

Kendi Lokalinizde LLM Çalıştırmak: Ollama Kurulum Rehberi

Verilerimizin internette uçuştuğu, yazdığımız her satırın ve gönderdiğimiz her prompt’un bir yerlerde sunuculara kaydedildiği bu dönemde, veri gizliliği yani privacy meselesi her zamankinden daha kritik bir hale geldi. Peki, OpenAI veya Anthropic gibi devlere mahkum olmadan, tamamen kendi bilgisayarınızda çalışan bir yapay zeka kurmak mümkün mü? Cevap kesinlikle evet. Ollama sayesinde, internet bağlantısına bile ihtiyaç duymadan local llm dünyasına adım atabilir; bilgisayarınızda llama, mistral ve Phi-3 gibi devasa açık kaynaklı modelleri koşturabilirsiniz. Bu yazıda, “Benim bilgisayarım bunu kaldırır mı?” korkusunu bir kenara bırakıp, adım adım kendi yapay zekamızı nasıl kuracağımızı test edip göreceğiz.

Neden Kendi Bilgisayarımızda LLM Çalıştıralım?

Bulut tabanlı modeller harika iş çıkarıyor, orası kesin. Ancak her sorgu için internete bağımlı olmak, API ücretleri ödemek ve en önemlisi gizli verilerinizi (örneğin şirket içi belgelerinizi veya kişisel günlüklerinizi) üçüncü parti sunuculara göndermek her zaman iyi bir fikir olmayabilir. Local LLM çalıştırmak size tam bir egemenlik verir. Bilgisayarınızın fişini çekseniz bile yapay zekanız çalışmaya devam eder. Üstelik tamamen ücretsizdir ve sansürsüz model kullanma özgürlüğü sunar.

Ollama Nedir ve Nasıl Çalışır?

Eskiden kendi bilgisayarımızda model çalıştırmak tam bir işkenceydi. Python kütüphaneleriyle boğuşur, CUDA sürücü hataları alır, en sonunda bilgisayara format atmak isterdik. Ollama, bu karmaşayı tek bir paketle çözen bir runtime ve model yönetim aracıdır. Docker kullanmaya aşina olanlar için söyleyelim; Ollama, LLM’ler için Docker neyse tam olarak odur. Modeli tek bir komutla indirir, arka planda API sunucusunu başlatır ve sizin için hazır hale getirir.

[Görsel: Mac terminalinde Ollama kurulum adımları ve ilk indirme ekranı]

Adım Adım Ollama Kurulumu

Ollama; macOS ve Linux platformlarında yerel olarak, Windows’ta ise önizleme sürümüyle harika çalışıyor. Biz bu rehberde Mac ve Linux adımlarına odaklanacağız.

macOS Kurulumu

Mac kullanıcıları için süreç oldukça konforlu. Resmi web sitesinden indireceğiniz bir DMG dosyasıyla kurulumu saniyeler içinde tamamlayabilirsiniz. Veya bilgisayarınızda Homebrew kuruluysa terminalden şu komutu vermeniz yeterli:

brew install ollama

Linux Kurulumu

Linux kullanıcıları için de süreç tek bir curl komutundan ibaret. Terminalinizi açın ve aşağıdaki komutu yapıştırın:

curl -fsSL https://ollama.com/install.sh | sh

İlk Modeli Ayaklandırmak

Kurulum bittikten sonra en keyifli kısma geliyoruz: Modeli indirmek ve onunla konuşmak. Ollama kütüphanesinde pek çok model var ancak başlangıç için Meta’nın popüler modeli Llama 3 veya Microsoft’un küçük ama yetenekli modeli Phi-3 harika birer seçenektir.

Terminalinize şu komutu yazın ve arkaya yaslanın:

ollama run llama3

Bu komut, modelin yaklaşık 4.7 GB boyutundaki “8B” (8 milyar parametreli) sürümünü otomatik olarak indirecek ve ardından size bir sohbet satırı açacaktır. Artık kendi bilgisayarınızda çalışan, tamamen offline bir yapay zekanız var!

GPU Olmadan Performans Optimizasyonu (CPU ile Hayatta Kalmak)

Peki ya güçlü bir Nvidia ekran kartınız ya da Apple Silicon (M1/M2/M3) işlemciniz yoksa? Sadece standart bir işlemci (CPU) ve RAM ile bu modelleri çalıştırabilir misiniz? Evet, ama bazı kurallara dikkat ederek.

Modellerin boyutları küçüldükçe, ihtiyaç duydukları donanım gücü de azalır. LLM dünyasında bu durum quantization (kuantizasyon) denilen bir yöntemle çözülür. Büyük modeller matematiksel olarak sıkıştırılır. Örneğin, 8B parametreli bir modeli CPU ile çalıştırmak yerine, Microsoft’un 3.8B parametreli Phi-3 modelini çalıştırmak çok daha mantıklıdır. Phi-3, boyutu küçük olmasına rağmen mantık yürütme konusunda devasa modellerle yarışır seviyededir.

Performans için altın kurallar:

  • En az 16 GB sistem RAM’ine sahip olduğunuzdan emin olun.
  • Eğer model çok yavaş yanıt veriyorsa (saniyede 1-2 kelime), hemen ollama run phi3 komutuyla daha hafif bir modele geçiş yapın.
  • Arka plandaki yüksek RAM tüketen uygulamaları (evet, Chrome sekmelerinden bahsediyorum) kapatın.

Terminalden Sıkılanlara: Open WebUI Entegrasyonu

Terminalde siyah ekrana bakarak yapay zekayla sohbet etmek bir süre sonra sıkıcı gelebilir. Kendinize tıpkı ChatGPT arayüzü gibi şık bir arayüz kurmak istemez misiniz? İşte burada devreye Open WebUI giriyor.

[Görsel: Open WebUI arayüzünde Llama 3 ile Türkçe sohbet örneği]

Eğer bilgisayarınızda Docker kuruluysa, Open WebUI’yi kurmak ve Ollama ile bağlamak tek bir satır komutla mümkün:

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

Bu komutun ardından tarayıcınızdan http://localhost:3000 adresine giderek, kendi bilgisayarınızda çalışan muhteşem bir yapay zeka arayüzüne kavuşabilirsiniz. Buradan geçmiş sohbetlerinizi görebilir, belgelerinizi yükleyip onlar üzerinde analizler yapabilirsiniz.

Model Karşılaştırmaları

Peki hangi modeli ne zaman kullanmalısınız? Sizin için en popüler üç modeli karşılaştırdık:

Model Adı Parametre Boyutu Güçlü Yönleri Zayıf Yönleri
Llama 3 (8B) 8 Milyar Genel kültür, Türkçe dil desteği, yaratıcı yazarlık. RAM tüketimi yüksektir, eski CPU’larda yavaş çalışır.
Mistral (7B) 7 Milyar Kod yazma becerisi, hızlı yanıt süresi, dengeli performans. Bazen karmaşık mantık yürütme adımlarında tökezleyebilir.
Phi-3 (3.8B) 3.8 Milyar Çok hızlıdır, inanılmaz düşük sistem kaynağı tüketir. Uzun metin yazımlarında yaratıcılığı görece düşüktür.

Maliyetler ve Ücretsiz Alternatifler

Ollama tamamen ücretsiz ve açık kaynaklıdır. İndirdiğiniz modeller için hiçbir ücret ödemezsiniz. Tek maliyetiniz, bilgisayarınızın harcayacağı elektrik faturası olacaktır.

Eğer Ollama’ya alternatif daha görsel bir araç arıyorsanız, LM Studio harika bir seçenektir. LM Studio da tamamen ücretsizdir (kapalı kaynak kodlu olsa da) ve arayüzü üzerinden tek tıkla Hugging Face üzerindeki binlerce modeli indirip test etmenize olanak tanır.

Sonuç: Gelecek Bizim Disklerde

Kendi bilgisayarınızda bir LLM çalıştırmak sadece teknik bir fantezi değil; aynı zamanda veri egemenliğinizi geri kazanma hareketidir. Ollama bize gösteriyor ki, çok da uzak olmayan bir gelecekte her birimizin kişisel asistanı tamamen kendi cihazlarımızda, internete bile ihtiyaç duymadan çalışacak. Siz de bugün ufak bir adım atın, terminalinizi açın ve bu benzersiz deneyimi kendi lokalinizde test edin!

Category: Genel | LEAVE A COMMENT