2019独角兽企业重金招聘Python工程师标准>>>
haproxy和keep-alive大家即使没有用也应该都听过吧.网上介绍的比较多,官网文档也比较全. 那我们直接开始演示
基本高可用
1 首先安装haproxy,安装的方式比较多,使用自己喜欢的就行,我直接使用apt仓库的.
sudo apt install haproxy
等待安装完成就行了.默认的配置文件在/etc/haproxy/haproxy.cfg
2 编辑配置文件,可以通过-f启动自定义的配置文件.这个是按照"rabbitmq实战"上配置的模板 保存为haproxy.cfg.其中主要的是server rabbit 172.17.0.3:5672 check inter 5000 rise 2 fall 3
的ip配置. 我使用docker启动了有三个节点的rabbitmq集群.如果不会可以参考我相关文章"RabbitMQ 集群使用"
global
log 127.0.0.1 local0 info
maxconn 4096
stats socket /tmp/haproxy.socket uid haproxy mode 770 level admin
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 5s
timeout client 120s
timeout server 120s
listen rabbitmq_cluster
bind 127.0.0.1:5670
mode tcp
balance roundrobin
server rabbit 172.17.0.3:5672 check inter 5000 rise 2 fall 3
server rabbit_1 172.17.0.4:5672 check inter 5000 rise 2 fall 3
server rabbit_2 172.17.0.5:5672 check inter 5000 rise 2 fall 3
listen private_monitoring
bind :8100
mode http
option httplog
stats enable
stats uri /stats
stats refresh 5s
3 启动haproxy.
sudo haproxy -f HAProxy-rabbitmq.cfg
访问ui界面 http://localhost:8100/stats .可以看到界面,即启动成功!
上面我们已经有了一个简单的rabbitmq的haproxy,下面我们要验证一下是否可用. 我们现在是看不到haproxy的日志的,我们使用rsyslog日志系统来记录haproxy日志. 创建目录,并赋予写权限.
mkdir /var/log/haproxy
chmod a+w /var/log/haproxy
rsyslog默认是已安装的,如果没有自行安装一下. sudo apt install rsyslog
打开rsyslog默认配置文件,开始udp功能
module(load="imudp")
input(type="imudp" port="514")
并在下面添加haproxy日志发往地址local0,监听所有日志.
local0.* /var/log/haproxy/haproxy.log
重启rsyslog,和haproxy
sudo systemctl stop rsyslogd
sudo systemctl start rsyslogd
sudo pgrep -a haproxy
sudo kill -9 pid
sudo haproxy -f HAProxy-rabbitmq.cfg
现在我们就可以看到日志了
tailf /var/log/haproxy/haproxy.log
简单看一条消息
2017-08-11T10:07:03+08:00 localhost haproxy[12948]: 127.0.0.1:53708 [11/Aug/2017:10:07:03.042] rabbitmq_cluster rabbitmq_cluster/rabbit_2 1/0/299 572 SD 2/2/2/0/0 0/0
发送方: 127.0.0.1:53708
接收方: rabbitmq_cluster rabbitmq_cluster/rabbit_2
现在我们做了一个HA,对于HA之外的人来说,只有一个地址,当访问的时候,会随机访问其中一个rabbitmq server. 通过界面,我们可以在Sessions栏目看到cur(rent)连接,cur表示连接的数量,例如现在是my-rabbit-cluster 节点,现在我们关闭这个服务stop_app,
我们已经做了集群,但是我们的集群是有弊端的,那就是没有做到Queue和exchange同步.需要在任意节点开启 镜像复制功能
rabbitmqctl set_policy -p '/' ha-all '.+' '{"ha-mode": "all"}'
完成上面的工作后,我们终于可以通过代码验证高可用集群了. 首先我们运行我们的代码,发送1000条记录,消费者每1s接收一条.消息正常接收中. 我们在界面 http://localhost:8100/stats 上看到session部分有1个cur,那就是现在连接 的服务器,比如,现在连接的rabbitmq-cluster节点,可以通过management界面 http://172.17.0.3:15672/#/ 的overview看到这个节点连接1个connection.
第一步 现在我们stop_app或者management界面reset当前连接的,过一会下线后,活跃连接到另外一台机器.
第二步 现在我们看到连接跳跃到另外一台,然而有一点必须注意,客户端现在不再"接收消息",但是,真的是不再接收消息么? 现在我们通过management界面向队列发送一条消息,客户端真实的收到消息了!,可见,目前的高可用 并不能保证一致性,只是保证了系统可用.
第三步 我们重启之前关闭的节点,现在我们通过management界面强制关闭连接,连接又跳回第一次节点(假设就2个节点)
看过官方文档的人都知道,集群时,队列不能持久化,考虑到性能和复杂的问题,官方并不支持. 如果设置队列为持久化,则会报下面的错误
channel error; protocol method: #method
代码演示请点击
主备高可用
考虑到这点,还有一种主/备集群模式,原理是使用haproxy的backup节点,主节点和backup节点只能 有一个节点可以使用,消息放在共享存储上,从而避免了节点之间的消息复制.关于共享内存,官方给出了pacemaker的案例. 实现主备比上面的变化就是定义server时多了一个backup属性. HAProxy-rabbitmq-warren.cfg 配置文件
global
# 0 系统不可用 1 必须马上采取行动的事件 2 关键的事件 3 错误事件 4 警告事件 5 普通但重要的事件 6 有用的信息 7 调试信息
log 127.0.0.1 local7 info
maxconn 4096
stats socket /tmp/haproxy_warren.socket uid haproxy mode 770 level admin
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 5s
timeout client 120s
timeout server 120s
listen rabbitmq_cluster
bind 127.0.0.1:5680
mode tcp
balance roundrobin
server rabbit 172.17.0.3:5672 check inter 5000 rise 2 fall 3
server rabbit_backup 172.17.0.6:5672 backup check inter 5000 rise 2 fall 3
listen private_monitoring
bind :8101
mode http
option httplog
stats enable
stats uri /stats
stats refresh 5s
其他步骤同上面,唯一不同在于http://localhost:8101/stats 界面显示的备份节点是蓝色的. 代码测试也跟上面的一样,只不过每次只有主或备启动.相对于上面的有几个优势:rabbitmq的版本可以不必保持一致, 但应该保持兼容.
代码演示请点击