找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[ Ngnix与高并发服务器 ] 【守望者 rabbitmq】RabbitMQ安装以及配置负载均衡

2014-10-12 17:24| 发布者: zhouy | 查看: 2004 | 收藏

摘要: 1.RabbitMQ安装1.1 windows xp版的安装第一步:下载erlang安装包及rabbitMQ安装包。http://www.erlang.org/download/otp_win32_R16B01.exe erlang http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.5/rabb ...
1.RabbitMQ安装

1.1 windows xp版的安装

第一步:下载erlang安装包及rabbitMQ安装包。

http://www.erlang.org/download/otp_win32_R16B01.exe       erlang  http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.5/rabbitmq-server-windows-3.1.5.zip   rabbitmq
    

第二步:安装erlang

    双击otp_win32_R16B01.exe不断下一步直到成功安装结束。
    设置环境变量ERLANG_HOME= C:\Program Files\erlx.x.x  (具体请根据自己机器的情况)。

第三步:安装RabbitMQ

    双击rabbitmq-server-3.1.5.exe不断下一步直到成功安装结束。
    设置环境变量RABBITMQ_SERVER=C:\Program Files\rabbitmq_server-x.x.x。
    设置环境变量path加入“;%RABBITMQ_SERVER%\sbin”。
    运行cmd->rabbitmq-server start,若出现下图,则代表安装成功。
      


1.2 linux debian版的安装

 第一步:下载rabbitMQ安装包
   
   如果是debian6.0以上版本则直接下rabbitmq-sever-2.8以上版本链接如下
    http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.5/rabbitmq-server_3.1.5-1_all.deb
   如果是debian5.0则需要下载rabbitmq-server-1.8.1
   http://ftp.cn.debian.org/debian/pool/main/r/rabbitmq-server/rabbitmq-server_1.8.1-1_all.deb
   如果是debian6.0最好下载rabbitmq-server-3.2.0-1
   http://packages.debian.org/sid/rabbitmq-server

第二步:安装rabbitmq-server-x.x.x

    切换到root用户下在rabbitmq-server-x.x.x 所在文件夹下运行
    dpkg -i rabbitmq-server-x.x.x安装rabbitmq-server
    结果会提示你rabbitmq-server-x.x.x依赖于一些 xxx.deb这些包需要你去手动下载,下载依赖包方法如下,以下载rabbitmq-server-1.8.1依赖包为例(因为目前许多服务器依然用debian 5.0版本):
    首先,点击rabbitmq-server-1.8.1详细介绍地址
    http://packages.debian.org/squeeze/rabbitmq-server
    寻找到系统提示你依赖的安装包。
    用wget address.deb(具体的依赖包链接地址)命令对依赖包一一下载
    下载好之后再用dpkg -i 命令依次安装,直到rabbitmq-server-1.8.1.deb安装完成
    这里需要注意的是选择的xx.deb必须与你系统的架构是一致的,如下所示
     


    32位系统选择i386 ,64位系统选择amd64
    此手动方法虽然笨看上去慢,但确能保证一次安装成功
    第三步:启动rabbitmq-server
     运行命令Rabbitmq-server start则rabbitmq-server运行成功
   
     
1.3 源码版的安装(适用于大部分linux系统)

主要以CentOS release 6.X为例

第一步:下载erlang R14B04源码包.tar.gz
https://www.erlang-solutions.com/downloads/download-erlang-otp

第二步:安装erlang R14B04
在安装包下./configure   --prefix=/home/erlang
make && make install

第三步:下载rabbitmq-3.2.0.tar.gz
http://www.rabbitmq.com/releases/rabbitmq-server/v3.2.0/rabbitmq-server-3.2.0.tar.gz

第四步:安装rabbitmq-3.2.0.tar.gz
export TARGET_DIR=/home/rabbitmq
export SBIN_DIR=/home/rabbitmq/sbin
export MAN_DIR=/home/rabbitmq/man
export DOC_INSTALL_DIR=/home/rabbitmq/docs

第五步:配置rabbitmq-3.2.0
建立目录/etc/rabbitmq(否则很多插件功能无法运行)

2.RabbitMQ管理

2.1环境变量管理

2.1.1 rabbitmq-env.config

