Ceph Storage Notlarım {3/5}

Merhaba, bir önceki yazımda Ceph storage cluster kurulumu yapıp ardından daemon konfigürasyonları yapmıştık. Bugünkü yazımızda da konfigürasyonlara devam edeceğiz ve sık kullandığım komutları paylaşacağım. Bi önceki yazıya buradan ulaşabilirsiniz.

MON Konfigürasyonları

Ceph monitörleri (MON’lar), istemcilerin MON ve OSD nodelarını bulmak için kullanılan cluster haritasını saklar ve sürdürür. Ceph istemcileri, herhangi bir veriyi OSD’lere okumadan veya yazmadan önce cluster haritasını almak için bir MON’a bağlanmalıdır. Bu nedenle, cluster MON’larının uygun şekilde yapılandırılması kritik öneme sahiptir.

MON’ların her biri aşağıdaki rollerden birine sahip olur. Bu yapılandırma ile kendi içindeki yönetimi yapar diyebiliriz.

Leader: Cluster haritasının en son sürümünü alan MON.
Provider: Cluster haritasının en son sürümüne sahip olan ancak leader olmayan MON.
Requester: Cluster haritasının en son sürümüne sahip olmayan ve quorum a yeniden katılabilmesi için bir provider ile eşitlenmesi gereken MON.

  • MON Quorum statüsüne aşağıdaki iki komuttan birini tercih ederek bakabiliriz.
$ ceph mon stat
$ ceph quorum_status -f json-pretty
  • Clusterın genel konfigürasyonlarını görmek için aşağıdaki komutu kullanabiliriz.
$ ceph config dump  
Cephx

Ceph, kimlik doğrulama için paylaşılan secret keyler kullanarak Ceph bileşenleri arasında kriptografik kimlik doğrulama sağlar. Bunun için ise Cephx denilen protokolü kullanmaktadır. Cluster cephadm kurulduğunda Cephx’i varsayılan olarak etkin gelmektedir. Gerekirse Cephx’i devre dışı bırakabilirsiniz, ancak cluster güvenliğini zayıflattığı için önerilmez. Cephx protokolünü etkinleştirmek veya devre dışı bırakmak için “ceph config set” komutunu kullanılır.

  • Servis ve cluster kimlik doğruluma şeklini görüntülemek aşağıdaki komutlar kullanabilirsiniz.
$ ceph config get mon auth_service_required
$ ceph config get mon auth_cluster_required
  • Cluster içerisinde yer alan mevcut accountları listeler.
$ ceph auth list
  • Yeni bir user oluşturmak istersek aşağıdaki komutu kullanabiliriz. Kimlik doğrulama için, keyring dosyası gerekmektedir, Bir önceki yazımda da belirtmiştim. Bu nedenle ilgili dosyayı bu yeni kullanıcı hesabıyla çalışan clusterdeki tüm hostlara kopyalamamız gerekir.
$ ceph auth get-or-create kubikolog.user mon 'allow r' osd 'allow rw' -o /etc/ceph/ceph.kubikolog.user.keyring
  • Oluşturduğumuz userı silmek ister isek,
$ ceph auth del <kubikolog.user>
Ceph tell

Ceph tell komutunu monitorün down olduğu durumlarda troubleshooting için kullanabilirsiniz. Kullanım şekli aşağıdaki gibidir.

$ ceph tell $type.$id config get  ...
 
$ ceph tell $type.$id config set  ...

ex:
$ ceph tell mon.* config set mon_allow_pool_delete true
OSD Konfigürasyonları

OSD bileşenleri veriyi kopyalayarak saklanmasında sorumludur. Serinin ilk yazısında datanın saklanma tiplerine değinmiştim. Bu yönetim OSD ile yapılır. Ayrıca monitore hostların disk durumunu da iletir. Her disk için ayrı bir disk tutulması önerilmektedir.

  • Clusterda çalışan bir OSD’nin konfigürasyonlarını görmek için aşağıdaki komutu kullanabiliriz.
$ ceph config show <osd.1>  
  • Bir OSD servisini restart etmek için ise aşağıdaki komut işe yarayacaktır.
$ ceph orch daemon restart <osd.1>   
$ ceph orch daemon stop <osd.1>
$ ceph orch daemon rm <osd.1>
$ ceph osd rm <1>

Hatırlatma: OSD ekleme komutu:

$ ceph orch daemon add osd <osd.1>:/dev/vdb 
  • OSD ağacına bakmak için,
$ ceph osd tree

ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.08817 root default
-3 0.02939 host nodec
0 ssd 0.00980 osd.0 up 1.00000 1.00000
1 ssd 0.00980 osd.1 up 1.00000 1.00000
2 ssd 0.00980 osd.2 up 1.00000 1.00000
-5 0.02939 host noded
3 ssd 0.00980 osd.3 up 1.00000 1.00000
4 ssd 0.00980 osd.4 up 1.00000 1.00000
5 ssd 0.00980 osd.5 up 1.00000 1.00000
  • Clusterdaki disk boyutunu görmek için,
$ ceph df
Pool Konfigürasyonları

Poollar, nesneleri depolamak için mantıksal bölümlerdir. Ceph istemcileri nesneleri poollara yazar. Poollar, küme için bir dayanıklılık katmanı sağlar, çünkü poollar veri kaybetmeden arızalanabilecek OSD’lerin sayısını tanımlar.

Veri nasıl saklanır diye konuşacak olursak;

Verinin Ceph üzerinde bulunan pool adresine yazma talebinde bulunmasıyla süreç başlar. Ardından daha önce konuştuğumuz CRUSH algoritması çalışır ve PG ataması yapar. Ayrıca CRUSH algoritması kullanılacak PG’leri OSD’ler ile eşlemekten de sorumludur. Ardından da veri primary olarak belirlenen PG’ye dolayısıyla da primary OSD’ye yazılmış olur. Primary OSD’ye yazma işlemi tamamlanınca da belirtilen pool türüne göre yedekleme yapılır. Örneğin replicated pool ile ilerleniyorsa belirtilen kopya sayısına göre diğer OSD’lere yazma işlemi yapılır. Yedek OSD’ler CRUSH Map ayarlarına göre farklı sunucularda tutulacak şekilde yerleştirilir. Tüm kopyaların da yazma işlemi tamamlanınca işlem tamamlanmış olur. Mükemmel çizimimizi de şuraya bırakalım 🙂

Şimdi gelelim fasulyenin faydalarına 🙂 Yukarıda verinin nasıl tutulduğunu konuştuk. Sıralamaya göre gidersek önce nasıl pool oluşturulduğuna bakmamız gerekecek.

  • Aşağıdaki komutu kullanarak pool oluşturup, bu pool için pg sayısını atayabiliriz. Burada pg-num bu pool için ayrılmış pg sayısını, pgp-num da bu poolda efektif kullanılacak pg sayısını ifade eder. pfp-num=pg-num olarak set ediyoruz.
$ ceph osd pool create <pool name> <pg-num> <pgp-num>

Pool oluşturururken replika sayısnı belirtmezsek default olarak 3 olarak pool’a atama yapar.

Total PG sayısını hesaplamak için aşağıdaki gibi bir formülasyon bulunuyor. Bunu sizin yerinize hesaplayan calculatorler de var tabi ki. Red Hat’in PG calculator linkini de şuraya bırakalım.

💡 Ceph Placement Groups (PGs) per Pool Calculator | Red Hat Customer Portal Labs

💡 Total PGs = (OSDs * 100)/Number of replicas

  • Bir başka PG atama yöntemi olarak da target_size_ratio ‘dan bahsedebiliriz. Bu özellik ile clusterda bulunan poollara bir oran veriyorsunuz ve bu orana göre pg’ler poollara atanıyor. Yukarıda calculator linkinde de vardi. Burada tüm clusterdaki oranların toplamının 1’e tamamlayarak oranlamayı yapıyor. Bunun için aşağıdaki komutu kullanabilirsiniz.
$ ceph osd pool set <pool name> target_size_ratio <ratio>
  • Ceph’te kullandığımız ve kesinlike kullanmanızı önerdiğim autoscale_mode‘dan bahsetmek istiyorum. Bu modu açmanız halinde clusterdaki poolların pg sayısını total pg’lere göre oranlayarak paylaştırıyor. Burada her pool için verdiğiniz ratio değerine göre oranlama yapıyor. Bu yüzden de kullanışlı buluyorum. Bu modu aktif etmek için aşağıdaki komutları kullanabilirsiniz.
$ ceph mgr module enable pg_autoscaler
$ ceph osd pool set pool-name pg_autoscale_mode on
  • Benim en sık kullandığım bir diğer komut ise aşağıdaki komut. Bu komut ile pooların güncel pg sayılarını ve diğer konfigürasyonlarını listeleyebiliryorsunuz.
$ ceph osd pool autoscale-status
  • Tabii poolları da listelemek için komut bulunuyor. “ceph osd pool ls” komutu ile clusterdaki pool isimlerini listeliyorsunuz. Sonuna “detail” eklediğinizde ise özelliklerini de size getiriyor. Yani replika sayısını, target size ratio değerini, autoscale mode on/off mu gibi gibi.
$ ceph osd pool ls
$ ceph osd pool ls detail

Pool oluşturma işlemini Ceph’in bize sağladığı dashboard üzerinden de yapmamız mümkün. Komutlarla yaptığımız adımların arayüzden yapılma şekli aşağıda görsellerde belirtildiği şekildedir.

  • Pool ismini değiştirmek istersek aşağıdaki komutu kullanabiliriz.
$ ceph osd pool rename <old-pool-name> <new-pool-name>
  • Pool oluşturmak gördüğünüz gibi gayet kolay. Ancak oluşturduğunuz pool’u kaldırmak bu kadar kolay değil. Kolay olmasın da zaten. Tehlikeli sular 🙂 Pool’u silmek için önce mon_allow_pool_delete özelliğini aktif etmek gerekiyor. Ardından silme komutlarını çalıştırmanıza izin veriliyor. Silme komutları aşağıdaki gibidir.
