Skip to content

Mart 17, 2014

1

Apache Solr Replikasyon Kurulumu

Apache Solr Replica

Merhaba arkadaşlar, bu yazımızda Apache Solr ile replikasyon ve tekrarlayıcı (repeater) kurulumunu inceleyip uygulamaya çalışacağız.

Bilenleri tenzih ederek replikasyon nedir diye değinecek olursak; Datanın bir kaynaktan diğerine aynen, değiştirmeden ve parçalara ayırmadan, kopyalanması diyebiliriz. Buna, benzer çalışma mantığı olan disk aynalama (disk mirroring) standardı RAID 1′ i  örnek olarak gösterebiliriz. Tabi ki bazı RAID denetçileri parçalı okuma yapabiliyor ama konumuzun bu olmaması ve “RAID 1′e benzer” dememiz nedeniyle daha fazla üzerinde durmuyoruz. Tekrarlayıcıları ise network darboğazı (network bottleneck) oluşmaması için ana (master) sunucuya yardım eden sunucular olarak düşünebiliriz. Solr ‘a bulut (cloud) özelliği eklendikten sonra tek başına pek tercih edilmiyor olsa da fikir vermesi açısından ve pratik yapmak için replikasyonu -en azından- denemek yararlı olabilir. Yazının devamında ana sunucuyu master, takipçi sunucuyu slave, tekrarlayıcıyı da repeater olarak adlandıracağız.

Apache Solr Replikasyonu Nasıl Çalışır?

Solr’ ı replikasyon ile kulanırken bir master sunucu ve buna bağlı n tane slave sunucu kurarak çalıştırabiliriz. Slave sunucu sayısının çok olması ve/veya slave sunucuların master sunucuya yaptığı istekler network üzerinde darboğaz oluşturmaması için bazı slave sunucuları repeater olarak kullanabiliriz. Tüm bu iletişimi HTTP üzerinden ve Solr RequestHandler ‘larıyla  (RequestHandler konusunu daha sonra işleyeceğiz) yapar.

Apache Solr Replikasyon Monitörü

Solr, replikasyon yaparken master sunucudan öncelikle değişiklik listesini alır, daha sonra bu dosyaları geçici (tmp) dizinine indirmeye başlar ve tüm değişiklikler indirilene kadar indexlerde herhangi bir değişiklik yapmayıp sistemin çalışmaya devam etmesini sağlar. Replikasyon işleminin yarıda kesilmesi durumunda slave sunucu üzerinde tek kaybımız güncel verinin henüz uygulanmamış olması olur, bunun dışında gelen isteklere cevap vermeye ve çalışmasına normal olarak devam eder. Replikasyon işlemi kaldığı yerden devam edip indirilme tamamlandığında indexlere değişiklikleri uygular (yandaki resimde örnek replikasyon monitör görüntüsü mevcut).

Master/Slave replikasyonReplikasyon kullanımı bize aynı anda tüm konfigürasyonları tek merkezden yönetme imkanı da sağlamış olur. Master sunucu üzerinde yaptığımız değişiklikler tüm slave sunucular tarafından çekilerek uygulanır. Böylece tüm slave sunucularda tek tek konfigürasyon ayarlamaya çalışmak zorunda kalmayız. Burada isteğimiz dosyaları replikasyona ekleyebilme esnekliği bırakılması güzel bir özellik olarak göze çarpıyor. Ayrıca replikasyon sonrasında (aşağıda bahsedeceğiz) dosyayı salve sunucularda yeniden adlandırabilme (rename) imkanımız da mevcut.

Burada dikkat edilmesi gereken nokta Solr’ ı master/slave replikasyon yöntemi ile kullanırken okuma dışındaki değişiklik yaratan sorguların (update, delete vd.) tamamının master sunucuya gelmesi gerektiğidir. Slave sunuculara güncelleme sorgusu gelmesi durumunda hiçbir problem çıkmamakla birlikte o değişiklik/ekleme’ nin sadece o sunucuda görüneceği ve replikasyon işlemi yapıldığı anda master sunucudaki kayıtlar dışındaki değişikliklerin kaybolacağını bilmemiz gerekir. Ayrıca slave sunucuya güncelleme yaratan komutlar geldiğinde bir sonraki replikasyon işlemini master’dan tüm datayı yeniden çekeceği için uzatmış olursunuz.

Eğer replikasyon ile birlikte konfigürasyon yönetimini de (önerilen budur) aktif ettiyseniz slave sunucuların konfigürasyonunda replikasyona dahil edilmiş bir dosyada değişiklik yaptığınızda replikasyon işlemi sonrasında yaptığınız değişiklikler kaybolup master sunucudaki konfigürasyonlar geçerli olacaktır.

