RabbitMQ集群安装配置+HAproxy+Keepalived高可用

RabbitMQ集群安装配置+HAproxy+Keepalived高可用

转自:https://www.linuxidc.com/Linux/2016-10/136492.htm

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:配置文件中修改

1# vi /etc/sysconfig/network 2 NETWORKING=yes 3 HOSTNAME=m1

2. 修改hosts文件,将集群所有机器 ip hostname 分别添加到每一台机器中 ,比如。

1vi/etc/hosts 2 3 127.0.0.1 localhost 4 127.0.0.1 m1 5 ::1 localhost 6 7 192.168.12.190 m1 8 192.168.12.190 m2 9 192.168.12.192 n1 10 192.168.12.193 n2 11 192.168.12.194 n3

安装过程

(下载rpm安装包安装)

1. 下载软件源到/etc/yum.repos.d/ ,并生成缓存

1wget –no-cache http://www.convirture.com/repos/definitions/rhel/6.x/convirt.repo -O /etc/yum.repos.d/convirt.repo 2 3yum makecache

2. 安装Socat

yum install -y socat

3. 下载安装Erlang

选择版本号尽量高的推荐18
下载地址https://packages.erlang-solutions.com/erlang/

1wget http://packages.erlang-solutions.com/site/esl/esl-erlang/FLAVOUR_1_general/esl-erlang_18.3.4-1~CentOS~6_amd64.rpm 2 3yum localinstall -y esl-erlang_18.3.4-1~centos~6_amd64.rpm

4. 下载安装RabbitMq 3.6.2

1wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.2/rabbitmq-server-3.6.2-1.noarch.rpm 2 3yum localinstall -y rabbitmq-server-3.6.2-1.noarch.rpm

