一、部署前工作
- 环境
rabbitmq-1 | 10.24.43.4 | centos6.x |
---|---|---|
rabbitmq-2 | 10.24.43.5 | centos6.x |
- 修改主机名
10.24.43.4 | rabbitmq_1 |
---|---|
10.24.43.5 | rabbitmq_2 |
部署路径:/data/UnicomSMS/ |
- 时间同步
ntpdate ntp1.aliyun.com
注:这里ntp后面跟域名/ip可以自行选择,此处作者用的时阿里的时间服务器
两台同步同一个地址,创建计划任务每5分钟同步一次即可
crontab -e
最后一行添加
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
- 安装依赖环境
yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
二、安装erlang
- 安装Erlang
wget http://erlang.org/download/otp_src_19.0.tar.gz
tar -zxvf otp_src_19.0.tar.gz
cd otp_src_19.0
mkdir /data/UnicomSMS/Erlang
./configure --prefix=/data/UnicomSMS/Erlang --without-javac
make && make install
export
echo "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/data/UnicomSMS/Erlang/bin:/data/UnicomSMS/Rabbitmq_server-3.6.5/sbin" >>/etc/profile
source /etc/profile
测试:输出erl会进入erl编译界面,证明安装配置成功!ctrl+G 然后输入q退出编译
- 安装rabbitmq
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-generic-unix-3.6.5.tar.xz
yum install -y xz
xz -d rabbitmq-server-generic-unix-3.6.5.tar.xz
mkdir /data/UnicomSMS/Rabbitmq_server-3.6.5
tar -xvf rabbitmq-server-generic-unix-3.6.5.tar -C /data/UnicomSMS/Rabbitmq_server-3.6.5/
echo "export PATH=$PATH:/data/UnicomSMS/Erlang/bin:/data/UnicomSMS/Rabbitmq_server-3.6.5/sbin" >> /etc/profile
source /etc/profile
- 导入rabbitmq的管理界面
两个目录没作用太繁琐,环境变量也定义的一个,所以去掉一个
cd /data/UnicomSMS/Rabbitmq_server-3.6.5/rabbitmq_server-3.6.5/
mv * ..
cd ..
rm -rf rabbitmq_server-3.6.5/
进入rabbitmq的sbin目录
cd /data/UnicomSMS/Rabbitmq_server-3.6.5/sbin
./rabbitmq-plugins enable rabbitmq_management
这里执行后The following plugins have been enabled:意思是下列插件已启用,有点像报错,并不是报错哦
- 设置erlang
查找位置:find / -name *erlang.cookie
/root/.erlang.cookie #如果用的包和我一样,默认就是这
将rabbitmq-1的该文件内容复制到rabbitmq_2,注意这个文件的权限是 400(默认即是400)
[root@rabbitmq_1 ~]#cat /root/.erlang.cookie
将其内容复制
[root@rabbitmq_2 ~]# vim /root/.erlang.cookie
将复制的内容替换到此处
[root@rabbitmq_2 ~]#chmod 400 /root/.erlang.cookie
可以通过cat /root/.erlang.cookie
来查看两台机器的cookie是否一致,设置erlang的目的是要保证集群内的cookie内容一致。
- 使用-detached参数运行各节点
rabbitmqctl stop
#如果已经在运行中用此命令停掉服务
rabbitmq-server -detached
#运行各节点
rabbitmqctl start_app
#开启
rabbitmqctl stop_app
#关闭
然后可以通过rabbitmqctl cluster_status
查看节点状态。PS:要先拷贝cookie到另一台机器上,保证两台机器上的cookie是一致的并且权限都为400,然后再启动服务。
- 新增用户赋予权限
由于guest这个用户,只能在本地访问,所以我们要新增一个用户并赋予权限:
添加用户并设置密码:
rabbitmqctl add_user admin 123456
添加权限(使admin用户对虚拟主机“/” 具有所有权限):
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
修改用户角色(加入administrator用户组):
rabbitmqctl set_user_tags admin administrator
然后就可以远程访问了,然后可直接配置用户权限等信息。到此,就可以通过http://ip:15672 使用admin 123456 进行登陆了。
到这里的话,每个节点是作为单独的一台RabbitMQ存在的,也可以正常提供服务了
- 组成集群
rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。
将rabbitmq_1与rabbitmq_2组成集群,这里以rabbitmq_1为例
rabbitmq_2#rabbitmqctl stop_app
rabbitmq_2#rabbitmqctl join_cluster rabbit@rabbitmq_1
#这里集群的名字一定不要写错了,需保证rabbitmq_1是开启的,rabbitmq_2是关闭的,才可以加入集群,如果还报错,请检查
cookie是否一致且权限都是否为400,最好不要复制cookie到其他节点,建议把文件cp过去并赋予400权限,因为我第一次复制过去wc -c 发现字节不一样
rabbitmq_2# rabbitmqctl start_app
(PS:如果要使用内存节点,则可以使用rabbitmq_2# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
加入集群)集群配置完毕!
- 检查集群状态
集群配置完毕后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。
rabbitmq_1# rabbitmqctl cluster_status
会有一个集群名字和连接信息,我这里只贴出来一个集群名字
{cluster_name,<<”rabbit@rabbitmq_1”>>}
可知,集群的名称默认为rabbit@rabbitmq_1;
PS:另外一种查看集群是否成功的方式,在web页面上的“Queues”的列表中,查看有如下显示为“同步镜像到node2”,则也表示集群配置成功
- 设置镜像队列策略
在任意一个节点上执行如下操作(这里在rabbitmq_1上执行)
首先,在web界面,登陆后,点击“Admin–Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);
然后,在linux中执行如下命令
rabbitmqctl set_policy -p / ha-all "^" '{"ha-mode":"all"}'
“/” vhost默认名称,可通过rabbitmqctl list_vhosts
查看, “^”匹配所有的队列, ha-all 策略名称为ha-all, ‘{“ha-mode”:”all”}’ 策略模式为 all 即复制到所有节点,包含新增节点。
则此时镜像队列设置成功。(这里的虚拟主机coresystem是代码中需要用到的虚拟主机,虚拟主机的作用是做一个消息的隔离,本质上可认为是一个rabbitmq-server,是否增加虚拟主机,增加几个,这是由开发中的业务决定,即有哪几类服务,哪些服务用哪一个虚拟主机,这是一个规划)。
- 这里补充一些对于设置镜像队列策略的说明
格式:rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
-p Vhost#可选参数,针对指定vhost下的queue进行设置
Name:#policy的名称
Pattern:#queue的匹配模式(正则表达式)
Definition#镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode#指明镜像队列的模式,有效值为 all/exactly/nodes
all#表示在集群中所有的节点上进行镜像
exactly#表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
node#:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params#ha-mode模式需要用到的参数
ha-sync-mode#进行队列中消息的同步方式,有效值为automatic和manual
priority#可选参数,policy的优先级
将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。完成这 几个步骤后,RabbitMQ 高可用集群就已经搭建好了,最后一个步骤就是搭建均衡器。
- 安装并配置HA
在rabbitmq-1上yum安装HAProxy(yum -y install haproxy
),然后修改vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
clitimeout 120s
srvtimeout 120s
listen rabbitmq_cluster 10.24.43.4:5670
mode tcp
balance roundrobin
server rabbit1 10.24.43.4:5672 check inter 5000 rise 2 fall 2
server rabbit2 10.24.43.5:5672 check inter 5000 rise 2 fall 2
listen private_monitoring :8100 mode http option httplog stats enable stats uri /rabbitmqstats stats refresh 5s
一般前面对照一下,就listen段落复制进去就可以了,记得改ip哦
- 重启 haproxy
service haproxy restart
登录浏览器输入地址http://10.24.43.4:8100/rabbitmqstats
查看HAProxy的状态
- 查询命令
获取服务器状态信息
服务器状态:rabbitmqctl status
##其中可查看rabbitmq的版本信息
- 获取集群状态信息
rabbitmqctl cluster_status