$ ceph config set mon mon_allow_pool_delete true
$ ceph osd pool rm <pool_name> <pool_name> --yes-i-really-really-mean-it

HATIRLATMA !! Bu işlem sonrası silme işlemini tekrar false a çekmeyi unutmayın. Bir küçük hata çok üzebilir sonrası. Benden demesi.

$ ceph config set mon mon_allow_pool_delete false

Yazının sonuna geldik sevgili Ceph sever okurum 🙂 Bu yazının üzerine biraz IT dünyasından uzaklaşmak lazım. Okyanuslara açılmaya ne dersiniz ? 🐸 Tesadüfen beni bulan bir vlog önerisiyle yazımı sonlandırıyor, sizi okyanusla baş başa bırakıyorum 😉

Ceph Storage Notlarım {2/5}

Serinin ikinci yazısından herkese selamlar 🐸

Bugünkü yazımda öncelikle bir ceph cluster oluşturmak istediğimizde dikkat etmemiz gereken noktaları ele alacağım. Ardından da ceph cluster kurulumu ve konfigürasyonlarına başlayacağız.

Depolama ortamını kullanacağınız amaca bağlı olarak performans odaklı veya maliyet odaklı planlayabiliriz. Buna bağlı olarak da elbette Ceph tasarımı yapılır. Yapılacak seçim kullanılacak mekanizmaları, donanımları (disk tipi, sunucu tipi, işlemci, bellek, v.b.) belirlemede önemli rol oynayacaktır. Performans istiyorsak bir önceki yazımda belirttiğim gibi replicated pool tercih edip clusterın tamamında SSD diskler kullanılabilir. Eğer maliyeti daha düşük bir çözüm istiyorsanız kullanım amacına göre replikated veya EC seçilebileceği gibi SSD disk olmadan mekanik diskler kullanılabilir. Ağ katmanı buna göre daha düşük kapasiteli seçilebilir. Maliyeti düşürmek için replika sayısı düşük tutulabilir. Eğer aynı maliyet ile daha yüksek kapasite ihtiyacınız varsa yüksek sayıda disk takılabilen sunuculardan seçip disk sayısına bağlı ağ katmanının tasarlayıp aynı sunucu sayısı ile daha yüksek kapasiteli bir depolama kümesi elde edebilirsiniz.

Ceph Cluster Kurulumu & Konfigürasyonlar

Ceph kurulumu için tavsiye edilen minimum hardware gereksinimleri aşağıdaki gibi olmalıdır:
-8 GB RAM
-4 CPU
-50 GB hard disk
-1Gbit network interface

Red Hat Ceph 5 kurulumu için en az RHEL 8 versiyonun olması gerek diye biliyorum. İşletim sistemi üzerinde firewall enable, selinux enforcing modda olmalı, NTP ayarları yapılmalıdır. Ayrıca minimal OS kurulumu yeterlidir. Ben kurulum adımlarına eğitimin bana sağladığı lab ortamından devam edeceğim. Benim cluster yapımda 1 admin+mon+mgr node , 3 OSD node olmak üzere toplam 4 node’um bulunuyor. Her OSD node üzerinde /dev/sdb, dev/sdc, dev/sdd şeklinde 3’er ayrı disk mevcut.

  • İlk olarak admin sunucu üzerinden diğer sunuculara password kullanmadan erişim için ssh-key metodu kullanılır.
$ ssh-keygen
$ ssh-copy-id nodea.lab.kubikolog.com  %admin node 
$ ssh-copy-id nodeb.lab.kubikolog.com  %bootstrap node
$ ssh-copy-id nodec.lab.kubikolog.com
$ ssh-copy-id noded.lab.kubikolog.com
  • Kurulum cephadm-ansible paketini indirmemiz gerekiyor. Bu paketi bootsrap olarak belirlediğimiz sunucuda indireceğiz. Bu arada söylemeyi unuttuğumu farkettim. Ceph kurulum için bootstrape ihtiyaç duyuyor. Ardından bu sunucu da clusterın bir parçası olacak. Bootstrap kurulumu başttığı sunucuda monitor ve manager rolünü kuruyor olacak.
$ yum install cephadm-ansible  %bootstrap node'da çalıştırılır.  (https://github.com/ceph/cephadm-ansible)
  • Clustera eklenecek nodeları inventorye ekleyelim.
$ vi /usr/share/cephadm-ansible/hosts
nodea.lab.kubikolog.com
nodeb.lab.kubikolog.com
nodec.lab.kubikolog.com
noded.lab.kubikolog.com
  • Cluster hostlarını hazırlamak için cephadm-preflight.yml’ını çalıştıralım. Burada ceph_origin değeri kuracağınız repoya göre değiklik gösteriyor. Detayları github linkinde belirtilmiş. Ben aşağıdaki şekilde ilerleyeceğim.
$ ansible-playbook -i hosts cephadm-preflight.yml --extra-vars "ceph_origin=rhcs"
  • install-cluster-config.yaml oluşturarak servisleri yapımıza nodelara atayacağız. Yaml içeriği aşağıdakine benzer şekilde olmalıdır.
$ cat install-cluster-config.yaml
---
service_type: host
addr: 172.10.10.10
hostname: nodea.lab.kubikolog.com
---
service_type: host
addr: 172.10.10.11
hostname: nodeb.lab.kubikolog.com
---
service_type: host
addr: 172.10.10.12
hostname: nodec.lab.kubikolog.com
---
service_type: host
addr: 172.10.10.13
hostname: noded.lab.kubikolog.com
---
service_type: mon
placement:
  hosts:
    - nodea.lab.kubikolog.com
    - nodeb.lab.kubikolog.com
    - nodec.lab.kubikolog.com
    - noded.lab.kubikolog.com
---
service_type: rgw
service_id: realm.zone
placement:
  hosts:
    - nodeb.lab.kubikolog.com
    - nodec.lab.kubikolog.com
---
service_type: mgr
placement:
  hosts:
    - nodea.lab.kubikolog.com
    - nodeb.lab.kubikolog.com
    - nodec.lab.kubikolog.com
    - noded.lab.kubikolog.com
---
service_type: osd
service_id: default_drive_group
placement:
  hosts:
    - nodeb.lab.kubikolog.com
    - nodec.lab.kubikolog.com
    - noded.lab.kubikolog.com
data_devices:
  paths:
    - /dev/vdb
    - /dev/vdc
    - /dev/vdd
  • Hazırladığımız config dosyasını aşağıdaki şekilde bootstrap node da çalıştıracağız. Bu sayede nodelar yukarıda belirttiğimiz konfigürayonları almış olacak.
$ cephadm bootstrap --mon-ip=172.10.10.12 --apply-spec initial-cluster-config.yaml --initial-dashboard-user <user> --initial-dashboard-password <password> --dashboard-password-noupdate --allow-fqdn-hostname --registry-url registry.redhat.io --registry-username <redhat username> --registry-password <password> --cluster-network 1.1.1.0/24
  • Üstteki adım başarılı şekilde tamamlandıysa artık kontrollerimizi yapmaya başlayabiliriz. Öncelikle aşağıdaki komut ile ceph shell komutlarının çalıştırılabilir olmasını sağlayalım.
$ cephadm shell
  • Clusterın sağlık durumunu ve hostların gelip gelmediğini kontrol edelim.
$ ceph -s
$ ceph orch host ls
  • Ceph komutlarının mevcut tüm nodelarda çalıştırılabilmesi için ceph.client.admin.keyring dosyasını tüm nodelara aşağıdaki şekilde gönderelim.
$ ansible all -i hosts -m copy -a 'src=/etc/ceph/ceph.client.admin.keyring dest=/etc/ceph/'
  • Ayrıca ceph.conf dosyasını da tüm nodelara göndermeliyiz.
$ ansible all -i hosts -m copy -a 'src=/etc/ceph/ceph.conf dest=/etc/ceph/
  • Admin node’una label atamak için aşağıdaki komutu kullanabiliriz.
$ ceph orch host label add nodea.lab.kubikolog.com _admin

Şu anda 4 nodelu bir ceph clusterı kurmuş olduk. Öncelikle tebrikler 🙂

Peki yeni bir node gelirse ?

  • Clustera yeni bir node eklemek istediğimizde aşağıdaki şekilde aksiyon alabiliriz.
$ ssh-copy-id -f -i /etc/ceph/ceph.pub root@new-node
$ ansible-playbook -i /usr/share/cephadm-ansible/hosts/ /usr/share/cephadm-ansible/cephadm-preflight.yml --limit new-node
$ ceph orch host add new-node --labels=mon,osd,mgr
  • OSD olarak kullanılabilcek diskleri listelemek için aşağıdaki komutu çalıştırırız.
$ ceph orch device ls

Mevcut OSD nodelarınıza yeni depolama aygıtları ekleyebilir ve ardından bunları OSD’ler olarak yapılandırabiliriz. Tabi bunun için aşağıdaki koşulların sağlanması gerekmektedir.

• The device must not have any partitions.
• The device must not have any LVM state.
• The device must not be mounted.
• The device must not contain a file system.
• The device must not contain a Ceph BlueStore OSD.
• The device must be larger than 5 GB.

  • Osd eklemek için aşağıdaki ilk komut çalıştırılabilir. Alternatif olarak ikinci komutu tercih ederseniz kullanılmayan tüm cihazları osd olarak eklemiş olur.
$ ceph orch daemon add osd new-osd:/dev/vdb 
$ ceph orch apply osd --all-available-devices

Şimdilik burada noktalayalım. Gelecek yazıda cluster konfigürasyonlarına devam ederek sık karşılaşabileceğimiz komutlar üzerinde duracağız.


Bu gecenin şarkısı Göksel’den geliyor 🕊️


Ceph Storage Notlarım {1/5}

Merhaba, bu yazı serisinde sizler ile “Red Hat Ceph Storage 5.0 CL260” eğitimini referans alarak tuttuğum notlarımı paylaşıyor olacağım.