(如果提示依赖问题,先安装依赖,提示erlang版本直接跳过

1yum localinstall --skip-broken rabbitmq-server-3.6.2-1.noarch.rpm 2或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端管理端口

1netstat -atn |grep 5672 2[root@n3 ~]# netstat -atn |grep 5672 3tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 4tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 5tcp 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

1[root@n1 ~]# cat /var/lib/rabbitmq/.erlang.cookie 2YZCUPNLBNOMPTDCUALZC

关闭rabbitmq,将cookie复制到其他机器…

1[root@n3~]# rabbitmqctl stop 2[root@n3~]# echo YZCUPNLBNOMPTDCUALZC > /var/lib/rabbitmq/.erlang.cookie 3 4[root@n2~]# rabbitmqctl stop 5[root@n2~]# echo YZCUPNLBNOMPTDCUALZC > /var/lib/rabbitmq/.erlang.cookie

或者使用scp命令

1scp /var/lib/rabbitmq/.erlang.cookie root@n2:/var/lib/rabbitmq/.erlang.cookie 2 3 scp /var/lib/rabbitmq/.erlang.cookie root@n3:/var/lib/rabbitmq/.erlang.cookie

cookie同步完成之后启动
以detached方式启动

rabbitmq-server -detached

如果提示PID FILE不能写入,可以关闭应用,直接以服务方式启动
关闭之后重启仍然提示有实例正在运行可以强制杀死线程

1ps aux | grep rabbitmq 2kill -9 xxxx

启动服务

service rabbitmq-server start
加入集群

将n2节点加入n1 作为RAM类型节点

1[root@n2 ~]#rabbitmqctl stop_app 2[root@n2 ~]#rabbitmqctl reset 3[root@n2 ~]#rabbitmqctl join_cluster rabbit@n1 --ram 4[root@n2 ~]#rabbitmqctl start_app

将n3节点加入n1 作为disc类型节点

[root@n3 ~]#rabbitmq stop_app
[root@n3 ~]#rabbitmqctl reset
[root@n3 ~]#rabbitmqctl join_cluster rabbit@n1
[root@n3 ~]#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,继续提供服务,从而保证了高可用性。

1 +------------------VIP(192.168.12.111)-------------+ 2 | | | 3 | | | 4 server(MASTER) <------------keepalived--------> server(BACKUP) 5 (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

修改配置文件

1vi /etc/haproxy/haproxy.cfg 2 3 4 5#配置rabbitmq集群节点信息,n1、n3相同配置 6 7#配置一个监听实例rabbitmq_cluster 8listen rabbitmq_cluster 9 10#监控端口 11bind 0.0.0.0:5670 12 13#配置TCP模式 14mode tcp 15 16#简单的轮询 17balance roundrobin 18 19#rabbitmq集群节点配置 20server m1 192.168.12.190:5672 check inter 5000 rise 2 fall 2 21 22server n1 192.168.12.192:5672 check inter 5000 rise 2 fall 2 23 24server n3 192.168.12.194:5672 check inter 5000 rise 2 fall 2 25 26 27#配置web端监控,查看统计信息 28###haproxy statistics monitor 29 30listen statics 0.0.0.0:8888 31 32mode http 33 34log 127.0.0.1 local0 debug 35 36transparent 37 38#数据刷新频率 39stats refresh 60s 40 41#后台地址http://ip:8888/haproxy-stats 42stats uri / haproxy-stats 43 44stats realm Haproxy \ statistic 45 46#账号密码 47stats auth admin:admin

Keepalived安装配置

在master和backup主机上安装(n1,n3)

# yum install keepalived

修改配置文件

vi /etc/keepalived.conf

备用节点:

1#定义一个脚本chk_haproxy 2vrrp_script chk_haproxy { 3 script "/etc/keepalived/scripts/haproxy_check.sh" 4 interval 2 5} 6 7#定义一个VRRP实例 8vrrp_instance VI_1 { 9 #备用节点(主节点为MASTER10 state BACKUP 11 #添加虚拟地址的网卡 ,选择稳定的网卡 12 interface eth0 13 #虚拟路由标识,同一个VRRP实例要使用同一个标识 14 virtual_router_id 51 15 #主、备节点是由优先级控制的state参数会失效 16 priority 100 17 # 用于设定主备节点间同步检查时间间隔 18 #advert_int 2 19 # 20 unicast_src_ip 192.168.12.194 21 unicast_peer { 22 192.168.12.192 23 } 24 25 #授权方式 26 authentication { 27 auth_type PASS 28 auth_pass rabbitmq 29 } 30 31 #设置虚拟地址 32 virtual_ipaddress { 33 192.168.12.111 34 } 35 36 #尽量将track_script放到virtual_ipaddress后面 37 track_script { 38 chk_haproxy 39 } 40 41 #设置高可用集群中不抢占功能,在主机down后,从机接管,当主机重新恢复后,设置此功能,备机将继续提供服务,从而避免因切换导致的隐患 42 nopreempt 43 44 # 当keepalived切换状态到MASTER时,执行脚本 45 notify_master "/etc/keepalived/scripts/haproxy_master.sh" 46 47 # 当keepalived切换状态到BACKUP时,执行脚本 48 49 #notify_backup "/etc/keepalived/backup.sh" 50 51 # 当keepalived切换状态到FAULT时,执行脚本 52 53 #notify_fault "/etc/keepalived/fault.sh" 54 55 #当keepalived切换状态到STOP时,执行脚本 56 57 #notify_fault "/etc/keepalived/stop.sh" 58 59}

主节点:

1vrrp_script chk_haproxy { 2 script "/etc/keepalived/scripts/haproxy_check.sh" 3 interval 2 4} 5 6 7vrrp_instance VI_1 { 8 state MASTER 9 interface eth0 10 virtual_router_id 51 11 priority 101 12 unicast_src_ip 192.168.12.192 13 unicast_peer { 14 192.168.12.194 15 } 16 17 authentication { 18 auth_type PASS 19 auth_pass rabbitmq 20 } 21 22 virtual_ipaddress { 23 192.168.12.111 24 } 25 26 27 track_script { 28 chk_haproxy 29 } 30 notify_master "/etc/keepalived/scripts/haproxy_master.sh" 31 32}

chk_haproxy.sh

1 #!/bin/bash 2LOGFILE="/var/log/keepalived-ha-state.log" 3echo "===========================================" >> \$LOGFILE 4date +%Y%m%d-%H:%M:%S >> \$LOGFILE 5pid1=\`ps aux|grep /etc/haproxy/haproxy.cfg | grep -v grep | grep -v bash | wc –l\` 6if [ "\$pid1" = "0" ]; then 7 8 echo "Ready to start haproxy....." >> \$LOGFILE 9haproxy -f /etc/haproxy/haproxy.cfgD

启动Haproxy

1 pid2=\`ps aux|grep /etc/haproxy/haproxy.cfg | grep -v grep | grep -v bash |wc –l\` 2 if [ "\$pid2" = "0" ]; then 3 echo "Haproxy failed to start !!! So,stop keepalived!!!" >> \$LOGFILE 4 /etc/init.d/keepalived stop 5 else 6 echo "Haproxy start success........." >> \$LOGFILE 7 fi 8fi

haproxy_master.sh

1#!/bin/bash 2LOGFILE="/var/log/keepalived-ha-state.log" 3echo "===========================================" >> $LOGFILE 4date +%Y%m%d-%H:%M:%S >> $LOGFILE 5echo "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

系统命令

1卸载 2#rpm -qa|grep rabbitmq 3rabbitmq-server-3.6.1-1.noarch 4#rpm -e --nodeps rabbitmq-server-3.6.1-1.noarch 5#rpm -qa|grep erlang 6esl-erlang-18.3-1.x86_64 7#rpm -e --nodeps esl-erlang-18.3-1.x86_64 8 9 10 11 服务 12#service rabbitmq-server start --后台方式运行 13#service rabbitmq-server stop --停止运行 14#service rabbitmq-server status --查看状态

CentOS 5.6 安装RabbitMQ http://www.linuxidc.com/Linux/2013-02/79508.htm

RabbitMQ客户端C++安装详细记录 http://www.linuxidc.com/Linux/2012-02/53521.htm

用Python尝试RabbitMQ http://www.linuxidc.com/Linux/2011-12/50653.htm

RabbitMQ集群环境生产实例部署 http://www.linuxidc.com/Linux/2012-10/72720.htm

Ubuntu下PHP + RabbitMQ使用 http://www.linuxidc.com/Linux/2010-07/27309.htm

在CentOS上安装RabbitMQ流程 http://www.linuxidc.com/Linux/2011-12/49610.htm

RabbitMQ概念及环境搭建 http://www.linuxidc.com/Linux/2014-12/110449.htm

RabbitMQ入门教程  http://www.linuxidc.com/Linux/2015-02/113983.htm

RabbitMQ 的详细介绍请点这里
RabbitMQ 的下载地址请点这里

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-10/136492.htm

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )