Comprendre l'utilisation de RabbitMQ+haProxy+keepalived
前言
如有错误,随时斧正,非常感谢!
为什么要使用haProxy+keepalived呢?
为了AMQP服务的稳定性
首先先说下为什么要使用haProxy。
我在两台服务器上建了AMQP集群,分别是10.71.13.24和10.71.13.25,以后简称为24、25服务器。假设AMQP客户端直接连接24或25。如果24|25服务器宕机了,那么连接24|25的AMQP客户端就无法工作,消费者也无法进行正常消费(以下以24举例代表24|25单机的情况)。再者单机连接可能造成单机负载过高,而其他服务器空闲的状态。此时则可以通过haProxy实现负载均衡。
在本地的配置如:
global #log 127.0.0.1 local0 #[日志输出配置,所有日志都记录在本机,通过local0输出] log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warringinfo debug] daemon #以后台形式运行harpoxy nbproc 2 #设置进程数量 maxconn 4096 #默认最大连接数,需考虑ulimit-n限制 #user haproxy #运行haproxy的用户 pidfile /var/run/haproxy.pid #haproxy 进程PID文件 #group www #运行haproxy的用户所在的组 #ulimit-n 65535 #ulimit 的数量限制 #chroot /usr/share/haproxy #chroot运行路径 #debug #haproxy 调试级别,建议只在开启单进程的时候调试 #quiet ########默认配置############ defaults log global log 127.0.0.1 local0 info mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK option httplog #日志类别,采用httplog option dontlognull #不记录健康检查日志信息 retries 3 #两次连接失败就认为是服务器不可用,也可以通过后面设置 option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现 option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接 maxconn 4096 #默认的最大连接数 #timeout http-keep-alive10s #默认持久连接超时时间 #timeout http-request 10s #默认http请求超时时间 #timeout queue 1m #默认队列超时时间 balance roundrobin #设置默认负载均衡方式,轮询方式 #balance source #设置默认负载均衡方式,类似于nginx的ip_hash #balnace leastconn #设置默认负载均衡方式,最小连接数 timeout connect 5s #连接超时 timeout client 120s # 客户端超时 timeout server 120s #服务端超时 timeout check 2000 #心跳检测超时ms #绑定配置 listen rabbitmq_cluster bind 0.0.0.0:5678 mode http #配置TCP模式 balance roundrobin #RabbitMQ集群节点配置 server rmq_node_13_24 10.71.13.24:5672 check inter 5000 rise 2 fall 3 weight 1 server rmq_node_13_25 10.71.13.25:5672 check inter 5000 rise 2 fall 3 weight 1 # server <name> <ip>:<port> check inter <value> rise <value> fall <value> weight <value> # check inter <value>:每隔5000ms检测AMQP服务是否可用 # rise <value>:检测到2次可用则可被确认再次可用。 # fall <value>:检测到3次无法连接则认为服务不可用 # weight <value>:权重
配置完haProxy.cfg之后,启动haProxy:sudo /etc/init.d/haproxy start
。(haproxy启动脚本见最后)
配置解析:之前连接的socket是10.71.13.24:5672
,现在连接的socket是10.71.13.24:5678
。在25也可以按24的配置COPY一份,因此无论连接的是哪个服务器的5678端口最终都能实现负载均衡。然后还是有一个问题没有解决,如果某个服务器宕机了怎么办?这就是为什么要引入keepalived了。
再谈keepalived的使用
关于keepalived的原理我不熟,也就不过多的去解读。目前我只是想要解决我碰到的问题。为了解决AMQP最终能够稳定服务,于是申请了一个虚拟IP-VIP:10.71.13.254。通过这个VIP则可以开始配置keepalived.conf了。
! Configuration File for keepalived global_defs { router_id Node_Master # 路由ID,主备的不能相同}vrrp_script chk_haproxy { script "/etc/keepalived/check_haproxy.sh" interval 5 weight 2}vrrp_instance VI_1 { state MASTER #keepalived的角色。Master表示主服务器,从服务器设置为BACKUP interface eth1 #指定检测网卡,配置成eth0之后我无法连接到AMQP服务 virtual_router_id 1 priority 100 #优先级,BACKUP机器上的优先级至少小于50 advert_int 1 #设置主备之间的检测时间,单位为s authentication { auth_type PASS auth_pass root123 } track_script { chk_haproxy } virtual_ipaddress { #VIP地址,可以设置多个 10.71.13.254 }}virtual_server 10.71.13.254 5672 { # 设置虚拟服务器 delay_loop 6 #设置运行情况检查时间,单位s lb_algo wrr #设置负载调度算法,共有rr、wrr、lc、wlc、lblc、lblcr、dh、sh 这8种 lb_kind DR #设置LVS实现的负载均衡机制方式 VS/DR persistence_timeout 50 #指定在一定时间内来自同一IP的连接将会被转发到同一RealServer中 protocol TCP # 这个real_server 即LVS的三大部分之一的RealServer,这里特指RabbitMQ服务 real_server 10.71.13.24 5678 { #配置服务节点 weight 1 #配置权重 TCP_CHECK { nb_get retry 3 connect_timeout 3 delay_before_retry 3 connect_port 5672 } } real_server 10.71.13.25 5678 { weight 1 TCP_CHECK { nb_get retry 3 connect_timeout 3 delay_before_retry 3 connect_port 5672 } } }virtual_server 10.71.13.254 15672 { delay_loop 6 lb_algo wrr lb_kind DR persistence_timeout 50 protocol TCP real_server 10.71.13.24 15672 { weight 1 TCP_CHECK { nb_get retry 3 connect_timeout 3 delay_before_retry 3 connect_port 15672 } } real_server 10.71.13.25 15672 { weight 1 TCP_CHECK { nb_get retry 3 connect_timeout 3 delay_before_retry 3 connect_port 15672 } }}
check_haproxy.sh
脚本的目的是为了防止haProxy服务已经不可用而keepalived可用的情况,该脚本会尝试重新启动haProxy,如果启动不成功则关闭keepalived。这样keepalived的VIP就会漂移到BACKUP备份机,从而继续保证服务。脚本的配置如下:
#! /bin/bashif [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then sudo service haproxy restartfisleep 2if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then sudo service keepalived stopfi
在25服务器上的配置和24的服务器基本一致,注意修改属性:route_id、state、priority。
然后启动keepalived:sudo /etc/init.d/keepalived start
。(启动脚本见最后)
启动完keepalived之后,我们再次连接AMQP服务就变成了:10.71.13.254:5762
,因为master是24服务器,所以实际真实响应的服务是10.71.13.24:5678
和10.71.13.25:5678
。因为采用的是加权轮询且权重都是1,24和25会轮流响应VIP的请求。在haProxy中监听了5678端口,并且采用了轮询机制分发到24和25的5672端口。会发现keepalived的和haProxy都使用了轮询机制,能不能把其中的某一处去掉呢?增加了VIP之后如果master宕机之后,就会选举一个从机成为主机,接管原主机的服务。当人工修复好了原主机之后,从机会把服务重新还给主机去接管,自己还原成原来的状态。
haProxy和keepalived的启动脚本
haProxy的启动脚本
#! /bin/shset -ePATH=/sbin:/bin:/usr/sbin:/usr/binPROGDIR=/opt/haproxy-1.7.11PROGNAME=haproxyDAEMON=$PROGDIR/$PROGNAMECONFIG=$PROGDIR/conf/$PROGNAME.cfg # PIDFILE=$PROGDIR/conf/$PROGNAME.pidPIDFILE=/var/run/haproxy.pidDESC="HAProxy daemon"SCRIPTNAME=/etc/init.d/$PROGNAME# Gracefully exit if the package has been removed.test -x $DAEMON || exit 0start(){ echo -e "Starting $DESC: $PROGNAME\n" $DAEMON -f $CONFIG echo "."}stop(){ echo -e "Stopping $DESC: $PROGNAME\n" haproxy_pid="$(cat $PIDFILE)" kill $haproxy_pid echo "."}restart(){ echo -e "Restarting $DESC: $PROGNAME\n" $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE) echo "."}case "$1" in start) start ;; stop) stop ;; restart) restart ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 exit 1 ;;esac exit 0
keepalived启动脚本:
#!/bin/sh # # Startup script for the Keepalived daemon # # processname: keepalived # pidfile: /var/run/keepalived.pid # config: /etc/keepalived/keepalived.conf # chkconfig: - 21 79# description: Start and stop Keepalived # Source function library. /etc/rc.d/init.d/functions # Source configuration file (we set KEEPALIVED_OPTIONS there). /etc/sysconfig/keepalivedRETVAL=0prog="keepalived"start() { echo -n $"Starting $prog: " daemon keepalived ${KEEPALIVED_OPTIONS} RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog}stop() { echo -n $"Stopping $prog: " killproc keepalived RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog}reload() { echo -n $"Reloading $prog: " killproc keepalived -1 RETVAL=$? echo}# See how we were called.case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; condrestart) if [ -f /var/lock/subsys/$prog ]; then stop start fi ;; status) status keepalived RETVAL=$? ;; *) echo "Usage: $0 {start|stop|reload|restart|condrestart|status}" RETVAL=1esac exit $RETVAL
相关学习推荐:php编程(视频)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds





Comment créer une application de messagerie fiable avec React et RabbitMQ Introduction : Les applications modernes doivent prendre en charge une messagerie fiable pour obtenir des fonctionnalités telles que les mises à jour en temps réel et la synchronisation des données. React est une bibliothèque JavaScript populaire pour créer des interfaces utilisateur, tandis que RabbitMQ est un middleware de messagerie fiable. Cet article explique comment combiner React et RabbitMQ pour créer une application de messagerie fiable et fournit des exemples de code spécifiques. Présentation de RabbitMQ :

Comment utiliser RabbitMQ pour implémenter le traitement distribué des messages en PHP Introduction : Dans le développement d'applications à grande échelle, les systèmes distribués sont devenus une exigence courante. Le traitement distribué des messages est un modèle qui améliore l'efficacité et la fiabilité du système en distribuant les tâches à plusieurs nœuds de traitement. RabbitMQ est un système de mise en file d'attente de messages open source et fiable qui utilise le protocole AMQP pour implémenter la livraison et le traitement des messages. Dans cet article, nous expliquerons comment utiliser RabbitMQ en PHP pour la distribution

Maintenir l’équilibre de la charge des serveurs Web est l’une des mesures clés pour éviter les temps d’arrêt. L'utilisation d'un équilibreur de charge est une approche fiable, HAProxy étant un choix très apprécié. À l'aide de HAProxy, vous pouvez configurer avec précision la méthode d'équilibrage de charge et prendre en charge le relais SSL pour garantir la sécurité de la communication entre le client et le serveur. Il commence par explorer l'importance de la mise en œuvre du relais SSL dans HAProxy, suivi d'une discussion détaillée des étapes requises pour implémenter cette fonctionnalité et d'un exemple pour une meilleure compréhension. Qu'est-ce que le relais SSL ? Pourquoi c'est important? En tant qu'équilibreur de charge, HAProxy accepte et distribue la charge circulant vers vos serveurs Web sur les serveurs configurés. La répartition de la charge est ciblée sur les appareils clients et

Comment s'assurer que les messages ne sont pas perdus. Le chemin de livraison des messages Rabbitmq producteur->switch->file d'attente->consommateur est généralement divisé en trois étapes. 1. Le producteur garantit la fiabilité de la livraison des messages. 2.Les messages internes de MQ ne sont pas perdus. 3. La consommation des consommateurs est réussie. Qu'est-ce que la fiabilité de la livraison des messages ? En termes simples, cela signifie que les messages sont envoyés à 100 % à la file d'attente des messages. Nous pouvons activer confirmCallback. Une fois que le producteur a envoyé le message, mq donnera au producteur un accusé de réception. Sur la base de l'accusé de réception, le producteur peut confirmer si le message est envoyé à mq. Activez confirmCallback et modifiez le fichier de configuration. #NONE : désactiver. le mode de confirmation de libération, qui est la valeur par défaut, CORRÉLÉ :

À mesure que les applications modernes deviennent de plus en plus complexes, la messagerie est devenue un outil puissant. Dans ce domaine, RabbitMQ est devenu un courtier de messages très populaire qui peut être utilisé pour transmettre des messages entre différentes applications. Dans cet article, nous explorerons comment utiliser RabbitMQ en langage Go. Ce guide couvrira les éléments suivants : Introduction à RabbitMQ Installation de RabbitMQ Concepts de base de RabbitMQ Premiers pas avec RabbitMQ dans Go RabbitMQ et Go

Les applications WebSocket permettent une communication bidirectionnelle en temps réel entre le client et le serveur. Même si des connexions WebSocket sont utilisées, des mécanismes efficaces de gestion du trafic sont toujours nécessaires pour éviter une surcharge du serveur, entraînant une interruption et une indisponibilité du service. HAProxy est un équilibreur de charge gratuit et fiable qui fonctionne également comme proxy inverse. En configurant HAProxy pour prendre en charge les connexions WebSocket, vous pouvez mieux utiliser les caractéristiques de transmission de données en temps réel des WebSockets et réduire la charge du serveur. Cet article fournira des étapes détaillées pour configurer HAProxy pour prendre en charge les connexions WebSocket. Guide étape par étape sur la configuration de HAProxy pour les connexions WebSocket via WebSoc

Auteur de cet article : Spark (membre de l'équipe de sécurité intranet Ms08067) 1. Présentation Haproxy est un logiciel proxy d'équilibrage de charge hautes performances développé en langage C. Il fournit des proxys d'application TCP et http. Il est gratuit, rapide et fiable. Semblable à frp, il peut être exécuté à l'aide d'un fichier de configuration + d'un serveur. Avantages : les applications de terrain d'entreprise à grande échelle prennent largement en charge les proxys à quatre couches (couche de transport) et les proxys à sept couches (couche d'application) et peuvent configurer de manière flexible les fenêtres de routage. La liste de contrôle d'accès cygwin (peut être multiplateforme) (AccessControlLists, ACL) est une liste de commandes appliquées à l'interface du routeur.

Introduction à la solution de synchronisation des données en temps réel entre Golang et RabbitMQ : À l'ère actuelle, avec la popularité d'Internet et la croissance explosive du volume de données, la synchronisation des données en temps réel est devenue de plus en plus importante. Afin de résoudre les problèmes de transmission asynchrone et de synchronisation des données, de nombreuses entreprises ont commencé à utiliser des files d'attente de messages pour réaliser une synchronisation des données en temps réel. Cet article présentera une solution de synchronisation de données en temps réel basée sur Golang et RabbitMQ et fournira des exemples de code spécifiques. 1. Qu'est-ce que RabbitMQ ? Rabbin