这是一个配置rabbitmq基本环境变量的配置文件,在windows系统中没有此文件,与rabbitmq相关的环境变量直接在系统环境变量中设置。而在linux系统中此文件一开始是不存在的,当rabbitmq启动时会自动从默认的启动角本就读取所有的环境变量,如果你需要自定义环境变量则需要在/etc/rabbitmq/文件夹下创建rabbitmq-env.config来配置相当的环境变量。
以NODENAME为例,该变量代表服务节点的名称,在Windows环境中直接设置RABBITMQ_NODENAME(在windows环境中所有的环境变量都要加入前缀RABBITMQ_NODENAME=hare,在linux环境中在rabbitmq-env.conf文件中加入NODENAME =hare语句,则当rabbitmq服务再次启动时,服务节点名称就会改变为hare@computername。
有关rabbitmq的基本环境变量参照
http://www.rabbitmq.com/relocate.html


主要参数的作用:

RABBITMQ_NODE_IP_ADDRESS 代表服务访问IP,可以设置为内网地址,防止外网IP进行访问,达到安全作用
RABBITMQ_NODE_PORT 代表TCP/IP访问端口
RABBITMQ_CONSOLE_LOG

2.2.2 rabbitmq.config
这是一个配置rabbitmq核心应用的配置文件,一开始此文件不存在,服务启动时通过启动角本获取默认的应用配置。如果你想自定义核心应用配置则需要手动创建rabbitmq.config文件。Windows的文件路径为%APPDATA%\RabbitMQ\。Liunx的文件路径etc/rabbitmq/。
此文件的格式与erlang配置文件的格式相同具体如下图所示。详细格式参照erlang配置文件的详细解释。http://www.erlang.org/doc/man/config.html
有关rabbitmq的核心应用变量参照 http://www.rabbitmq.com/configure.html#config-location


2.2 Web管理
在2.8以上版本在命令行中输入rabbitmq-plugins enable rabbitmq_management (linux,windwos都适用),WEB访问链接为http://server-name:15672。3.0以上版本端口号为55672


2.3 命令行管理

主要介绍rabbitmqctl命令集中的几个常用命令
Rabbitmqctl stop 停止rabbitmq service
Rabbitmqctl add_user {username} { password} 添加一个用户并给出用户名密码
Rabbitmqctl list_users 列出所有用户
Rabbitmqctl delete_user {username}删除一个用户
Rabbitmqctl add_vhost {vhostpath}添加一个虚拟主机(类似于命名空间)
Rabbitmqctl list_vhosts列出所有的虚拟主机
Rabbitmqctl delete_vhost {vhostpath}删除一个虚拟主机
Rabbitmqctl set_permissions [-p vhostpath] {user} {conf} {write} {read}设置虚拟主机的用户访问权限,如下例所示
rabbitmqctl set_permissions -p /myvhost tonyg "^tonyg-.*" ".*" ".*"
此命令授于用户tonyg访问虚拟主机/myvhost中所有命名以“tonyg-”开头的资源,并且具有读和写的权限
Rabbitmqctl clear_permissions [-p vhostpath] {username}删除某一用户访问一个虚拟主机的权限
Rabbitmqctl list_permissions [-p vhostpath]列出此虚拟主机的所有用户权限
Rabbitmqctl list_user_permissions {username}列出用户的权限
Rabbitmqctl list_queue|list_exchanges.......展示出所有资源
Rabbitmqctl status 展示rabbitmq service的状态


3.RabbitMQ持久化

3.1持久化相关的环境变量

RABBITMQ_BASE  rabbitmq数据库及日志存放的根目录
RABBITMQ_CONFIG_FILE  rabbitmq.config存放的路径
RABBITMQ_MNESIA_BASE  rabbitmq数据库存放的根目录
/var/lib/rabbitmq/mnesia/
RABBITMQ_MNESIA_DIR  rabbitmq本机结点的存放目录
$RABBITMQ_MNESIA_BASE/本机节点
RABBITMQ_LOG_BASE  rabbitmq日志存放的根目录
/var/log/rabbitmq
RABBITMQ_LOGS  rabbitmq本结点的存放目录
$RABBITMQ_LOG_BASE/本机节点
tail -f /var/log/rabbitmq/rabbit\@vzw5220.log  在屏幕上显示日志


4.RabbitMQ客户端配置(java)


4.1消息生产者

4.1.1建立连接

需要导入rabbitmq-client.jar
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");//服务名
factory.setPort(5673);//端口号
factory.setVirtualHost("test");//虚拟主机
factory.setUsername("guest");//用户
factory.setPassword("19851225");//密码
Connection connection = (Connection) factory.newConnection();


4.1.2建立资源

1) 普通队列

