RabbitMQ 3.5.6 普通镜像集群安装步骤-手动模式安装
文章目录
一、准备工作
1、三台虚拟机
172.22.40.104(磁盘节点)
172.22.40.105(内存节点)
172.22.40.106(内存节点)
2、安装环境
centos-release-7-3
3、集群命名
qa-rabbitmq-group-1
4、使用版本
RabbitMQ v3.5.6
Erlang v18.2
Erlang和RabbitMQ版本关系如下:
RabbitMQ | Erlang/OTP |
---|---|
3.8.16,3.8.17,3.8.18,3.8.19 | 23.2~24.x |
3.8.9,3.8.10,3.8.11,3.8.12,3.8.13,3.8.14,3.8.15 | 22.3~23.x |
3.8.4,3.8.5,3.8.6,3.8.7,3.8.8 | 21.3~23.x |
3.7.15,3.7.16,3.7.17,3.7.18 | 20.3~22.x |
3.7.11,3.7.12,3.7.13,3.7.14 | 20.3~21.x |
3.7.7,3.7.8,3.7.9,3.7.10 | 19.3~21.x |
3.7.0,3.7.1,3.7.2,3.7.3,3.7.4,3.7.5,3.7.6 | 19.3~20.x |
5、hostname
说明:这步操作也可以放到集群配置的时候再修改,但是如果节点启动后再修改hostname的话,需要重置节点!
扩展:
RabbitMQ节点是由节点名称标识并根据节点名称存储数据。在集群中,节点使用节点名称相互识别和联系,节点名称由两部分固定前缀rabbit@和hostname,如:rabbit@localhost
#hostname用于显示系统的主机名称,使用 hostname 或 hostnamectl 命令来查看当前的主机名
[root@localhost ~]# hostname
[root@localhost ~]# hostnamectl
5.1、修改hostname
分别设置三台机器的hostname为rabbitmq-1、rabbitmq-2和rabbitmq-3
#使用hostname命令设置hostname值
[root@localhost ~]# hostname yourHostname
#修改静态主机名
[root@localhost ~]# echo yourHostname > /etc/hostname
注意:此命令修改hostname可立即生效,但系统重启后失效。为了保证重启后依然有效,需要修改 /etc/sysconfig/network 配置文件:
[root@localhost ~]# vim /etc/sysconfig/network
输入以下文件:
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=yourHostname
修改了 /etc/sysconfig/network 下的HOSTNAME后需要重启机器才能生效,我们以使用命令 sysctl kernel.hostname 使其立即生效。
[root@localhost ~]# sysctl kernel.hostname=yourHostname
再扩展:
hostname 与 /etc/hosts 的关系?
很多人一提到更改hostname首先就想到修改/etc/hosts文件,认为hostname的配置文件就是/etc/hosts。其实不是的。hosts文件的作用相当于dns,提供ip地址到hostname的对应映射关系。
例如,我们绑定以下host:
127.0.0.1 www.baidu.com
那么我们本机再 ping www.baidu.com 的时候就会解析出127.0.0.1这个ip
5.1.1、修改172.22.40.104机器的hostname
[root@localhost ~]# hostname rabbitmq-1
#查看当前hostname,看是否修改成功
[root@localhost ~]# hostname
#查看静态主机名
[root@localhost ~]# cat /etc/hostname
localhost.localdomain
#修改静态主机名
[root@localhost ~]# echo rabbitmq-1 > /etc/hostname
#再次查看静态主机名
[root@localhost ~]# cat /etc/hostname
rabbitmq-1
#使hostname永久有效
[root@localhost ~]# vim /etc/sysconfig/network
输入:
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=rabbitmq-1
#使 /etc/sysconfig/network 配置生效
[root@localhost ~]# sysctl kernel.hostname=rabbitmq-1
kernel.hostname = rabbitmq-1
#修改完后,重新登录机器可以看到hostname修改成功
[root@rabbitmq-1 ~]#
5.1.2、按照同样的方法修改另外两台机器的hostname
二、单节点RabbitMQ服务安装步骤
1、安装工具包和常用命令
其实RabbitMQ只需要socat,因为我这里是新机器,索性一次性都安装了
yum groupinstall "Development Tools"
yum -y install wget make unzip zip gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel gtk2-devel binutils-devel unixODBC-devel socat lrzsz wxWidgets-devel epel-release ncurses-devel logrotate
2、安装Erlang
wget http://erlang.org/download/otp_src_18.2.tar.gz
3、解压Erlang
tar -xzvf otp_src_18.2.tar.gz
4、进入Erlang解压目录
cd otp_src_18.2
5、Erlang配置安装
5.1、检查编译环境并配置安装路径
./configure --prefix=/usr/local/otp_src_18.2 --without-javac
5.2、编译和安装
#从makefile中读取指令,执行源码编译命令和安装命令
make && make install
5.3、设置Erlang环境变量
vim /etc/profile
5.4、添加如下文本
#set erlang environment
export PATH=$PATH:/usr/local/otp_src_18.2/bin
5.5、保存并使环境变量立即生效
source /etc/profile
5.6、验证是否安装成功
erl
6、安装RabbitMQ
6.1、下载安装包
https://github.com/rabbitmq/rabbitmq-server/releases/tag/rabbitmq_v3_5_6/
下载:rabbitmq-server-generic-unix-3.5.6.tar.gz
下载后把包上传到服务器 /usr/local 目录下
6.2、解压RabbitMQ安装包
tar -xzvf rabbitmq-server-generic-unix-3.5.6.tar.gz
6.3、进入RabbitMQ解压目录
cd rabbitmq_server-3.5.6
6.4、配置RabbitMQ的环境变量
vim /etc/profile
6.5、添加如下文本
#rabbitMQ
export PATH=$PATH:/usr/local/rabbitmq_server-3.5.6/sbin
6.6、保存并使环境变量立即生效
source /etc/profile
6.7、启动和设置用户管理插件
cd /usr/local/rabbitmq_server-3.5.6/sbin
6.7.1、后台启动RabbitMQ服务
#这个命令执行的时候会报 Warning: PID file not written; -detached was passed. 忽略即可
./rabbitmq-server -detached
6.7.2、添加admin用户
#因为guest用户只能在本机访问(只能通过localhost登陆使用),添加一个admin用户,密码设置为:963741852
./rabbitmqctl add_user admin 963741852
#设置admin为超级管理员
./rabbitmqctl set_user_tags admin administrator
#为admin账号添加所有的权限
./rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
#RabbitMQ默认账户和密码为 guest/guest,我们修改guest用户密码
./rabbitmqctl change_password guest 852963741
#查看当前的用户列表
./rabbitmqctl list_users
#如果想要删除一个用户
./rabbitmqctl delete_user yourUserName
扩展:
1)rabbitmq用户角色
用户角色可分为五类:超级管理员、监控者、策略制定者、普通管理者以及其他
(1) 超级管理员(administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户、策略(policy)进行操作
(2) 监控者(monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数、内存使用情况、磁盘使用情况等)
(3) 策略制定者(policymaker)
可登陆管理控制台(启用management plugin的情况下),同时可以对policy进行管理,但无法查看节点的相关信息
(4) 普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理
(5) 其他
无法登陆管理控制台,通常就是普通的生产者和消费者
了解了这些后,就可以根据需要给不同的用户设置不同的角色,以便按需管理
设置用户角色的命令为:
./rabbitmqctl set_user_tags User Tag
User为用户名,Tag为角色名(对应于上面的 administrator、monitoring、policymaker、management或其他自定义名称)
也可以给同一用户设置多个角色,例如:
./rabbitmqctl set_user_tags myName monitoring policymaker
2)用户权限
用户权限指的是用户对 exchange、queue 的操作权限,包括配置权限、读写权限。
配置权限会影响到 exchange,queue 的声明和删除。
读写权限影响到从queue里取消息,向exchange发送消息以及queue和exchange的绑定(bind)操作
例如:
将queue绑定到某exchange上,需要具有queue的写权限,以及exchange的读权限。
向exchange发送消息需要具有exchange的写权限。
从queue里取数据需要具有queue的读权限。
相关命令为:
(1) 设置用户权限
./rabbitmqctl set_permissions -p VHostPath User ConfP WriteP ReadP
如:设置guest用户权限
./rabbitmqctl set_permissions -p / guest '.*' '.*' '.*'
(2) 查看(指定VHostPath)所有用户的权限信息
./rabbitmqctl list_permissions [-p VHostPath]
如:列出虚拟主机上的所有权限
./rabbitmqctl list_permissions -p /
(3) 查看指定用户的权限信息
./rabbitmqctl list_user_permissions User
如:列出guest用户权限
./rabbitmqctl list_user_permissions guest
(4) 清除用户的权限
./rabbitmqctl clear_permissions [-p VHostPath] User
3)vhost 操作
./rabbitmqctl delete_vhost /
./rabbitmqctl add_vhost /
./rabbitmqctl list_vhosts
6.7.3、启用web后台管理插件
./rabbitmq-plugins enable rabbitmq_management
./rabbitmq-plugins enable rabbitmq_shovel
./rabbitmq-plugins enable rabbitmq_shovel_management
#对应的禁用web后台管理插件
./rabbitmq-plugins disable rabbitmq_management
./rabbitmq-plugins disable rabbitmq_shovel
./rabbitmq-plugins disable rabbitmq_shovel_management
6.7.4、启动和关闭
1)直接启动模式:如果你关闭窗口或者需要在该窗口使用其他命令时应用就会停止
./rabbitmq-server //启动
./rabbitmq-server restart //重启
./rabbitmq-server stop //停止
./rabbitmq-server status //查看状态
2)rabbitmq以应用方式后台启动
./rabbitmq-server -detached //rabbitmq分别启动节点和应用,不会生成pid_file文件
./rabbitmqctl status //查看运行状态
./rabbitmqctl start_app //应用启动,此命令典型的用途是在执行了其他管理操作之后,重新启动之前停止的 RabbitMQ 应用,比如reset
./rabbitmqctl stop_app //将rabbitmq服务应用关闭,但是Erlang虚拟机还是处于运行状态
./rabbitmqctl stop //同时关闭应用和节点
6.7.5、查看端口
#15672是HTTP API客户端、web管理界面使用,25672用于节点间通信,5672是AMQP使用的端口
netstat -lnp |grep beam
6.7.6、管理界面访问测试
http://172.22.40.104:15672
三、普通集群配置
1、准备单节点RabbitMQ服务
同上面单节点RabbitMQ服务安装的步骤,
把172.22.40.105、172.22.40.106这两台机器上也安装好RabbitMQ服务。
2、修改hosts配置
绑定ip和hostname的映射关系,便于RabbitMQ节点间进行DNS解析和通信
[root@rabbitmq-1 ~]# cat /etc/hosts
[root@rabbitmq-1 ~]# vim /etc/hosts
三台机器的hosts文件中都添加如下文本:
172.22.40.104 rabbitmq-1
172.22.40.105 rabbitmq-2
172.22.40.106 rabbitmq-3
2、查看hosts是否生效
#在任意一台机器上ping这三个hostname,能正确解析出对应ip即成功
[root@rabbitmq-1 ~]# ping rabbitmq-1
3、同步 .erlang.cookie 文件
3.1、Erlang Cookie
RabbitMQ节点是使用cookie来确定它们是否被允许相互通信的(erlang集群是通过这个cookie进行通信认证),为了让节点间能够通信,它们必须具有相同的共享秘密,称为:Erlang Cookie。
所以必须确保集群中的每个RabbitMQ节点都使用相同的cookie值。
3.2、Erlang Cookie的位置
Erlang Cookie的位置通常在:$HOME/.erlang.cookie
所以要想知道Erlang Cookie位置,首先要取得RabbitMQ启动日志里面的home dir的根路径:
#RabbitMQ日志所在目录:/usr/local/rabbitmq_server-3.5.6/var/log/rabbitmq
[root@rabbitmq-1 ~]# cd /usr/local/rabbitmq_server-3.5.6/var/log/rabbitmq
[root@rabbitmq-1 rabbitmq]# cat rabbit@rabbitmq-1.log | grep home
home dir : /root
home dir : /root
可知,RabbitMQ的$HOME目录为:/root
3.3、Erlang Cookie的权限
[root@rabbitmq-1 rabbitmq]# cd ~
[root@rabbitmq-1 ~]# ls -la // 可以看到一个 .erlang.cookie 文件
[root@rabbitmq-1 ~]# chmod 400 /root/.erlang.cookie // 修改.erlang.cookie的权限为只读
#如果需要,请把.erlang.cookie文件的拥有者改为指定的rabbitmq用户或组
#[root@rabbitmq-1 ~]# chown -R rabbitmq:rabbitmq .erlang.cookie
[root@rabbitmq-1 ~]# cat .erlang.cookie // 查看cookie的值
注意:.erlang.cookie 文件的权限必须是400,不然存在节点之间无法通信的风险。
扩展:
chmod权限的三个数字:
第一个数字表示文件所有者的权限
第二个数字表示与文件所有者同属一个用户组的其他用户的权限
第三个数字表示其它用户组的权限
权限分为三种:读(r=4),写(w=2),执行(x=1),无(-=0)。
综合起来还有:只读(r=4)、可读可执行(rx=5=4+1)、可读可写(rw=6=4+2)、可读可写可执行(rwx=7=4+2+1)
所以:
chmod 400 file // 所有人只读
chmod 600 file // 设置拥有者可读写及执行
chmod 777 file // 所有人可以读写及执行
3.4、Erlang Cookie的同步
保持三台机器的.erlang.cookie值一致
在172.22.40.105机器执行:
[root@rabbitmq-2 ~]# scp root@172.22.40.104:/root/.erlang.cookie /root/
[root@rabbitmq-2 ~]# chmod 400 /root/.erlang.cookie
在172.22.40.106机器执行:
[root@rabbitmq-3 ~]# scp root@172.22.40.104:/root/.erlang.cookie /root/
[root@rabbitmq-3 ~]# chmod 400 /root/.erlang.cookie
注意:.erlang.cookie 文件同步复制完成后,须逐个重启节点服务。
4、创建集群
为了使三个节点连接到一起组成一个集群,我们需要把另外两个节点(rabbit@rabbitmq-2和rabbit@rabbitmq-3)加入到第一个节点(rabbit@rabbitmq-1),在此之前,必须重新设置两个新加入的成员节点。
4.1、将节点rabbit@rabbitmq-2加入到rabbit@rabbitmq-1的集群中
#在rabbit@rabbitmq-2上
[root@rabbitmq-2 ~]# cd /usr/local/rabbitmq_server-3.5.6/sbin/
[root@rabbitmq-2 sbin]# ./rabbitmqctl stop_app
Stopping node 'rabbit@rabbitmq-2' ...
[root@rabbitmq-2 sbin]# ./rabbitmqctl reset
Resetting node 'rabbit@rabbitmq-2' ...
#加入集群时指定节点类型,--ram 指定内存节点类型,--disc 指定磁盘节点类型
[root@rabbitmq-2 sbin]# ./rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
Clustering node 'rabbit@rabbitmq-2' with 'rabbit@rabbitmq-1' ...
[root@rabbitmq-2 sbin]# ./rabbitmqctl start_app
Starting node 'rabbit@rabbitmq-2' ...
[root@rabbitmq-2 sbin]# ./rabbitmqctl cluster_status
Cluster status of node 'rabbit@rabbitmq-2' ...
[{nodes,[{disc,['rabbit@rabbitmq-1']},{ram,['rabbit@rabbitmq-2']}]},
{running_nodes,['rabbit@rabbitmq-1','rabbit@rabbitmq-2']},
{cluster_name,<<"rabbit@rabbitmq-1">>},
{partitions,[]}]
4.2、将节点rabbit@rabbitmq-3加入到集群中
这次我们将rabbit@rabbitmq-3节点集群到rabbit@rabbitmq-2节点来证明新节点加入集群时跟选择集群的节点无关紧要,只须提供一个在线节点。
#在rabbit@rabbitmq-3上
[root@rabbitmq-3 ~]# cd /usr/local/rabbitmq_server-3.5.6/sbin/
[root@rabbitmq-3 sbin]# ./rabbitmqctl stop_app
Stopping node 'rabbit@rabbitmq-3' ...
[root@rabbitmq-3 sbin]# ./rabbitmqctl reset
Resetting node 'rabbit@rabbitmq-3' ...
[root@rabbitmq-3 sbin]# ./rabbitmqctl join_cluster --ram rabbit@rabbitmq-2
Clustering node 'rabbit@rabbitmq-3' with 'rabbit@rabbitmq-2' ...
[root@rabbitmq-3 sbin]# ./rabbitmqctl start_app
Starting node 'rabbit@rabbitmq-3' ...
[root@rabbitmq-3 sbin]# ./rabbitmqctl cluster_status
Cluster status of node 'rabbit@rabbitmq-3' ...
[{nodes,[{disc,['rabbit@rabbitmq-1']},
{ram,['rabbit@rabbitmq-3','rabbit@rabbitmq-2']}]},
{running_nodes,['rabbit@rabbitmq-2','rabbit@rabbitmq-1','rabbit@rabbitmq-3']},
{cluster_name,<<"rabbit@rabbitmq-1">>},
{partitions,[]}]
4.设置集群名字
#在任意一台节点机器上查看集群状态
[root@rabbitmq-1 sbin]# ./rabbitmqctl cluster_status
可知,集群的名字为:rabbit@rabbitmq-1
#在任意一台节点机器上执行修改集群名字的命令
[root@rabbitmq-1 sbin]# ./rabbitmqctl set_cluster_name qa-rabbitmq-group-1
Setting cluster name to qa-rabbitmq-group-1 ...
再次查看集群状态可知,集群的名字为:qa-rabbitmq-group-1
四、镜像集群配置
上面配置的普通集群为RabbitMQ默认集群模式,但并不保证队列的高可用性,
尽管队列名、交换机、绑定关系这些元数据可以在集群节点间相互复制,
但是队列中的内容不会被复制,虽然该模式解决一部分节点压力,
但队列节点宕机将直接导致该队列无法使用,只能等待重启,
所以要想在队列节点宕机或故障的时候也能正常使用,
就要复制队列的内容到集群里的每个节点,需要创建镜像队列。
1、镜像集群:在普通集群的基础上,创建镜像策略,如下,即可实现集群之间镜像的复制:
使用Rabbit镜像功能,需要基于rabbitmq策略来实现,策略是用来控制和修改群集内的队列行为和Exchange行为。
2、测试镜像策略是否生效
五、高可用集群配置
HAProxy + Keepalived 实现高可用方案,忽略。
六、RabbitMQ其他介绍
详见 RabbitMQ相关资料