Öncelikle kısaca geleneksel depolama çözümleri ile yazılım tabanlı depolama çözümlerine (SDS) bakaraK SDS ile kazandığımız ayrıcalıkları listeleyelim.

Geleneksel Depolama Çözümleri:
-Donanım ve yazılım birlikte verilen çözümlerdir.
-Bir veri merkezi üzerine konumlandırılır.
-Scale-up ölçeklendirilir.
-Storage admin ihtiyacı vardır.

Yazılım Tabanlı Depolama Çözümleri:
-Yazılım tabanlıdır. Donanım bağımsızdır.
-On-premise, public ya da hibrit cloudda çalışabilir.
-Scale-out ölçeklendirilir.
-Self-servis kullanılabilir.

Yazılım tabanlı çözümler yukarıda belirttiğim gibi donanım bağımsızdır. Bu da size hardware seçim avantajı sağlayacaktır. Bu donanımların ciddi paralar olduğunu düşünürsek burada maliyetten de tasarruf imkanı sağlar diyebiliriz. Geleneksel çözümler de ölçeklendirilebilir fakat belli limitasyonlara sahiptir. Alan arttırımı ürünün kapasitesin bağlıdır. Sınıra ulaşıldığında yeni bir depolama alanı satın alınması gerekecektir. Alan arttırımı ürünün kapasitesin bağlıdır. Sınıra ulaşıldığında yeni bir depolama alanı satın alınması gerekecektir. Yazılım tabanlı çözümler ise esnektir, Scale out olarak mevcut yapıdan bağımsız şekilde arttırım yapabilir.

Gelelim ana konumuz Ceph‘e.

Ceph, yazılım tanımlı, birleşik depolama çözümleri sunan açık kaynaklı bir projedir. Openshift, openstack ortamlarının storage ihtiyacını karşılamak amacıyla yaygın kullanılır. Wikipedia’dan historye bakacak olursak; bu projenin mimarı Sage Weil ‘dir. Sage Weil, Los Angeles merkezli hosting şirketi DreamHost’un kurucu ortağı, WebRing’in mimarı ve Inktank’ın kurucusu ve CTO’suymuş. Şimdi de Ceph projesinin baş mimarı olarak Red Hat için çalıştığını öğrendim.

Ceph, mükemmel performans, güvenilirlik ve ölçeklenebilirlik sağlamak üzere tasarlanmıştır. Ceph’e giriş amacıyla hazırladığım CEPH 101 paylaşımımda Ceph’in faydalarına ve mimari bileşenlerine değinmiştim. Bu yazının devamını okumadan önce CEPH 101 yazımı da okumanızı tavsiye ederim.

Çok kısaca genel yapıya baktığımızda RADOS altyapıda storage yazma işleminden sorumludur. RGW(Rados Gateway), RBD(Rados Block Device), CephFS(File System) ise bizim için clientlar ile haberleşmeyi sağlayan metodlardır.


Ceph Storage Backend Daemons

Red Hat Ceph Storage clusterı aşağıdaki daemonlara sahiptir:

1.Monitor (MON’s) :

Cluster durumunun haritalarını korur. Dçğer daemonların koordinali çalışmasına yardım eder.

2.Object Storage Devices (OSD’s) :

Verileri depolar ve veri çoğaltma, kurtarma ve yeniden dengeleme rollerini üstlenir.

2.1. Crush Map

Ünlü bir düşünür der ki “where to find the data , where to put the data ?” . Ünlü de olmayabilir 🙂 Ama birileri bu soruya kafa yormus ve bir algoritma geliştirmiş: Crush Algoritması.

CRUSH, her nesneyi tek bir karma kova (single hash bucket) olan yerleşim grubuna (PG) atar. PG’ler, nesneler (uygulama katmanı) ve OSD’ler (fiziksel katman) arasında bir soyutlama katmanıdır. CRUSH, nesneleri PG’ler arasında dağıtmak için sözde rastgele bir yerleştirme algoritması kullanır ve PG’lerin OSD’lere eşlenmesini belirlemek için kurallar kullanır. Primary OSD’ye read/write işlemleri yapılır. Arıza durumunda ise Ceph, PG’leri farklı fiziksel cihazlara ( Secondary OSDs) yeniden eşler ve içeriklerini yapılandırılmış veri koruma kurallarına uyacak şekilde senkronize eder.

Normal şartlar altında

Arıza durumunda

3.Managers (MGR’s) :

Çalışma zamanı ölçümlerini izler ve tarayıcı tabanlı bir dashboard ve REST API aracılığıyla cluster bilgilerini gösterir.

4.Metadata Servers (MDS’s) :

POSIX komutlarını verimli bir şekilde çalıştırabilmeleri için CephFS’nin kullandığı meta verileri depolar. Nesne depolama ve blok depolama için clusterda MDS’e ihtiyaç yoktur.

Cluster Map

5 harita bulunuyor. Ceph istemcileri ve OSD’ler, cluster topolojisi hakkında bilgi gerektirdiğinden bu haritaları kullanır. Aşağıda bu haritaları ve komutlarını belirttim.

--monitormap: contains cluster id (fsid)
$ ceph mon dump

--osdmap: pgs and pool id
$ ceph osd dump

--pgmap: pool ratio , more details about the pgs, pgs data usage , etc.
$ ceph pg dump

--crushmap: list of storage devices, getting this map
$ ceph crush dump

--mdsmap: some information about the daemon
$ ceph fs dump

Data Protection

Poolları oluştururken yerleşim gruplarının (placement groups) sayısını ve replika sayısını, “CRUSH” kuralını belirtmemiz gerekmektedir. İki tür pool bulunur. Birincisi “replicated pools”, diğeri ise “erasure coded pools”. 

Replika tipinde veri bir kaç kopya halinde tutularak veri güvenilirliği ve dayanıklılığı sağlanırken, EC ise veri hata bölgelerini gözetecek şekilde belli parçalara (chunk) bölerek dağıtık şekilde tutulur. Burada veri bütünlüğünü sağlamak amacıyla ekstra parçalar(4 e bölüyorsa mesela +2 tane daha mesela metadata kullanıyor) kontrol parçacıkları ekleniyor. Her bir chunk belirlenen oranlarda belirlenen nodelara dağıtılıyor. Bu şekilde daha az yer kaplıyor ama daha fazla cpu tüketiyor. Eğer bütçeniz kısıtlı ise EC kullanmak bir tercih olabilir.

Replikasyon yönteminde bir kopya asıl hedefe yazıldıktan sonra diğer kopyalar ikinci bir ağ  (cluster network) üzerinden kopyalanmaktadır. Yazma işlemi sırasında replika sayısı kadar yazma yapılmadan işlem tamamlanmayacağı için yazma işlemi uzasa da, okuma sırasında farklı kopyalardan farklı bölümler okunarak işlem hızlanacaktır. Elbette veriyi bir kaç kopya halinde tutmak daha maliyetli olacak ancak sistemin hata toleransı bu durumda artar ve okuma performansı yükselecektir.

Replika sayısı arttıkça sistem üzerinde bir şekilde devre dışı kalan disk veya sunucu olması halinde performans düşüşü kaynaklı yaşanan etki azalır diyebiliriz. Ayrıca cluster üzerinde herhangi bir durumda (disk değişimi, sunucu arızası v.b.) başlayacak veri kurtarma (recovery) işlemi birden fazla kopyadan okunarak EC’ye göre oldukça hızlı bir biçimde yapılacaktır.

Toparlayacak olursak, bütçe çerçevesinde farklı katmanlar (object, block, filesystem) için replika veya EC kullanılabilir. Bu seçimi yaparken sistemdeki okuma-yazma oranı dikkate alınmalıdır. Kritik veriler için replika yöntemi önerilirken daha çok arşiv amaçlı ihtiyaçlarda EC önerilmektedir. Yani veriyi saklayıp çok sık erişmeyeceğiniz durumlarda (cold storage) EC, sürekli kullandığınız durumlarda replika kullanmak daha mantıklı olacaktır. Genel kabül replikasyon yönteminde en az 3 replika tutmak şeklindedir. Ancak bütçe kısıtı gibi durumlarda 2 replika da kullanılabilir. Seçilen yöntem doğrultusunda donanım seçimi yapılmalıdır.

Bugünlük bana ayrılan sürenin sonuna geldik, Yazı serisinin gelecek paylaşımında Ceph Storage Cluster’ın nasıl konumlandırıldığından ve konfigürasyon süreçlerinden bahsediyor olacağım.

Geceye bu sıralar müptelası olduğum şarkıyı hediye ederek şimdilik veda ediyorum 🐸

Spontane | “Tempo”

Bu gece bir farklılık yapıp teknik olmayan bir yazı yazmak istediğim için bilgisayarın başına geçiyorum. Bu sıralar bitirme projem ile uğraşıyor, bu sebeple de açıkçası hayattan beziyor olabilirim 🙂

Gelin biraz bunu sorgulayalım.

Yaptığınız bir ödev, çalışma, proje size keyif vermediğinde ne yapıyorsunuz? Eminim ki birçok insanın zorunlu olarak tamamlaması gereken görevler var. Bu görevleri tamamlarken motivasyonunuz ne oluyor? Enerjinizi yukarıya çeken taktikleriniz var ise yorumlarda paylaşırsanız sevinirim 🙂

Evet, bugünün ana başlığını da bulmuş olduk sanırım: Motivasyon. Hayatta karşımıza çıkan anomalilere karşı duruşumuz bana göre motivasyonun tanımı diyebilirim. Tabi ki güçlendirmek için eklemeler yaptığım triklerim de var. Hepimizin vardır 🙂

Neler yapabiliriz? Biraz damardan olacak ama “içim kan ağlasa da ben gülmeye mecburum” demiş bir sanatçımız. Aynen öyle. İşte birinci motivasyonum.