Replikasyon Ayarlarımız

localhost80818006true/var/www/solr/replication/master
localhost80828007false/var/www/solr/replication/slave1
localhost80838008false/var/www/solr/replication/slave2

Replikasyon konfigürasyonuna geçmeden neler yapmak istediğimizi çalışırken minimum kağıda veya tahtaya çizdiğimiz gibi tablo halinde listeleyelim. Üç ayrı kurulum yapıp biri master diğer ikisi slave sunucu olacak şekilde aşağıdaki değerleri kullanacağız. Tabloya başlıkları, dizgide takıntılı olmam nedeniyle göze hoş gelmediği gerekçesiyle eklemedim. Başlıklar “Sunucu Adı, Apache Portu, Apache Shutdown Portu, Master, Dizin Yolu” oluşuyor. Replikasyona özel ayarlara geçmeden yandaki tabloya göre yaptığımız kurulumların yapılıp (Apache Solr ve Tomcat Kurulumu yazısında olduğu gibi) ayrı ayrı çalıştığına emin olalım. Bunun için http://localhost:8081/solr http://localhost:8082/solr http://localhost:8083/solr adreslerinden Solr paneline erişebiliyor olmamız gerekiyor.

Eğer farklı sunucularda kurulum yapacaksanız tabi ki portlar aynı olabilir (hatta aynı olması önerilir). Her bir kurulum setine aynı portları verip diğer kurulumlardan ayırabiliriz. Mesela x sitesi için üç ayrı sunucuda 8081, y sitesi için de üç ayrı sunucuda 8082 portlarına kurulum yapmak gibi. Aynı şekilde dizinler de tüm sunucularda aynı yolda bulunması iyi olacaktır.

Apache Solr Replikasyon Master Sunucu Ayarları

Master (8081) sunucumuzda solr_home/collection1/conf/solrconfig.xml dosyasında <requestHandler name="/replication" class="solr.ReplicationHandler" > ile başlayan direktif içinde aşağıdaki değişiklikleri yapalım. Şimdilik sadece master ayarlarının yorumlarını kaldırıp aktifleştirdik.

  <requestHandler name="/replication" >
    <!--
       To enable simple master/slave replication, uncomment one of the 
       sections below, depending on whether this solr instance should be
       the "master" or a "slave".  If this instance is a "slave" you will
       also need to fill in the masterUrl to point to a real machine.
    -->
    <lst name="master">
        <str name="replicateAfter">commit</str>
        <str name="replicateAfter">startup</str>
        <str name="confFiles">schema.xml,stopwords.txt</str>
    </lst>
    <!-- 
       <lst name="slave">
         <str name="masterUrl">http://your-master-hostname:8983/solr</str>
         <str name="pollInterval">00:00:60</str>
       </lst>
    -->
  </requestHandler>

Burada replicateAfter direktifi hangi durum/olay sonrası verilerin replikasyona dahil edileceğini belirliyor. Alabileceği parametreler startup, commit ve optimize. En efektif olanı commit gibi duruyor. Optimize yüksek boyutlu indexlerde çok zaman aldığından replikasyon maliyeti artabilir. Tabi ki çok fazla dosya transfer olmaması gibi artı yanı da var. Bu sebeple duruma göre direktifi ayarlamak gerekiyor. Konfigürasyona verdiğiniz direktifteki ilgili olay gerçekleştiğinde master sunucu üzerinde replicable index versiyonu güncellenir ve böylece slave sunucular kendi index versiyonlarından güncel bir veri olduğunu farkedip replikasyon işlemi (bir sonraki başlıkta bulunan direktifler doğrultusunda) yaparlar.

Apache Solr Replikasyon Slave Sunucu Ayarları

Slave sunucularımızda (8082 ve 8083) solr_home/collection1/conf/solrconfig.xml dosyasında <requestHandler name="/replication" class="solr.ReplicationHandler" > ile başlayan direktif içinde aşağıdaki değişiklikleri yapalım. Şimdilik sadece slave ayarlarının yorumlarını kaldırıp aktifleştirdik ve master sunucumuzun adresini verdik.

   <requestHandler name="/replication" >
    <!--
       To enable simple master/slave replication, uncomment one of the
       sections below, depending on whether this solr instance should be
       the "master" or a "slave".  If this instance is a "slave" you will
       also need to fill in the masterUrl to point to a real machine.
    -->
    <!--
       <lst name="master">
         <str name="replicateAfter">commit</str>
         <str name="replicateAfter">startup</str>
         <str name="confFiles">schema.xml,stopwords.txt</str>
       </lst>
    -->
    <lst name="slave">
       <str name="masterUrl">http://localhost:8081/solr/collection1/replication</str>
       <str name="pollInterval">00:00:60</str>
    </lst>
  </requestHandler>

