添加RabbitMQ用户
用户可以在主节点进行操作,默认情况下,安装完毕RabbitMQ有一个guest用户,默认该用户是管理员权限,用户可以为guest用户设置密码,当然,也可以增加新的用户,设置相关权限。
修改guest密码
root@mq1:~# sudo rabbitmqctl change_password guest mq4smtest
Changing password for user "guest" ...
...done.
添加一个demo用户,密码也为demo
root@mq1:~# rabbitmqctl add_user demo demo
Creating user "demo" ...
...done.
为demo用户设置tags
root@mq1:~# rabbitmqctl set_user_tags demo member
Setting tags for user "demo" to [member] ...
...done.
为demo用户赋予所有虚拟主机vhost(/),配置、写、读的权限
root@mq1:~# rabbitmqctl set_permissions -p / demo ".*" ".*" ".*"
Setting permissions for user "demo" in vhost "/" ...
...done.
查看已有的用户信息
root@mq1:~# rabbitmqctl list_users
Listing users ...
demo [member]
guest [administrator]
...done.
登录Web页面
从图中可以看到,目前安装的RabbitMQ版本为3.2.4版本,已经可以看到集群包含的三个节点,每个节点的类型也可以看到。
RabbitMQ的集群类型
单一模式:最简单的情况,非集群模式。
普通模式
普通模式:默认的集群模式。对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构.当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,然后就没有然后了……
- 镜像模式
镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案。该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。
设置高可用策略
为了使用HAProxy,我们需要将RabbitMQ设置为镜像模式,只需要使用命令行执行即可
root@mq1:~# rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^ha\\." to "{\"ha-mode\":\"all\"}" with priority "0" ...
...done.
root@mq1:~# rabbitmqctl list_policies
Listing policies ...
/ ha-all all ^ha\\. {"ha-mode":"all"} 0
...done.
安装HAProxy
将RabbitMQ集群设置为镜像模式之后,需要用负载均衡服务将访问压力分散于集群中的每个节点,在此我们选择了HAProxy,它的特点在于配置简单,并且功能十分强大,配置过程归纳起来也就是安装、设置配置文件、启动服务这三步这么简单。选择一个节点运行负载均衡服务即可,也可以单独拿一台机器运行,根据实际情况进行调整。
在主节点安装软件
root@mq1:~# apt-get install haproxy
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
vim-haproxy
The following NEW packages will be installed:
haproxy
0 upgraded, 1 newly installed, 0 to remove and 182 not upgraded.
Need to get 417 kB of archives.
After this operation, 822 kB of additional disk space will be used.
Get:1 http://mirrors.sohu.com/ubuntu/ trusty-proposed/main haproxy amd64 1.4.24-2ubuntu0.1 [417 kB]
Fetched 417 kB in 3s (135 kB/s)
Selecting previously unselected package haproxy.
(Reading database ... 57754 files and directories currently installed.)
Preparing to unpack .../haproxy_1.4.24-2ubuntu0.1_amd64.deb ...
Unpacking haproxy (1.4.24-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-16) ...
Processing triggers for man-db (2.6.7.1-1) ...
Setting up haproxy (1.4.24-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-16) ...
配置文件,设置/etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
#使用tcp监听模式
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen admin_stat
#haproxy的web管理端口 8888,自行设置
bind 0.0.0.0:8888
mode http
stats refresh 30s
#haproxy web管理url,自行设置
stats uri /haproxy_stats
stats realm Haproxy\ Statistics
#haproxy web管理用户名密码,自行设置
stats auth guest:mq4smtest
stats hide-version
listen rabbitmq 0.0.0.0:5670
#监听5670端口,并转发给三个节点的5672端口,采用轮询策略
mode tcp
balance roundrobin
server mq1 192.168.13.41:5672 check inter 2000 rise 2 fall 3
server mq2 192.168.13.92:5672 check inter 2000 rise 2 fall 3
server mq3 192.168.13.93:5672 check inter 2000 rise 2 fall 3
启动Haproxy服务
haproxy -f /etc/haproxy/haproxy.cfg -D
查看HAproxy的Web页面
根据上述配置文件,端口号设置为8888,用户名密码设置为guest/mq4smtest,所以登录:http://192.168.13.41:8888/haproxy_stats