Biraz spontane yazıyorum bugün bir akış belirlemedim. Bir başlık belirlemeden başladım ve akış beni motivasyon yazısı yazmaya itti 🙂 O zaman birkaç maddede şöyle bizi pozitif anlamda yükseklere çıkaran, o gazla uzaya dahi çıkabileceğimiz havaya girelim. Buna ihtiyacım olduğunda ilk olarak Emin Çapa’nın gençlik ile ilgili söylediği sözleri hatırlarım. 💪 Sonrasında ise kendimi bir gezi planı hazırlarken bulduğum zamanlar olmuştur. Gezmek.. Bir gün bunun üzerine de konuşabiliriz belki.

Biraz da business life tarafından bu konuşmayı düşünürsek direk şu soruyu kendime sormaya başlıyorum. Beni farklı yapan ne? Kendi içimde bir anomaly detection başlıyor işte o sırada. Burada tespit ettiğim her anomaliyi bana fayda sağlaması için kullanıyorum. Bunu denemenizi tavsiye ederim. Bir kağıt kalem alın ve yazın. Sıradan gördüğünüz özellikleriniz ve sizi çevrenizdeki insanlardan ayıran özellikleriniz. İleride dönüp baktığınızda bu özelliklerinizi sihirli kutunuza koyup zamana rağmen taşıyıp taşımadığınızı da analiz edebilirsiniz. Ayrıca klişe gelebilir ama kesinlikle gelecekteki benliğinize mektup yazma olayını da uygulamanızı tavsiye ediyorum. Lise yıllarımda başlamıştım bu mektup işine. Ben 6 yıl sonrasına yazmayı tercih ediyorum. Birkaç adet mektuba sahibim. O gelecek gelmeyecekmiş gibi yazıyorsunuz mektubu. Sonra bir bakmışsınız geçmiş 🙂 O yüzden yazın, şiddetle tavsiye edilir.

Biraz da şarkıların enerjisinden konuşabiliriz bence. Bu sıralar keşfettiğim enerjimi inanılmaz şekilde yukarıya taşıyan bir şarkı. Yazının devamını şarkıyı dinleyerek okuyun hadi 🙂

https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FOwnRKKB8dRk%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DOwnRKKB8dRk&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FOwnRKKB8dRk%2Fhqdefault.jpg&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=youtube

🎵“Geleceğe akar zaman, korkan yerinde saysın”🎵

Bu tempoyla gelin devam edelim. Edelim de saat 01.00 olmuş 🙂 O zaman hızlıca en son ama en etkili gördüğüm formülümü söyleyerek kaçıyorum. Yazının başında keyif vermeyen çalışmalarda ne yaptığınızı sormuştum. Bu durumlarda bence motivasyonunuzu düşüren her ne taskınız varsa onu şöyle bi masaya yatırın. Ben bu çalışmada neyi sevmiyorum, neyi yapmakta güçlük çekiyorum diye küçük başlıklara ayırın. İş bundan sonrası kolaylaşacak kesinlikle demiyorum. Ama ayırdığınız küçük başlıklarla kendinize küçük sorumluluklar atayarak gittiğinizde daha az yıprandığınızı göreceksiniz. Bir de ötelemeyin. Ne olursa olsun bir şeyi ötelemek bana hep daha fazla efor olarak geri döndü. Ne demişler bugünün işini yarına bırakma.. Çok doğru. Bu yazıyı yazarken biraz da kendimle de mukayese yapıyorum galiba 🙂

Sanırım şimdilik yazıyı noktalama zamanı. Beğeni sayısına bakacağım 😀 Severseniz spontane yazıların devamı gelir belki. Kim bilir 🐸

Son olarak bir de okurken altını çizmeye doyamadığım motivasyon kitabımı sizler ile paylaşayım: Posta Kutusundaki Mızıka 📕

“..Çünkü insan koşarken kaçar hayattan.” 😉

İyi geceler.

Elasticsearch ile Anomali Tespiti

Merhaba bugün sizlerle Elasticsearch ile Anomaly tespiti üzerine konuşacağız. Anomali tespit temelde bir makine öğrenim modelidir. Makine öğrenimi anormallik algılama özellikleri, verilerinizde normal davranışın doğru temellerini oluşturarak zaman serisi verilerinin analizini otomatikleştirir. Bu taban çizgileri daha sonra anormal olayları veya kalıpları belirlemenizi sağlar. Anomali tespiti için zamana bağlı veriler gerekir.

Peki, Elasticsearch ile Anomali Tespiti nasıl sağlanır?

Veriler, analiz için Elasticsearch’ten alınır ve anormallik sonuçları Kibana panolarında görüntülenir. Bu yöntemde bir olasılık modeli oluşturulur ve meydana gelen olağandışı olayları tanımlamak için sürekli olarak data toplar.

Anomali Tespiti için öncelikle anomali job’ı oluşturulmalıdır. Kibana arayüzünde“Anomaly Detection” sekmesine gidilir ve ardından “Create Job” butonuna basılır. Açılan ekranda anomali tespiti gerçekleştirmek için gerekli ndex pattern’i seçilir.

Job oluştururken yukarıdaki görselde de gözüktüğü gibi tercih edilebilecek bazı sihirbazlar bulunmaktadır. Gelin bu sihirbazları biraz daha detaylı inceleyelim.

Single Metric, tek bir dedektöre sahip basit işler oluşturur. Bir dedektör, verilerinizdeki belirli alanlara analitik bir işlev uygular. Single metric sihirbazu, dedektör sayısını sınırlamaya ek olarak, daha gelişmiş yapılandırma seçeneklerinin çoğunu atlar.

Multi-metric, birden fazla algılayıcıya sahip olabilen ve aynı verilere karşı birden çok işi çalıştırmaktan daha verimli olan işler oluşturur.

Population, popülasyonun davranışına kıyasla olağandışı etkinliği algılayan işler oluşturur.

Categorization, günlük mesajlarını kategoriler halinde gruplandıran ve içlerindeki anormallikleri algılamak için count veya işlevlerini kullanan işler oluşturur

Advanced, birden çok detektöre sahip olabilen işler oluşturur ve tüm iş ayarlarını yapılandırmanıza olanak tanır.

Anomali tespiti gerçekleştirilecek ortama ait metrikleri “time range” kısmından sınırlandırabilirsiniz ya da tüm metrikleri kullanabilirsiniz. Time range size tercih ettiğiniz zaman aralığında anomali tespiti yapabilmenizi sağlar.

Bir sonraki aşamada Pick Fields adımı karşınıza gelecek. Burası average, min ve max gibi fonksiyonları içerir.

Gelin şimdi de anomali tespiti yaparken seçebileceğiniz fonksiyonları inceleyelim.

  • Count: Bucket’daki genel olay sayısının normalden daha yüksek veya daha düşük olduğu zaman dilimlerini tanımlar.
  • High_count: Bucket’daki olay sayısı olağandışı derecede yüksek olduğunda anormallikleri algılar. Diğer kullanıcılara kıyasla alışılmadık derecede yüksek sayıda hata kodu oluşturan kullanıcıları algılar.
  • Low_count: Bucket’daki olay sayısı olağandışı derecede düşük olduğunda anormallikleri algılar. Bu işlevi anormallik algılama işinizde bir dedektörde kullandığınızda, her bir durum kodu için olay oranını modeller ve bir durum kodunun geçmiş davranışına kıyasla olağandışı derecede düşük bir sayıya sahip olduğunu algılar.
  • Mean: Bir değerin aritmetik ortalamasındaki anormallikleri algılar. Ortalama değer, her bir kova için hesaplanır.
  • High_mean: Alışılmadık derecede yüksek ortalama değerleri izlemek istiyorsanız bu işlevi kullanın.
  • Low_mean: Alışılmadık derecede düşük ortalama değerlerle ilgileniyorsanız, bu işlevi kullanın.
  • Sum: Bir bucket alan toplamının anormal olduğu verileri algılar. Bu sum işlevi anormallik algılama işinizde bir dedektörde kullanırsanız, her bir maliyet merkezi için çalışan başına toplam giderleri modeller. Her zaman bölümü için, bir çalışanın harcamalarının diğer çalışanlara kıyasla bir maliyet merkezi için olağandışı olup olmadığını tespit eder.
  • High_sum: Bu işlevi anormallik algılama işinizde bir dedektörde kullanırsanız, total modelini oluşturur. Diğerlerine kıyasla alışılmadık derecede yüksek hacimlerin aktarıldığını algılar.
  • Low_sum: Bu işlevi anormallik algılama işinizde bir dedektörde kullanırsanız, total modelini oluşturur. Diğerlerine kıyasla alışılmadık derecede düşük hacimlerin aktarıldığını algılar.
  • Median: Bir değerin istatistiksel medyanındaki anormallikleri algılar. Medyan değer, her bir kova için hesaplanır.
  • High_median: Alışılmadık derecede yüksek ortalama değerleri izlemek istiyorsanız bu işlevi kullanın.
  • Low_median: Alışılmadık derecede düşük ortalama değerlerle ilgileniyorsanız, bu işlevi kullanın.
  • Min: Bir değerin aritmetik minimumundaki anormallikleri algılar. Her kova için minimum değer hesaplanır. Bu işlevi anormallik algılama işinizde bir dedektörde kullanırsanız, en küçük işlemin daha önce gözlemlenenden daha düşük olduğu yeri algılar.
  • Max: Bir değerin aritmetik maksimum değerindeki anormallikleri algılar. Her kova için maksimum değer hesaplanır.
  • Distinct count: Bir alandaki farklı değerlerin sayısının olağandışı olduğu anormallikleri algılar.

Pick fields alanında seçtiğiniz fonsiyona göre ekrandaki gibi bir grafik sizi karşılıyor. Ayrıca “bucket span” ve “sparse data” isimli 2 yeni terime de hoşgeldin dememiz gerekiyor 🙂