Tüm direktifleri tek tek işlemeyeceğiz ama pollInterval ‘in otomatik replikasyon işleminin ne sıklıkla yapılacağını (HH:mm:ss) bildirdiğini ve bu direktifi vermezseniz replikasyonu sadece ilgili komutu (urli) elle tetikleyerek gerçekleştirebileceğimizi bilmekte yarar var. Son olarak pollInterval direktifi -interval kelimesinden de anlaşılacağı üzere- zaman değil aralık/sıklık komutu alır. Yani 01:00:00 komutu saat 1′de değil her saat başı çalış anlamına gelmektedir.
apache solr replicationSlave sunucularda bu değişikliği yapıp Solr’ı tekrar başlattığımızda ve http://localhost:8082/solr/#/collection1/replication http://localhost:8083/solr/#/collection1/replication adreslerine girdiğimizde yandaki resimde olduğu gibi replikasyon hakkında bilgi ve bazı komutları görebiliyor olacağız. Burada yer alan bilgiler solrconfig.xml içindeki direktiflerin yanı sıra master sunucudaki direktifleri de yansıtıyor. Master sunucuda replikasyonun aktif olup olmadığı (Settings Master: replication enable), master sunucuda hangi konfigürasyon dosyalarının replikasyona dahil olduğu (Settings Master: confFiles), master sunucu değişiklikleri hangi durumda replikasyona hazır hale getireceği (Settings Master: replicateAfter)

Bunun yanı sıra master ve slave sunucudaki index replikasyon durumlarını da versiyon numaralarıyla verir. Master sunucuda indexin hangi versiyonda olduğu (Index Master Searching). Master sunucuda replikasyona dahil edilen (replikasyon yapılabilir veriler) index versiyon numarası (Index Master Replicable). Slave sunucudaki index versiyonu, bu bilgi master’dan son değişiklikler alınırken kullanılıyor (Index Slave Searching)

