haproxy和keep-alive你们即便没有用也应该都听过吧.网上介绍的比较多,官网文档也比较全. 那咱们直接开始演示html
1 首先安装haproxy,安装的方式比较多,使用本身喜欢的就行,我直接使用apt仓库的.linux
sudo apt install haproxy
等待安装完成就好了.默认的配置文件在/etc/haproxy/haproxy.cfggit
2 编辑配置文件,能够经过-f启动自定义的配置文件.这个是按照"rabbitmq实战"上配置的模板 保存为haproxy.cfg.其中主要的是server rabbit 172.17.0.3:5672 check inter 5000 rise 2 fall 3
的ip配置. 我使用docker启动了有三个节点的rabbitmq集群.若是不会能够参考我相关文章"RabbitMQ 集群使用"github
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.redis
sudo haproxy -f HAProxy-rabbitmq.cfg
访问ui界面 http://localhost:8100/stats .能够看到界面,即启动成功!docker
上面咱们已经有了一个简单的rabbitmq的haproxy,下面咱们要验证一下是否可用. 咱们如今是看不到haproxy的日志的,咱们使用rsyslog日志系统来记录haproxy日志. 建立目录,并赋予写权限.服务器
mkdir /var/log/haproxy chmod a+w /var/log/haproxy
rsyslog默认是已安装的,若是没有自行安装一下. sudo apt install rsyslog
打开rsyslog默认配置文件,开始udp功能session
module(load="imudp") input(type="imudp" port="514")
并在下面添加haproxy日志发往地址local0,监听全部日志.app
local0.* /var/log/haproxy/haproxy.log
重启rsyslog,和haproxysocket
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<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'queue.haproxy' in vhost '/': received 'true' but current is 'false', class-id=50, method-id=10)
考虑到这点,还有一种主/备集群模式,原理是使用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的版本能够没必要保持一致, 但应该保持兼容.
因为我的水平有限,若有问题请指出。