15、RabbitMQ学习笔记—Ha-Proxy高可用

Haproxy

HAProxy是一款提供高可用性、负载均衡以及基于TCP (第四层)和HTTP (第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且HAProxy是一款提供高可用性、负载均衡以及基于TCP (第四层)和HTTP (第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上.
HAProxy借助于OS上几种常见的技术来实现性能的最大化:

  • 1,单进程、事件驱动模型显著降低了上下文切换的开销及内存占用
  • 2,在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽
  • 3,借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用, HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting)
  • 4,内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长
  • 5,树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列
    安装
    //下载依赖包
    yum install gcc vim wget
    //下载haproxy
    wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.5.tar.gz
    解压
    tar -zxvf haproxy-1.6.5.tar.gz -C /usr/local
    //进入目录、进行编译、安装
    cd /usr/local/haproxy-1.6.5
    make TARGET=linux31 PREFIX=/usr/local/haproxy
    make install PREFIX=/usr/local/haproxy
    mkdir /etc/haproxy
    //赋权
    groupadd -r -g 149 haproxy
    useradd -g haproxy -r -s /sbin/nologin -u 149 haproxy
    //创建haproxy配置文件
    touch /etc/haproxy/haproxy.cfg
    Haproxy配置
    PS:haproxy 配置文件haproxy.cfg详解
    vim /etc/haproxy/haproxy.cfg
#logging options
global
	log 127.0.0.1 local0 info
	maxconn 5120
	chroot /usr/local/haproxy
	uid 99
	gid 99
	daemon
	quiet
	nbproc 20
	pidfile /var/run/haproxy.pid

defaults
	log global
	#使用4层代理模式,”mode http”为7层代理模式
	mode tcp
	#if you set mode to tcp,then you nust change tcplog into httplog
	option tcplog
	option dontlognull
	retries 3
	option redispatch
	maxconn 2000
	contimeout 5s
     ##客户端空闲超时时间为 60秒 则HA 发起重连机制
     clitimeout 60s
     ##服务器端链接超时时间为 15秒 则HA 发起重连机制
     srvtimeout 15s	
#front-end IP for consumers and producters

listen rabbitmq_cluster
	bind 0.0.0.0:5672
	#配置TCP模式
	mode tcp
	#balance url_param userid
	#balance url_param session_id check_post 64
	#balance hdr(User-Agent)
	#balance hdr(host)
	#balance hdr(Host) use_domain_only
	#balance rdp-cookie
	#balance leastconn
	#balance source //ip
	#简单的轮询
	balance roundrobin
	#rabbitmq集群节点配置 #inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
        server bhz76 192.168.11.76:5672 check inter 5000 rise 2 fall 2
        server bhz77 192.168.11.77:5672 check inter 5000 rise 2 fall 2
        server bhz78 192.168.11.78:5672 check inter 5000 rise 2 fall 2
#配置haproxy web监控,查看统计信息
listen stats
	bind 192.168.11.79:8100
	mode http
	option httplog
	stats enable
	#设置haproxy监控地址为http://localhost:8100/rabbitmq-stats
	stats uri /rabbitmq-stats
	stats refresh 5s

启动haproxy
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
//查看haproxy进程状态
ps -ef | grep haproxy
访问haproxy
PS:访问如下地址可以对rmq节点进行监控:http://192.168.1.27:8100/rabbitmq-stats
关闭haproxy
killall haproxy
ps -ef | grep haproxy

KeepAlived

KeepAlived软件主要是通过VRRP协议实现高可功的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行所以, Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能
KeepAlived服务的三个重要功能:

  • 管理LVS负载均衡软件
  • 实现LVS集群节点的健康检查中
  • 作为系统网络服务的高可用性(failover)
    Keepalived高可用服务对之间的故障切换转移,是通过VRRP (Virtual RouterRedundancy Protocol,虚拟路由器冗余协议)来实现的。在Keepalived服务正常工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的IP资源及服务。而当主Master节点恢复时备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色
    那么,什么是VRRP呢? VRRP,全称Virtual Router RedundancyProtocol,中文名为虚拟路由冗余协议, VRRP的出现就是为了解决静态路由的单点故障问题, VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的
    //安装所需软件包
    yum install -y openssl openssl-devel
    //下载
    wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
    //解压、编译、安装
    tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
    cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
    make && make install
    //将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作
    //首先创建文件夹,将keepalived配置文件进行复制:
    mkdir /etc/keepalived
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    //然后复制keepalived脚本文件:
    cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    ln -s /usr/local/sbin/keepalived /usr/sbin/
    ln -s /usr/local/keepalived/sbin/keepalived /sbin/
    //可以设置开机启动:chkconfig keepalived on,到此我们安装完毕!
    chkconfig keepalived on
    3、Keepalived配置
    PS:修改keepalived.conf配置文件
    vim /etc/keepalived/keepalived.conf

PS: 79节点(Master)配置如下
! Configuration File for keepalived
global_defs {
router_id bhz79 ##标识节点的字符串,通常为hostname
}
vrrp_script chk_haproxy {
script “/etc/keepalived/haproxy_check.sh” ##执行脚本位置
interval 2 ##检测时间间隔
weight -20 ##如果条件成立则权重减20
}
vrrp_instance VI_1 {
state MASTER ## 主节点为MASTER,备份节点为BACKUP
interface eth0 ## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eth0)
virtual_router_id 79 ## 虚拟路由ID号(主备节点一定要相同)
mcast_src_ip 192.168.11.79 ## 本机ip地址
priority 100 ##优先级配置(0-254的值)
nopreempt
advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s
authentication { ## 认证匹配
auth_type PASS
auth_pass bhz
}
track_script {
chk_haproxy
}
virtual_ipaddress {
192.168.11.70 ## 虚拟ip,可以指定多个
}
}
PS: 80节点(backup)配置如下
! Configuration File for keepalived

global_defs {
router_id bhz80 ##标识节点的字符串,通常为hostname
}
vrrp_script chk_haproxy {
script “/etc/keepalived/haproxy_check.sh” ##执行脚本位置
interval 2 ##检测时间间隔
weight -20 ##如果条件成立则权重减20
}
vrrp_instance VI_1 {
state BACKUP ## 主节点为MASTER,备份节点为BACKUP
interface eno16777736 ## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eno16777736)
virtual_router_id 79 ## 虚拟路由ID号(主备节点一定要相同)
mcast_src_ip 192.168.11.80 ## 本机ip地址
priority 90 ##优先级配置(0-254的值)
nopreempt
advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s
authentication { ## 认证匹配
auth_type PASS
auth_pass bhz
}
track_script {
chk_haproxy
}
virtual_ipaddress {
192.168.1.70 ## 虚拟ip,可以指定多个
}
}

4、执行脚本编写
PS:添加文件位置为/etc/keepalived/haproxy_check.sh(79、80两个节点文件内容一致即可)
#!/bin/bash
COUNT=ps -C haproxy --no-header |wc -l
if [ $COUNT -eq 0 ];then
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
sleep 2
if [ ps -C haproxy --no-header |wc -l -eq 0 ];then
killall keepalived
fi
fi
5、执行脚本赋权
PS:haproxy_check.sh脚本授权,赋予可执行权限.
chmod +x /etc/keepalived/haproxy_check.sh
6、启动keepalived
PS:当我们启动俩个haproxy节点以后,我们可以启动keepalived服务程序:
//启动两台机器的keepalived
service keepalived start | stop | status | restart
//查看状态
ps -ef | grep haproxy
ps -ef | grep keepalived

集群回复与故障转移

RabbitMQ镜像队列集群的恢复的解决方案和应用场景:
前提:比如两个节点A和B组成一个镜像队列

  • 场景1:A先停,B后停
    方案1:该场景下B是Master,只要先启动B,再启动A即可。或者先启动A,再30秒之内启动B即可恢复镜像队列
  • 场景2: A、B同时停机
    方案2:该场景可能是由于机房掉电等原因造成的,只需在30秒之内连续启动A和B即可恢复镜像
  • 场景3: A先停, B后停,且A无法恢复
    方案3:改场景是1场景的加强版,因为B是Master,所以等B起来以后,在B节点上调用控制台命令: rabbitmqctl
    forget cluster node A解除与A的Cluster关系,再将新的Slave节点加入B即可重新恢复镜像队列
  • 场景4: A先停, B后停,且B无法恢复
    方案4:该场景是场景3的加强版,比较难处理,原因是因为Master节点无法恢复,早在3.1.x时代之前没有什么好的解决方案,但是现在已经有解决方案了,在3.4.2以后的版本。因为B是主节点,所以直接启动A是不行的,当A无法启动的时候,也就没办法在A节点上调用之前的rabbitmactl forget cluster-node B命令了。新版本中,
    forget cluster-node支持-offline参数
    这就意味着允许rabbitmqctl在理想节点上执行该命令,迫使RabbitMQ在未启动Slave节点中选择一个节点作为Master,当在A节点执行rabbitmqctl forget cluster node-offline B时RabbitMQ会mock一个节点代表A,执行forget cluster node命令将B剔除cluster,然后A就可以正常启动了,最后将新的Slave节点加入A即可重新恢复镜像队列
  • 场景5: A先停、B后停,且A、B均无法恢复,但是能得到A或B的磁盘文件
    方案5:这种场景更加难处理,只能通过恢复数据的方式去尝试恢复,将A或B的数据库文件默认在$RABBIT-HOME/var/lib/目录中,把它拷贝到新节点的对应mulxia,再将新节点的hostname改成A或B的hostname,如果是A节点(Slave)的磁盘文件,则按照场景4处理即可,如果是B节点(Master)的磁盘文件,则按照场景3处理,最后将新的Slave加入到新节点后完成恢复

延迟插件作用:

延迟队列可以做什么事情?
比如消息的延迟推送、定时任务(消息)的执行。包括一些消息重试策略的配合使用,以及用于业务削峰限流、降级的异步延迟消息机制,都是延迟队列的实际应用场景
#step1:upload the ‘rabbitmq_delayed_message_exchange-0.0.1.ez’ file:
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange
http://www.rabbitmq.com/community-plugins.html
https://bintray.com/rabbitmq/community-plugins/rabbitmq_delayed_message_exchange/v3.6.x#files/

#step2:PUT Directory:
/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.4/plugins
#step3:Then run the following command:
Start the rabbitmq cluster for command ## rabbitmq-server -detached
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
在这里插入图片描述
访问地址:http://192.168.1.21:15672/#/exchanges,添加延迟队列
15、RabbitMQ学习笔记—Ha-Proxy高可用_第1张图片
15、RabbitMQ学习笔记—Ha-Proxy高可用_第2张图片

你可能感兴趣的:(RabbitMQ)