Bu dökümanda Ubuntu 16.04 Xenial dağıtımı üzerinde en basit ve temel şekilde Ceph Storage Kurulumunu anlatacağız. Kurulum sırasında Ceph’in Jewel sürümünü kullanacağız., bu dökümanda anlatılan teknikleri Ceph’in diğer sürümlerinin kurulumu için rahatlıkla kullanabilirsiniz. Kurulum yapılırken kurulumu yapacak kişinin genel Ceph kavram, konseptini bildiği ve yine iyi seviyede Linux bilgisine sahip olduğu kabul edilir.

Ceph Nedir?

Ceph esnek ve ölçeklenebilir yapıda Özgür Yazılım temelli, farklı tiplerdeki veriyi saklamak üzerine tasarlanmış, maliyet efektif bir çözümdür. Ceph’in en temel özellikleri

  • Mimari tasarımı ile kurumların saklama alanı yatırımlarındaki kurulum ve işletme maliyetlerini(capex, opex) düşük seviyelerde tutmaktadır.
  • Esnek ve ölçeklenebilir bir yapıya sahiptir.
  • Blok, Obje ve Dosya Saklama Çözümünü tek bir noktadan tek bir çözümle sunar
  • Standard x86/Arm sunucular üzerinde çalışır, kapasite ve performans artışı için Ceph kümesine yeni bir sunucu eklemeniz yeterlidir.
  • Büyük verileri saklayan, veri miktarı sürekli artan, veri üzerinde aktif işlem yapan, arşivleme işlemi yapan kurum ve kuruluşlar için idealdir.
  • Exabyte seviyesindeki verileri çok rahat ve güvenli bir şekilde yönetebilmektedir.

Gerekli Donanımlar ve Kurulum:

Kurulum toplam 9 adet sanal sunucu üzerinde yapılacaktır. Bu kadar sunucu kurmak istemezseniz siz daha az sunucu ile de kurulumu tamamlayabilirsiniz(Örnek olarak tek bir monitör sunucu kullanma, daha az sayıda osd sunucusu kullanma gibi). Bu sunucular network altyapısı olarak aynı network üzerinde olmalıdır. Kurulum için aşağıda belirtilen donanımlar genel test ortamı kurmak için gerekli olan donanımlardır, üretim ortamlarının tasarımı ve kurulumu ayrıca bir tasarım ve mühendislik çalışması gerektirir.

Kurulum sırasında monxx1, monxx2, monxx3 (Ceph Monitör Sunucuları 1 Core, 700 Mb Ram, OS Disk) osdxx1, osdxx2, osdxx3, osdxx4, osdxx5 (Ceph Object Storage Server 2 Core, 3 Gb Ram, OS Disk, 2x 40GB Data Disk, 4 GB Journal Disk) rgwxx1 (Rados GW Sunucusu 1 Core 700 Mb Ram, OS Disk) mdsxx1 (Ceph Metadata Sunucusu 1 Core 700 Mb Ram, OS Disk)

Kurulumu üzerinde SSD disk olan bir notebook hypervisor (sunucunun adı fabrika) üzerinde yapılmıştır, kurulum için standard Ubuntu Xenial x64 16.04.3 kullanılmıştır, sunucular KVM sanallaştırma teknolojisi üzerinde çalışmaktadır.

Ceph test ortamında kullanılan sunucular

Ceph kurulumu için Ceph-Deploy tekniğini kullanacağımız için Ceph ile yukarıda listesi olan  tüm sunucular için aşağıdaki adımlar uygulanmıştır.

  1. Sunuculara statik ip verilmiştir
  2. Kurulum yapacağımız Ceph Sürümüne göre(Örnek: Hammer, Jewel, Luminous) ilgili repo eklenmiştir.
  3. Ceph paketleri kurulumu yapılmıştır
  4. Ceph-deploy tipinde kurulum için kullandığımız cephdeploy kullanıcısı tüm sunucular üzerinde yaratılmış ve ilgili ayarlamalar yapılmıştır.
  5. Ceph Deploy için kullanılacak ssh key’i için admin node olarak kullanacağınız sunucudaki kendi ssh genel anahtarınızı girmeniz gereklidir.
#!/bin/sh

#http://ceph.com/install/
#http://docs.ceph.com/docs/master/start/quick-start-preflight/#advanced-package-tool-apt

echo "Starting Ceph Preflight, Fasten Your Seat Belt"

ceph_release=jewel
#ceph_release=luminous

#Enable Ceph Repo
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -
echo deb https://download.ceph.com/debian-${ceph_release}/ $(lsb_release -sc) main > /etc/apt/sources.list.d/ceph.list