Bucket span, Makine öğrenimi özellikleri, zaman serilerini işlenmek üzere gruplara bölmek için kullanılır. Bir anormallik algılama işi için yapılandırma bilgilerinin bir parçasıdır. Verileri özetlemek ve modellemek için kullanılan zaman aralığını tanımlar. Bu genellikle 5 dakika ile 1 saat arasındadır ve veri özelliklerinize bağlıdır. Bucket span’ı ayarladığınızda, analiz etmek istediğiniz ayrıntı düzeyini, giriş verilerinin sıklığını, anormalliklerin tipik süresini ve uyarının gerekli olduğu sıklığı dikkate alın.

Sparse Data, verisetindeki boş metriklerin anormal olarak değerlendirilmesi istenirse seçilir.

Bu alanları da yapınıza uygun tercih ettikten sonrası bir sonraki aşama için next diyoruz. Burada Job ID ve groups sekmeleri karşımıza geliyor. Job ID, Job’a verilecek isimdir. Groups, Job etiketleme için kullanılır. Örneğin Ceph clusterınız için bir anomali tespiti oluşturuyorsanız burada Ceph olarak bir tag yani group oluşturabilirsiniz. Job description, Job hakkında açıklama girilmek istenirse doldurulur.

Biz sonraki adımda yapılanların genel bir özeti, yani köprüden önceki son çıkış tabı yer alır 🙂 Her şey tamam ise “Create Job” ile job oluşturulur.

Tebrikler , buraya kadar takip ettiysen bir anomali job’ını başarıyla oluşturdun demektir. Oluşan jobların tamamını anomalyt detection sekmesinden görüntüleyebilirsin.

Anomali Sonuçlarını nasıl inceleriz?

Kibana’da anormallik algılama çalışmalarından elde edilen sonuçları incelemek için iki araç vardır: Anomaly Explorer 
Single Metric Viewer.

Makine öğrenimi sonuçlarınızı görüntülediğinizde, her paketin bir anormallik puanı olacaktır. Bu puan, tüm kayıt sonuçlarının birleşik anormalliğinin istatistiksel olarak toplu ve normalleştirilmiş bir görünümüdür.

Makine öğrenimi sonuçlarınızı gözden geçirdiğinizde, son anomali puanının ne kadar güçlü bir şekilde etkilendiğini gösteren bir multi_bucket_impact özelliği vardır. Kibana’da, orta veya yüksek çoklu etkiye sahip anormallikler, Anomaly Explorer ve Single Metric Viewer’da nokta yerine bir çarpı işaretiyle gösterilir.

Aşağıdaki örnekte bazı anormalliklerin, beklenen değerlerin sınırlarını temsil eden gölgeli mavi alan içinde kaldığını görebilirsiniz. Burada turuncu alanda bir anormallik olduğu gözlenebilir. Kök neden tespiti için ilgili kayıtları inceleyerek daha fazla araştırma yapabilirsiniz.

Single Metric Viewer Grafiği

Bir diğer örneğe bakacak olursak, aşağıdaki görselde kırmızı ile belirtilan alanda normal olmayan bir metrik toplanmıştır.

Anomaly Explorer Grafiği

Burada renk skalası bize normalden anormale gidişattaki yoğunluğu belirtir. Yani mavi rengi normal, kırmızı en en en anormal olarak kabul ederiz.

Özetlersek, bu yazıda anomali tespitinden, elasticsearch ile nasıl anomali job’ı oluşturduğumuzdan ve sonuçlarını nasıl inceleyeceğimizden bahsetmiş olduk.

Gelecek yazılarda görüşmek üzere, yağmurlu bir yaz akşamından esen kalın 🐸

DİPNOT: Yağmur deyince akla gelen şemsiye, şemsiye ile anomaly detection uyumluluğunun sağlanması ve şemsiyenin sarı olması lise yıllarımda çok severek izlediğim bir diziyi hatırlattı bana. Meraklısı için bir dizi tavsiyesi gelsin öyleyse: Love Rain 🌂

Referans:
https://www.elastic.co/guide/en/machine-learning/

vSAN Notlarım – 3 / Failure Handling

Kahveler hazır mı? Hazırsa haydi kaldığımız yerden devam edelim.

Bugünkü yazımda sistemde oluşabilecek hata ve arızalara karşı vSAN’ın savunma gardını konuşacağız.

vSAN Storage Policy

vSAN object based bir storage olduğu için objelerin koruması yapılır ve objelerin korumasının yapılabilmesi için de bizim o objelerin yapılacağı politikaları hazırlamamız gerekir. ( Ne çok obje dedim :D)

vSAN’da storage policy base management imkanı vardır. İsterseniz varsayılan politikaları kullanır, isterseniz de ihtiyacınıza göre politika oluşturabilirsiniz. vSAN’ın defaultta bir policysi bulunur.

Object Repair Timer

Objeler komponentlerden oluşur. Komponentler gün gelir arızalanabilir. Sistemde hatayı görebilmek adına vSAN’ın da bir işlemde bulunması gerekebilir. Amaç hata anında, bir disk arızasında sistem recovery senaryosunu devreye alsın olmalıdır. Peki komponentler hangi durumlarda olabilir?

Absent: Hata/arızadan dolayı oluşur. Geri dönüşünün olduğuna inandığı belirsizlikleri temsil eder diyebiliriz.

Active-State: Aynı vSAN objesini oluşturan komponentler birbirleri arasında sync yapamadığında karşımıza çıkar.

Degrated: Sistemde büyük bir arıza gibi algılanabilir. Aslında bir arızadan kaynaklı alınan uyarıdır. Mesela ESXI sunuculardan birini reboot edersem componentler degrated duruma düşer. Beklemediği anda gelen sürprizlere tepkisidir.

vSAN bir hata tespit ettiğinde onu onarmak için belli bir süre bekler. Bu süreye “object repair timer” denir. Bu süre defaultta 60 dkka olarak ayarlanmıştır. Dilerseniz bu süreyi değiştirebilirsiniz.

Host Isolation Response

Eğerki bir sunucu clusterın diğer üyelerinden cevap alamıyor ve dolayısıyla da default gatewayine gidecek duruma geliyorsa, ve gatewayden de cevap alamıyorsa “Host Isolation Response”‘u uygulayacaktır. vSAN’daki yapıda gateway vSAN networkü olacaktır.

Burada 3 seçenekten birini cevap olarak ayarlamanız mümkündür. Disabled seçerseniz default gatewayine ping atamadın beklemeye devam et demiş olursunuz. Host fail durumda ama üzerindeki vmler çalışmaya devam eder. Power off and restart VMs’i seçerseniz fişini çeker gibi düşünelim, diğeri de makine içinden kapatma talimatı vermektir. İhtiyacınıza göre tercih edebilirsiniz.

Fault Domain

Amacı veriyi domainler arasında bölmek, yani sistemizdeki sunucuları gruplamaktır. Bir örnek ile açıklayacak olursak aşağıdaki şekilde bir vSAN Cluster yapımız olsun. 4 sunucumuz var ve bunlar 2 farklı kabinde olsun. Kabinler arası da bağlantı olduğunu düşünelim. Bir sanal makinemi 2 farklı kabinette oluşturulmus vSAN’a atarsam 3 ihtimalle çalışabilir. Kabin 1’de çalışabilir, kabin 2 ‘de çalışabilir ya da verileri kabin ve kabin 2’ye dağılabilir. Ama biz isteriz ki mirror yapımız olsun, kabin 1’e bir şey olma ihtimalinde verim diğer kabinde de olsun. Peki bunu yapabilr miyiz? Normal şartlarda yapamayız. Amaaa vSAN’ın fault domain özelliği ile bunu yapmak mümkün. Eğer sanal makinemin 1 komponentinin 1-2 hostunda, diğer komponentimin de 3-4 hostlarında durmasını istiyorsak fault domaini kullanabiliriz.

vSAN cluster‘ında bulunan her host dolaylı olarak fault domain kabul edilir. vSAN, tüm vSAN nesnelerinin bileşenlerini, Number of Failures to Tolerate kuralına göre otomatik olarak cluster’daki Fault Domain’lere dağıtır.

NumberOfFailuresToTolerate = 1 olan bir sanal makineyi deploy ederken 2n+1 kuralına uymalıyız. Yani burada 1 arızayı tolere etmek için 3 ESXi hostumuzun olması gerekecektir. Eğer 3 arızayı tolere etmek istiyorsak 2*3+1=7 ESXi hostuna sahip olmalıyız.

Son olarak fault domain konfigürasyonu yapılmamışsa ve fault domain veya host kaybı yaşanırsa, çabucak yeniden oluşturulamayacaktır. Bu durum için, VMware ek bir host veya Fault Domain bulundurulmasını tavsiye ettiğini belirtmek isterim.

Bugünlük de müessesemizden bu kadar. Yarın mesai var, ben kaçar. Herkese kolaylıklar 🐸

vSAN Notlarım – 2 / Node Management

vSAN Node Management

vSAN ‘ı aktif etmek bir right click kadar yakın mesafededir. Yeni cluster oluştururken DRS’i , HA’i aktif etmek gibi kolaydır. ESXI hostları üzerinde vSAN platformunu koşturmak için ilave sanal makine yoktur. vSAN, ESXI üzerine gömülüdür. vSAN’ı kurmak diye bir şey yoktur, aktif etmek vardır.

Peki vSAN’ı aktif edebilmek için gereksinimler nelerdir?

1- Olmazsa olmazımız lisans : ) Kendisine ait farklı lisans modelleri bulunmaktadır.
2- Kullanılacağın vSAN türüne göre elinde ESXI hostlara takılı disklerinin bulunması gerekmektedir.
3- vSAN’da disk grupları oluşturabilmek, performans elde edebilmek, yedekliliği elde edebilmek için kesinlikle sunucular üzerinde bulunan Controller seçimi çok önemlidir. Tabii uygun olan firmware ve driver seçimi de önemlidir. Uyumsuz olduğu senaryolarda ciddi sorunlar oluşmaktadır. VMware Compatibility Guide a bakılarak seçim yapmak fayda sağlayacaktır.

Storage Controller Performansı