Bu bölümle alakalı son olarak “replicate now” butonunun adından da anlaşılacağı üzere “replikasyonu şu an gerçekleştir” komutunu verdiğini (http://localhost:8082/solr/collection1/replication?command=fetchindex&wt=json urlini çağırarak) söyleyelim.

solrconfig.xml Dosyasını Replikasyona Ekleme

Slave sunucularda konfigürasyonları teker teker değiştirmek istemiyorsak (mesela pollInterval değerlerini değiştirmek istiyor olabiliriz) master sunucu üzerinde slave sunucularda kullanılmak üzere solrconfig_slave.xml adında dosya oluşturup (slave sunucu için yaptığımız konfigürasyonları içeren dosyanın aynısı olabilir) aşağıdaki direktifleri master sunucu (8081) üzerinde solr_home/collection1/conf/solrconfig.xml dosyasına yukarıda master konfigürasyonu kısmında anlattığımız gibi vermemiz yeterli olacaktır.

<str name="confFiles">schema.xml,stopwords.txt,solrconfig_slave.xml:solrconfig.xml</str>
apache solr slave config files

Slave sunucu replikasyon monitör görüntüsü

Bu direktif slave makinelerce solrconfig_slave.xml dosyasını master sunucudan indir ve solrconfig.xml olarak kaydet olarak yorumlanır. Böylelikle slave sunucuların solrconfig.xml dosyasını master sunucudan güncellemiş oluruz. Yandaki resim master sunucudan solrconfig.xml dosyasını alan bir slave sunucunun replikasyon monitörü görüntüsüdür.

Dosyaların replikasyona dahil edilmesinde şöyle ilginç bir durum olduğunu bilmenizi isterim; dosyaların sunuculara gitmesi için replikasyonu tetikleyen bir işlem oluşması, commit veya optimize gibi, gerekiyor. Diğer bir ifadeyle; konfigürasyon dosyasında yapılan değişiklikler replikasyonu tetiklemiyor.

Apache Solr Replikasyon Repeator Sunucu Ayarları

Yukarıdaki 3 sunucu kurulumuna 10 sunucu daha ekleyip; 1 master, 2 repeater ve her bir repeater’a bağlı 5′şer sunucu (1,2,5) oluşturacaksak şu adımları izlememiz gerekir. Kurulum örneğini 13 sunucu üzerinden verme nedenim (1,1,n) kurulum konfigürasyonu ile (1,n,n) konfigürasyonunun çok farklı olması. Mesela 1,1,n kurulumunda repeater sunucusunda da herhangi bir dosya değiştirme zorunluluğunuzun olmaması gibi.

Bu kısım hakkında kusura bakmamanızı rica ediyorum, zira ayrı bir yazı başlığı gibi gelmesi ve kısa yoldan anlatamıyor olmam nedeniyle sadece kurulum adımlarını ve gereki konfigürasyonları yazıp bitirmek istiyorum.

Master sunucu üzerinde yapılacaklar;

solrconfig.xml:

...
<lst name="master">
  <str name="replicateAfter">startup,commit</str>
  <str name="confFiles">schema.xml,stopwords.txt,solrconfig_repeater.xml:solrconfig.xml,solrconfig_slave.xml</str>
</lst>
...

Yukarıdaki ayarlar, repeater sunucusu master’dan replikasyon yaparken solrconfig_repeater.xml dosyasını kendine solrconfig.xml olarak kopyalacak ve içerisinde de master url’i olmasından dolayı master’a otomatik olarak bağlanacak (bir önceki başlıkta işlediğimiz gibi). Repeater sunucusu solrconfig_slave.xml dosyasını olduğu gibi alıp bir işlem yapmayacak.

solrconfig_repeater.xml:

...
<lst name="master">
  <str name="replicateAfter">commit</str>
  <str name="confFiles">schema.xml,stopwords.txt,elevate.xml,solrconfig_slave.xml:solrconfig.xml,solrcore.properties_slave:solrcore.properties</str>
  <str name="commitReserveDuration">00:00:10</str>
</lst>
<lst name="slave">
  <str name="masterUrl">http://localhost:8081/solr/collection1/replication</str>
  <str name="pollInterval">00:10:00</str>
</lst>
...

Yukarıdaki ayarlar repeater sunucusunda solrconfig.xml dosyası olarak görünecek ve herhangi bir slave sunucu repeater’a replikasyon için bağlandığında solrconfig_slave.xml dosyasını kendine solrconfig.xml dosyası olarak kaydedecek. Ayrıca solrcore.properties_slave dosyasını da solrcore.properties olarak kaydedecek.

solrconfig_slave.xml:

...
<lst name="slave">
  <str name="masterUrl">${solr.core.master_url}</str>
  <str name="pollInterval">00:10:00</str>
</lst>
...

Repeater sunucudan alınan ve solrconfig.xml olarak kaydedilen solrconfig_slave.xml dosyası master_url olarak solr.core.master_url değişkeninden gelen değeri okuyacak.

Repeater sunucular üzerinde yapılacaklar;

solr_home/collection1/conf/solrcore.properties dosyası içine her repeater sunucusunun replikasyon url’ini yazalım. Mesela 8082 sunucumuz repeater ise aşağıdaki örnek uygun olacak;

master_url=http://localhost:8082/solr/collection1/replication

Slave sunucular üzerinde yapılacaklar;

Eklediğimiz herhangi bir slave sunucuyu ilk kurulumda istediğimiz bir repeater’a bağlamamız yeterli olacaktır. Diğer tüm konfigürasyonları repeater sunucudan devralacaktır. Repeater’a slave’i bağlama işlemini yazının başlarında anlattığımız yöntemle kolaylıkla yapabilirsiniz.

Repeater başlığı içinde yer alan tüm adımlar için bir defaya mahsus bir üst sunucuya slave olarak bağlanmanız gerekiyor, sonrasında tüm konfigürasyonlar ve veriler bir üst sunucudan gelmeye başlayacaktır. Tek istisna repeater sunucusu üzerinde master_url’i verdiğimiz solrcore.properties dosyasını oluşturmamız gerekmesi.

Sonuç

Konfigürasyonları replikasyona dahil ederken tabi ki tüm dosyaları replikasyona eklememiz çok daha mantıklı olacaktır. Yazıda çok fazla karmaşık olmaması açısından önemli 1-2 dosya üzerinden anlatma yolunu seçtim.

apache solr replication master downSolr replikasyonuyla deneysel kullanım dışında ilgilenmediğim için yanılıyor olabilme ihtimaliyle  beraber, master sunucusunu kapatırsanız ya da bir şekilde cevap veremez duruma gelirse slave sunucularda hiçbir problem çıkmıyor. Yandaki ekra görüntüsünde görüleceği üzere sadece invalid_master hatası alırsınız.

Sonuç olarak kendi tecrübelerime dayanarak replikasyon yönetmine yorum yapmam gerekirse en büyük eksikliğinin tek sunucuya güncelleme sorgusu gönderme zorunluluğunuzun olması diyebilirim. Bir sonraki yazıda inceleyeceğimiz bulut yönteminde herhangi bir sunucuya güncelleme isteği gönderebiliyorsunuz.

Kaynaklar

Replication
Disk Mirroring
RAID 1
Solr Index Replication
Solr Replication

Sizin fikriniz nedir? Lütfen aşağıdaki formu kullanarak yorum yapın.

(gerekli)
(gerekli)