1、安装EPEL(Extra Packages for Enterprise Linux)
(1)x86_64位cpu
su -c 'rpm -Uvh http://mirrors.yun-idc.com/epel/5/x86_64/epel-release-5-4.noarch.rpm'
(2)i386cpu
su -c 'rpm -Uvh http://mirrors.yun-idc.com/epel/5/i386/epel-release-5-4.noarch.rpm'
2、安装simplejson
pip install simplejson
3、安装erlang语言环境
yum install erlang
4、安装RabbitMQ Server
(1)第1种安装法
yum install rabbitmq-server
(2)第2种安装法(不推荐)
下载rpm包
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.3/rabbitmq-server-3.1.3-1.noarch.rpm
rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
yum install rabbitmq-server-3.1.3-1.noarch.rpm
二、python用客户端
pip install amqplib
pip install pika
三、rabbitmq cluster集群
1、修改主机名(仅仅三步)
(1) 执行命令:hostname <主机名>
eg. hostname rabbit45
(2)编辑/etc/hosts:
加入 <对应节点的IP> <节点的主机名>
eg.
ip地址1 rabbit44
ip地址2 rabbit45
(3)编辑/etc/sysconfig/network:
把localhost改成 <主机名>
eg. HOSTNAME=rabbit45
此时,ping <主机名>是通的。
2、配置其他节点的[主机名,IP]的映射关系(仅仅一步)
编辑/etc/host:(注意:是需要集群的所有结点)
加入 <对应节点的IP> <其他节点的主机名>
eg.
ip地址1 rabbit44
ip地址2 rabbit45
此时,ping <其他节点的主机名>是通的。
3、配置RabbitMQ Server的环境变量:
首先在/etc/rabbitmq/下建立文件rabbitmq-env.conf
文件添加内容
NODENAME=rabbit # 设置结点名
4、搭建RabbitMQ Cluster。
建立RabbitMQ Cluster,首先一个很重要的前提就是,各个节点上安装的RabbitMQ Server和Erlang版本必须完全一致,同时各个节点RabbitMQ Server所使用的cookie必须完全一致,要不然无法建立Cluster。
注意:
a、由于通过rabbitmq-server -detached时,产生的.erlang.cookie文件会放到主目录下(此目录优先级比/var/lib/rabbitmq高),所以应将主目录下的文件放到/var/lib/rabbitmq下,并且cookie文件的内容要保持一致,可以通过先启动一台机子的rabbitmq服务器产生一个.erlang.cookie文件后复制到另外一台机子上。
b、保持.erlang.cookie文件的权限为444,否则在运行时,会有权限问题
eg.假设现在我们已经登录到了rabbit45和rabbit44主机上。
(1)、在rabbit45和rabbit44终端上执行:
rabbitmq-server -detached
此时Node1和Node2的RabbitMQ就成功启动起来了。
然后执行:
rabbitmqctl cluster_status
会看到
Cluster status of node rabbit@rabbit45 ...
[{nodes,[{disc,[rabbit@rabbit45}]},{running_nodes,[rabbit@rabbit45]}]
...done
(2)、在rabbit44上建立Cluster,并将rabbit45加入到集群中:
首先要把Server启动时默认产生的cookie与rabbit45产生的保持一致:
1、关掉当前运行(rabbit45)的RabbitMQ Server,即执行rabbitmqctl stop_app。
2、将rabbit45加入到rabbit44中,执行rabbitmqctl join_cluster rabbit@rabbit44
3、启动起来看看有没有出错,执行rabbitmqctl start_app
此时再次执行rabbitmqctl cluster_status,此时会看到
Cluster status of node rabbit@rabbit45 ...
[{nodes,[{disc,[rabbit@rabbit44,rabbit@rabbit45]}]},
{running_nodes,[rabbit@rabbit44,rabbit@rabbit45]},
{partitions,[]}]
...done.
再到rabbit44执行rabbitmqctl cluster_status,此时同样会看到上面的输出。
到这里,我的RabbitMQ Server Cluster就搭建好了。
另外还可以通过配置rabbitmq.config文件来配置好Cluster内的所有节点,参考官方文档。
5、使用镜像队列
(1)先增加负载均衡
安装:
sudo yum install haproxy
在/etc/haproxy/haproxy.cfg文件下添加rabbitmq配置:
# rabbitmq-cluster dispatch
listen rabbitmq_cluster 0.0.0.0:5672
mode tcp
balance roundrobin
option tcpka
server rabbit44 ip地址:5672 check inter 2000 rise 2 fall 3
server rabbit45 ip地址:5672 check inter 2000 rise 2 fall 3
修改之后,重启
或重新加载/etc/init.d/haproxy reload
6、代码访问
(1)publisher.py发送端
import pika
class Publisher():
def __init__(self):
self.connection = pika.BlockingConnection(pika.ConnectionParameters(host='xx.xx.xx.43', port=5672))
self.channel = self.connection.channel()
self.channel.confirm_delivery() # Turn on delivery confirmations,保证在挂掉一个rabbitmq服务后,不丢数据
self.channel.exchange_declare(exchange='ex', type='direct', durable=True)
self.channel.queue_declare(queue='que', durable=True)
self.channel.queue_bind(exchange='ex', queue='que', routing_key='update')
def write_message(self, json_string):
self.channel.basic_publish(exchange='ex',
routing_key='update',
body=json_string,
properties=pika.BasicProperties(delivery_mode=2))
def disconnect(self):
self.connection.close()