Recent News

Cuma, Aralık 06, 2013

Rabbitmq HA(Yüksek Erişilebilir) Yapısı


Rabbitmq HA yapısının kurulması ve kurulum sırasında dikkat edilmesi gereken bir kaç noktadan bahsedeceğim.
Kurulum sırasında işletim sistemi olarak Ubuntu 12.04 LTS kullanılmıştır.

Rabbitmq kullanımında HA yapısı büyük projelerde oldukça önemli. Çünkü rabbitmq bir mesaj kuyruğu ve ona gönderilen işlerin sırayla işlenmesinden sorumlu. Sistemde rabbitmq ulaşılmaz olduğu durumlarda mesaj gönderen sistem mesajları göndermek için istekte bulunacak , her isteğinde hata alacak , işleri işleyecek olan sistem (consumer) yine iş alabilmek için rabbitmq'ya istekte bulunacak ve  her isteğinde hata alacak. Yani işlerin sırayla düzgün işlenmesi için arada köprü görevi gören rabbitmq sistem için oldukça kritik bir yerde bulunuyor.

Kurulumu sırasında ubuntu repolarındaki rabbitmq sürümü eski olduğu için rabbitmq'nun sitesinden deb paketini indiriyoruz.

$ wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.0.4/rabbitmq-server_3.0.4-1_all.deb

İndirdiğimiz deb paketini sisteme kuruyoruz.

$ sudo dpkg -i rabbitmq-server_3.0.4-1_all.deb

sudo apt-get -f install

ile eksik kalan bağımlılıklar var ise (erlang paketi gibi) bunları sisteme kuruyoruz.

$ sudo rabbitmq-plugins enable rabbitmq_management

komutu ile rabbitmq yönetim arayüzünü aktif hale getiriyoruz. Bu arayüz oldukça güzel. Böylece çalışan kuyrukları , kuyruklardaki mesaj sayılarını görebilir gereksiz olarak gördüğünüz mesajların işlenmesini engellemek için sistemden silebilirsiniz.

Bu sürümdeki yönetim arayüzü öntanımlı olarak 15672 portunda çalışmaktadır.

Ör: http://rabbitmq.domain.vpn:15672/

Sunucu sadece rabbitmq için kullanılıyorsa ve sistem kaynakları yeterli ise rabbitmq kullanıcısı için dosya açma limitini arttırıyoruz. Bu açılacak bağlantı sayısının artmasını sağlıyor.

$ sudo vi /etc/default/rabbitmq-server dosyasına aşağıdaki satırları ekliyoruz.

ulimit -Hn 4096

ulimit -Sn 4096

HA yapısı için kurduğumuz sunucularda aşağıdaki dosyada yazan değer tüm sunucularda aynı olmalıdır.

$ sudo vi /var/lib/rabbitmq/.erlang.cookie

MIGfrgrsşalsSJDKS şeklinde rastgele oluşturduğumuz bir değeri  bu dosyaya yazıyoruz.

Cluster yapısı için birden fazla sunucu gerektiğinden aynı adımları kullanarak en az bir sunucu kurulumu daha yapıyoruz.

Sunucuları cluster olarak çalıştırabilmek için aşağıdaki adımları uyguluyoruz.

Öncelikle rabbitmq servisini durduruyoruz.

$ sudo rabbitmqctl stop app

$ sudo rabbitmqctl join cluster rabbit@digersunucu

$ sudo rabbitmqctl start app

Rabbitmq'da tanımlı virtual hostun kuyruklarının HA olması için aşağıdaki komut ile ha modunun aktif edilmesi gerekmektedir.

$ rabbitmqctl set_policy ha-all ".*" '{"ha-mode":"all"}'-p virtualhost

HA yapısındaki sunucuların network ile birbirlerine bağlanabiliyor olması gereklidir. Daha sonra rabbitmq servisini yeniden başlatıyoruz.

$ sudo service rabbitmq-server restart

Bu işlemi ha yapısında bulunan sunucularda aynı anda değil sırayla yapıyoruz. Yönetim arayüzünden HA ya eklenen sunucuları görebilir çalışma durumlarına bakabiliriz.

Cluster yapısı kurulduktan sonra bu sunucuların HA olarak sistemlerde kullanılabilmesi için aşağıdaki yöntemler kullanılabilir.
* Load balancer kullanmak : Sunucular bir grup içerisinde tanımlanır. Bu grubun ortak kullanacağı virtual ip belirlenir. Load balancer istekleri sunuculara random olarak gönderir. Celery için BROKER_URL kısmına bu virtual ip tanımlanır. Consumerların bağlanacağı sunucu ayarlarında da bu virtual ip kullanılır.

* Celery için ayar dosyasına birden fazla BROKER_URL tanımlanabilir. Sunucu ilk tanıma bağlanamadığında diğerine bağlanmayı deneyecektir.

Bu yapının bozulmasınına sebep olabilecek durumlardan biri sunucular arasındaki ağ bağlantılarının çok kısa bir an bile olsa kopması. O zaman yapı tamamen bozuluyor. Bu durumda yapılacak en sağlıklı işlem istekleri geçici olarak başka bir rabbitmq sunucusuna yönlendirmek ve ha yapısındaki sunucularda rabbitmq servislerini durdurup teker teker başlatmak. Yapıyı bir süre gözlemledikten sonra geçici sistem kaldırılabilir.

Mümin Öztürk'e bu konudaki katkıları için teşekkürler

0 yorum:

Yorum Gönder