CLVM z Corosync/OpenAIS W Debianie Squeeze


CLVM to rozszerzenie LVM pozwalające na pracę w klastrze. Dzięki temu wiele maszyn może równocześnie mieć dostęp do VG na współdzielonym dysku (przez FC, iSCSI, itp.). CLVM sam nie pozwala na budowę klastra, zamiast tego używa istniejącej już infrastruktury do komunikacji między węzłami, np. cman z Red Hat Cluster Suite. Teoretycznie wybór może nastąpić w trakcie uruchomienia, niestety, standardowa paczka w Debianie Squeeze jest na sztywno skompilowana z cman. Istnieje co najmniej parę sytuacji w których taka konfiguracja jest niekorzystna.

Przedstawione dalej rozwiązanie jest zaprojektowane głównie z celu ułatwienia konfiguracji klastra, którego jedyną klastrową cechą jest współdzielony dysk i CLVM, natomiast same LV zawierają normalne systemy plików (nie klastrowe) i są używane przez pojedyncze węzły.

Narzędzia

Z pewnością potrzebny będzie jakiś edytor, paczki devscripts, dpkg-dev, build-essential, libcorosync-dev i libopenais-dev. Ponadto potrzebne będą paczki oznaczone przez paczkę lvm2 jako zależności potrzebne do kompilacji. Najłatwiej zainstalować te paczki poleceniem:

root@lol:~# apt-get build-dep lvm2

Rekompilacja paczki

Na początek należy pobrać paczkę źródłową i ją rozpakować:

root@lol:~# apt-get source lvm2

Następnie należy zmodyfikować odpowiednie pliki w katalogu debian, który znajduje się w katalogu z paczką (lvm2-2.02.66).

W pliku control należy do atrybutu Build-Depends dopisać libcorosync-dev i libopenais-dev. Z atrybutu Depends należy usunąć cman.

Następnie należy w pliku rules znaleźć linię zawierającą parametr –with-clvmd=cman i zamienić na –with-clvmd=all. Przy okazji można poprawić pewien bug, który powoduje, że paczka clvm automatycznie nie tworzy katalogu /var/run/lvm. Za linią zawierającą polecenie dh_installexamples należy dopisać dh_installdirs i utworzyć plik clvm.dirs zawierający jedną linię

var/run/lvm

Paczka clvm instaluje się razem ze skryptem init, który zależy bezpośrednio od obecności cman. Należy poprawić plik clvm.init. W nagłówkach LSB konieczna jest zastąpienie wartości cman na $cluster_manager dla atrybutów Required-Start i Required-Stop. Następnie należy wyrzucić dwie konstrukcje warunkowe sprawdzające obecność pliku /etc/cluster/cluster.conf i wynik polecenia cman_tool status.

Aby paczka mogła zastąpić standardową paczkę musi mieć wyższy numer wersji. Zgodnie z polityką Debiana najlepiej do istniejącej wersji dopisać jakiś tekst (np. nick) i numer. W ten sposób kolejna oficjalna paczka będzie mieć wyższy numer. Przykładowo numer wersji 2.02.66-5 można zmienić na 2.02.66-5ruanda0. Gdyby paczka zawierała błędy należy inkrementować ostanią część numeru wersji, np. 2.02.66-5ruanda1. Numer wersji znajduje się w pliku changlelog, który najłatwiej edytować skryptem dch -i. Skrypt otworzy plik w domyślnym edytorze z dopisanym szkieletem wpisu. Należy poprawić numer wersji, opisać krótko wprowadzone zmiany i ewentualnie poprawić podpis. Istotne jest zachowanie formatowania.

Następnie należy skompilować paczkę:

root@lol:~/lvm2-2.02.66# dpkg-buildpackage

Wszystkie paczki binarne *.deb zostaną utworzone w katalogu nadrzędnym.

Corosync/OpenAIS

Należy zainstalować paczki corosync i openais:

root@lol:~# apt-get install corosync openais

Następnie należy skonfigurować corosync. Przykładowa zawartość pliku /etc/corosync/corosync.conf:

Please read the corosync.conf.5 manual page

compatibility: whitetank

totem { version: 2 secauth: on threads: 0 interface { ringnumber: 0 bindnetaddr: 10.0.0.0 mcastaddr: 226.94.1.1 mcastport: 5405 } }

