1. 官网地址
rabbitmq官网:https://www.rabbitmq.com/download.html
Elang官网:http://www.erlang.org/downloads
我用的是 erlang-21.3-1.el7.x86_64.rpm 和 rabbitmq-server-3.8.8-1.el7.noarch.rpm,下载好后上传服务器
首先准备5台服务器,其中,node1、node2、node3三台服务器安装RabbitMQ服务,node4和node5安装HA-proxy和Keepalived。
192.168.110.100 node1
192.168.110.101 node2
192.168.110.102 node3
192.168.110.103 node4
192.168.110.104 node5
2. 安装文件(分别按照以下顺序安装)
rpm -ivh erlang-21.3-1.el7.x86_64.rpm
yum install socat -y
rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm3. 常用命令(按照以下顺序执行)
添加开机启动 RabbitMQ 服务
chkconfig rabbitmq-server on
启动服务
/sbin/service rabbitmq-server start
查看服务状态
/sbin/service rabbitmq-server status
停止服务(选择执行)
/sbin/service rabbitmq-server stop
开启 web 管理插件
rabbitmq-plugins enable rabbitmq_management
用默认账号密码(guest)访问地址 http://19.168.110.126:15672/出现权限问题
4. 添加一个新的用户
创建账号
rabbitmqctl add_user chengzl 123456
设置用户角色
rabbitmqctl set_user_tags chengzl administrator
设置用户权限
set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
rabbitmqctl set_permissions -p "/" chengzl ".*" ".*" ".*"
用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限
当前用户和角色
rabbitmqctl list_users
5. 再次登陆chengzl用户
重置命令:
关闭应用的命令为
rabbitmqctl stop_app
清除的命令为
rabbitmqctl reset
重新启动命令为
rabbitmqctl start_app
三台服务器:100、101、103分别按以上步骤安装。
6. RabbitMQ集群配置
这里以node1为master节点,node2和node3为slave节点。
A》首先配置5个服务器hosts文件:
192.168.110.100 node1
192.168.110.101 node2
192.168.110.102 node3
192.168.110.103 node4
192.168.110.104 node5
B》修改5台服务器的主机名(node1 ~ node5)
vim /etc/hostname
C》停止MQ服务
rabbimqctl stop
以确保各个节点的 cookie 文件使用的是同一个值
在 node1 上执行远程操作命令
scp /root/.erlang.cookie root@node2:/root/.erlang.cookie
scp /root/.erlang.cookie root@node3:/root/.erlang.cookie
7. 启动 RabbitMQ 服务,顺带启动 Erlang 虚拟机和 RbbitMQ 应用服务(在三台节点上分别执行以下命令)
rabbitmq-server -detached
8. slave加入集群,对node2和node3分别执行下面操作
rabbitmqctl stop_app
(rabbitmqctl stop 会将 Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ 服务)
rabbitmqctl join_cluster rabbit@node1
rabbitmqctl start_app(只启动应用服务) A> 如果需要移除集群节点,执行下面命令:
rabbitmqctl forget_cluster_node rabbit@node2(具体节点)
B> 修改集群名称(任意一个节点操作,默认为master node名称)
rabbitmqctl set_cluster_name rabbitmq_cluster1
C> 查看集群状态(任意一个节点操作)
rabbitmqctl cluster_status
D> 设置镜像队列策略(任意一个节点操作)
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
ha-mode:指明镜像队列的模式,有效值为all、exactly、nodes,默认为all。all表示在集群中所有的节点上进行镜像;exactly表示在指定个数的节点上进行镜像,节点个数由ha-params指定;nodes表示在指定节点上进行镜像,节点名称通过ha-params指定,节点的名称通常类似于rabbit@hostname
ha-params:不同的ha-mode配置中需要用到的参数
ha-sync-mode:队列中消息的同步方式,有效值为automatic和manual
E> 将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态一致。
此时看rabbitmq管控台,Nodes会有三个节点:
9. 安装 Haproxy(node4和node5)
A》下载haproxy
yum install haproxy -y
B》编辑 haproxy 配置文件
vi /etc/haproxy/haproxy.cfg
新增listen内容,根据实际情况,修改default内容:
#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
# 使用四层代理模式,"mode http" 为7层代理模式
mode tcp
# if you set mode to tcp,then you must change tcplog into httplog
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
# 客户端空闲超时时间为60秒,过了该时间,HA发起重连机制
clitimeout 60s
# 服务端连接超时时间为15秒,过了该时间,HA发起重连机制
srvtimeout 15slisten rabbitmq_cluster
# 定义监听地址和端口,本机的5672端口
bind 0.0.0.0:5672
# 配置 tcp 模式
mode tcp
# balance url_param userid
# balance url_param session_id check_post 64
# 简单的轮询
balance roundrobin
#rabbitmq集群节点配置 #inter 每隔五秒对mq集群做健康检查,2次正确证明服务器可用,
#2次失败证明服务器不可用,并且配置主备机制
server node1 192.168.110.100:5672 check inter 5000 rise 2 fall 2
server node2 192.168.110.101:5672 check inter 5000 rise 2 fall 2
server node3 192.168.110.102:5672 check inter 5000 rise 2 fall 2
# 配置 haproxy web 监控,查看统计信息
listen stats
bind *:8100
mode http
option httplog
stats enable
# 设置 haproxy 监控地址为:http://localhost:8100/rabbitmq-stats
stats uri /rabbitmq-stats
stats refresh 5s10. 启动haproxy
haproxy -f /etc/haproxy/haproxy.cfg 重启haproxy:service haproxy restart
至此,haproxy配置成功,可以访问:http://192.168.174.13:8100/rabbitmq-stats11. 安装 Keepalived(node4和node5)
我这里将node4作为keepalived的主节点,node5为备用节点。 A、安装所需软件包
yum install -y openssl openssl-develB、下载 keepalived
wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gzC、解压、编译、安装
tar -xvf keepalived-1.2.18.tar.gz
cd keepalived-1.2.18
./configure --prefix=/usr/local/keepalived
make && make installD、创建文件夹,将keepalived配置文件进行复制
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfigE、创建软连接,如果存在则进行删除
ln -s /usr/local/sbin/keepalived /usr/sbin
ln -s /usr/local/keepalived/sbin/keepalived /sbinF、设置开机启动
chkconfig keepalived onG、编辑 keepalived 配置文件(编辑node4和node5)
vi /etc/keepalived/keepalived.conf! Configuration File for keepalived
global defs {
router_id node4 ##标识节点的字符串,通常为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 ens33 ##绑定虚拟ip的网络接口(网卡)
virtual_router_id 13 ##虚拟路由id号,主备节点相同
mcast_src_ip 192.168.174.13 ##本机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.174.70 ##虚拟ip,可以指定多个
}
}! Configuration File for keepalived
global defs {
router_id node5 ##标识节点的字符串,通常为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 ens33 ##绑定虚拟ip的网络接口(网卡)
virtual_router_id 13 ##虚拟路由id号,主备节点相同
mcast_src_ip 192.168.174.14 ##本机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.174.70 ##虚拟ip,可以指定多个
}
}vrrp_instance 的 interface 为VIP需要挂载的网卡上,我这里都放在虚拟机的ens33上。 node4 的 state 为 MASTER,node5 为 BACKUP ,priority 要保证node4大于node5,这样就能实现node4宕机之后恢复服务,能够从node5抢回VIP;如果需要实现不抢回VIP,则node4和node5的state都设置为BACKUP,并且vrrp_instance 都添加nopreempt,表示不抢夺VIP(实际上已经加了)。
12. 添加执行脚本 haproxy_check.sh
vi /etc/keepalived/haproxy_check.sh
内容如下(node4和node5一样):
#!/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
13、赋予脚本执行权限
chmod +x haproxy_check.sh
14、启动keepalived
service keepalived start
至此,基于Keepalived和Haproxy的rabbitmq集群,已经搭接完成。