apt update

#Ceph Package Install
echo "Installing Ceph Packages"
apt -y install ceph
echo
dpkg -l | grep ceph
dpkg -l | grep -v grep | grep ceph | wc -l

#Ceph Deploy Setup
useradd -d /home/cephdeploy -m -s /bin/bash cephdeploy
echo "cephdeploy ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/cephdeploy
chmod 0440 /etc/sudoers.d/cephdeploy

#Inject fabrika's Public SSH Key
mkdir /home/cephdeploy/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2mYZtPiILyo1L9Ojf/JOlV57PUtFkzMhJ32dcdc+s+3ff2ssffXEhP2e/LBWz9rWXIjZhd5iOn0Miv6tdO1KajYcq2ArhOl8MJ9/H58mwsIhAfO5FrZByHjXCynSc5oAipkHv3TiFAR+yf0d9nfP1jNTFgFZNzcQ/PAPUl7L9MjKdtOWrPzF/Qxz1HPBzVfMFubrEhX1dUiW2zyCUFJlKWUquuZQsCWVzLH0mNhn7FhfgDj2aMz7goEj2LsBEgBH2xpx0fjpLixGsb0jN7EKDC/nrYy1Qfm08CLGQ7sRxZUvEpzPP6IzgTlrlwOi6M1n4ltl/gL6fVYcnU8QBtfiD root@fabrika" >> /home/cephdeploy/.ssh/authorized_keys
chown -R cephdeploy:cephdeploy /home/cephdeploy/.ssh
chmod 700 /home/cephdeploy/.ssh
chmod 600 /home/cephdeploy/.ssh/authorized_keys

Ceph Deploy Hakkında Detaylı Bilgi için: http://docs.ceph.com/docs/master/start/

Yukarıdaki kurulum tüm sunucularda yapıldıktan sonra admin node olarak kullanılacak sunucunun Ceph node’larını isim ile çözebilmesi gereklidir, bunun için ilgili sunucuların ip adresleri /etc/hosts sunucusuna girilebilir veya benim kullandığım gibi bir DNS sunucu ile işi çözebilirsiniz.

Kurulum başarılı şekilde tamamlandıysa tüm sunucularda aşağıdaki şekilde Ceph paketlerinin sürümlerini gösteren bir çıktı almanız gereklidir.

Tüm sunucularda Ceph paket sürümlerinin kontrolü

Bu adımdan sonra kullanacağınız admin node’dan Ceph kurulumuna başlayabiliriz.

Ceph Monitör Sunucuları Üzerinde Ceph Cluster’ın Ayağa Kaldırılması

Ceph Admin Node Sunucuna girerek öncelikle Ceph Deploy işlemi için kullanacağımız bir klasör yaratıyoruz ve tüm çalışmamızı bu klasörün içinde yapıyoruz, burada dikkat edilmesi gereken Ceph Deploy ile ilgili vereceğimiz ilerideki tüm komutlarda bu klasörün içinde olmamamız gerekliliğidir.

mkdir ceph-deploy
cd ceph-deploy
ceph-deploy new monxx1 monxx2 monxx3

Bu adımdan sonra Ceph cluster için kullanacağımız örnek keyring ve ayar dosyaları bu klasörün içinde yer almaktadır. Şimdi Ceph Journal Partition’larının test amaçlı küçük boyutta yaratılması için aşağıdaki parametreleri yeni oluşan ceph.conf dosyası içine en alt kısma girmemiz gerekmektedir.

[osd]
osd_journal_size = 2000

Bu adımdan sonra artık Ceph Cluster’ı aşağıdaki komutla yaratıyoruz.

ceph-deploy mon create-initial

Bu işlemden sonra Cluster Quorum’un oluştuğunu görmek için monitör sunucularından birine ssh ile bağlanıp ceph -w komutunu kullanabiliriz. Şu anda Cluster’ın Error State’de olması normal çünkü Cluster’a bağlı herhangi bir Object Storage Server aktif edilmemiştir. Burada dikkat ederseniz 3 monitör sunucusu arasında Cluster Quorum kurulmuş durumdadır.

Ceph Cluster’ın ayağa kaldırılması

OSD Sunucuların Aktif Edilmesi

Ceph için monitör sunucuları ile cluster oluşturulduktan sonra sıra verilerin saklanacağı sunucuları Ceph’e dahil etmeye geldi, bunun için yine ceph deploy komutu ile ilgili sunucular Ceph’e bağlanmalıdır. Örnek test  kurulumunda Ceph OSD Sunucularında 3 adet disk vardır, 2 disk (vdc, vdd) dataların saklanması için diğer disk ise journal diski (vdb) için kullanılmaktadır. Burada performans açısından Journal Diski için ayrı bir disk kullanılmıştır, bu şekilde genel Ceph disk performansı arttırılmaktadır.

