rabbitmq有3种模式,但集群模式是2种。详细如下:
单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。之前我们一直在用
普通模式:默认模式,以两个节点(a、b)为例来进行说明
- 当消息进入a节点的queue后,consumer从b节点消费时,rabbitmq会在a和b之间创建临 时通道进行消息传输,把a中的消息实体取出并经过通过交给b发送给consumer
- 当a故障后,b就无法取到a节点中未消费的消息实体
- 如果做了消息持久化,那么得等a节点恢复,然后才可被消费
- 如果没有持久化的话,就会产生消息丢失的现象
镜像模式:非常经典的 mirror 镜像模式,保证 100% 数据不丢失。
- 高可靠性解决方案,主要就是实现数据的同步,一般来讲是 2 - 3 个节点实现数据同步
- 对于 100% 数据可靠性解决方案,一般是采用 3 个节点。
- 在实际工作中也是用得最多的,并且实现非常的简单,一般互联网大厂都会构建这种镜像集 群模式
还有主备模式,远程模式,多活模式等,本次课程不作为重点,可自行查阅资料了解。
一、单机模式
1.1 官网地址
https://www.rabbitmq.com/download.html
1.2 文件上传
上传到/usr/local/software 目录下(如果没有 software 需要自己创建)
1.3 安装文件(分别按照以下顺序安装)
rpm -ivh erlang-21.3-1.el7.x86_64.rpm
yum install socat -y
rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm
1.4 常用命令(按照以下顺序执行)
添加开机启动 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://47.115.185.244:15672/出现权限问题
1.5 用户操作
创建账号
rabbitmqctl add_user admin 123
设置用户角色
rabbitmqctl set_user_tags admin administrator
设置用户权限
set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限
当前用户和角色
rabbitmqctl list_users
再次用admin用户登录
1.6 重置命令
关闭应用的命令为
rabbitmqctl stop_app
清除的命令为
rabbitmqctl reset
重新启动命令为
rabbitmqctl start_app
二、普通集群
前置条件:准备两台linux,并安装好rabbitmq
集群步骤如下:
1、修改 /etc/hosts 映射文件
两台服务器都要修改
若重启不生效,请修改 /etc/hostname 文件 以及 /etc/sysconfig/network
注意:重启网络服务:service network restart
2、相互通信,cookie必须保持一致,同步 rabbitmq的cookie 文件:跨服务器拷贝 .erlang.cookie (隐藏文件,使用 ls -all 显示)
scp /var/lib/rabbitmq/.erlang.cookie 192.168.40.101:/var/lib/rabbitmq
修改cookie文件,要重启服务器,reboot
3. 停止防火墙,启动rabbitmq服务
systemctl stop firewalld
systemctl start rabbitmq-server
4. 加入集群节点
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@jiqun100
rabbitmqctl start_app
5. 查看节点状态
rabbitmqctl cluster_status
6. 查看管理端
- 搭建集群结构之后,之前创建的交换机、队列、用户都属于单一结构,在新的集群环境中是 不能用的
- 所以在新的集群中重新手动添加用户即可(任意节点添加,所有节点共享)
rabbitmqctl add_user panghl panghl
rabbitmqctl set_user_tags panghl administrator
rabbitmqctl set_permissions -p "/" panghl ".*" ".*" ".*"
- 注意:当节点脱离集群还原成单一结构后,交换机,队列和用户等数据 都会重新回来
此时,集群搭建完毕,但是默认采用的模式“普通模式”,可靠性不高
三、镜像集群
1、将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态一致
语法:set_policy {name} {pattern} {definition}
1、name:策略名,可自定义
2、pattern:队列的匹配模式(正则表达式)
"^" 可以使用正则表达式,比如"^queue_" 表示对队列名称以“queue_”开头的所有 队列进行镜像,而"^"表示匹配所有的队列
3、definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode:(high available,高可用)模式,指明镜像队列的模式,有效值为 all/exactly/nodes,当前策略模式为 all,即复制到所有节点,包含新增节点
ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
通过管理端设置镜像策略
四、负载集群
- 虽然我们在程序中访问a服务器,可以实现消息的同步,虽然在同步,但都是a服务器在接收消 息,a太累
- 是否可以想nginx一样,做负载均衡,a和b轮流接收消息,再镜像同步
4.1 haproxy简介
ha(high available,高可用),proxy(代理)
haproxy是一款提供高可用性,负载均衡,并且基于tcp和http应用的代理软件
haproxy完全免费
haproxy可以支持数以万计的并发连接
haproxy可以简单又安全的整合进架构中,同时还保护web服务器不被暴露到网络上
4.2 haproxy 与 nginx
osi:(open system interconnection:开放式系统互联 是把网络通信的工作分为7层,分别是物理 层,数据链路层,网络层,传输层,会话层,表示层和应用层)
1、nginx的优点:
- 工作在osi第7层,可以针对http应用做一些分流的策略
- nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,屹立至今的绝对优势
- nginx安装和配置比较简单,测试起来比较方便;
- nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的web应用服务 器
2、haproxy的优点:
- 工作在网络4层和7层,支持tcp与http协议,
- 它仅仅就只是一款负载均衡软件;单纯从效率上来讲haproxy更会比nginx有更出色的负载均 衡速度,在并发处理上也是优于nginx的
- 支持8种负载均衡策略 ,支持心跳检测
3、性能上ha胜,功能性和便利性上nginx胜
4、对于http协议,haproxy处理效率比nginx高。所以,没有特殊要求的时候或者一般场景,建议使 用haproxy来做http协议负载
5、但如果是web应用,那么建议使用nginx!
6、总之,大家可以结合各自使用场景的特点来进行合理地选择
4.3 安装和配置
haproxy下载:http://www.haproxy.org/download/1.8/src/haproxy-1.8.12.tar.gz
1、解压
2、make时需要使用 target 指定内核及版本
3、进入目录,编译和安装
4、安装成功后,查看版本
5、配置启动文件,复制haproxy文件到/usr/sbin下 ,复制haproxy脚本,到/etc/init.d下
6、创建系统账号
7、haproxy.cfg 配置文件需要自行创建
8、添加配置信息到haproxy.cfg
#应用全局的日志配置
log global
#默认的模式mode {tcp|http|health},tcp是4层,http是7层,health只返回ok
mode tcp
#日志类别tcplog
option tcplog
#不记录健康检查日志信息
option dontlognull
#3次失败则认为服务不可用
retries 3
#每个进程可用的最大连接数
maxconn 2000
#连接超时
timeout connect 5s
#客户端超时30秒,ha就会发起重新连接
timeout client 30s
#服务端超时15秒,ha就会发起重新连接
timeout server 15s
#绑定配置
listen rabbitmq_cluster
bind 192.168.40.102:5672
#配置tcp模式
mode tcp
#简单的轮询
balance roundrobin
#rabbitmq集群节点配置,每隔5秒对mq集群做检查,2次正确证明服务可用,3次失败证明服务不可用
server jiqun-100 192.168.40.100:5672 check inter 5000 rise 2 fall 3
server jiqun-101 192.168.40.101:5672 check inter 5000 rise 2 fall 3
#haproxy监控页面地址
listen monitor
bind 192.168.40.102:8100
mode http
option httplog
stats enable
# 监控页面地址 http://192.168.40.102:8100/monitor
stats uri /monitor
stats refresh 5s
9、启动haproxy
[root@localhost haproxy]# service haproxy start
10、访问监控中心:http://192.168.40.102:8100/monitor
记得关闭防火墙: systemctl stop firewalld
11、项目发消息,只需要将服务器地址修改为102即可,其余不变
12、所有的请求都会交给haproxy,其负载均衡给每个rabbitmq服务器
五、高可用负载集群
现在的最后一个问题暴露出来了,如果haproxy服务器宕机,rabbitmq服务器就不可用了。所以我们需 要对haproxy也要做高可用的集群
5.1 概述
1、keepalived是linux下一个轻量级别的高可用热备解决方案
2、keepalived的作用是检测服务器的状态,它根据tcp/ip参考模型的第三、第四层、第五层交换机 制检测每个服务节点的状态,如果有一台web服务器宕机,或工作出现故障,keepalived将检测 到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作 正常后keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉, 需要人工做的只是修复故障的服务器。
3、keepalived基于vrrp(virtual router redundancy protocol,虚拟路由冗余协议)协议,vrrp它 是一种主备(主机和备用机)模式的协议,通过vrrp可以在网络发生故障时透明的进行设备切换 而不影响主机之间的数据通信
4、两台主机之间生成一个虚拟的ip,我们称漂移ip,漂移ip由主服务器承担,一但主服务器宕机,备 份服务器就会抢夺漂移ip,继续工作,有效的解决了群集中的单点故障
5、说白了,将多台路由器设备虚拟成一个设备,对外提供统一ip(vip)
5.2 安装keepalived
1、修改hosts文件的地址映射
与1.1类似!
2、安装 keepalived
yum install -y keepalived
3、修改配置文件(内容大改,不如删掉,重新创建)
rm -rf /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
! configuration file for keepalived
global_defs {
router_id jiqun-102 ## 非常重要,标识本机的hostname
}
vrrp_script chk_haproxy{
script "/etc/keepalived/haproxy_check.sh" ## 执行的脚本位置
interval 2 ## 检测时间间隔
weight -20 ## 如果条件成立则权重减20
}
vrrp_instance vi_1 {
state master ## 非常重要,标识主机,备用机143改为 backup
interface ens33 ## 非常重要,网卡名(ifconfig查看)
virtual_router_id 66 ## 非常重要,自定义,虚拟路由id号(主备节点要相同)
priority 100 ## 优先级(0-254),一般主机的大于备机
advert_int 1 ## 主备信息发送间隔,两个节点必须一致,默认1秒
authentication { ## 认证匹配,设置认证类型和密码,master和backup必须使用相同的密码才能正常通信
auth_type pass
auth_pass 1111
}
track_script {
chk_haproxy ## 检查haproxy健康状况的脚本
}
virtual_ipaddress { ## 简称“vip”
192.168.40.66/24 ## 非常重要,虚拟ip,可以指定多个,以后连接mq就用这个虚拟ip
}
}
virtual_server 192.168.40.66 5672 { ## 虚拟ip的详细配置
delay_loop 6 # 健康检查间隔,单位为秒
lb_algo rr # lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind nat # 负载均衡转发规则。一般包括dr,nat,tun 3种
protocol tcp # 转发协议,有tcp和udp两种,一般用tcp
real_server 192.168.40.102 5672 { ## 本机的真实ip
weight 1 # 默认为1,0为失效
}
}
4、创建执行脚本 /etc/keepalived/haproxy_check.sh
#!/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
keepalived 组之间的心跳检查并不能察觉到 haproxy 负载是否正常,所以需要使用此脚本。 在 keepalived 主机上,开启此脚本检测 haproxy 是否正常工作,如正常工作,记录日志。 如进程不存在,则尝试重启 haproxy ,2秒后检测,如果还没有,则关掉主 keepalived ,此时备 keepalived 检测到主 keepalived 挂掉,接管vip,继续服务
5、授权,否则不能执行
chmod +x /etc/keepalived/haproxy_check.sh
6、启动keepalived(两台都启动)
systemctl stop firewalld
service keepalived start | stop | status | restart
7、查看状态
ps -ef | grep haproxy
ps -ef | grep keepalived
8、查看ip情况 ip addr 或 ip a
ip a
此时,安装完毕,按照上面的步骤就可以安装第二台了(服务器hostname和ip注意要修改)
常见的网络错误:子网掩码、网关等信息要一致
9、测试vip+端口是否提供服务(在100,jiqun-100 服务器上测试)
curl 192.168.40.66:5672amqp ## 正常提供amqp服务,表示通过vip访问mq服务正常
发表评论