centos7编译安装rabbitmq及集群配置

rabbitmq简介:

Queue(队列)

消息队列,提供了FIFO的处理机制,具有缓存消息的能力。rabbitmq中,队列消息可以设置为持久化,临时或者自动删除。

1.    设置为持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统crash,数据丢失
2.    设置为临时队列,queue中的数据在系统重启之后就会丢失
3.    设置为自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除

Exchange

Exchange类似于数据通信网络中的交换机,提供消息路由策略。rabbitmq中,producer不是通过信道直接将消息发送给queue,而是先发送给Exchange。一个Exchange可以和多个Queue进行绑定,producer在传递消息的时候,会传递一个ROUTING_KEY,Exchange会根据这个ROUTING_KEY按照特定的路由算法,将消息路由给指定的queue。和Queue一样,Exchange也可设置为持久化,临时或者自动删除。
Exchange有4种类型:direct(默认),fanout, topic, 和headers,不同类型的Exchange转发消息的策略有所区别:

1.    Direct
直接交换器,工作方式类似于单播,Exchange会将消息发送完全匹配ROUTING_KEY的Queue
2.    fanout
广播是式交换器,不管消息的ROUTING_KEY设置为什么,Exchange都会将消息转发给所有绑定的Queue。
3.    topic
主题交换器,工作方式类似于组播,Exchange会将消息转发和ROUTING_KEY匹配模式相同的所有队列,比如,ROUTING_KEY为user.stock的Message会转发给绑定匹配模式为 * .stock,user.stock, * . * 和#.user.stock.#的队列。( * 表是匹配一个任意词组,#表示匹配0个或多个词组)
4.    headers
消息体的header匹配(ignore)

Binding

所谓绑定就是将一个特定的 Exchange 和一个特定的 Queue 绑定起来。Exchange 和Queue的绑定可以是多对多的关系。

virtual host

在rabbitmq server上可以创建多个虚拟的message broker,又叫做virtual hosts (vhosts)。每一个vhost本质上是一个mini-rabbitmq server,分别管理各自的exchange,和bindings。vhost相当于物理的server,可以为不同app提供边界隔离,使得应用安全的运行在不同的vhost实例上,相互之间不会干扰。producer和consumer连接rabbit server需要指定一个vhost。

通讯过程

假设P1和C1注册了相同的Broker,Exchange和Queue。P1发送的消息最终会被C1消费。基本的通信流程大概如下所示:

1.    P1生产消息,发送给服务器端的Exchange
2.    Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
3.    Queue1收到消息,将消息发送给订阅者C1
4.    C1收到消息,发送ACK给队列确认收到消息
5.    Queue1收到ACK,删除队列中缓存的此条消息

Consumer收到消息时需要显式的向rabbit broker发送basic.ack消息或者consumer订阅消息时设置auto_ack参数为true。在通信过程中,队列对ACK的处理有以下几种情况:

1.    如果consumer接收了消息,发送ack,rabbitmq会删除队列中这个消息,发送另一条消息给consumer。
2.    如果cosumer接受了消息, 但在发送ack之前断开连接,rabbitmq会认为这条消息没有被deliver,在consumer在次连接的时候,这条消息会被redeliver。
3.    如果consumer接受了消息,但是程序中有bug,忘记了ack,rabbitmq不会重复发送消息。
4.    rabbitmq2.0.0和之后的版本支持consumer reject某条(类)消息,可以通过设置requeue参数中的reject为true达到目地,那么rabbitmq将会把消息发送给下一个注册的consumer。

安装依赖关系文件:

yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl

安装erlang语言环境:

下载安装
wget http://www.erlang.org/download/otp_src_20.1.tar.gz //下载
tar -xzvf otp_src_20.1.tar.gz //解压
cd otp_src_20.1/ //进入安装目录
./configure —prefix=/usr/local/erlang //初始化
make && make install //编译安装

配置erlang环境变量:

vi /etc/profile //在底部添加以下内容
ERL_HOME=/usr/local/erlang
PATH=$ERL_HOME/bin:$PATH
export ERL_HOME PATH

source /etc/profile //生效