Kullanıcağınız donanım üreticisine ve desteklediği RAID controller modellerine göre vSAN’daki kullanılacak disklerin kullanım senaryoları da farklılık gösterir. Aşağıdaki ekranda 2 senaryo görüyoruz.

Passthrough mod: Sunucu üzerine takılan disklerin doğrudan hypervizöre gösterildiği ve RAID controllerda herhangi bir RAID aktivitesinin olmadığı, cache in devrede olmadığı bir yöntemdir. Buna bir diğer tabirle HBA metodu da denir. Controller üzerinde herhangi bir konfigürasyon yapılmasına ihtiyaç yoktur.

RAID O Mod: Bu modda hypervizor diskleri doğrudan görmez. Kullanılan ilgili storage controllerlarda her bir disk birbirinden bağımsız RAID 0 yapılarak sanki bir local VMFS datastore u sisteme kazandıracakmış gibi hypervizöre gösterilir.

Bu 2 yöntem arasında kullanmak isteyeceğimiz yöntem Passthrough yöntemidir. Daha az konfigürasyonu olduğundan ve troubleshooting daha kolaydır.

RAID in kullanılmış olduğu senaryolarda controllerların üzerinde de konfigürasyonlar yapmak gibi. Örneğin cache i kapatmak gerekmektedir. Kapatamıyorsanız read e çekilmelidir, write özelliğine yer vermemek gerekir. Write her zaman disklere doğru yapılmalı, controllerdaki cache de yapılmamalıdır.

Özetleyecek olursak, sunucuya taktığımız controllerlar, firmware i driver ı kesinlikle performansa etki etmektedir. Kullanılacak controller ın modları da yukarıda belirttiğim gibi etkilemektedir.

Ortamda birden fazla controller olmasında fayda vardır. Performans açısından etkilidir. Ayrıca ortamdaki single point of failure durumunu kaldırmış oluruz.

Mümkünse ESXI sunucuların power managementlarını high performance olarak ayarlanmalıdır. BIOS seviyesinde aşağıdaki gibi ayarlanırsa sağ taraftaki gibi VMware üzerinden high performance ayarlaması kolaylıkla yapılabilinecektir.

Skyline Health

Gerek vSAN’ın gerek vSphere’in sağlık durumunu temel seviyede konfigürasyonların doğru yapılıp yağılmadığını, üretici tavsiyelerine uyup uymadığını, üzerinde olabilecek zaafiyetlerin kapanıp kapanmadığı, donanımların vSAN’a uyup uymadıgını, driverlarının firmwarelerinin biribirne uyup uymadıgını kontrol eden yapıya denir.

Uyumsuzluk durumları performansı doğrudan etkileyeceği için ara sıra skyline health’te retest yapılmasında fayda olacaktır.

Serinin ikinci yazısının da sonuna geldik. Bir sonraki yazımda vSAN’ın arıza durumlarındaki davranışlarını ve dayanıklılığını konuşacağız.

Şimdilik hoşçakalın 🐸

vSAN Notlarım – 1 / Genel Bakış

Geleneksel Storage Yapısı

Geleneksel vSphere depolama çözümlerinde bir block storage dan gelen LUN’u bir VMFS Datastore olarak ya da File storagedan gelen NFS paylaşımını NFS datastore olarak ekleyerek ESXI hostlara depolama alanı sunulur. Kapasite ihtiyacını karşılamak, güvenliğini, yedekliliğini, yük dağılımını sağlamak için sanal makinelerin datastore’larda barındırılması gerekir. Fakat bu datastore’ların kesinlikle paylaşılan datastore’lar olması gerekir. Neden? Çünkü, bu alanları birden fazla ESXI host görebilsin ki biz aynı anda birden fazla sunucu tarafından bu ilgili depolama alanına erişebilelim, okuyabilelim yazabilelim diye. VMFS datastore filesystem gereğince aslında bir ortak depolama olmaya elverişli bir filesystemdir. NFS de aynı şekildedir. Daha ziyade Linux OS’in kullanımında gördüğümüz ve amacı Linux OS’lere öncelikle bir kaynak paylaştırmak ve o ilgili sisteme erişecek sistemleri eş zamanlı okumasına yazmasına izin verecek bir platformdur. Bu platformlar genel olarak geleneksel depolamalarla elde edilir. Ama artık ezber bozuldu : )

SDS & Hyperconverged SDS

*SDS: Software Defined Storage

Yıllardan beri söylenen neydi? ESXI hostların (yani bir fiziksel serverın) local disklerinde veri (yani sanal makine) barındırmamalıyız. Çünkü o fiziksel sunucunun disklerine okuma/yazma yapabilecek tek sistem ilgili fiziksel sunucudur. Dolayısıyla sizin oraya bir sanal makine barındırıyor olmanız sunucu kapandığında/sunucunun erişilemez hale geldiği senaryoda o veri gidecek ve o veriye hiçbir ESXI sunucu erişemeyecektir. Bu yüzden yıllarca geleneksel depolama dediğimiz filesystem VMFS ,NFS gibi tabirleri kullanılarak ESXI hostlarına bir depolama alanı sunulmuştur. Bu depolama alanları da her zaman bir storage unitesi ile beraber sunulmuştur. Çünkü storage ünitesi eş zamanlı birden fazla ESXI hosta bağlanabilir ve bu hostlar da bu alanları eş zamanlı okuyabilir ve yazabilirler. Host giderse o sanal makinelerin hiçbirine erişemezsiniz dedik yıllarca. vSAN’ın da aralarında bulunduğu yazılım tanımlı depolama çözümlerinin ortaya çıkmasıyla bu ezber bozulmuş oldu.

Artık sunucuların local diskleri diğer sunucuların local diskleriyle birleşerek ortak depolama alanı oluşturabilir duruma geldi. Yani artık üretim ortamı kurmak istediğimizde sunuculara ve depolamalar olarak bir platform kurmak yerine bir sunucunun hem sunucu hem de depolama olduğu bir mimariye geçebilir hale geldik. Bazı üreticiler bunu sadece bir yazılım olarak yaptılar, bazı üreticiler bunu hem yazılım hem donanımla birleştirilerek bir paket haline getirdiler. Bu yüzden de kullanılan iki tabir karşımıza çıktı. Biri SDS, diğer tabir ise Hyperconverged SDS. (Hyperconverged temelinde aynı olmakla beraber çözüm olarak birbirinden ayrılırlar. Örneğin vSAN bir SDS çözümdür.)

Hyperconverged çözümlerde; genel itibariyle bir üreticinin marka model sunucusu + sunmuş olduğu yazılım ile elde edilen bir tümleşik sistem bulunur. Üretici size yazılımı da donanımı da bir arada verir. Yani sunucuyu da sanallaştırma platformunu da bir arada verir ve size tümleşik bir sistem sunduğunu depolama ünitesi almanıza gerek kalmadığını, yani üçüncü bir çözüm olarak da depolamayı da sunduğunu söyler. Bunu bazı üreticiler donanımlar ile destekler bazı üreticiler de kullandıkları hypervizorleri üzerinde sanal makineler oluşturarak (controller vm, storage vm.. vb.) yaparlar. Sanal makineler bulundukları hostları temsilen yazılan bir veriyi diğer node a senkrron ederek aynı verinin diğer node üzerinde de bir kopyasının olmasını sağlarlar. Bu işlemi yaparken bazı üreticiler donanımla alakalı bağımlılıklara sahiptir, bazı üreticiler tümüyle yazılımla yaparlar. Bu temsilen hyperconverged tümleşik sisteminin örneğidir. VMware de tüm çözümlerini yazılım olarak dünyaya sunmaktadır. Bu yazılımlardan vSAN’ı inceleyelim.

Hoşgeldin vSAN ^_^

vSAN; Bir donanıma bağımlı olmadan, bir üreticiye bağımlı olmadan elde edilebilecek hem sunucu sanallaştırma hem depolama sanallaştırma mimarisini bize sunuyor. Bunu yaparken de sunucuların yerel disklerini kullanarak ortak bir depolama oluşturuyor.

Geleneksel mimari ile elimdeki 5 diski gruplayarak hem hata toleransı hem performans ihtiyaçlarına karşılık gelecek olan RAID yapısını oluşturmam gerekir. vSAN bize bu gruplamış olduğum disklerin hem performansı hem yedekliliği bir arada sunan ve bunu da geleneksel araçlardan kurtularak yapan bir nesne tabanlı bir depolama sunar. Burada obje kavramını iyi kavramak lazım. Örneğin sanal makinenin log dosyaları, hard diski, swap file ı, snapshotları bizim için bir objedir. Bizler bir sanal makine objesine dilediğimiz RAID politikasını soyleyerek istediğimiz korumayı , istediğimiz disk tipini söyleyebilir ve bunun yapılandırılmasını sağlayabiliriz. Bu işlem sırasında kullanılan disklerde hem bir sanal makinenin RAID5 diskine ait objesi dururken, hem de bambaşka bir sanal makinenin RAID1 objesine ait bir parça aynı diskin üzerinde durabilir. Yani geleneksel depolamada diskler korunurken ve dolayısıyla veri koruması böyle sağlanırken bizler artık vSAN’da disk koruması yapmak yerine diskin içerisindeki bir objeye/veriye politikalar vererek dilediğimiz konfigürasyonu sunabiliyoruz. Yani bizim için aslında diskler raw kapasiteyi oluşturuyorlar.

Vmware’in bizlere sunduğu kıymetli yetenekleri ( HA ve DRS gibi ) kullanmak için temel gereksinim ortak bir depolamadır. vSAN burada da hostların yerel diskleri birleşerek ortak bir depolama hizmeti sunması ile avantaj sağlamaktadır.