OSD sunucularının Ceph Cluster’ına dahil edilmesi için aşağıdaki komutlar kullanılmıştır.

ceph-deploy osd create osdxx1:vdc:vdb
ceph-deploy osd create osdxx1:vdd:vdb

ceph-deploy osd create osdxx2:vdc:vdb
ceph-deploy osd create osdxx2:vdd:vdb

ceph-deploy osd create osdxx3:vdc:vdb
ceph-deploy osd create osdxx3:vdd:vdb

ceph-deploy osd create osdxx4:vdc:vdb
ceph-deploy osd create osdxx4:vdd:vdb

ceph-deploy osd create osdxx5:vdc:vdb
ceph-deploy osd create osdxx5:vdd:vdb

Yukarıdaki komutlardan sonra Ceph ortamımız Error durumundan Warning durumuna geçtiğini görebilirsiniz. Warning State’e geçmesi normal bir durum çünkü kurulum sırasında gelen rbd pool’u 64 adet placement group’dan oluştuğu için her bir OSD başına düşmesi gereken placement group değerinden çok aşağıda bir değer oluşmuştur. İleride yeni pool’lar yarattığımız zaman cluster OK state’ine geçecektir.

Ceph Data Disklerinin Bağlanması

Aynı şekilde ceph osd tree komutu ile Ceph’in disklerinin up olduğunu görebiliriz.

Ceph Storage Disklerinin Görüntülenmesi

Şu anda 5 adet OSD sunucusundan oluşan ve 399 GB raw kapasiteye sahip bir saklama alanına sahibiz.

Ceph Pool Yaratma İşlemleri

Ceph üzerinde 2 ayrı tipte data storage pool (veri saklama havuzu) kullanılabilmektedir. Her iki pool’un kullanım amacı ve sunduğu performans birbirinden farklıdır.

Ceph Replicated Pool Yaratma

Replicated Pool ilgili data bloklarının (placement group) arka tarafta belirtilen kopya sayısı kadar farklı diske, sunucuya veya kabinete kopyalanması mantığı ile çalışmaktadır. Burada ilgili kopyalamanın hangi node’a yapılacağı CRUSH algoritması ile belirlenir ve burada failure domain kavramı dikkate alınır.

Aşağıdaki komut ile 128 placement group’a sahip bir replicated pool yaratılabilir.

Replicated Pool Yaratma

Erasure Coded Pool Yaratma

Erasure Coded Pool’lar Raid mantığına benzer bir yapıda çalışan veri saklama ve erişim tekniğindir, Erasure Coding genel olarak dataları küçük parçalara ayırıp, encode eden ve dağıtık yapıda saklayan bir veri saklama ve erişim tekniğidir. Erasure Coded Pool’lar genelde cold storage ve fazla erişim yapılmayan maliyet efektif medya saklama sistemleri için kullanılabilinir. Erasure Coded Pool’lar replicated pool’lara göre daha az disk kapasitesi kullanmanın yanında daha yüksek miktarda cpu kullanırlar.

Erasure Coded Pool’lar n = k + m hesaplaması ile çalışmaktadır. Burada k değeri gelen datanın kaç parçaya bölüneceği, m değeri ise veri bütünlüğünü sağlamak için orjinal dataya, parçalara eklenen data kodlarıdır, bu m değerine güvenilirlik düzeyi de diyebiliriz. n değeri ise erasure coding işleminden sonra oluşan parça sayısıdır. Burada recovery için en fazla m adet veri parçacığının(data chunk) kaybolmasına izin verilir, eğer m kadar veri parçacığı kaybolduysa veri kaybı oluşur.

Burada r=k/n hesaplaması ile encoding rate değerine oradan da veri saklamak için gereken disk alanına 1/r hesabı ile ulaşabiliriz.

Aşağıda basit bir örnek verecek olursak:

(3,5) Erasure Coded Pool için

Erasure Coding Hesabı: N=5, K=3, M=2, bu hesaptan 2 adet kodlanmış parça her 3 veri parçasına eklenecek ve her data toplam 5 parça olarak dağıtık şekilde storage üzerinde saklanacak. Burada orginal datayı oluşturmak için bu 5 adet parçadan herhangi bir 3 adedine erişmemiz veriyi oluşturmamız için yeterli olacaktır, buradan sistemde 2 adet parça kaybedene kadar sıkıntı yaşamayacağımızı çıkartabiliriz.

