主机 | ip | 安装软件 |
---|---|---|
server1 | 192.168.56.102 | rabbitmq服务 |
server2 | 192.168.56.107 | haproxy代理+keepalived |
server3 | 192.168.56.108 | rabbitmq服务 |
server4 | 192.168.56.109 | haproxy代理+keepalived |
vim /etc/hosts
192.168.56.102 server1
192.168.56.108 server3
RabbitMQ的集群是依赖erlang集群,而erlang集群是通过这个cookie进行通信认证的
sudo apt-get install erlang
rabbitmq集群需要通过主机名互相访问 所以必须在这两台机器 /etc/hosts配置以上内容 确保主机名正确
两台机器使用rabbitmq进行通信 使用的安全策略是 erlang.cookie 就是一个随机字符串 两节点必须保持一致 否则 无法添加节点到集群
该cookie文件 可能位于 /var/lib/rabbitmq/.erlang.cookie 或者 ~/.erlang.cookie 启动任何一台机器,刚才已经启动了一个节点
把启动节点的.erlang.cookie拷贝到其他节点相同目录下
.erlang.cookie是erlang分布式的token文件,集群内所有的节点要持有相同的.erlang.cookie文件,才允许彼此通信。
将server1的.erlang.cookie文件复制到server3的相关路径下面(在server1下执行)
scp /var/lib/rabbitmq/.erlang.cookie 192.168.56.108:/var/lib/rabbitmq/
修改文件的权限(两台服务器都需要执行)
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
sudo apt-get install rabbitmq-server
##启动rabbitmq服务
sudo service rabbitmq-server start
sudo rabbitmqctl stop_app #暂停server2服务
sudo rabbitmqctl join_cluster rabbit@server1 #server2加入集群,rabbit是server1默认名称
sudo rabbitmqctl start_app #启动server2服务
sudo rabbitmqctl cluster_status #查看集群状态
rabbitmq的内存节点和磁盘节点的作用
在RabbitMQ集群中的节点只有两种类型:内存节点/磁盘节点,单节点系统只运行磁盘类型的节点。而在集群中,可以选择配置部分节点为内存节点。
内存节点将所有的队列,交换器,绑定关系,用户,权限,和vhost的元数据信息保存在内存中。
磁盘节点将这些信息保存在磁盘中,但是内存节点的性能更高,
为了保证集群的高可用性,必须保证集群中有两个以上的磁盘节点,来保证当有一个磁盘节点崩溃了,集群还能对外提供访问服务。
在上面的操作中,可以通过如下的方式,设置新加入的节点为内存节点还是磁盘节点。
rabbitmqctl join_cluster --ram rabbit@server1 #加入--ram表示内存节点,否则表示磁盘节点
sudo rabbitmqctl add_user admin manager
sudo rabbitmqctl set_permissions -p / admin ".* " ".* " ".*"
sudo rabbitmqctl set_user_tags admin administrator
sudo rabbitmqctl cluster_status
方法一:
在节点上执行:
rabbitmqctl stop
rabbitmqctl forget_cluster_node rabbit@server3 --offline
注意上面在使用 rabbitmqctl forget_cluster_node 命令的时候用到了
“–offline” 参数,如果不添加这个参数,就需要保证 server3 节点中的 RabbitMQ 服务处于
运行状态,而在这种情况下, server3 无法先行启动, 则 “–offline” 参数的添加让其可以在非运行状态下将 nodel 剥离出当前集群。
方法二:
在节点上执行:
rabbitmqctl stop_app
rabbitmqctl reset
这样也能剔除该节点
sudo apt-get install haproxy
vim /etc/haproxy/haproxy.conf
加入以下配置内容
#### 对MQ集群进行监听
listen rabbitmq_cluster
bind 0.0.0.0:5673 #通过5673对m1和m2进行映射
option tcplog #记录TCP连接状态和时间
mode tcp #四层协议代理,即对TCP进行转发
option clitcpka #开启TCP的Keep Alive(长连接模式)
timeout connect 1s #haproxy与mq建立连接的超时时间
timeout client 10s #客户端与haproxy最大空闲时间
timeout server 10s #服务器与haproxy最大空闲时间
balance roundrobin #采用轮询转发消息
#每5秒发送一次心跳包,如果连续两次有响应则代表状态良好
#如果连续3次没有响应,则视为服务故障,该节点将被剔除
server server1 192.168.56.102:5672 check inter 5s rise 2 fall 3
server server3 192.168.56.108:5672 check inter 5s rise 2 fall 3
#log /dev/log local0
#### 开启监控服务
listen http_front
bind 0.0.0.0:1080 #监听端口
stats refresh 30s #每30秒刷新一次
stats uri /haproxy?stats #统计页面uri
stats auth admin:manager #统计页面用户名和密码设置
#### RabbitMQ管理界面
listen rabbitmq_admin
bind 0.0.0.0:8804 #这里注意端口不要冲突,冲突会导致haproxy服务启动失败
server server1 192.168.56.102:15672
server server3 192.168.56.108:15672
sudo apt-get install keepalived
vrrp_instance VI_1 {
state MASTER
interface enp0s8
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
192.168.56.110
}
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s8
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
192.168.56.110
}
}
访问 RabbitMQ管理界面 在server1上添加一个queue,看能否在server2上看到该queue
登录http://192.168.56.102:15672/ 添加一个queue queue:new