RabbitMQ erstellt eine Clusterumgebung, konfiguriert Spiegelcluster und führt einen Lastausgleich durch

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

Fügen Sie hier eine Bildbeschreibung ein

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.

Fügen Sie hier eine Bildbeschreibung ein

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.

Fügen Sie hier eine Bildbeschreibung ein

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.

Fügen Sie hier eine Bildbeschreibung ein

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.

Fügen Sie hier eine Bildbeschreibung ein

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
Fügen Sie hier eine Bildbeschreibung ein

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,也就是同步所有匹配的队列。问号链接帮助文档

Fügen Sie hier eine Bildbeschreibung ein

Erstellen Sie eine Spiegelwarteschlange

Erstellen Sie eine Warteschlange. Dann können Sie sehen, dass die Warteschlange mit der Synchronisierung beginnt
Fügen Sie hier eine Bildbeschreibung ein
Die Synchronisierung ist abgeschlossen und die Warteschlangendaten auf dem Knoten werden angezeigt mq1@node01 wird an mq2@node01Synchronisierung auf dem Knoten gesendet
Fügen Sie hier eine Bildbeschreibung ein

Spiegelwarteschlange testen

Senden Sie am Knotenmq1@node01 eine Nachricht an die Warteschlange.
Fügen Sie hier eine Bildbeschreibung ein
Überprüfen Sie die Warteschlange des Knotensmq2@node01 und suchen Sie dass die Nachricht synchronisiert wurde a>
Fügen Sie hier eine Bildbeschreibung ein

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/adminHAProxy-Überwachung ansehen
Fügen Sie hier eine Bildbeschreibung ein

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....");

    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_38628046/article/details/130185691
Recomendado
Clasificación