Geleneksel depolamada controller dediğimiz üniteler olur, bu controller ünitelerinin üzerinde cache ler ve ilgili sisteme eklemiş olduğunuz çekmeceler ve elde etmiş olduğunuz diskler yani kapasiteler bulunur. vSAN’a baktığımızda fiziksel sunucumuz bir storage ın ünitesi gibidir. vSAN üzerinde disk grup oluşturulur. Oluşturacağımız her bir disk grupta minimum 1 adet cache disk ve 1 adet minimum capasity disk barındırmak gerekir. Bu cache disk ya SSD ya da NVMe tarzda bir disk olacaktır. Çünkü RAM’e yakın, minimum letancy, maksimum i/o per second ile bir geleneksel depolaya karşın hizmet sunabilsinler. Capacity diskler ise sizin satın alacağınız mimariye , lisansa göre farklılık gösterebilirler. HDD ya da SSD/NVMe olabilir. Bu da karşımıza 2 farklı vSAN senaryosu çıkarmaktadır. Nedir bunlar?

Hybrid ve All-Flash.

Gelin vSAN’ın çalıştığı bu 2 mimariyi inceleyelim.

All-Flash: Cache in de kapasitenin de SSD ya da NVMe olduğu sistemdir.

Hybrid: Cache SSD ya da NVMe , capacity disklerin ise HDD olduğu mimaridir.

Cache de duran data ilgili disk grup ile ilgili temsilen veri barındırır. Dolayısıyla başka bir disk gruba replikası söz konusu değildir. Ayrıca bir disk grubunun içerisinde birden fazla cache eklenemez. Normalde geleneksel storage’da ne kadar çok disk, ne kadar çok cache o kadar performansken yeni nesil storage’da böyle değildir.

Kapasite ihtiyaçlarımıza göre disk gruplarımızın üzerine disk ilavesi yapabilir ya da disk gruplardan birden fazla oluşturabiliriz. Her bir disk grup içerisinde maksimum 7 tane disk barındırılabilir. Bunun dışında sunucu/host sayısını artırarakta kapasiteyi ve performansı arttırmak mümkündür. İşte burada sıklıkla duyduğumuz scale up , scale out büyüme karşımıza çıkıyor. İlk bahsettiğim disk grupları ile olan büyüme scale up büyümeye örnek iken node ekleyerek büyüme scale out büyümeye örnek olacaktır.

Piyasada tabir olarak kullanılan birkaç tane storage tipi bulunmaktadır.

1.Giriş seviyesi storageler
2.Orta seviye storageler
3.En yüksek seviye storageler

Giriş seviyesi storageların kabiliyetleri sınırlıdır. Ama orta ölçekli ve yüksek ölçekli diyebileceğimiz storagelar arasındaki fark controller sayısıdır.

Bir disk grubun bana sunacağı kapasite miktarını hesaplarken cache hesaba katılmaz. Mesela 5 hostumuz için 1 disk grubumuz olsun. Disk grubumuz içerisinde 2 capacity, 1 cache diski olsun. Her bir capacity disk 3 TB olsun. Bu durumda vSAN storage kapasitesi 3x2x5=30 TB olacaktır.

vSAN Cluster’lar disk yapılarına göre VMware’in izin verdiği en yüksek değerlere ulaşabilirler. vSAN cluster’ınız, tek bir cluster’da 64 ESXI sunucuya kadar büyüyebilir.

Buraya kadar iyilik sağlık : ) Şimdi biraz mola verelim. Serinin ilk yazısında geleneksel storage yapısından, yazılım tabanlı storage yapısından ve vSAN’dan genel anlamda bahsetmiş olduk. Serinin 2.yazısında vSAN Node Management üzerine konuşacağız.

Şimdilik hoşçakalın 🐸

NOT: Bu yazı serisini Ercan Ergen’den almış olduğum vSAN eğitimi notlarımdan derleyerek oluşturuyorum. Bu vesileyle kendisine bir teşekkürü borç bilirim.

ELK (Elasticsearch-Logstash-Kibana) Notlarım – 1

ELK, 3 ayrı open source yapının birleşmesiyle oluşmus yine open source bir hizmettir. Beats aracılığıyla loglar toplanarak Logstash aracımıza aktarılır. Burada loglar derlenir, yapılması istenilen şekle dönüştürülür. Bu logları indexleyerek aranabilir ve analiz edilebilir hale getirmek için ise Elasticsearch kullanılır. Tüm bu yapılan işlemleri ise Kibana arayüzü görselleştirir.

Bu yazı serisinde bu araçları tek tek incelemek istiyorum. Haydi Elasticsearch üzerine aldığım notlar ile başlayalım.

Elasticsearch

Uygulamalar üzerinden toplanan verilerin analizi ve içerik arama yapmamızı sağlayan bir arama motorudur. Elasticsearch tamamen Java dilinde yazılmıştır. Dağıtık mimariye sahiptir ve açık kaynak kodludur. Elasticsearch indexler üzerinden arama yaparak çok hızlı sonuçlar elde etmektedir. Bunun yanında sorgular üzerinde analizler , skorlamalar yapmaya da imkan tanır. Dağıtık ve yüksek ölçeklenebilir yapıda çalışabilir. Alternatiflerine göre çok az kaynak kullanarak çalışır. RestfullAPI desteği vardır.

ElasticSearch Kavramları

Indice: ElasticSearch aramaları “Indice” olarak adlandırılan indeks dosyaları üzerinden gerçekleştirilir.

Gelin Kibana arayüzünden Dev Tools alanına gidelim. Bu ekranda sorgu yazabilir, index oluşturabilir, arayabiliriz. Temel bir kaç komutu inceleyelim.

GET /_cat/nodes?help   % Elasticsearchteki yardım havuzuna gidebileceğimiz komut.
PUT       % İndex oluşturur.
GET       % Oluşturulan indexi görür.
POST      % İndex'i update eder.
DELETE    % İndexi siler.

Mapping: İndekslenen verilerin hangi veri tipinde olduğunun tanımlandığı işleme denir. Mapping’i aşağıdaki örnekteki gibi kullanabiliriz.

Bulk : Elasticsearch üzerinde indeksleme işlemi birkaç farklı yöntem ile yapılabilmektedir. Yukarıda yaptığımız gibi tek tek index oluşturubileceğimiz gibi birden fazla indexi tek seferde de girebiliriz. İşte bu indexleme türü Bulk İndexleme olarak adlandırılır.

NOT | Index ve Create Farkı: Index ve create ikisi de temelde insert işlemi yaparken aralarında bir fark vardır. Index ile yollanan istekte aynı Id’ye sahip başka bir document olsa bile onu replace eder. Create ise revize işlemi yapamaz, hata verir.

Request:
POST courses/_bulk
{"index": {"_id": "1"}}
{"course_name":"ansible", "duration": 20}
{"index": {"_id": "2"}}
{"course_name":"linux", "duration": 50}
{"index": {"_id": "3"}}
{"course_name":"openshift", "duration": 42}
{"index": {"_id": "4"}}
{"course_name":"PYTHON", "duration": 36}
{"create": {"_id": "5"}}
{"course_name":"vSAN", "duration": 30}

Analyzer: Elasticsearch’e yolladığınız dökümanlardan maksimum performans ve amaca hizmet edebilen bir search yapısı oluşturabilmek için bazı işlemler yapılması gerekir. Bu işlemlerin bütünü Analysis, işlemi yapan kısım ise Analyzer olarak adlandırılır. Yapılan analiz işlemleri aşağıdaki gibidir:

1. Karakter filtreleme ( Birebir girmiş olduğumuz metnin çıktısını almaktayız.)
2. Tokenizer ( Parçalara ayırarak çıktı verir. Soru işereti, ünlem, tire şeklinde karakterlerin dönüşünü yapmaz. )
3. Token filtreleme ( Tokenizer’dan farkı büyük harf küçük harf duyarlılığıdır. )

Query: Elasticsearch’te sorgu yapmak için kullanılır.

Query Tipleri:

  • URI Query: hızlı sorgu işlemlerinde kullanılır, karmaşık sorgular için uygun değildir.
  • DSL Query: okunması kolaydır, karmaşık sorgular için uygundur.
  • Leaf Query: Belirli bir alanla ilgili arama yapılmasını sağlar.
  • Compound Query: Birden fazla alanla ilgili arama yapılmasını sağlar.
Request:    % URI query example 
GET courses/_search?q=duration:42

DSL Query’de search için birtakım keywordler bulunmaktadır. Bunlardan bazıları şunlardır:

→ match: Birebir uyumlu olan alanı getirir.

Yukarıda bulk ile oluşturduğumuz index dizisinden dsl query ile sorgu yapmak istersek:

Request:   % DSL query + match example
GET courses/_search
{
  "query": {
    "match": {
       "course_name": "vSAN"
    }
  }
}

→ term: Bu metod tamamen küçük harfleri baz alır. Siz büyük harflerle yazsanız bile arka planda küçük harflere çevirerek arama yapar.

Request:    % DSL query + term example 
GET courses/_search
{
  "query": {
    "term": {
      "course_name":"python"
    }
  }
}

→ range: Bu metod belirtilen aralıklardaki alanları getirir.

Range ile kullanılabilecek operatörler şunlardır:
-gte: greater than equal to
-gt: 
greater than
-lte: 
less than equal to
-lt: 
less than

Request:   % range example
GET courses/_search
{
  "query": {
    "range": {
      "duration": {
        "gte":20,
        "lte":45
      }
    }
  }
}

→  Wilcard ve Prefix ile Query İşlemleri: Wilcard ve prefix arasındaki fark tamamen performans üzerinedir. Prefix’te ayarları belirtiyoruz, ona göre performansı yüksek tutuyor.

