Aufbau eines RabbitMQ-Clusters
Installieren Sie RabbitMQ unter Linux
herunterladen
Offizielle RabbitMQ-Downloadseite:https://www.rabbitmq.com/download.html
RabbitMQ-Download:https://github.com/rabbitmq/rabbitmq-server/tags
Erlang-Download:https://github.com/rabbitmq/erlang-rpm/releases
Laden Sie RabbitMQ mit Erlang herunter:https://packagecloud.io/rabbitmq
Installieren
Hinweis: Wenn beim Herunterladen der Pakete rabbitmq-server
und erlang
der Paketname el8
enthält, bedeutet dies, dass Centos8 vorhanden ist zur Installation erforderlich! Beispiel: rabbitmq-server-3.11.13-1.el8.noarch.rpm
, andernfalls verursacht die Installation eine Ausnahme ähnlich der folgenden:
[root@node01 ~]# rpm -ivh erlang-25.3-1.el8.x86_64.rpm
警告:erlang-25.3-1.el8.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID cc4bbe5b: NOKEY
错误:依赖检测失败:
libcrypto.so.1.1()(64bit) 被 erlang-25.3-1.el8.x86_64 需要
libcrypto.so.1.1(OPENSSL_1_1_0)(64bit) 被 erlang-25.3-1.el8.x86_64 需要
libcrypto.so.1.1(OPENSSL_1_1_1)(64bit) 被 erlang-25.3-1.el8.x86_64 需要
libstdc++.so.6(CXXABI_1.3.9)(64bit) 被 erlang-25.3-1.el8.x86_64 需要
libtinfo.so.6()(64bit) 被 erlang-25.3-1.el8.x86_64 需要
libz.so.1(ZLIB_1.2.7.1)(64bit) 被 erlang-25.3-1.el8.x86_64 需要
Da der Server CentOS7 ist, suchen wir nach dem Softwarepaket mit el7
im Paketnamen. Das folgende Paket wird hier verwendet
rabbitmq-server-3.6.5-1.noarch.rpm
erlang-18.3-1.el7.centos.x86_64.rpm
Download-Link:https://download.csdn.net/download/qq_38628046/87697057
1. Installieren oder aktualisieren Sie abhängige Umgebungen
yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc
gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel
readline-devel tk-devel gcc make -y
2. Erlang installieren
[root@node01 ~]# rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:erlang-18.3-1.el7.centos ################################# [100%]
3. Rabbitmq installieren
[root@node01 ~]# rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
警告:rabbitmq-server-3.6.5-1.noarch.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 6026dfca: NOKEY
错误:依赖检测失败:
socat 被 rabbitmq-server-3.6.5-1.noarch 需要
Besuchen Sie:https://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/
Abhängigkeiten herunterladen
wget http://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/socat-1.7.3.2-2.el7.x86_64.rpm
[root@node01 ~]# rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
警告:socat-1.7.3.2-2.el7.x86_64.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 87e360b8: NOKEY
错误:依赖检测失败:
tcp_wrappers 被 socat-1.7.3.2-2.el7.x86_64 需要
Dann besuchen Sie:https://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/
Abhängigkeiten herunterladen
wget http://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/tcp_wrappers-7.6-77.el7.x86_64.rpm
[root@node01 ~]# rpm -ivh tcp_wrappers-7.6-77.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:tcp_wrappers-7.6-77.el7 ################################# [100%]
[root@node01 ~]# rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
警告:socat-1.7.3.2-2.el7.x86_64.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 87e360b8: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:socat-1.7.3.2-2.el7 ################################# [100%]
[root@node01 ~]# rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
警告:rabbitmq-server-3.6.5-1.noarch.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 6026dfca: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:rabbitmq-server-3.6.5-1 ################################# [100%]
Hinweis: Der Standardinstallationsort von Rabbitmq:/usr/lib/rabbitmq/bin
Grundlegende Betriebsbefehle
Überprüfen Sie den Status von RabbitMQ
systemctl status rabbitmq-server
Starten Sie den RabbitMQ-Dienst
systemctl start rabbitmq-server
systemctl restart rabbitmq-server
Stoppen Sie den RabbitMQ-Dienst
systemctl stop rabbitmq-server
Stellen Sie RabbitMQ so ein, dass es beim Booten automatisch startet
systemctl enable rabbitmq-server
Öffnen Sie die Verwaltungsoberfläche und Konfiguration
Öffnen Sie die Verwaltungsoberfläche
rabbitmq-plugins enable rabbitmq_management
Ändern Sie die Standardkonfigurationsinformationen
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
Oder erstellen Sie eine Konfigurationsdatei und konfigurieren Sie sie so, dass die Standardkonfigurationsinformationen überschrieben werden
cd /usr/share/doc/rabbitmq-server-3.6.5/
cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
Nachdem RabbitMQ installiert wurde, besuchen Siehttp://ip:15672
und melden Sie sich mit dem Gastbenutzernamen und dem Passwort an.
In Versionen nach 3.3.1 kann sich der Standardbenutzer Gast aus Sicherheitsgründen nur über localhost anmelden und andere IPs können dieses Konto nicht direkt verwenden.
Bearbeiten Sie die Konfigurationsdateivim /etc/rabbitmq/rabbitmq.config
und fügen Sie Folgendes hinzu:
[{
rabbit, [{
loopback_users, []}]}]
Hinweis: Fügen Sie einfach{loopback_users, []}]
an der entsprechenden Stelle hinzu
%% -*- mode: erlang -*-
%% ----------------------------------------------------------------------------
%% RabbitMQ Sample Configuration File.
%%
%% See http://www.rabbitmq.com/configure.html for details.
%% ----------------------------------------------------------------------------
[
{
rabbit,
[%%
{
loopback_users, []}
%% Network Connectivity
%% ====================
%%
%% By default, RabbitMQ will listen on all interfaces, using
%% the standard (reserved) AMQP port.
%%
%% {
tcp_listeners, [5672]},
%% To listen on a specific interface, provide a tuple of {
IpAddress, Port}.
%% For example, to listen only on localhost for both IPv4 and IPv6:
%%
%% {
tcp_listeners, [{
"127.0.0.1", 5672},
%% {
"::1", 5672}]},
Starten Sie nach dem Speichern den Rabbitmq-Server neu, um sich mit dem Gastbenutzernamen und dem Passwort anzumelden.
Aufbau eines RabbitMQ-Clusters
Offizielle Dokumentation:https://www.rabbitmq.com/clustering.html
Bestimmen Sie das Rabbitmq-Installationsverzeichnis
Suchen Sie das Installationsverzeichnis von Rabbitmq
[root@node01 rabbitmq-server-3.6.5]# whereis rabbitmq
rabbitmq: /usr/lib/rabbitmq /etc/rabbitmq
[root@node01 rabbitmq-server-3.6.5]# cd /usr/lib/rabbitmq/bin
[root@node01 bin]# ls
rabbitmqctl rabbitmq-defaults rabbitmq-env rabbitmq-plugins rabbitmq-server
Stellen Sie sicher, dass RabbitMQ ordnungsgemäß ausgeführt wird
rabbitmqctl status
Stoppen Sie dann den Rabbitmq-Dienst
systemctl stop rabbitmq-server
Starten Sie den ersten Knoten
[root@node01 bin]# RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=mq1 rabbitmq-server start
RabbitMQ 3.6.5. Copyright (C) 2007-2016 Pivotal Software, Inc.
## ## Licensed under the MPL. See http://www.rabbitmq.com/
## ##
########## Logs: /var/log/rabbitmq/mq1.log
###### ## /var/log/rabbitmq/mq1-sasl.log
##########
Starting broker...
completed with 6 plugins.
Starten Sie den zweiten Knoten
Der Web-Management-Plug-in-Port belegt, daher müssen Sie auch die Portnummer angeben, die von seinem Web-Plug-in belegt wird.
[root@node01 bin]# RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=mq2 rabbitmq-server start
RabbitMQ 3.6.5. Copyright (C) 2007-2016 Pivotal Software, Inc.
## ## Licensed under the MPL. See http://www.rabbitmq.com/
## ##
########## Logs: /var/log/rabbitmq/mq2.log
###### ## /var/log/rabbitmq/mq2-sasl.log
##########
Starting broker...
completed with 6 plugins.
Stoppbefehl
[root@node01 ~]# rabbitmqctl -n mq1 stop
Stopping and halting node mq1@node01 ...
[root@node01 ~]# rabbitmqctl -n mq2 stop
Stopping and halting node mq2@node01 ...
Erstellen Sie einen Cluster
mq1-Betrieb als Masterknoten:
Hinweis: Stellen Sie vor dem Betrieb des Knotens sicher, dass mq ausgeführt wird
[root@node01 ~]# rabbitmqctl -n mq1 stop_app
Stopping node mq1@node01 ...
[root@node01 ~]# rabbitmqctl -n mq1 reset
Resetting node mq1@node01 ...
[root@node01 ~]# rabbitmqctl -n mq1 start_app
Starting node mq1@node01 ...
mq2 fungiert als Slave-Knoten:
[root@node01 ~]# rabbitmqctl -n mq2 stop_app
Stopping node mq2@node01 ...
[root@node01 ~]# rabbitmqctl -n mq2 reset
Resetting node mq2@node01 ...
[root@node01 ~]# rabbitmqctl -n mq2 join_cluster mq1@'node01'
Clustering node mq2@node01 with mq1@node01 ...
[root@node01 ~]# rabbitmqctl -n mq2 start_app
Starting node mq2@node01 ...
Cluster anzeigen
[root@node01 ~]# rabbitmqctl cluster_status -n mq1
Cluster status of node mq1@node01 ...
[{
nodes,[{
disc,[mq1@node01,mq2@node01]}]},
{
running_nodes,[mq2@node01,mq1@node01]},
{
cluster_name,<<"mq1@node01">>},
{
partitions,[]},
{
alarms,[{
mq2@node01,[]},{
mq1@node01,[]}]}]
Webüberwachung anzeigen
Clustermanagement
Fügen Sie den Knoten zum angegebenen Cluster hinzu
Hinweis: Sie müssen die RabbitMQ-Anwendung stoppen und den Knoten zurücksetzen
rabbitmqctl join_cluster {
cluster_node} [–ram]
Clusterstatus anzeigen
rabbitmqctl cluster_status
Ändern Sie den Typ des Clusterknotens
Hinweis: Sie müssen die RabbitMQ-Anwendung stoppen
rabbitmqctl change_cluster_node_type {
disc|ram}
Entfernen Sie den Knoten aus dem Cluster, um die Offline-Ausführung zu ermöglichen
rabbitmqctl forget_cluster_node [–offline]
Konsultieren Sie die neuesten Informationen des Clusternode-Knotens, bevor Sie die Knotenanwendung im Cluster starten, und aktualisieren Sie die entsprechenden Clusterinformationen.
Dies unterscheidet sich von „join_cluster“, da es nicht dem Cluster beitritt. Stellen Sie sich eine Situation vor, in der Knoten A und Knoten B beide im Cluster sind. Wenn Knoten A offline geht, bildet Knoten C einen Cluster mit Knoten B, und dann verlässt Knoten B den Cluster wieder. Wenn A aufwacht, wird ein Versuch unternommen Kontakt zu Knoten B aufzunehmen, dies schlägt jedoch fehl, da Knoten B nicht mehr im Cluster ist.
rabbitmqctl update_cluster_nodes {
clusternode}
Brechen Sie den Vorgang der Spiegelung der Warteschlangensynchronisierung ab
rabbitmqctl cancel_sync_queue [-p vhost] {
queue}
Legen Sie den Clusternamen fest. Der Clustername wird dem Client mitgeteilt, wenn er eine Verbindung herstellt. Die Plugins „Federation“ und „Shovel“ sind auch dort nützlich, wo der Clustername verwendet wird. Der Clustername ist standardmäßig der Name des ersten Knotens im Cluster und kann mit diesem Befehl zurückgesetzt werden.
rabbitmqctl set_cluster_name {
name}
Konfiguration des RabbitMQ-Spiegelclusters
Der Standard-Clustermodus von RabbitMQ ermöglicht die Replikation von Metadaten wie Schaltern und Bindungen auf alle Knoten im Cluster und stellt so sicher, dass diese Metadaten im gesamten Cluster verfügbar sind.
Der Inhalt der Warteschlange wird jedoch nicht automatisch auf andere Knoten im Cluster kopiert. Dies bedeutet, dass bei einem Ausfall oder Ausfall eines Knotens der Inhalt der Warteschlange auf diesem Knoten von Verbrauchern nicht gelesen werden kann.
Um dieses Problem zu lösen, muss eine Spiegelwarteschlange erstellt werden. Die Spiegelwarteschlange ist ein spezieller Warteschlangentyp, der die Nachrichten in der Warteschlange auf andere Knoten im Cluster kopiert, um sicherzustellen, dass die Nachrichten in der Warteschlange unter allen Umständen normal verarbeitet werden können.
Wenn ein hochverfügbarer RabbitMQ-Cluster erstellt werden muss, wird normalerweise eine Spiegelwarteschlange verwendet, um die Nachrichtenzustellung und -persistenz sicherzustellen.
Aktivieren Sie die HA-Richtlinie
Die Spiegelwarteschlange basiert auf dem normalen Clustermodus und fügt dann einige Richtlinien hinzu. Sie müssen also zuerst den normalen Cluster konfigurieren und dann die Spiegelwarteschlange einrichten.
Es gibt zwei Möglichkeiten, eine Spiegelwarteschlange einzurichten:
1. Legen Sie die Spiegelwarteschlange über den Befehl fest
rabbitmqctl set_policy ha "^" '{
"ha-mode":"all"}'
2. Richten Sie die Spiegelwarteschlange über das Webverwaltungsterminal ein
Name:策略名称
Pattern:匹配的规则,如果是匹配所有的队列,是^
Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档
Erstellen Sie eine Spiegelwarteschlange
Erstellen Sie eine Warteschlange. Dann können Sie sehen, dass die Warteschlange mit der Synchronisierung beginnt
Die Synchronisierung ist abgeschlossen und die Warteschlangendaten auf dem Knoten werden angezeigt mq1@node01
wird an mq2@node01
Synchronisierung auf dem Knoten gesendet
Spiegelwarteschlange testen
Senden Sie am Knotenmq1@node01
eine Nachricht an die Warteschlange.
Überprüfen Sie die Warteschlange des Knotensmq2@node01
und suchen Sie dass die Nachricht synchronisiert wurde a>
Lastausgleich-HAProxy
HAProxy bietet Hochverfügbarkeit, Lastausgleich und Proxying für TCP- und HTTP-Anwendungen und unterstützt virtuelles Hosting. Es ist eine kostenlose, schnelle und zuverlässige Lösung, einschließlich Twitter, Reddit, StackOverflow, GitHub und vielen anderen bekannten Internetanbietern Unternehmen nutzen es. HAProxy implementiert ein ereignisgesteuertes Einzelprozessmodell, das eine sehr große Anzahl gleichzeitiger Verbindungen unterstützt.
Offizieller Download:https://www.haproxy.org/download/
Installieren Sie HAProxy
Laden Sie das tar.gz-Installationspaket von HAProxy herunter
wget https://www.haproxy.org/download/2.7/src/haproxy-2.7.6.tar.gz
Entpacken Sie das Installationspaket
tar xvfz haproxy-2.7.6.tar.gz
cd haproxy-2.7.6
Kernelversion anzeigen
[root@node01 ~]# uname -r
3.10.0-1160.88.1.el7.x86_64
Kompilieren und installieren Sie HAProxy
ARGET=linux310:内核版本
ARCH=x86_64:系统位数
PREFIX=/usr/local/haproxy:haprpxy安装路径
make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64
make install PREFIX=/usr/local/haproxy
Haproxy konfigurieren
Erstellen Sie eine Benutzergruppe mit dem Namen „haproxy“
# -r 将该用户组设置为系统级别的组
groupadd -r haproxy
Erstellen Sie einen Benutzer mit dem Namen „haproxy“
# -g 将该用户添加到上面创建的"haproxy"用户组中
# -r 将该用户设置为系统级别用户
useradd -r -g haproxy haproxy
Erstellen Sie eine Haproxy-Konfigurationsdatei
mkdir -p /etc/haproxy
# 源码目录下执行
cp examples/quick-test.cfg /etc/haproxy/haproxy.cfg
Ändern Sie die Konfigurationsdatei/etc/haproxy/haproxy.cfg
und konfigurieren Sie sie nach Bedarf, siehe folgendes Beispiel
# 全局配置参数,属于进程级的配置
global
# 日志配置 local0:日志设备 info:日志记录级别
log 127.0.0.1 local0 info
# haproxy工作目录
chroot /usr/local/haproxy
# haproxy启动后进程的pid文件路径
pidfile /usr/local/haproxy/haproxy.pid
# 每个haproxy进程可接受的最大并发连接数
maxconn 4000
user haproxy
group haproxy
# haproxy启动时可创建的进程数,默认1个,值应小于服务器的CPU核数,高版本已弃用
# nbproc 1
# haproxy在后台运行
daemon
# 默认参数配置
defaults
mode tcp
log global
option abortonclose
option redispatch
# 配置连接后端服务器失败重试次数,超过3次后会将失败的后端服务器标记为不可用
retries 3
# 配置成功连接到一台服务器的最长等待时间,默认单位是毫秒,也可自己指定单位
timeout connect 10000
# 配置连接客户端发送数据时的最长等待时间,默认单位是毫秒,也可自己指定单位
timeout client 1m
# 配置服务器端回应客户端数据发送时最长等待时间,默认单位是毫秒,也可自己指定单位
timeout server 1m
# 配置对后端服务器的检测超时时间,默认单位是毫秒,也可自己指定单位
timeout check 10s
# 最大连接数
maxconn 3000
# 定义服务叫"proxy_status "名字的虚拟节点
# haproxy代理的两个mq
listen proxy_status
# 配置监听5672端口
bind 0.0.0.0:5672
# tcp模式
mode tcp
# 轮询访问mq1与mq2
balance roundrobin
# mq真实IP:端口
server node01 192.168.10.13:5673 check inter 10s
server node02 192.168.10.13:5674 check inter 10s
# 定义服务叫"admin_stats"名字的虚拟节点
# haproxy管理页面
frontend admin_stats
# 监听地址和端口
bind *:8888
# http模式
mode http
# 配置在客户端和服务器完成一次连接请求后,haproxy主动关闭此TCP连接
option httpclose
# 配置后端服务器需要获得客户端的真实IP,通过增加"X-Forwarded-For"来记录客户端IP
option forwoardfor
# 启用日志来记录http请求,默认只对tcp日志进行日志记录
option httplog
maxconn 10
stats enable
stats refresh 30s
# 统计页面路径
stats uri /admin
# 设置统计页面认证的用户和密码
stats auth admin:123123
stats hide-version
stats admin if TRUE
Starten Sie den HAProxy-Dienst
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
Haproxy-Prozessstatus anzeigen
[root@node01 haproxy]# ps -ef|grep haproxy
haproxy 6061 1 0 22:51 ? 00:00:00 /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
root 6318 27966 0 22:51 pts/8 00:00:00 grep --color=auto haproxy
HAProxy-Überwachung anzeigen
Besuchenhttp://192.168.10.13:8888/admin
HAProxy-Überwachung ansehen
Java-Code zum Herstellen einer Verbindung zum MQ-Cluster
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 发送消息
*/
public class HelloWorld {
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置参数
factory.setHost("192.168.10.13");// HaProxy的ip
factory.setPort(5672); //端口 HaProxy的监听的端口
// 创建连接 Connection
Connection connection = factory.newConnection();
// 创建Channel
Channel channel = connection.createChannel();
// 创建队列Queue
channel.queueDeclare("hello_queue",true,false,false,null);
String body = "hello rabbitmq";
// 发送消息
channel.basicPublish("","hello_queue",null,body.getBytes());
// 释放资源
channel.close();
connection.close();
System.out.println("send success....");
}
}