Encoding Oranı => 3/5 = 0.6

Disk alanı ihtiyacı => 1 / 0.6 = 1.6 (Orginal dosyanın 1.6 katı saklama alanı gerekir, Örnek olarak 1 GB’lık veriyi saklamak için 1.6 GB disk alanına ihtiyaç duyulmaktadır)

(10,16) Erasure Coded Pool için

N=16, K=10, M=6

Encoding Oranı => 10 /16 = 0.625 < 1

Disk alanı ihtiyacı => 1 / 0.625 = 1.6  (Burada sistemde datanın tekrardan oluşturulması için toplam 16 parçadan 10 tanesinin erişilmesi yeterdir, 6 adet parça kaybedinceye kadar veri kaybı yaşanmaz, tabii ki unutmamak gerekirki M miktarının arttırılması CPU kullanımını ciddi miktarda arttırmaktadır)

Örnek Erasure Coded Pool aşağıdaki komutlarla yaratılır

#Örnek EC Profile yaratma
ceph osd erasure-code-profile set EC-deneme-profile
#Mevcut EC Profillerini listeleme 
ceph osd erasure-code-profile ls
#Yaratılan yeni EC Profile'ın detaylarını görüntüleme
ceph osd erasure-code-profile get EC-deneme-profile

----

#EC Profilinin Özelleştirilmesi
#k=4 m=2 özellikleri için EC profilini güncelleme
ceph osd erasure-code-profile set EC-deneme-profile ruleset-failure-domain=osd k=4 m=2 --force
#Guncellenmiş profili görüntülemek için
ceph osd erasure-code-profile get EC-deneme-profile
#EC pool yaratma
ceph osd pool create ECdenemepool 128 128 erasure EC-deneme-profile
#Mevcut Pool'ları listeleme
ceph osd lspools
#Mevcut erasure coded pool'ların özelliklerinin listelenmesi
ceph osd dump | grep -i erasure
Erasure Coded Pool Yaratma İşlemleri

Ceph FS Kurulumu

Cephfs genel olarak POSIX yapıda olan ve Linux sunuculardan mount edilen bir dosya sistemidir. CephFS’in çalışması için bir metadata sunucuya ihtiyaç bulunmaktadır. Ceph Jewel sürümü ile beraber CephFS kararlı bir yapıya gelmiş, Ceph Luminous sürümü ile beraber birden fazla metadata sunucusu kullanımı, metadata’nın fragmente yapılabilmesi ve metadata’daki bazı dalların pin edilmesi gibi üstün özellikler gelmiştir ve üretim ortamlarında kullanılabilmesi için tüm gereksinimler sağlanmıştır.

Cephfs konusunda detaylı bilgi için: http://docs.ceph.com/docs/master/cephfs/

Öncelikle ceph-deploy tekniği ile Ceph metadata sunucusu kurulumunu yapalım, ilgili kurulumu mdsxx1 sunucusu üzerine yapacağız. Kurulum için aşağıdaki komut kullanılır:

ceph-deploy mds create mdsxx1

İlgili işlem sonrası ceph mds stat komutu ile mds sunucusunun durumuna baktığımızda ilgili daemon’un çalıştığı ve standby konumda beklediğini görebiliriz.

Metadata sunucusu kurulduktan sonra monitör sunucularından herhangi birine bağlanılarak Cephfs için gerekli metadata ve data pool’larını yaratmalıyız.

ceph osd pool create cephfs_data 128
ceph osd pool create cephfs_metadata 128

Daha sonra aşağıda yer alan komut ile cephfs_metadata ve cephfs_data pool’larını kullanan mycephfs isimli bir filesystem yaratmış oluyoruz.

ceph fs new mycephfs cephfs_metadata cephfs_data
ceph fs ls
Cephfs dosya sisteminin yaratılması

Şu anda mycephfs isimli bir dosya sistemini Ceph üzerinde yaratmış olduk, bu adımdan sonra yapmamız gereken bu filesystem’i bir makinadan mount etmek olacaktır. Burada dikkat edilmesi gereken konu mount edilecek sunucuda ceph-fs-common paketinin Ceph sunucusu ile aynı sürümde olacak şekilde ilgili sunucuya yüklenmesi gerekmektedir. Bu şekilde “mount -t ceph” komutu ile yeni yarattığımız mycephfs dosya sistemini mount edebiliriz.