Channel channel = connection.createChannel();//创建转输通道
channel.queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments);
创建一个队列,其中:
queue代表队列名称
durable代表队列是否持久化
exclusive代表该队列是否是独占的即连接上来时它占用整个网络连接
autoDelete代表当此队列不再被使用时,是否自动销毁
arguments队列的备用参数

2) 多线程队列

Channel channel = connection.createChannel();//创建转输通道
channel.queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments);
channel.basicQos(1);
这条语句告诉RabbitMQ在同一时间不要给一个worker一个以上的消息。或者换一句话说, 不要将一个新的消息分发给同一个worker知道它处理完了并且返回了前一个消息的通知标志(acknowledged)替代的,消息将会分发给下一个不忙的worker。


3) 普通中转站

Channel channel = connection.createChannel();
channel.exchangeDeclare(String exchange,String type,boolean durable,boolean autoDelete,boolean internal,Map<String, Object> arguments);
创建一个中转站,基中:
exchange代表中转站名称
type代表中转站的使用方式(包含pub/sub,routing,topics)
durable代表队列是否持久化
autoDelete代表当此中转站不再被使用时,是否自动销毁
internal代表中转站是否是内部的,如果是内部的将不能直接发信息给客户端
arguments中转站的其它参数
在普通中转站中type要选择“fanout”

4) 路由中转站

Channel channel = connection.createChannel();
channel.exchangeDeclare(ROUTING_EXCHANGE_NAME, "direct");
“direct”代表路由方式

5) 主题中转站

Channel channel = connection.createChannel();
channel.exchangeDeclare(TOPIC_NAME, "topic");
“topic”代表主题方式


4.1.3发送消息

channel.basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body)
发送消息,其中:
exchange代表中转站名称
routingKey如果是发送消息至队列则是队列名称,如果发送消息至中转站则代表routing的关键字或者topic的主题内容
mandatory如果是true,exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,那么会调用basic.return方法将消息返还给生产者;当为false时,出现上述情形broker会直接将消息扔掉。
immediate如果是true,exchange在将消息route到queue(s)时发现对应的queue上没有消费者,那么这条消息不会放入队列中。当与消息routeKey关联的所有queue(一个或多个)都没有消费者时,该消息会通过basic.return方法返还给生产者
porps代表其它参数,其中如果值为MessageProperties.PERSISTENT_TEXT_PLAIN则消息为持久化消息
body代表二进制消息流


4.1.4关闭连接
channel.close();
connection.close();

4.2消息消费者


4.2.1建立连接

同生产者

4.2.2连接资源

同生产者

4.2.3消费资源

QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(String queue, boolean autoAck, String consumerTag,boolean noLocal, boolean exclusive, Map<String, Object> arguments, Consumer callback)
取出一条消息,其中queue代表队列名称,autoAck是否自动应答,如果为真,消息一旦被消费者收到,服务端就知道该消息已经投递,从而从队列中将消息剔除,否则,需要在消费者端手工调用channel.basicAck()方法通知服务端,如果没有调用,消息将会进入unacknowledged状态,并且当消费者连接断开后变成ready状态重新进入队列
consumerTag消费者标识
noLocal如果为真则服务端不会发送给消息者消息
exclusive如果为真则表示这是一个独占连接的消费者
arguments消费者的参数
callback回调具体的消费者

while (true) {
   QueueingConsumer.Delivery delivery = consumer.nextDelivery();
   String message = new String(delivery.getBody());
   //利用多线程对消息进行处理
   doWork(message);
}


4.2.4关闭连接
同生产者


5.rabbitmq的集群配置


5.1 复制.erlang.cookie

第一步:修改hostname服务中.erlang.cookie的权限

Chomd 777 /var/lib/rabbitmq/.erlang.cookie   或者
Chomd 777 /root/.erlang.cookie(根据系统和安装的不同)

第二步:复制hostname中的.erlang.cookie至slavename中的相应位置

