阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

高可用RabbitMQ集群安装配置

162次阅读
没有评论

共计 11890 个字符,预计需要花费 30 分钟才能阅读完成。

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
[root@n3 ~]# 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 文件:/var/lib/rabbitmq/.erlang.cookie
将任意一台的 cookie 文件或者内容替换到集群其他机器。最后确保文件权限为 400。
查看某台机器的 cookie

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

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

[root@n3~]# rabbitmqctl stop
[root@n3~]# echo YZCUPNLBNOMPTDCUALZC > /var/lib/rabbitmq/.erlang.cookie 

[root@n2~]# rabbitmqctl stop
[root@n2~]# echo YZCUPNLBNOMPTDCUALZC > /var/lib/rabbitmq/.erlang.cookie 

或者使用 scp 命令

scp /var/lib/rabbitmq/.erlang.cookie root@n2:/var/lib/rabbitmq/.erlang.cookie

 scp /var/lib/rabbitmq/.erlang.cookie root@n3:/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 类型节点

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

        +------------------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

高可用 RabbitMQ 集群安装配置
在 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 -- 查看状态

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

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计11890字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中