Bu işlemlere geçmeden önce ceph yetkilendirme sistemi üzerinden bu filesystem için sadece ilgili filesystem’e erişebilecek yeni bir yetki tanımı yapabilirsiniz veya aşağıdaki örnekte olduğu gibi admin keyring’i kullanabilirsiniz. Burada biz kolaylık olması açısından admin keyring’i kullanıyoruz.

admin keyring oluşturma

Daha sonra fabrika sunucusuna geçilerek yarattığımız Cephfs dosya sistemi mount edilir.

Cephfs dosya sisteminin mount edilmesi

İlgili işlemler sırasında kullanılan komutlar aşağıdaki gibidir:

root@monxx1:~# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
	key = AQAFtB1axWgjBxAAmVEf2Yugx7TO/husbuBcrg==
root@monxx1:~# cat /etc/ceph/ceph.client.admin.keyring | grep "key =" | awk {'print $3'} > admin.secret
root@monxx1:~# cat admin.secret
AQAFtB1axWgjBxAAmVEf2Yugx7TO/husbuBcrg==
root@monxx1:~# scp admin.secret root@fabrika:/root/Ceph5

----

root@fabrika:~/Ceph5# cat admin.secret
AQAFtB1axWgjBxAAmVEf2Yugx7TO/husbuBcrg==
root@fabrika:~/Ceph5# mount -t ceph monxx1:6789,monxx2:6789,monxx3:6789:/ /mnt/ -o name=admin,secretfile=/root/Ceph5/admin.secret
root@fabrika:~/Ceph5# df -h
Filesystem                                                     Size  Used Avail Use% Mounted on
udev                                                            32G     0   32G   0% /dev
tmpfs                                                          6.3G   18M  6.3G   1% /run
/dev/sda2                                                      872G  249G  581G  30% /
tmpfs                                                           32G     0   32G   0% /dev/shm
tmpfs                                                          5.0M     0  5.0M   0% /run/lock
tmpfs                                                           32G     0   32G   0% /sys/fs/cgroup
/dev/nvme1n1p1                                                 118G  104M  112G   1% /vm1
/dev/nvme0n1p1                                                 118G   60M  112G   1% /vm0
/dev/sda1                                                      511M  3.4M  508M   1% /boot/efi
cgmfs                                                          100K     0  100K   0% /run/cgmanager/fs
tmpfs                                                          6.3G     0  6.3G   0% /run/user/0
192.168.99.211:6789,192.168.99.212:6789,192.168.99.213:6789:/  400G  352M  400G   1% /mnt
root@fabrika:~/Ceph5#

İlgili mount işlemini NFS gibi birden çok sunucu üzerinden kolaylıkla mount edebiliriz.

Hazır bir qcow imajının Ceph Storage’a aktarılması

Bu işlemin amacı KVM sanallaştırma için kullanılan hazır bir qcow2 imajını Ceph Storage’a aktarmaktır. Burada test için kullandığımız sunucuların disklerin boyutları çok küçük olduğu için elimizdeki örnek bir ubuntu14.04 qcow imajını öncelikle cephfs için kurduğumuz ortak disk alanına aktarıp ondan sonra monitör sunucuların birisinin üstünde rbd import komutu ile daha önceden yaratmış olduğumuz Ceph replicated pool’una aktaracağız. Bu şekilde Ceph’den bir imajın import veya export edilmesini öğreneceğiz.

#Öncelikle qcow2 formatındaki disk imajı Ceph'e aktarmak için raw formatına çevrilmelidir
qemu-img convert -f qcow2 -O raw ubuntu1404.qcow2 /mnt/ubuntu1404.raw
#rbd komutu ile ilgili raw imaj replicated pool'a aktarılır, işlem raw imajın boyutuna göre 5-10 dakika sürebilir
rbd --image-format 2 import /mnt/ubuntu1404.raw replicated-test-pool/testimg
#Imajın pool içinde listeleyelim
rbd -p replicated-test-pool ls
#rbd info ile Ceph'e attığımız imajın detaylarına bakalım
rbd info replicated-test-pool/testimg

Ceph’in içine aktardığımız imajı http://docs.ceph.com/docs/giant/rbd/libvirt/ adresindeki yöntemlerden birini kullanarak kolaylıkla KVM üzerinde vm olarak açabilirsiniz.

Bu dokümanda, makalede yazan komutları, çözümleri uygulamak tamamen kullanıcının kendi sorumluluğunda ve insiyatifin de olan bir konudur, mevcut komutların uygulanması ile doğabilecek, oluşabilecek her türlü sorumluluk ve sonuçlar kullanıcının kendisine aittir, CloudEOS’ un bu konuda herhangi bir sorumluluğu bulunmamaktadır.

17 Paylaşımlar