Ceph Object Storage Kurulumu
Ceph; blok depolama, nesne tabanlı depolama ve dosya sistemi türündeki depolama ihtiyaçlarını tek bir platform üzerinden sağlayan bütünleşik bir çözümdür. Bu yazıda mevcut bir Ceph kümesine “object storage” servisinin eklenmesi ele alınacaktır.
Object Storage Servisi Hakkında
Ceph üzerinde “object storage” servisi Rados gateway sunucuları ile sağlanmaktadır. Yeni Ceph sürümlerinde “Rados Gateway – RGW” terimi yerini “Ceph Object Gateway”e bırakmıştır. Her ne kadar daha öncesinde RadosGW olarak anılsa da, bu yazıda da terminolojide farklılık olmaması açısından “Ceph Object Gateway – Object GW” kullanılacaktır.
“Object storage” servisi, ön tarafta çalışan, REST tabanlı, Amazon S3 ve OpenStack Swift API ile uyumlu Object GW sunucularından meydana gelmektedir. Object GW üzerinde çalışan web sunucusu, API üzerinden istekleri karşılayarak librados kütüphanesi kullanarak alt katmanda yer alan nesnelere erişmektedir. Aynı kullanıcıya ait erişim bilgileri ile hem S3, hem de Swift API üzerinden aynı alandaki objelere erişmek mümkündür. Amazon S3 literatüründe “bucket” olarak kullanılan terim OpenStack Swift tarafında “container” kavramına karşılık gelmektedir.
Object GW sunucuları monitör sunucular üzerinde çalışabileceği gibi istenmesi halinde farklı sunucularda da yer alabilir. Ceph aksi belirtilmediği sürece varsayılan olarak C/C++ tabanlı Civetweb sunucusunu kullanmaktadır. İhtiyaç halinde Apache ile kullanılmak üzere de yapılandırılabilmektedir. Bu yazıda Object GW sunucularının monitör sunucularda Civetweb ile çalışacak şekilde kurulumu anlatılacaktır. Birden fazla monitör sunucusunda kurulum yapıldığı için ön tarafta trafiği karşılayan bir “load balancer” tanımlanmalı, her Object GW sunucusu bu “load balancer”a ait havuza eklenmelidir. Böylece hem gelen yük dengelenecek, hem de sunuculardan birisi devre dışı kaldığında yedeklilik sağlanmış olacaktır.
Object Storage Servisinin Eklenmesi
Öncelikle Ceph kurulumunda kullanılan ve sistem tarafından rezerv edilen “ceph” kullanıcısından farklı olması gereken kullanıcıya geçiş yapılması ve kurulum sürecinde oluşturulan keyring ve konfigürasyon dosyalarının olduğu dizine geçilmesi gerekmektedir. Bu örnekte “ceph-admin” kullanıcısı baz alınmıştır.
1 2 |
su - ceph-admin cd config |
Bu dizin içerisinde kurulum esnasında kullanılan ceph.conf dosyası ve oluşturulan keyring dosyaları bulunmalıdır.
Daha sonra istenilen sürüm baz alınarak Object GW sunucusuna ait paketlerin ilgili sunuculara eklenmesi gerekmektedir.
1 |
ceph-deploy install --release luminous --rgw testmon01 testmon02 testmon03 |
Örnekte monitör sunucularının üçüne de ilgili paketlerin kurulması sağlanmıştır. Ardından bu paketlerde yer alan civetweb kullanılarak Object GW servisinin oluşturulması ve başlatılması için aşağıdaki komutun çalıştırılması gerekmektedir.
1 |
ceph-deploy rgw create testmon01 testmon02 testmon03 |
Ardından ilgili servise ait istenilen parametreler ceph.conf dosyası içerisinde değiştirilmelidir. Örneğin varsayılan olarak 7480 portunda çalışan web hizmetinin 80 portunda çalışması için aşağıdaki tanımların eklenmesi gerekir.
1 2 3 4 5 6 7 8 9 10 11 |
[client.rgw.testmon01] host = testmon01 rgw_frontends = "civetweb port=80" [client.rgw.testmon02] host = testmon02 rgw_frontends = "civetweb port=80" [client.rgw.testmon03] host = testmon03 rgw_frontends = "civetweb port=80" |
Eğer SSL üzerinden servis verilmek istenirse geçerli bir sertifika yolu belirtilmelidir. Sertifika dosyasının içeriğinde sunucuya ait private key, alan adına ait sertifika ve sertifika otoritesine ait root ve CA sertifikaları bulunmalıdır. Örnek bir SSL yapılandırması aşağıdaki gibi olmalıdır.
1 2 3 4 5 6 7 8 9 10 11 |
[client.rgw.testmon01] host = testmon01 rgw_frontends = "civetweb port=443s ssl_certificate=/etc/ssl/private/tr-ist-test.storage.uyumsoft.com/tr-ist-test.storage.uyumsoft.com.pem" [client.rgw.testmon03] host = testmon02 rgw_frontends = "civetweb port=443s ssl_certificate=/etc/ssl/private/tr-ist-test.storage.uyumsoft.com/tr-ist-test.storage.uyumsoft.com.pem" [client.rgw.testmon03] host = testmon03 rgw_frontends = "civetweb port=443s ssl_certificate=/etc/ssl/private/tr-ist-test.storage.uyumsoft.com/tr-ist-test.storage.uyumsoft.com.pem" |
Bunun dışında S3 API kullanıldığında ilgili “bucket”lara subdomain olarak erişmek için aşağıdaki tanımların eklenmesi gerekmektedir. Örneğin test isimli bir “bucket”a “test.domain.com” adresi ile doğrudan erişmek için konfigürasyona “dns name” tanımı eklenmelidir. Tutulan günlük dosyaları için bir yol tanımı da eklemek de mümkündür.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[client.rgw.testmon01] host = testmon01 rgw_frontends = "civetweb port=443s ssl_certificate=/etc/ssl/private/tr-ist-test.storage.uyumsoft.com/tr-ist-test.storage.uyumsoft.com.pem" rgw dns name = tr-ist-test.storage.uyumsoft.com log file = /var/log/radosgw/client.radosgw.testmon01.log [client.rgw.testmon02] host = testmon02 rgw_frontends = "civetweb port=443s ssl_certificate=/etc/ssl/private/tr-ist-test.storage.uyumsoft.com/tr-ist-test.storage.uyumsoft.com.pem" rgw dns name = tr-ist-test.storage.uyumsoft.com log file = /var/log/radosgw/client.radosgw.testmon02.log [client.rgw.testmon03] host = testmon03 rgw_frontends = "civetweb port=443s ssl_certificate=/etc/ssl/private/tr-ist-test.storage.uyumsoft.com/tr-ist-test.storage.uyumsoft.com.pem" rgw dns name = tr-ist-test.storage.uyumsoft.com log file = /var/log/radosgw/client.radosgw.testmon03.log |
S3 bucket subdomain erişimi için ayrıca ilgili alan adı için wildcard bir DNS tanımı yapılmalı, bu adres Object GW sunucularının çalıştığı havuza ait load balancer VIP adresi olmalıdır.
Benzer şekilde OpenStack entegrasyonu için bazı tanımlar yapılabilir ancak bu durumda OpenStack tarafında da yapılması gereken işlemler bulunduğundan bu konu ayrı bir yazıda ele alınacaktır.
Son olarak büyük bucket’larda performans kaybı yaşanmaması için konfigürasyon dosyasının [global] bölümüne aşağıdaki eklemenin yapılması önerilmektedir.
1 2 3 4 |
[global] ... rgw_override_bucket_index_max_shards = 4 ... |
Tüm bu eklemeler yapıldıktan sonra konfigürasyon dosyası “ceph-deploy” komutu vasıtasıyla kümedeki tüm sunuculara gönderilir. Örnek komut aşağıda verilmiştir. Buradaki –overwrite-conf parametresi mevcut konfigürasyonun üzerine yazması için gereklidir. Aksi halde konfigürasyon dosyası mevcut olduğu için hata verecektir.
1 |
ceph-deploy --overwrite-conf config push testmon01 testmon02 testmon03 testceph01 testceph02 testceph03 testceph04 testceph05 |
Kopyalama işlemi bittiğinde rgw servislerinin yeniden başlatılması sonrası değişiklikler etkili olacaktır. İlgili sunucular üzerinde çalıştırılması gereken örnek komutlar aşağıda verilmiştir.
1 2 3 |
systemctl restart ceph-radosgw@rgw.testmon01.service systemctl restart ceph-radosgw@rgw.testmon02.service systemctl restart ceph-radosgw@rgw.testmon03.service |
Yeniden başlatma tamamlandığında Object GW servisleri kullanıma hazır hale gelmiştir. Servis için tanımlanan adrese erişildiğinde aşağıdakine benzer bir sayfa karşılamalıdır.
Bu servise API üzerinden erişip kullanabilmek için resmi sayfadan faydalanabilirsiniz. S3 API ve Swift API için ayrı ayrı Java, C#, Python, PHP, C++, Ruby ve Perl gibi bir çok dilde örnek mevcuttur. Bu tür örnekler başka bir yazının konusu olacaktır.