Request:   % wildcard example
GET courses/_search
{
  "query": {
    "wildcard": {
      "course_name": {
        "value": "ans?ble" 
    }
  }
}

Wilcard ile yaptığımız sorgu işlemini prefix ile yapalım. Aşağıdaki örnekte önce mapping işlemi yapıyorum ve ayarları belirtiyorum. İkinci request işleminde kitap ismini belirterek indexi update ediyorum. Son olarak üçüncü request’te prefix metoduyla indexte arama yapacağım. “min” ve “max” değerine göre sorgu yapacağı için value kısmında en az 2 harf belirtmemiz gerekir. 1 harf belirtirseniz hata alacaktır. Deneyebilirsiniz 🙂

% prefix example 
Request1:  
PUT test
{
  "mapping": {
    "properties": {
      "book": {
        "type": "test",
        "index_prefix": {
           "min_chars":2,
           "max_chars":5
        } 
      }
    }
  }
}

-----------------------------------------------------------------------------------

Request2:  
POST test/_doc/1
{
  "book":"satranc"
}

-----------------------------------------------------------------------------------

Request3:
GET test/_search
{
  "query": {
    "prefix": {
      "book": {
         "value": "sa"
      }
    }
  }
}

→ Sorting: Sıralama işlemlerinde kullanılır. SQL’den de bildiğimiz ASC ve DESC keywordlerini burada da kullanacağız. ASC ile indexleri artan sıraya göre, DESC ile ise tersten sıralama işlemi yapabiliriz. Basit bir sort işlemi aşağıdaki gibi olacaktır.

Request:   % sorting example
GET courses/_search
{
  "sort": [
    {
      "duration": {
        "order": "desc"
      }
    }
  ]
}
Answer:  % sorting example
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "courses",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : null,
        "_source" : {
          "course_name" : "linux",
          "duration" : 50
        },
        "sort" : [
          50
        ]
      },
      {
        "_index" : "courses",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : null,
        "_source" : {
          "course_name" : "openshift",
          "duration" : 42
        },
        "sort" : [
          42
        ]
      },
      {
        "_index" : "courses",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : null,
        "_source" : {
          "course_name" : "PYTHON",
          "duration" : 36
        },
        "sort" : [
          36
        ]
      },
      {
        "_index" : "courses",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : null,
        "_source" : {
          "course_name" : "vSAN",
          "duration" : 30
        },
        "sort" : [
          30
        ]
      },
      {
        "_index" : "courses",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : null,
        "_source" : {
          "course_name" : "ansible",
          "duration" : 20
        },
        "sort" : [
          20
        ]
      }
    ]
  }
}

→ Pagination: Çektiğimiz verileri sayfa sayfa listelemeye yarar. “from” ve “size” komutları ile bu işlem yapılabilmektedir. Yani daha önce courses olarak oluşturduğumuz veriden 2.indexten başlayıp 5 tanesini bize getir demek istersek aşağıdaki şekilde işlemi yapmamız gerekir.

Request:   % pagination example
GET courses/_search
{
  "from": 1
  , "size": 5
}

→ Fuzzy Query: Özelliği text alanı içerisindeki bir harfin yer değişimini veya eksikliğini otomatik olarak tamamlamasıdır.

Request:    % fuzzy query example
GET courses/_search
{
  "query": {
    "fuzzy": {
      "course_name": "ansi"
    }
  }
}

Bir başka örnek ile inceleyecek olursak,;

Kaç karakteri tamamlayacağını fuzziness komutuyla belirtebiliriz. Bunu dilersek auto olarak da seçip otomatik tamamlamasını söyleyebiliriz.

Request:    % fuzzy query example 2 
GET courses/_search
{
  "query": {
    "fuzzy": {
      "course_name": {
        "value": "lin", "fuzziness": 2
      }
    }
  }
}
Answer: % fuzzy query example 2 
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.46209806,
    "hits" : [
      {
        "_index" : "courses",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.46209806,
        "_source" : {
          "course_name" : "linux",
          "duration" : 50
        }
      }
    ]
  }
}

Aggregations: Verisetimizde ortalama, min, max ve toplama işlemlerini yapmaya imkan tanıyan arama şeklidir. Aşağıdaki görüntüdeki gibi eğitim sürelerinin ortalamalarını alabiliriz. Aynı şekilde “avg” yerine bu komutları ekleyerek diğer işlemleri de yaptırabilirsiniz.

-Avg: Ortalamasını alır.
-Min: Minimum değeri alır.
-Max: Maksimum değeri alır.
-Sum: Toplam değerini getirir.
-Stats: Avg, min, maxi sum bilgilerinin tamamını verir.

Example: Aggregation -Avg
Example: Aggregation – Stats

Yazı serisinin devamında Lostash ve Kibana üzerine konuşacağız. Bugünlük müessesemizden bu kadar : )

Elasticsearch ile alakalı takip ettiğim eğitim serilerinin de linklerini buraya bırakıyorum.

https://www.elastic.co/training/elasticsearch-engineer
https://www.youtube.com/playlist?list=PLFzFX4nf_25zFjWqEjReoS07U4ic0VuZO

Kolaylıklar 🐸

Ansible Notlarım

Bugün sizler ile PluralSight platformundan almış olduğun Getting Started with Ansible notlarımı paylaşacağım.

Ansible, manuel olarak yaptığınız işleri otomatize etmenizi sağlayan bir otomasyon tool’udur. Birçok modülü sayesinde network cihazlarınızdan bulut ortamlarına kadar kullandığınız sunuculara geniş kapsamlı otomasyon hizmeti sunmanızı sağlar.

Ansible’ın temel yapısını incelemek istersek;

Control Node: Ansible’ın kurulu olduğu makinedir. Bu makine üzerinden ansible komutlarını, playbook’larını çalıştırabiliriz.

Managed Nodes: Ansible tarafından yönetilen makinelerdir. Örneğin bir playbook’un uygulanmasını istediğimiz hostumuz bu yapıdaki managed node olacaktır.

Ayrıca Ansible ile çalışmaya başladığımızda sıklıkla duymaya başlayacağımız terimlerden de bahsetmek istiyorum.

Modules: Ansible’ın farklı görevler için oluşturulmuş kod kümeleridir. Ansible’ın zengin bir modül kütüphanesi bulunmaktadır.

Inventory: Ansible komutlarının uygulandığı hostların tamamını kapsayan envanter diyebiliriz.

Playbooks: Otomasyon ile yapılacak görevlerin toplandığı dosyadır. YAML formatındadır. Mesela envaterdeki tüm sunuculara remote bağlantı sağlayıp backup scriptini başlat şekilinde bir playbook’umuz olabilir. Ad-hoc komutlarını YAML formatına dönüştürerek kolaylıkla playbook oluşturabiliriz.

Temel kavramlar üzerine durduktan sonra biraz pratik yaparak öğrendiklerimizi pekiştirelim istiyorum. Öncelikle test ortamımıza Ansible kurulumu yapmamız gerekiyor. Birçok farklı şekilde Ansible kurulumu yapabilirsiniz. Detaylı dökümanın linkini de bırakıyorum.

Benim gerçekleştireceğim örnek ile aşağıdaki adımları yapıyor olacağız.
1. İlk olarak test sunucumuzda podman kurulumu yapıp ardından üzerinde Ansible AWX container’ı ayağa kaldıracağız
2. Daha sonrasında ise Ad-hoc komutları ile Ansible modüllerini kullanacağız.
3. Komutlar ile yaptığımız çalışmayı playbook dosyası haline getireceğiz ve playbook dosyasını çalıştıracağız.

Öyleyse başlayalım.

1. Podman + Ansible AWX Kurulumu

Bu aşamada Zeynep Rümeysa Yorulmaz tarafından kaleme alınmış “Podman Nedir?” yazısından yararlandım. Açıklayıcı paylaşımından dolayı kendisini tebrik ederim. Merak edenler için yazının linkini buraya bırakıyorum. 🙂

Ubuntu 22.04 OS versionuna sahip test sunucumuza podman paketlerini yükleyelim.

sudo apt install podman

Eğer ki sisteminizde Kubic proje deposu ekli değilse öncesinde onu da eklemeniz gerekiyor. Detayları Podman Nedir? yazısında belirtilmiş.

Kurulumdan sonra podman hakkında detayları ve mevcut podman versiyon bilgisini aşağıdaki komutlar ile görebilirsiniz.

podman info
podman -version

Red Hat’in bir ürünü olan Quay.io image registry tool’unu kullanarak Ansible AWX image ını localimize çekeceğiz.

podman login quay.io      % Quay.io hesabına login olunur.
podman pull quay.io/ansible/awx-ee    % İmajı kendi localimize alalım. 
podman images   % İndirilen imajları listeleyelim.
podman run -dt quay.io/ansible/awx-ee   % Ansible AWX imajımızı çalıştıralım.
podman ps -a  % Çalışan imajlarımızı listeleyerek Ansible AWX imajının ContainerID'sini öğrenelim.
podman exec -it <ContainerID> /bin/bash   % Ansible AWX Container ID'si yazılarak container'a bağlanalım.

Artık Ansible AWX container’ına bağlandık ve diğer adımları gerçekleştirebiliriz.

2.Ad-Hoc Komutları ile Ansible Modül Kullanımı

Ad-hoc komutları absible’ı komut satırı olarak çalıştırmamızı sağlarlar. Tek seferde tek bir görevi yerine getirir.

Ad-hoc komutlarının yapısı şu şekildedir:

Gelin dosya kopyalama işlemi için Ad-hoc komutunu kullanalım.

ansible -m copy -a "src=/runner/example.txt dest=/runner/examplecopy.txt" localhost

Komutun çıktısı aşağıdaki gibi olacaktır. Farkettiyseniz changed : true olarak belirtilmiş. Aynı komutu tekrar çalıştırırsanız komut çalışacak ancak changed: false olarak gelecektir. Yani dosyada değişiklik olmadan kopyalamış olacaktır.

3. Playbook Oluşturma

Şimdi de ad-hoc ile yaptığımız kopyalama işlemini playbook oluşturarak yapalım.

bash-4.4$ vi playbook.yml

---

- name: copy a file
  hosts: localhost
  tasks:
  - copy:
      src: /runner/example.txt
      dest: /runner/examplecopy.txt

Oluşturduğumuz YAML formatındaki dosyamınızı ansible-playbook komutu ile çalıştıracağız.

ansible-playbook playbook.yml

Bu basit örnek ile temel kavramları öğrendiğimizi düşünüyorum. Eğitimden yakaladığım diğer notları bir başka yazıda devam edeceğim.

Şimdilik hoşçakalın 🙂