安装系统 : CentOS release 6.6 (Final) , Red Hat 4.4.7-11 , x86_64 GNU
参考:http://www.aichengxu.com/view/37456
需要安装一个比较新的Python版本
1、安装 python:
#wget https://www.python.org/ftp/python/3.5.0/Python-3.5.1.tar.xz
#xz –d Python-3.5.1.tar.xz
#tar -xvf Python-3.5.1.tar
#cd Python-3.5.1
#./configure (--prefix=/usr/local/python-3.5.1)可选
#make && make install
# make clean && make distclean
★注:./configure 不加prefix默认安装到/usr/local/bin
测试:在命令行下输入python,出现python解释器即表示已经正确安装。
此时
python –V
Python 2.6.6
安装目录:/usr/bin/python
仍然是系统默认的版本
使用python3.5 -V
安装目录:/usr/local/bin/python3.5
需要建立软连接指向当前系统默认的python目录处,让系统使用新的python版本
mv /usr/bin/python /usr/bin/python.bak
ln -s /usr/local/python-3.5.1/bin/python3.5 /usr/bin/python
此时修改完成,输入python –V
PS:
有些人更新了python版本无法使用yum,需要为yum修改它的配置文件
vi /usr/bin/yum
将文件头部的#!/usr/bin/python改成#!/usr/bin/python2.6(注意这个是之前的老版本python号,因为此时老版本才能支持yum)
至此,Python安装完成
https://pypi.python.org/pypi/simplejson#downloads
simplejson-3.8.2.tar.gz
tar –zxvf simplejson-3.8.2.tar.gz
cd simplejson-3.8.2
#python setup.py build
#python setup.py install
命令行下敲python
RabbitMQ是基于Erlang的,必须配置Erlang环境。
本文采用yum安装方式
yum info erlang : No Package~~~
先下载epel源
# wget -O
/etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo
切换yum源,可换为国内阿里云:
http://blog.csdn.net/realghost/article/details/45949759
先安装以下依赖包
#yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
#yum install libX* tk unixODBC unixODBC-devel
yum –y install xmlto
yum install erlang
★注:可能会报错:
Error Downloading Packages:
erlang-megaco-R14B-04.3.el6.x86_64: failure: erlang-megaco-R14B-04.3.el6.x86_64.rpm from epel: [Errno 256] No more mirrors to try.
erlang-pman-R14B-04.3.el6.x86_64: failure: erlang-pman-R14B-04.3.el6.x86_64.rpm from epel: [Errno 256] No more mirrors to try.
erlang-compiler-R14B-04.3.el6.x86_64: failure: erlang-compiler-R14B-04.3.el6.x86_64.rpm from epel: [Errno 256] No more mirrors to try.
erlang-typer-R14B-04.3.el6.x86_64: failure: erlang-typer-R14B-04.3.el6.x86_64.rpm from epel: [Errno 256] No more mirrors to try.
重新将报错的安装包下载
安装完成,命令行输入erl
rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
rpm安装完成的路径
命令都在/usr/lib/rabbitmq/bin中
其中,指向的命令链接目录都在
/usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin中
rabbitmq-plugins enable rabbitmq_management
运行rabbitmqctl status
/etc/init.d/rabbitmq-server restart
或者
rabbitmq-server start : 此方式关闭连接,自动结束进程
后台运行:rabbitmq-server -detached
再次运行rabbitmqctl status
ps aux | grep rabbitmq //查看端口
netstat -tnlp|grep 5672
启动成功
打开防火墙,开启rabbit_management页面管控台的15672端口
vi /etc/sysconfig/iptables
添加
## rabbitmq_management Port
-A INPUT -m state --state NEW -m tcp -p tcp --dport 15672 -j ACCEPT
## rabbitmq Port
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5672 -j ACCEPT
保存退出,重启防火墙
service iptables restart
在浏览器输入http://192.168.230.131:15672/
初始密码guest/guest,进入管理界面:
/etc/init.d/rabbitmq-server stop
或者: rabbitmqctl stop
查看配置
cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/sbin
cat rabbitmq-defaults
查看默认设置
cd /var log/rabbitmq
使用rpm包安装完,默认开机任务有rabbitmq-server脚本
使用chkconfig --add rabbitmq-server
命令把rabbitmq-server添加到开机启动,然后使用chkconfig –list
查看添加是否在开机任务中
用cd 命令切换到/etc/rc.d/init.d/目录下
cd /etc/rc.d/init.d
用touch rabbitmq创建一个文件,为这个文件添加可执行权限
chmod +x rabbitmq
接着用vi rabbitmq
来编辑这个文件
#!/bin/bash
#chkconfig:2345 20 90
#description: rabbitmq
#processname: rabbitmq
case $1 in
start) su root /etc/init.d/rabbitmq-server start;;
stop) su root /etc/init.d/rabbitmq-server stop;;
status) su root /etc/init.d/rabbitmq-server status;;
restart) su root /etc/init.d/rabbitmq-server restart;;
*) echo "require start|stop|status|restart" ;;
esac
然后保存退出
这个时候就可以用service rabbitmq start/stop/status/restart
来启动、停止rabbitmq服务了
最后一点我们需要开机自动启动,所以需要添加到启动里面
使用chkconfig --add rabbitmq
命令把rabbitmq添加到开机启动,然后使用chkconfig –list
查看添加是否在开机任务中
格式化命令输出数据格式
从Management查建中获取脚本
cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.1.5/plugins
wget http://localhost:55672/cli/rabbitmqadmin
chmod +x rabbitmqadmin
./rabbitmqadmin -V "/" list exchanges
通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。
这些节点通过 RabbitMQ HA 队列(镜像队列)进行消息队列结构复制。本方案中搭建 3 个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务。
设计架构可以如下:在一个集群里,有3台机器,其中1台使用磁盘模式,另2台使用内存模式。2台内存模式的节点,无疑速度更快,因此客户端 (consumer、producer)连接访问它们。而磁盘模式的节点,由于磁盘IO相对较慢,因此仅作数据备份使用,另外一台作为反向代理。
集群安装在三台虚拟机上,hostname分别为:
master_node : 192.168.230.131
slave_node1 : 192.168.230.133
slave_node2 : 192.168.230.134
HAProxy 安装在 192.168.230.135 上,用于对外提供 RabbitMQ 均衡
1. 安装 erlang、rabbitmq
在 192.168.230.131、192.168.230.133、192.168.230.134 三个节点上安装,安装过程省略,开启 RabbitMQ 监控插件:
rabbitmq-plugins enable rabbitmq_management
2. 修改 /etc/hosts
加入集群 3 个节点的描述:
192.168.230.131 master_node
192.168.230.133 slave_node1
192.168.230.134 slave_node2
3. 设置 Erlang Cookie
Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信
将其中一台节点上的.erlang.cookie值复制下来保存到其他节点上。或者使用scp远程拷贝的方法也可,但是要注意文件的权限和属主属组
这里将 master_node 的该文件复制到 slave_node1、slave_node2,由于这个文件权限是 400,所以需要先修改 slave_node1、slave_node2 中的该文件权限为 777:
chmod 777 /var/lib/rabbitmq/.erlang.cookie
然后将 node1 中的该文件拷贝到 node2、node3,
scp -v root@master_node:/var/lib/rabbitmq/.erlang.cookie .erlang.cookie
复制好后别忘记还原.erlang.cookie的权限和所属用户/组,否则可能会遇到错误
# chmod 400 /var/lib/rabbitmq/.erlang.cookie
# chown rabbitmq /var/lib/rabbitmq/.erlang.cookie
# chgrp rabbitmq /var/lib/rabbitmq/.erlang.cookie
4. 使用 -detached 参数运行各节点
停止所有节点RabbitMq服务,然后使用detached参数独立运行
这步很关键,尤其增加节点停止节点后再次启动遇到无法启动都可以参照这个顺序
# rabbitmqctl stop
# rabbitmq-server -detached
slave_node1 # rabbitmqctl stop_app
slave_node1 # rabbitmqctl join_cluster –ram root@master_node
slave_node1 # rabbitmqctl start_app
slave_node2 # rabbitmqctl stop_app
slave_node2 # rabbitmqctl join_cluster –ram root@master_node
slave_node2 # rabbitmqctl start_app
先停掉rabbitmq应用,然后调用cluster命令,将slave_node1连接到,使两者成为一个集群,最后重启rabbitmq应 用。在这个cluster命令下,slave_node1、slave_node2是内存节点,master_node是磁盘节点(RabbitMQ启动后,默认是磁盘节 点)。
master_node 如果要使slave_node1或slave_node2在集群里也是磁盘节点,join_cluster 命令去掉–ram参数即可
只要在节点列表里包含了自己,它就成为一个磁盘节点。在RabbitMQ集群里,必须至少有一个磁盘节点存在。
[root@master_node~]# rabbitmqctl cluster_status
[root@slave_node1~]# rabbitmqctl cluster_status
[root@slave_node2~]# rabbitmqctl cluster_status
往任意一台集群节点里写入消息队列,会复制到另一个节点上, 这样RabbitMQ集群就正常工作了,
这种模式更适合非持久化队列,只有该队列是非持久的,客户端才能重新连接到集群里的其他节点,并重新创建队列。假如该队列是持久化的,那么唯一办法是将故障节点恢复起来.
为什么RabbitMQ不将队列复制到集群里每个节点呢?这与它的集群的设计本意相冲突,集群的设计目的就是增加更多节点时,能线性的增加性能(CPU、内存)和容量(内存、磁盘)。
6. 设置镜像队列策略
在任意一个节点上执行:
# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。
完成这 6 个步骤后,RabbitMQ 高可用集群就已经搭建好了,最后一个步骤就是搭建均衡器。
7. 安装并配置 HAProxy
在 192.168.230.134 上安装 HAProxy,然后修改
/etc/haproxy/haproxy.cfg:
listen rabbitmq_cluster 0.0.0.0:5672
mode tcp
balance roundrobin
server node1 192.168.230.131:5672 check inter 2000 rise 2 fall 3
server node2 192.168.230.133:5672 check inter 2000 rise 2 fall 3
server node2 192.168.230.134:5672 check inter 2000 rise 2 fall 3