RabbitMQ集群部署完成,通过HAProxy反向代理来提供统一的对RabbitMQ的访问入口。
1.Haproxy提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。(负载均衡策略有很多:轮询、加权轮询、源地址哈希、最小连接数等等)
2.为什么使用集群?面对大量业务访问、高并发请求可以使用高性能的服务器来提升RabbitMQ服务的负载能力。当单机容量达到极限时,采取集群的策略来对负载能力做进一步的提升和提升系统稳定性,但是这里还存在一个负载不均衡的问题。如果一个集群中有3个节点,所有的客户端都与其中的单个节点node1建立TCP连接,那么node1的网络负载必然会大大增加而显得难以承受,其他节点又由于没有那么多的负载而造成硬件资源的浪费。通过使用 haproxy 的负载策略来转发客户端的请求到RabbitMQ集群中,缓解队列集群中单一节点网络负载等情况
3.RabbitMQ集群的搭建方式有多种,其中就包括我们今天要说的RabbitMQ+HAProxy的形式。
HAProxy是部署在Linux服务器的一个非常容易安装的程序包,对于安装我们不再赘述,我们只说明HAProxy的配置。
HAProxy部署完成以后,在配置文件/etc/haproxy/haproxy.cfg(Haproxy的安装路径) 的后面加上以下配置
1 # 配置文件
2 -------------------------------------------------------
3 # 全局配置
4 global
5
6 # 设置日志文件输出定向
7 log 127.0.0.1 local3 info
8
9 # 改变当前工作目录
10 chroot /usr/local/haproxy
11
12 # 用户与用户组
13 user haproxy
14 group haproxy
15
16 # 守护进程启动,运维方式为后台工作
17 daemon
18
19 # 最大连接数
20 maxconn 4000
21
22 # 作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen
23 defaults
24
25 # 启用每个实例日志记录事件和流量。
26 log global
27
28 # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
29 mode http
30
31 # maxconn 65535 maxconn 每个进程可用的最大连接数
32 # retries 3 当对server的connection失败后,重试的次数
33 # option abortonclose 启用或禁用在队列中挂起的中止请求的早期丢弃
34 # option redispatch 启用或禁用在连接故障情况下的会话重新分配
35 # option dontlognull 启用和禁用 记录 空连接
36 # option httpclose 每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
37 # option forwardfor 获得客户端IP
38 # option httplog 记录HTTP 请求,session 状态和计时器
39 option httplog
40 option dontlognull
41 timeout connect 5000
42 timeout client 50000
43 timeout server 50000
44
45
46 #前端配置,http_front名称可自定义
47 frontend http_front
48
49 # bind *:443 ssl crt /etc/haproxy/cert.pem 启用ssl证书
50 # bind *:80 发起http请求道80端口,会被转发到设置的ip及端口
51 bind *:80
52
53 #haproxy的状态管理页面,通过/haproxy?stats来访问
54 stats uri /haproxy?stats
55 default_backend http_back
56
57 #后端配置,http_back名称可自定义
58 backend http_back
59
60 # 负载均衡方式
61 # source 根据请求源IP
62 # static-rr 根据权重
63 # leastconn 最少连接者先处理
64 # uri 根据请求的uri
65 # url_param 根据请求的url参数
66 # rdp-cookie 据据cookie(name)来锁定并哈希每一次请求
67 # hdr(name) 根据HTTP请求头来锁定每一次HTTP请求
68 # roundrobin 轮询方式
69 balance roundrobin
70
71 #设置健康检查页面
72 option httpchk GET /index.html
73
74 #传递客户端真实IP
75 option forwardfor header X-Forwarded-For
76
77 # inter 2000 健康检查时间间隔2秒
78 # rise 3 检测多少次才认为是正常的
79 # fall 3 失败多少次才认为是不可用的
80 # weight 30 权重
81 # 需要转发的ip及端口
82 server node1 192.168.179.131:8081 check inter 2000 rise 3 fall 3 weight 30
83 server node2 192.168.179.131:8082 check inter 2000 rise 3 fall 3 weight 30
84
85 -------------------------------------------------------
86
87
88
89 # haproxy的acl规则
90 -------------------------------------------------------
91
92 frontend http_front
93 bind *:80
94 stats uri /haproxy?stats
95
96 #创建一个acl,is_http_back2是acl的名称,可自定义,用于判断主机名是否为www.back2.com
97 acl is_http_back2 hdr_end(host) www.back2.com
98
99 #通过正则判断主机名中是否为bbs.back.com或forum.back.com
100 acl is_host_bbs hdr_reg(host) -i ^(bbs.back.com|forum.back.com)
101
102 #判断ua是否为android
103 acl is_ua_android hdr_reg(User-Agent) -i android
104
105 #判断主机名开头是否为img.或css.或js.
106 acl is_host_static hdr_beg(host) -i img. css. js.
107
108 #判断url路径中是否有/bbs
109 acl is_path_bbs path_beg -i /bbs
110
111 #判断url文件结尾
112 acl is_php path_end -i .php
113
114 #通过正则判断url中结尾以
115 acl is_static_file url_reg -i /*.(css|jpg|png|jpeg|gif)$
116
117 #效果同上
118 acl is_static_file2 path_end -i .css .jpg .png .jpeg .gif
119
120 #如果主机名是www.back2.com那么就使用后端http_back2
121 use_backend http_back2ifis_http_back2
122
123 #默认使用的后端
124 default_backend http_back
125
126 backend http_back
127 balance roundrobin
128 option httpchk GET /index.html
129 option forwardfor header X-Forwarded-For
130 server node1 192.168.1.222:8080 check inter 2000 rise 3 fall 3 weight 30
131
132 backend http_back2
133 balance roundrobin
134 option httpchk GET /index.html
135 option forwardfor header X-Forwarded-For
136 server node2 192.168.1.222:8082 check inter 2000 rise 3 fall 3 weight 30
137
138 -------------------------------------------------------
4.HAProxy及RabbitMQ均部署完成后,可以通过查看HAProxy的监控页面,来确认HAProxy是否正确安装
5.HAProxy及RabbitMQ的部署关系
针对HAProxy参数配置,比较固定,调整的时机也很小,但每个参数都有其必要的作用,因此了解每个常用HAProxy参数是非常有必要的。
针对RabbitMQ集群,顺便提一下,部署了集群以后,务必针对重要队列开启镜像,因为可以最大限度的避免消息丢失。