Előfeltételek
Konfigurálja a tűzfalat
Telepítse a rabbitmqadmin programot
Konfigurálja a DNS-t
Csoportosítsa a csomópontokat
Hozzon létre egy magas rendelkezésre állási szabályzatot
A beállítás tesztelése
Törölje a vendég felhasználót
A RabbitMQ egy nyílt forráskódú üzenetközvetítő, amely támogatja az AMQP, STOMP és más kommunikációs technológiákat. Széles körben használják a vállalati alkalmazásokban és a modern mikroszolgáltatási architektúrákban, ahol aszinkron üzenetcsatornaként működik a különböző mikroszolgáltatások között. Ez az útmutató leírja, hogyan csoportosíthatja a RabbitMQ-t több CentOS 7-kiszolgálón, hogy magas rendelkezésre állású üzenetközvetítőt hozzon létre. Ebben az oktatóanyagban az egyik kiszolgáló főkiszolgálóként, a többi kiszolgáló pedig tükörszerverként fog működni arra az esetre, ha a főkiszolgáló elérhetetlenné válna.
Előfeltételek
A CentOS tűzfal ( firewalld) alapértelmezés szerint nem engedélyez bejövő forgalmat. Ahhoz, hogy a RabbitMQ elérhetővé váljon a hálózaton belüli és kívüli más rendszerek számára, és hogy hozzáférhessünk a felügyeleti konzolhoz, először meg kell nyitnunk néhány portot.
A RabbitMQ webes felületkezelő konzolja alapértelmezés szerint a porton figyel 15672. Szeretnénk a felügyeleti konzolt nyilvánosan elérhetővé tenni, hogy számítógépünkről elérhessük. Ezért azt utasítjuk, firewalldhogy véglegesen nyissa meg a portot 15672a nyilvános zónában (amely az alapértelmezett és aktív zóna a Vultr példányon).
sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent
A RabbitMQ csomópontoknak képesnek kell lenniük kommunikálni egymással. Szeretnénk megnyitni a szükséges portokat, de csak a belső hálózaton keresztül. Nem akarjuk, hogy az interneten bárki felügyelhesse vagy közvetlenül kapcsolatba léphessen szervereinkkel. A következő parancsok feltételezik, hogy kiszolgálóink az 192.168.0.100/24alhálózaton vannak.
Az első szolgáltatás a epmdpeer-felderítési szolgáltatás, amely alapértelmezés szerint a porton figyel 4369.
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.0.100/24"
port protocol="tcp" port="4369" accept'
A csomópontok közötti és a CLI kommunikációhoz a RabbitMQ-nak képesnek kell lennie a porton keresztüli kommunikációra 25672.
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.0.100/24"
port protocol="tcp" port="25672" accept'
A CLI eszközök a porttartományon keresztül kommunikálnak 35672-35682.
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.0.100/24"
port protocol="tcp" port="35672-35682" accept'
Ha az alkalmazásoknak szüksége van az AMQP protokollra, akkor meg kell nyitnia a portokat 5671és a 5672. Ha más protokollon keresztül kell kommunikálnia, a RabbitMQ hálózati követelményeivel kapcsolatos szükséges információkat a hivatalos RabbitMQ dokumentációban találja .
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.0.100/24"
port protocol="tcp" port="5672" accept'
sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.0.100/24"
port protocol="tcp" port="5671" accept'
Most, hogy be firewalldvan állítva, utasítanunk kell a konfiguráció újratöltésére.
sudo firewall-cmd --reload
Ismételje meg az ebből a szakaszból származó lépéseket minden kiszolgálón.
Telepítés rabbitmqadmin
A felügyeleti bővítményhez tartozik egy Python nevű eszköz, rabbitmqadminamely egyszerűen telepíthető a rendszerre, miután a felügyeleti bővítményt engedélyezték.
sudo wget http://localhost:15672/cli/rabbitmqadmin
sudo mv rabbitmqadmin /usr/local/bin/
sudo chmod +x /usr/local/bin/rabbitmqadmin
A fürtözés során a kiszolgáló állomásneveit kell használnia a kiszolgálók azonosításához. Alapértelmezés szerint a kiszolgálókhoz nincs DNS-rekord hozzárendelve, és a kapcsolat meghiúsul. Ennek gyors kiküszöböléséhez adja hozzá a fő és a tükrözött gazdagép nevét a /etc/hostsfájlhoz kedvenc szerkesztője segítségével.
Például a mester hosts fájlja a következőképpen nézhet ki. Figyelje meg az utolsó két rekordot, amelyek lehetővé teszik a szerverek számára, hogy azonosítsák egymást gazdagépnevük alapján. Ügyeljen arra, hogy módosítsa az IP-címeket a sajátjára.
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 guest
::1 guest
127.0.0.1 YOUR_MASTER_SERVER_HOST_NAME
::1 YOUR_MASTER_SERVER_HOST_NAME
192.168.0.101 YOUR_MASTER_SERVER_HOST_NAME
192.168.0.102 YOUR_MIRROR_SERVER_HOST_NAME
Csoportosítsa a csomópontokat
A csomópontok egymáshoz való csatlakozásának importálási előfeltétele, hogy az összes csomópont Erlang cookie-ja azonos legyen. Alapértelmezés szerint minden csomóponthoz egyedi Erlang cookie lesz hozzárendelve, ezért újra kell konfigurálnia az összes csomóponton.
A következő parancs az Erlang cookie-t " WE<3COOKIES" értékre állítja , de ezt nyugodtan módosíthatja saját ízlése szerint. Tegye ezt az összes szerveren.
sudo sh -c "echo 'WE<3COOKIES' > /var/lib/rabbitmq/.erlang.cookie"
Indítsa újra a RabbitMQ-t az összes szerveren, hogy megbizonyosodjon arról, hogy az Erlang cookie megfelelően újra van töltve.
sudo systemctl restart rabbitmq-server.service
Hajtsa végre a következő parancsokat az összes kiszolgálón, kivéve a főkiszolgálón. Ez lehetővé teszi, hogy a csomópontok csatlakozzanak a főkiszolgálóhoz, és fürtöt képezzenek.
sudo rabbitmqctl stop_app
sudo rabbitmqctl join_cluster "rabbit@<YOUR_MASTER_SERVER_HOST_NAME>"
sudo rabbitmqctl start_app
A következő parancs futtatásával ellenőrizze, hogy a csomópontok csatlakoztak-e a fürthöz.
sudo rabbitmqctl cluster_status
Az összes csomópont megjelenik a kimenet nodesés running_nodesszakaszában. Mostantól nem kell megismételnie a lépéseket minden szerveren, a konfiguráció automatikusan tükröződik a többi csomóponton.
Hozzon létre egy magas rendelkezésre állási szabályzatot
Most, hogy van egy RabbitMQ csomópontok fürtje, ezt felhasználhatjuk magas rendelkezésre állású várólisták és cserék létrehozására egy új házirend beállításával. Ez a házirend hozzáadható a RabbitMQ Management Console-on vagy a parancssori felületen keresztül.
sudo rabbitmqctl set_policy -p "/" --priority 1 --apply-to "all" ha ".*" '{ "ha-mode": "exactly", "ha-params": 2, "ha-sync-mode": "automatic"}'
A következő lista elmagyarázza, mit jelentenek a parancs egyes részei.
-p "/": Használja ezt a házirendet a "/"vhost-on (a telepítés után az alapértelmezett)
--priority 1: Az irányelvek alkalmazásának sorrendje
--apply-to "all": Lehet "queues", "exchanges"ill"all"
ha: Az a név, amelyet irányelvünknek adunk
".*": Az a reguláris kifejezés, amely annak eldöntésére szolgál, hogy mely sorokra vagy cserékre vonatkozzon ez a házirend. ".*"bármihez passzol
'{ "ha-mode": "exactly", "ha-params": 2, "ha-sync-mode": "automatic"}': A házirend JSON-reprezentációja. Ez a dokumentum azt írja le, hogy pontosan 2 csomópontot szeretnénk, amelyeken az adatok automatikusan szinkronizálva vannak
Röviden, ez a házirend biztosítja, hogy mindig legyen 2 másolatunk az adatokból egy sorban vagy cserében mindaddig, amíg legalább 2 csomópont működik. Ha több csomópontja van, növelheti az értékét ha-params. N/2 + 1Javasoljuk, hogy a csomópontok határozatképesek ( ). Ha több másolatot készít az adatokról, az nagyobb lemez-, i/o- és nethasználatot eredményez, ami a teljesítmény romlásához vezethet.
Ha tükrözni szeretné az adatokat a fürt összes csomópontjára, használhatja a következő JSON-dokumentumot.
'{ "ha-mode": "all", "ha-sync-mode": "automatic"}'
Ha csak meghatározott csomópontokra szeretné tükrözni az adatokat (például: node-1és node-2), használhatja a következőket.
'{ "ha-mode": "nodes", "ha-params" :["rabbit@node-1", "rabbit@node-2"], "ha-sync-mode": "automatic"}'
Módosíthatja a reguláris kifejezést, hogy különböző házirendeket rendeljen hozzá a különböző sorokhoz. Tegyük fel, hogy a következő három csomópontunk van:
- nyúl@mester
- nyúl@kliens-ha
- nyúl@termék-ha
Ezután létrehozhatunk két házirendet, amelyek eredményeképpen a sorok neve „kliens”-vel kezdődik, és tükröződik a rabbit@client-hacsomópontban, és minden olyan sor, amelynek neve „termék”-vel kezdődik, tükröződik a rabbit@product-hacsomópontban.
sudo rabbitmqctl set_policy -p "/" --priority 1 --apply-to "queues" ha-client "client.*" '{ "ha-mode": "nodes", "ha-params": ["rabbit@master", "rabbit@client-ha"], "ha-sync-mode": "automatic"}
sudo rabbitmqctl set_policy -p "/" --priority 1 --apply-to "queues" ha-product "product.*" '{ "ha-mode": "nodes", "ha-params": ["rabbit@master", "rabbit@product-ha"], "ha-sync-mode": "automatic"}
Egy kis megjegyzés itt: az exkluzív várólisták soha nem tükröződnek vagy tartósak a RabbitMQ-ban, még akkor sem, ha ez a házirend megfelelne az ilyen soroknak. Az exkluzív várólisták automatikusan megsemmisülnek, amint egy kliens megszakad, és ezért nem lenne hasznos replikálni egy másik szerverre. Ha a szerver meghibásodna, a kliens megszakad vele, és a sor automatikusan megsemmisül. A tükrözött példányok is megsemmisülnének.
A beállítás tesztelése
A fürtözött beállítás teszteléséhez a felügyeleti konzolon keresztül a parancssori felület segítségével új sort hozhatunk létre.
sudo rabbitmqadmin declare queue --vhost "/" name=my-ha-queue durable=true
Ez tartós sort hoz létre az alapértelmezett /vhost- on a következő névvel: my-ha-queue.
Futtassa a következő parancsot, és ellenőrizze a kimenetben, hogy a sorhoz van-e hozzárendelve a „ha” házirend, és vannak-e pid-ek a fő és egy tükörcsomóponton.
sudo rabbitmqctl list_queues name policy state pid slave_pids
Most már közzétehetünk egy üzenetet a sorba a fő csomópontból, és leállíthatjuk a RabbitMQ-t a fő csomóponton.
sudo rabbitmqadmin -u user_name -p password publish routing_key=my-ha-queue payload="hello world"
sudo systemctl rabbitmqctl shutdown
Most kapja vissza a tükörcsomóponthoz való csatlakozással.
sudo rabbitmqadmin -H MIRROR_NODE_IP_OR_DNS -u user_name -p password get queue=my-ha-queue
Végül újraindíthatjuk főcsomópontunkat.
sudo systemctl start rabbitmq-server.service
Törölje a vendég felhasználót
Mint korábban említettük, a RabbitMQ automatikusan létrehoz egy vendég felhasználót alapértelmezett vendégjelszóval. Rossz gyakorlat lenne, ha ezt az alapértelmezett felhasználót nyilvánosan hozzáférhető rendszeren hagyná.
sudo rabbitmqctl delete_user guest