将slavename的权限修改回原始状态
Chmod 400 .erlang.cookie
同时将hostname的权限修改回原始状态
Chmod 400 .erlang.cookie


5.2 分别启动各rabbitmq节点

Rabbitmqctl stop
Rabbitmq-server  –detached


5.3 配置集群hosts

修改每个节点的hosts
61.135.251.157   hostname
220.181.29.243   slavename

5.4 将slavename加入集群rabbitmq

Rabbitmqctl  stop_app
Rabbitmqctl  join_cluster  rabbit@hostname
Rabbitmqctl  start_app

5.5 更改slavename的集群类型

Rabbitmqctl  stop_app
Rabbitmqctl  change_cluster_node_type  disc/ram
Rabbitmqctl  start_app
Rabbitmqctl  cluster_status

5.6 slavename脱离集群

Rabbitmqctl  stop_app
Rabbitmqctl  reset
Rabbitmqctl  start_app


5.7 设置镜像队列

5.7.1建立镜像规则

第一种情况,向所有的结点镜像队列:

rabbitmqctl set_policy ha-all "^ha" '{"ha-mode":"all"}'
ha-all: 规则的名称
“^ha”: 正则表达式
'{"ha-mode":"all"}': 参数模式

第二种情况,只向主服务备用机器镜像队列

Rabbitmqctl set_policy ha-backup “^ha” ‘{“ha-mode”: “nodes”, “ha-params”: [“rabbit@yz-20-157”,“rabbit@bjchinanet29-243”], "ha-sync-mode":"automatic"}'


5.7.2建立镜像队列


第一种方法:通过rabbitmq-management创建
     


第二种方法:通过客户端创建


Map<String, Object> map = new HashMap();
map.put("x-ha-policy", "all");
channel.queueDeclare(QUEUE_NAME, true, false, false, map);


6.负载匀衡配置


6.1 下载代理服务器HAProxy

http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz
下载haproxy1.4.24

6.2 安装代理服务器HAProxy

tar  -zxvf  haproxy-1.4.24.tar.gz
cd haproxy-1.4.24
make  TARGET=linux26  PREFIX=/home/haprpxy
make  install  PREFIX=/home/haproxy
cd  /home/haproxy
mkdir conf
cd conf
vi haproxy.conf   在此文件中添加如下内容
global
        log 127.0.0.1   local0
        maxconn 4096
        chroot /home/haproxy
        uid 501
        gid 501
        daemon
        nbproc 1
        pidfile /home/haproxy/logs/haproxy.pid
        debug
defaults
        log     127.0.0.1       local3
        mode    http
        option httplog
        option httpclose
        option dontlognull
        option forwardfor
        option redispatch
        retries 2
        maxconn 2000
        balance roundrobin
        stats   uri     /haproxy-stats
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000
listen rabbitservice
        bind 220.181.29.243:8888
        mode tcp
        option tcplog
        server r1 192.168.51.243:5672 check
详细的配置说明可以参照http://www.linuxidc.com/Linux/2012-07/65350.htm

6.3 HAProxy命令

/home/haproxy/sbin/haproxy  -f  /home/haproxy/haproxy.conf   启动HAProxy
/home/haproxy/sbin/haproxy  -f  /home/haproxy/haproxy.cfg  -st  ‘cat /home/haproxy/haproxy.pid’    重启HAProxy
killall  haproxy   停止HAProxy


7.rabbitmq日志管理

7.1 安装日志插件

在rabbitmq环境变量中的日志目录只能记录客户端连接或断开的信息,日志信息非常有限,因此如果要想监控其它运行情况,必须安装日志插件rabbitmq-tracing

第一步:在linux命令行中输入rabbitmq-plugins enable rabbitmq_tracing使该插件得以运行

第二步:运行命令rabbitmqctl trace_on打开日志监控,此时会创建两个基于topic的exchange:amq.rabbitmq.trace和amq.rabbitmq.log。
Amq.rabbitmq.trace:表示成功或者失败的消息记录,保证在系统运行过程中每条消息不会丢失。
Amq.rabbitmq.log:记录每次操作的日志,保证在系统运行过程中每次操作记录不会丢失。

第三步:向这两个exchange邦定队列,将routingKey定义为’#’,会监控系统运行的所有操作信息。routingKey也可以自定义,则只监控感兴趣的日志.

推荐阅读