erl //如果进入erlang的shell则证明安装成功,退出即可

安装RabbitMQ:

下载安装:
cd /home/macro/tools //切换到计划安装RabbitMQ的目录,我这里放在/home/macro/tools
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.7.2/rabbitmq-server-generic-unix-3.7.2.tar.xz //下载RabbitMQ安装包
xz -d rabbitmq-server-generic-unix-3.7.2.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.7.2.tar

启动服务
cd /home/macro/tools/rabbitmq_server-3.7.2/sbin/ //切换到启动文件目录
./rabbitmq-server -detached //启动rabbitmq,-detached是以后台守护进程方式启动
./rabbitmqctl status //查看rabbitmq状态
"1.png"
//输出以上信息即正确
启动服务:rabbitmq-server -detached【 /home/macro/tools/rabbitmq_server-3.7.2/sbin/rabbitmq-server -detached 】
查看状态:rabbitmqctl status【 /home/macro/tools/rabbitmq_server-3.7.2/sbin/rabbitmqctl status 】
关闭服务:rabbitmqctl stop【 /home/macro/tools/rabbitmq_server-3.7.2/sbin/rabbitmqctl stop 】
列出角色:rabbitmqctl list_users 【 /home/macro/tools/rabbitmq_server-3.7.2/sbin/abbitmqctl list_users 】

配置网页插件:

首先创建目录,否则可能会出错:
mkdir /etc/rabbitmq

然后启用插件:
cd /home/macro/tools/rabbitmq_server-3.7.2/sbin/ //切换到启动文件目录
./rabbitmq-plugins enable rabbitmq_management //启动网页插件
"2.png"
//输入以上信息即启动成功

添加账号配置访问权限:

rabbitmqctl add_user macro macro //添加用户,后面两个参数分别是用户名和密码
rabbitmqctl set_permissions -p / macro “.“ “.“ “.*” //添加权限
rabbitmqctl set_user_tags macro administrator //修改用户角色

//现在你在浏览器中输入服务器IP:15672 就可以看到RabbitMQ的WEB管理页面了
利用刚添加到管理员账号登陆rabbitmq:
"4.png"

删除guest账户:
"5.png"

大功告成,rabbitmq安装就到此为止结束了。

Rabbitma集群配置:

172.16.47.172 rabbitmq
172.16.47.173 rabbitmq01

配置hosts(两台机器同时配置):

vi /etc/hosts
172.16.47.172 rabbitmq
172.16.47.173 rabbitmq01

Rabbitmq配置:

cd /home/macro/tools/rabbitmq_server-3.7.2/sbin //切换到启动文件目录
./rabbitmqctl stop_app
./rabbitmqctl start_app

Rabbitmq01配置:

cd /home/macro/tools/rabbitmq_server-3.7.2/sbin //切换到启动文件目录
./rabbitmq-server -detached //启动rabbitmq ,以后台守护进程方式启动
./rabbitmqctl stop_app
./rabbitmqctl cluster_join —disc rabbit@rabbitmq //以磁盘模式加入集群,rabbitmq为主机hosts
./rabbitmqctl start_app
./rabbitmqctl cluster_status
"7.png"
"8.png"
//通过以上信息发现已经将rabbitmq01加入了集群

附录:

内存控制:
vm_memory_high_watermark 该值为内存阈值,默认为0.4。意思为物理内存的40%。40%的内存并不是内存的最大的限制,它是一个发布的节制,当达到40%时Erlang会做GC。最坏的情况是使用内存80%。如果把该值配置为0,将关闭所有的publishing 。
rabbitmqctl set_vm_memory_high_watermark 0
Paging 内存阈值,该值为默认为0.5,该值为vm_memory_high_watermark的20%时,将把内存数据写到磁盘。
如机器内存16G,当RABBITMQ占用内存1.28G(160.40.2)时把内存数据放到磁盘。
硬盘控制:
当RabbitMQ的磁盘空闲空间小于50M(默认),生产者将被BLOCK,如果采用集群模式,磁盘节点空闲空间小于50M将导致其他节点的生产者都被block
可以通过disk_free_limit来对进行配置