RabbitMQ集群安装配置+HAproxy+Keepalived高可用
rabbitmq 集群 消息队列
RabbitMQ简介
RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件 (MOM)系统,例如发布/订阅队列,没有作为基本元素实现。反而通过发送简化的AMQ实体,用户被赋予了构建例如这些实体的能力。这些实体也是规范的一 部分,形成了在线路层协议顶端的一个层级:AMQP模型。这个模型统一了消息模式,诸如之前提到的发布/订阅,队列,事务以及流数据,并且添加了额外的特 性,例如更易于扩展,基于内容的路由。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
RabbitMQ安装
版本选择
1. 安装之前首先确认自己的系统版本和位数,然后选择适合的安装程序。
查看系统版本:cat /etc/issue
查看系统位数:cat /proc/cpuinfo |grep “clflush size”
2. 浏览博客,论坛,官网以及开源主页,尽量避免选择有重大缺陷版本
比如3.6.3版本rabbitmq的web端管理界面不能查看、管理queues
https://github.com/rabbitmq/rabbitmq-server/issues
3. 根据选择的版本,选择Erlang版本,http://www.erlang.org/
避免选择最高版本Erlang,3.6.4之前所有版本rabbitmq均不完全兼容当前最新的(2016.8)19.0 Erlang。同时选择高于等于R16B03的Erlag。
安装准备
1. 安装之前可以根据需要先修改好hostname,可以修改为有意义的名称,比如node1、node2等,安装之后再修改会出现一系列问题。
方式1:hostname命令查看,修改
# hostname m1
方式2:配置文件中修改
# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=m1
2. 修改hosts文件,将集群所有机器 ip hostname 分别添加到每一台机器中 ,比如。
vi/etc/hosts
127.0.0.1 localhost
127.0.0.1 m1
::1 localhost
192.168.12.190 m1
192.168.12.190 m2
192.168.12.192 n1
192.168.12.193 n2
192.168.12.194 n3
安装过程
(下载rpm安装包安装)
1. 下载软件源到/etc/yum.repos.d/ ,并生成缓存
wget –no-cache http://www.convirture.com/repos/definitions/rhel/6.x/convirt.repo -O /etc/yum.repos.d/convirt.repo
yum makecache
2. 安装Socat
yum install -y socat
3. 下载安装Erlang
选择版本号尽量高的推荐18
下载地址https://packages.erlang-solutions.com/erlang/
wget http://packages.erlang-solutions.com/site/esl/esl-erlang/FLAVOUR_1_general/esl-erlang_18.3.4-1~centos~6_amd64.rpm
yum localinstall -y esl-erlang_18.3.4-1~centos~6_amd64.rpm
4. 下载安装RabbitMq 3.6.2
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.2/rabbitmq-server-3.6.2-1.noarch.rpm
yum localinstall -y rabbitmq-server-3.6.2-1.noarch.rpm
(如果提示依赖问题,先安装依赖,提示erlang版本直接跳过
yum localinstall --skip-broken rabbitmq-server-3.6.2-1.noarch.rpm
或rpm -ivh --nodeps rabbitmq-server-3.6.2-1.noarch.rpm
)
到此安装结束!
RabbitMQ配置
单机配置
启动服务
service rabbitmq-server start
查看运行状态
rabbitmqctl status
开启管理扩展(关闭为disable)
rabbitmq-plugins enable rabbitmq_management
开启之后可以用浏览器访问管理界面:http://ip:15672
默认用户名密码 guest:guest
如果提示不能登录就需要新建账户,见下文添加用户操作。
查看端口监听状态 5672为集群间通信端口,15672为web端管理端口
netstat -atn |grep 5672
[[email protected] ~]# netstat -atn |grep 5672
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN
tcp 0 0 :::5672 :::* LISTEN
添加账户(只需要在一台机器上设置,加入集群后会同步到所有机器)
rabbitmqctl add_user username password
添加账户标签(administrator)
rabbitmqctl set_user_tags username administrator
标签:
management
用户可以访问管理插件。
policymaker
用户可以访问管理插件,可以管理可访问的vhost的策略和参数。
monitoring
用户可以访问管理插件,可以查看所有connections、channels、node-related信息。
administrator
用户拥有monitoring用户的所有权限,可以管理用户,vhost和权限,关闭他用户的连接,并管理所有vhost策略和参数。
(除此之外可以设置任何标签,以上几个只是特殊标签)
赋予权限 set_permissions [-p vhost] {user} {conf} {write} {read}
rabbitmqctl set_permissions -p / username ".*" ".*" ".*"
({conf} {write} {read}为正则表达式)
rabbitmqctl set_permissions -p /myvhost tonyg "^tonyg-.*" ".*" ".*"
这个命令指示RabbitMQ代理授予用户名为tonyg访问虚拟主机名为/myvhost,tonyg具有对“tonyg-”开头的资源的读写权限。
集群配置
RabbitMQ集群中所有节点都是平等的,没有绝对的主次之分,每一个节点的配置信息都会在集群中进行同步。只有节点类型区别,节点类型有disk型和RAM型。分别对应磁盘和内存,disk节点可以持久化消息安全性较高、RAM节点存取速度快,但是不能持久化。一个集群中至少要有一个disk类型的节点,以便在所有节点宕机重启时将持久化队列中的消息进行持久化。
同步 Erlang Cookie
Erlang Cookie 文件:/var/lib/rabbitmq/.erlang.cookie
将任意一台的cookie文件或者内容替换到集群其他机器。最后确保文件权限为400。
查看某台机器的cookie
[[email protected] ~]# cat /var/lib/rabbitmq/.erlang.cookie
YZCUPNLBNOMPTDCUALZC
关闭rabbitmq,将cookie复制到其他机器…
[[email protected]~]# rabbitmqctl stop
[[email protected]~]# echo YZCUPNLBNOMPTDCUALZC > /var/lib/rabbitmq/.erlang.cookie
[[email protected]~]# rabbitmqctl stop
[[email protected]~]# echo YZCUPNLBNOMPTDCUALZC > /var/lib/rabbitmq/.erlang.cookie
或者使用scp命令
scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/.erlang.cookie
cookie同步完成之后启动
以detached方式启动
rabbitmq-server -detached
如果提示PID FILE不能写入,可以关闭应用,直接以服务方式启动
关闭之后重启仍然提示有实例正在运行可以强制杀死线程
ps aux | grep rabbitmq
kill -9 xxxx
启动服务
service rabbitmq-server start
加入集群
将n2节点加入n1 作为RAM类型节点
[[email protected] ~]#rabbitmqctl stop_app
[[email protected] ~]#rabbitmqctl reset
[[email protected] ~]#rabbitmqctl join_cluster [email protected] --ram
[[email protected] ~]#rabbitmqctl start_app
将n3节点加入n1 作为disc类型节点
[[email protected] ~]#rabbitmq stop_app
[[email protected] ~]#rabbitmqctl reset
[[email protected] ~]#rabbitmqctl join_cluster [email protected]
[[email protected] ~]#rabbitmqctl start_app
(rabbitmq集群节点有disc 和ram两种类型,一个集群中至少要有一个disc类型的节点,不指定默认加入为disc)
查看状态
完成之后可以用rabbitmqctl 命令查看相关信息
rabbitmqctl status //查看应用状态
rabbitmqctl cluster_status //查看集群信息
访问任意管理端界面查看http://ip:15672
到此简单集群部署完毕!
(如果某节点显示unavailable检查服务是否启动,管理扩展是否开启
rabbitmq-plugins enable rabbitmq_management)
HAproxy+Keepalived 高可用
随着网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,如何有效节约成本?同时实现商业硬件一样的高性能高可用的功能?有什么好的负载均衡可伸张可扩展的方案吗?答案是利用HAproxy+Keepalived基于完整开源软件的架构可以提供一个负载均衡及高可用的服务器。
HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。
HAproxy简介
HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。
(1)免费开源,稳定性也是非常好,可以与硬件级的F5相媲美;
(2)根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom’s 10GbE NICs (Myri-10G PCI-Express)。
(3)HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
(4)HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
(5)HAProxy现多于线上的Mysql集群环境,我们常用于它作为MySQL(读)负载均衡;
(6)自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警,这个也是我非常喜欢它的原因之一;
(7)HAProxy支持虚拟主机,许多朋友说它不支持虚拟主机是错误的,通过测试我们知道,HAProxy是支持虚拟主机的。
总结:
HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
在功能上,能以proxy反向代理方式实现WEB均衡负载,这样的产品有很多。包括lvs,Nginx,ApacheProxy,lighttpd等。
国内生产环境上使用Haproxy的公司很多,例如淘宝的CDN系统
keepalived简介
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
Keepalived是一个基于VRRP协议来实现的WEB 服务高可用方案,可以利用其来避免单点故障。一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
+------------------VIP(192.168.12.111)-------------+
| | |
| | |
server(MASTER) <------------keepalived--------> server(BACKUP)
(192.168.12.192) (192.168.12.194)
HAproxy安装配置
在进行安装配置HAproxy之前首先确定集群的基本架构,需要在节点n1和n2上做热备,所以需要同时安装上haproxy。基本结构如下:
ip | hostname | 节点类型 | 主/备 |
---|---|---|---|
192.168.12.190 | m1 | Disk | |
192.168.12.192 | n1 | RAM | master |
192.168.12.194 | n3 | RAM | backup |
在master和backup主机上安装(n1,n3)haproxy
yum install haproxy
修改配置文件
vi /etc/haproxy/haproxy.cfg
#配置rabbitmq集群节点信息,n1、n3相同配置
#配置一个监听实例rabbitmq_cluster
listen rabbitmq_cluster
#监控端口
bind 0.0.0.0:5670
#配置TCP模式
mode tcp
#简单的轮询
balance roundrobin
#rabbitmq集群节点配置
server m1 192.168.12.190:5672 check inter 5000 rise 2 fall 2
server n1 192.168.12.192:5672 check inter 5000 rise 2 fall 2
server n3 192.168.12.194:5672 check inter 5000 rise 2 fall 2
#配置web端监控,查看统计信息
###haproxy statistics monitor
listen statics 0.0.0.0:8888
mode http
log 127.0.0.1 local0 debug
transparent
#数据刷新频率
stats refresh 60s
#后台地址http://ip:8888/haproxy-stats
stats uri / haproxy-stats
stats realm Haproxy \ statistic
#账号密码
stats auth admin:admin
Keepalived安装配置
在master和backup主机上安装(n1,n3)
# yum install keepalived
修改配置文件
vi /etc/keepalived.conf
备用节点:
#定义一个脚本chk_haproxy
vrrp_script chk_haproxy {
script "/etc/keepalived/scripts/haproxy_check.sh"
interval 2
}
#定义一个VRRP实例
vrrp_instance VI_1 {
#备用节点(主节点为MASTER)
state BACKUP
#添加虚拟地址的网卡 ,选择稳定的网卡
interface eth0
#虚拟路由标识,同一个VRRP实例要使用同一个标识
virtual_router_id 51
#主、备节点是由优先级控制的state参数会失效
priority 100
# 用于设定主备节点间同步检查时间间隔
#advert_int 2
#
unicast_src_ip 192.168.12.194
unicast_peer {
192.168.12.192
}
#授权方式
authentication {
auth_type PASS
auth_pass rabbitmq
}
#设置虚拟地址
virtual_ipaddress {
192.168.12.111
}
#尽量将track_script放到virtual_ipaddress后面
track_script {
chk_haproxy
}
#设置高可用集群中不抢占功能,在主机down后,从机接管,当主机重新恢复后,设置此功能,备机将继续提供服务,从而避免因切换导致的隐患
nopreempt
# 当keepalived切换状态到MASTER时,执行脚本
notify_master "/etc/keepalived/scripts/haproxy_master.sh"
# 当keepalived切换状态到BACKUP时,执行脚本
#notify_backup "/etc/keepalived/backup.sh"
# 当keepalived切换状态到FAULT时,执行脚本
#notify_fault "/etc/keepalived/fault.sh"
#当keepalived切换状态到STOP时,执行脚本
#notify_fault "/etc/keepalived/stop.sh"
}
主节点:
vrrp_script chk_haproxy {
script "/etc/keepalived/scripts/haproxy_check.sh"
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
unicast_src_ip 192.168.12.192
unicast_peer {
192.168.12.194
}
authentication {
auth_type PASS
auth_pass rabbitmq
}
virtual_ipaddress {
192.168.12.111
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/scripts/haproxy_master.sh"
}
chk_haproxy.sh
#!/bin/bash
LOGFILE="/var/log/keepalived-ha-state.log"
echo "===========================================" >> \$LOGFILE
date +%Y%m%d-%H:%M:%S >> \$LOGFILE
pid1=\`ps aux|grep /etc/haproxy/haproxy.cfg | grep -v grep | grep -v bash | wc –l\`
if [ "\$pid1" = "0" ]; then
echo "Ready to start haproxy....." >> \$LOGFILE
haproxy -f /etc/haproxy/haproxy.cfg –D
启动Haproxy
pid2=\`ps aux|grep /etc/haproxy/haproxy.cfg | grep -v grep | grep -v bash |wc –l\`
if [ "\$pid2" = "0" ]; then
echo "Haproxy failed to start !!! So,stop keepalived!!!" >> \$LOGFILE
/etc/init.d/keepalived stop
else
echo "Haproxy start success........." >> \$LOGFILE
fi
fi
haproxy_master.sh
#!/bin/bash
LOGFILE="/var/log/keepalived-ha-state.log"
echo "===========================================" >> $LOGFILE
date +%Y%m%d-%H:%M:%S >> $LOGFILE
echo "Switch to here....." >> $LOGFILE
集群搭建完毕!
常用命令
rabbitmqctl命令
http://www.rabbitmq.com/man/rabbitmqctl.1.man.html#
1). 服务器启动与关闭
启动: rabbitmq-server –detached
关闭:rabbitmqctl stop
若单机有多个实例,则在rabbitmqctlh后加–n 指定名称
2). 插件管理
开启某个插件:rabbitmq-pluginsenable xxx
关闭某个插件:rabbitmq-pluginsdisablexxx
注意:重启服务器后生效。
3).virtual_host管理
新建virtual_host: rabbitmqctladd_vhost xxx
撤销virtual_host:rabbitmqctl delete_vhost xxx
4). 用户管理
新建用户:rabbitmqctl add_user xxxpwd
删除用户: rabbitmqctl delete_user xxx
改密码: rabbimqctlchange_password {username} {newpassword}
设置用户角色:rabbitmqctlset_user_tags {username} {tag …}
Tag可以为 administrator,monitoring, management
5). 权限管理
权限设置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
Vhostpath
Vhost路径
user
用户名
Conf
一个正则表达式match哪些配置资源能够被该用户访问。
Write
一个正则表达式match哪些配置资源能够被该用户读。
Read
一个正则表达式match哪些配置资源能够被该用户访问。
6). 获取服务器状态信息
服务器状态:rabbitmqctl status
队列信息:rabbitmqctl list_queues[-p vhostpath] [queueinfoitem …]
Queueinfoitem可以为:name,durable,auto_delete,arguments,messages_ready,messages_unacknowledged,messages,consumers,memory
Exchange信息:rabbitmqctllist_exchanges[-p vhostpath] [exchangeinfoitem …]
Exchangeinfoitem有:name,type,durable,auto_delete,internal,arguments.
Binding信息:rabbitmqctllist_bindings[-p vhostpath] [bindinginfoitem …]
Bindinginfoitem有:source_name,source_kind,destination_name,destination_kind,routing_key,arguments
Connection信息:rabbitmqctllist_connections [connectioninfoitem …]
Connectioninfoitem有:recv_oct,recv_cnt,send_oct,send_cnt,send_pend等。
Channel信息:rabbitmqctl list_channels[channelinfoitem …]
Channelinfoitem有consumer_count,messages_unacknowledged,messages_uncommitted,acks_uncommitted,messages_unconfirmed,prefetch_count,client_flow_blocked
rabbimq-plugins
http://www.rabbitmq.com/man/rabbitmq-plugins.1.man.html
系统命令
卸载
#rpm -qa|grep rabbitmq
rabbitmq-server-3.6.1-1.noarch
#rpm -e --nodeps rabbitmq-server-3.6.1-1.noarch
#rpm -qa|grep erlang
esl-erlang-18.3-1.x86_64
#rpm -e --nodeps esl-erlang-18.3-1.x86_64
服务
#service rabbitmq-server start --后台方式运行
#service rabbitmq-server stop --停止运行
#service rabbitmq-server status --查看状态