logging { fileline: off to_stderr: no to_logfile: no to_syslog: yes logfile: /var/log/corosync.log debug: off timestamp: on logger_subsys { subsys: AMF debug: off } }

amf { mode: disabled }

aisexec { user: root group: root }

Warto zwrócić uwagę na adres w parametrze bindnetaddr. Zgodnie z dokumentacją powinien być to adres sieci, nie interfejsu. W ten sposób można łatwo współdzielić konfigurację między wieloma węzłami w jednej podsieci.

Następnie należy dopisać w pliku /etc/insserv.conf linię:

$cluster_manager +cman +corosync

Aby poprawnie uruchomić corosync należy dodatkowo zastąpić plik /etc/default/corosync zawartością:

start corosync at boot [yes|no]

START=yes

COROSYNC_DEFAULT_CONFIG_IFACE=“openaisserviceenableexperimental:corosync_parser”

export COROSYNC_DEFAULT_CONFIG_IFACE

Następnie można uruchomić corosync:

root@lol:~# /etc/init.d/corosync start

CLVM

Należy zainstalować przygotowaną wcześniej paczkę clvm jak również lvm2, jeżeli do tej pory nie była zainstalowana.

Aby LVM używał demona clvm, należy w pliku /etc/lvm/lvm.conf atrybut locking_type ustawić na wartość 3.

Użycie

Aby VG było klastrowe, należy w trakcie tworzenia podać argument -cy, np.

root@lol:~# vgcreate -cy test-cvg0 /dev/sda1

Tak utworzone VG ma ustawiony atrybut c przy listowaniu VG:

root@lol:~# vgs
  VG             #PV #LV #SN Attr   VSize  VFree
  test-local-vg0   1   5   0 wz–n-  9.52g  6.47g
  test-cvg0        1   0   0 wz–nc 50.00g 50.00g

LV tworzy się standardowo. Zachęcam do testowej utworzenia LV o tej samej nazwie na wszystkich maszynach równocześnie z użyciem np. Cluster SSH.

Tips & tricks

W standardowej konfiguracji LVM, skrypty startowe debiana uruchomią wszystkie LV przy starcie systemu. Jeżeli system plików nie zapewnia bezpiecznego współdzielenia dysku przez wiele maszyn może to powodować pewne problemy przy manipulowaniu systemem plików z innej, niż przeznaczonej do tego, maszyny. Rozwiązanie problemu jest stosunkowo proste.

LVM umożliwia ustawianie tagów dla VG i LV. Tagi można dodać istniejącym LV i VG poleceniami lvchange i vgchange z argumentem –addtag jakis_tag. Dokładnie taki sam argument należy podać przy tworzeniu LV i VG, np.:

root@lol:~# lvcreate –addtag klaster -L 10G -n tmp test-cvg0

Aby wyświetlić ustawione tagi należy zmodyfikować opcje wyświetlane przez polecenia lvs i vgs:

root@lol:~# lvs -o +lv_tags,vg_tags
  LV      VG              Attr  LSize   Origin Snap%  Move Log Copy%  Convert LV Tags VG Tags
root test-local-vg0 -wi-ao 488.00m test-local swap test-local-vg0 -wi-ao 952.00m test-local usr test-local-vg0 -wi-ao 952.00m test-local var test-local-vg0 -wi-ao 488.00m test-local var-log test-local-vg0 -wi-ao 244.00m test-local tmp test-cvg0 -wi-a- 10.00g klaster root@lol:~# vgs -o +vg_tags VG #PV #LV #SN Attr VSize VFree VG Tags
test-local-vg0 1 5 0 wz–n- 9.52g 6.47g test-local test-cvg0 1 1 0 wz–nc 50.00g 40.00g klaster

Tagów można przypisać więcej niż jeden.

W pliku /etc/lvm/lvm.conf można ustawić w atrybucie volume_list listę urządzeń, które mają być włączane przez skrypty startowe. Lista urządzeń może zawierać dokładne nazwy VG lub VG/LV lub tagi w formacie @tag, np.:

root@lol:~# grep volume_list /etc/lvm/lvm.conf
    volume_list = [ “@test-local”, “@shared” ]

Tagi mogą być dowolnym tekstem, ale przy automatyzacji konfiguracji przy użyciu narzędzi typu cfengine, warto rozważyć użycie nazwy hosta jako tag. W ten sposób łatwo też podejrzeć listę hostów, które mają dostęp do LV, wystarczy wylistować tagi;)

comments powered by Disqus