[守望者 算法视频]01_数据存储(链表与数组)
[守望者 算法视频]01_数据存储(链表与
本章重点介绍数据的在计算机的存储方式 :连续存储(数组)与链式存储,同时
[守望者   java初中级视频]22_javaNIO,AIO编程
[守望者 java初中级视频]22_javaNIO,
内容简介:本课程介绍阻塞,非阻塞,同步和异步的基本概念,介绍javaNIO,AIO
[守望者   java初中级视频]00_java初中级课程学习导航
[守望者 java初中级视频]00_java初中
内容简介:全面贾少这套视频课程学习需要具备的理论基础,以及适合的学习人群
[守望者 linux视频]01_开发工具与开发平台
[守望者 linux视频]01_开发工具与开发
本课主要介绍gcc,gdb等系列开发工具,开始编写程序之旅。要求理解Linux开发平
[守望者 算法视频]08_数据查找_hash算法
[守望者 算法视频]08_数据查找_hash算
守望者:普通逐个查找O(n),组织方式可以无序的数组或者普通链表。已经排序的
[守望者 linux视频]02 进程内存管理与valgrind的使用
[守望者 linux视频]02 进程内存管理与v
本课主要介绍Linux可执行文件与进程内存结构, Linux进程结构及内存申请与释放
[守望者 C和指针]11_高级指针_C_面向对象
[守望者 C和指针]11_高级指针_C_面向对
(1) 彻底解决指针、取地址后的类型问题。(2) 回调函数示例。
[守望者 算法视频]02_数据逻辑组织_线性关联_栈与队列
[守望者 算法视频]02_数据逻辑组织_线
数组与链表是数据存储的基本方法。栈与队列是两种特殊的数据成员管理方式。栈
[守望者 算法视频]07_数据查找_普通查找与二分查找
[守望者 算法视频]07_数据查找_普通查
守望者:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;
[守望者  java初中级视频]01_java环境搭建
[守望者 java初中级视频]01_java环境
内容介绍:学习如何搭建一个java的开发环境,配置JAVA_HOME,Classpath,path等
[守望者 算法视频]03_数据逻辑组织_树_二叉树
[守望者 算法视频]03_数据逻辑组织_树_
树是为了解决链表查找时是线性特点,树采用一分为多的方式,例如二叉树采用一
[守望者  java初中级视频]02_java语法基础
[守望者 java初中级视频]02_java语法
内容简介:介绍java语法的基础,包括常量,变量,作用域,以及常用运算符,对
[守望者 算法视频]05_数据逻辑组织__红黑树
[守望者 算法视频]05_数据逻辑组织__红
守望者:1972年 由Rudolf Bayer发明的,他称之为“对称二叉B树”,它现代的名
[守望者 Linux 视频]09_执行单元_进程异步_信号
[守望者 Linux 视频]09_执行单元_进程
本章重点介绍Linux系统下信号的基本原理,异步与同步区别,信号的产生,安装
[守望者 算法视频] 04_数据逻辑组织_AVL树
[守望者 算法视频] 04_数据逻辑组织_AV
守望者:二叉排序树的最坏情况下其退化为一个链表,相应的查找时间复杂度退化

行业聚焦  面试交流  职位推荐  开发视频   技术交流  腾讯微博  新浪微博

友情链接:课课家教育  阿里云  鲜果  W3Cfuns前端网  中国企业家  环球企业家  投资界  传媒梦工场  MSN中文网  Android开发者社区  cnbeta  投资中国网  又拍云存储  美通说传播  IT茶馆  网商在线  商业评论网  TechOrange  IT时代周刊  3W创新传媒  开源中国社区  二维工坊  Iconfans  推酷  智能电视网  FreeBuf黑客与极客  财经网  DoNews  凤凰财经  新财富  eoe移动开发者社区  i黑马  网易科技  新浪科技  搜狐IT  创业家  创业邦  腾讯财经  福布斯中文网  天下网商  TechWeb  雷锋网  新浪创业  和讯科技  品途O2O  极客公园  艾瑞网  抽屉新热榜  卖家网  人民网通信频道  拉勾网  创新派  简单云主机  

手机版|黑名单|守望者在线 在线教育 linux 高级程序设计 C/C++ 大数据 ( 蜀ICP备14029946号

成都守望者科技有限公司 © 2013-2016 All Rights Reserved