![]() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| C/C++ / CGI / Sieć Novell / PHP / Java / SQL / Oracle / WebSphere MQ / WebSphere Message Broker / JavaScript / Humor / IT Quiz | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|
![]() |
Klastry MQ, to rozwiązanie pozwalające na połączenie większej ilości menadżerów kolejek w grupę.
Rozwiązanie to pozwala na programowe osiągniecie wysokiej dostępności jak również na zmniejszenie
ilości kanałów do zarządzania.
Kanał cluster sender Kanał ten musi być stworzony na każdym menadżerze będącym częścią klastra. Wskazuje on na menadżer będący pełnym repozytorium MQ. Każde częściowe repozytorium MQ powinno mieć tyle kanałów cluster sender ile w klastrze znajduje się pełnych repozytoriów. Każde pełne repozytorium klastra powinno mieć po jednym tego typu kanale wskazującym na pozostałe pełne repozytoria znajdujące się w klastrze. Kanał cluster receiver Kanał ten musi być stworzony na każdym menadżerze będącym częścią klastra. Wskazuje on na siebie samego i każdy menadżer ma tylko jeden tego typu kanał. Kanał ten służy do wskazywania innym menadżerom w klastrze definicji połączenia z menadżerem, na którym kanał ten został stworzony. Łączenie się do klastra z menadżera kolejek znajdującego się poza klastrem W przypadku kiedy mamy sytuacje, gdy aplikacja podłączona jest do menadżera znajdującego się poza klastrem, a kolejka docelowa znajduje się na menadżerach kolejek wewnątrz klasta w kilku instancjach można zastosować architekturę, w której jeden menadżer w klastrze potraktujemy jednocześnie jako gateway pomiędzy klastrem a zewnętrznymi menadżerami kolejek. W takiej sytuacja pomiędzy zewnętrznym menadżerem, a menadżerem pełniącym rolę klastra tworzy się standardowe definicje par kanałów np. sender-receiver. Następnie aby umożliwić zewnętrznym menadżerom komunikacje z innymi menadżerami wewnątrz klastra na gateway-u tworzy się alias menadżera wskazujący na dowolny menadżer w klastrze. Definicję taką możemy utworzyć np. poleceniem: DEFINE QREMOTE(ANY.CLUSTER) RNAME(' ') RQMNAME(' ') Oznacza to, że jeśli do menadżera gatewaya dotrze z zewnątrz komunikat z kolejki zdalnej wskazującej na menadżer o nazwie ANY.CLUSTER, komunikat ten zostanie przekazany do dowolnego menadżera wewnątrz klastra posiadającego instancję kolejki, zdefiniowanej w definicji kolejki zdalnej na zewnętrznym menadżerze. Definicję takiej kolejki zdalnej znajdującej się na zewnętrznym menadżerze może mieć postać: DEFINE QREMOTE(TO.CLUSTER.QUEUE) RNAME(CLUSTER.QUEUE.IN) RQMNAME(ANY.CLUSTER) XMITQ(QM3) Teraz po umieszczeniu na zdalnym menadżerze komunikatu w kolejce TO.CLUSTER.QUEUE komunikatu przejdzie on za pośrednictwem pary sender-receiver do gatewaya. Tam jako, że docelowy menadżer okazał się aliasem na dowolny menadżer kolejek za pomocą określonych zasad routingu komunikat zostanie umieszczony w jednym z menadżerów kolejek wewnątrz klastra zawierających lokalna kolejkę klastrową CLUSTER.QUEUE.IN . Usunięcie menadżera z klastra Niekiedy istnieje potrzeba zatrzymania menadżera lub jego usunięcia. W przypadku architektury klastrowej Ważne jest aby przed dokonaniem tej czynności poinformować innych członków klastra, o tym zdarzeniu aby nowe komunikaty ni były do niego przesyłane. Inne menadżery mogą mieć we własnej częściowej bazie informacje o tym menadżerze i jego zatrzymanie nie spowoduje od razu rozpropagowanie tej informacji. Informacja ta wygaśnie na innych menadżerach po 90 dniach, ponieważ co taki czas menadżery w klastrze odświeżają swoje lokalne repozytorium. Aby prawidłowo zatrzymać menadżera będącego częścią klastra należy przed tym wykonać na nim komendę usuwającą jego definicje z klastra. Komenda ta ma postać: SUSPEND QMGR CLUSTER(CLUSTER_NAME) MODE(SUSPEND_MODE) gdzie : CLUSTER_NAME : nazwa klastra, z którego danego menadżera usuwamy SUSPEND_MODE : tryb usunięcia. Przyjmuje następujące wartości: QUIESCE :usunięcie z oczekiwaniem na zakończenie bieżących prac FORCE :usunięcie natychmiastowe Po dokonaniu na nim odpowiednich czynności, np. wgrania poprawki taki menadżer możemy ponownie dodać do klastra. Dodanie ponowne usuniętego menadżera do klastra ma postać: RESUME QMGR CLUSTER(CLUSTER_NAME) gdzie : CLUSTER_NAME : nazwa klastra, do którego danego menadżera dodajemy Jeśli już się zdarzyło, że usunęliśmy menadżera bez wykonania na nim komendy SUSPEND lub w jakiś inny sposób straciliśmy nad nim kontrolę możemy w takiej sytuacji wykonać na pełnym repozytorium klastra komendę nakazującą wszystkim menadżerom w klastrze usunąć definicje tego zagubionego menadżera. Komenda taka ma postać: RESET CLUSTER(CLUSTER_NAME) ACTION( FORCEREMOVE ) QMNAME(QMGR_NAME) gdzie : CLUSTER_NAME : nazwa klastra, z którego usuwamy wszystkie definicje danego menadżera QMGR_NAME : nazwa menadżera kolejek, którego definicje chcemy usunąć Przykładowa architektura Dla zobrazowania koncepcji klastrów przykładowe poniższe skrypty wykonują: Zmienia definicje menadżera QM1 ustalając go pełnym repozytorium klastra MK_CLUSTER, tworzy jego kanał cluster receiver, kanał cluster sender do drugiego pełnego repozytorium klastra QM2 oraz tworzy na nim kolejkę klastrową CLUSTER.QUEUE.IN
#na QM1 wykonyjemy
Zmienia definicje menadżera QM2 ustalając go pełnym repozytorium klastra MK_CLUSTER, tworzy jego kanał cluster receiver, kanał cluster sender do drugiego pełnego repozytorium klastra QM1 oraz tworzy na nim kolejkę klastrową CLUSTER.QUEUE.IN
#na QM2 wykonyjemy
#na QM3 (GATEWAY) wykonyjemy
Aby teraz zweryfikować działanie klastra należy na zewnętrznym menadżerze nie będącym w klastrze wykonać komendę tworzącą kolejkę zdalną wykorzystującą alias stworzony wcześniej. DEFINE QREMOTE(TO.CLUSTER.QUEUE) RNAME(CLUSTER.QUEUE.IN) RQMNAME(ANY.CLUSTER) XMITQ(QM3) Po wrzuceniu kilku komunikatów do tej kolejki część z nich powinna się znaleźć na menadżerze QM1, a część na menadżerze QM2. Ilość komunikatów jakie znajda się w jednej i drugiej kolejce klastrowej będzie rozłożona mniej więcej proporcjonalnie (przy standardowej konfiguracji). |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||