首页 > 编程知识 正文

java实现消息队列,rabbitmq集群模式

时间:2023-05-06 11:52:42 阅读:125716 作者:477

服务器主机ip安装软件server1192.168.56.102rabbitmq服务server 2192.168.56.107 ha代理keepalived server 3192.168

在服务器1、服务器3上分别配置主机,确保相互可访问的地址vim /etc/hosts

192.168.56.102 server 1192.168.56.108 server3rabbit MQ群集依赖于erlang群集,但erlang群集已通过此cookie的通信认证

在server1和server3上分别安装erlangsudoapt-getinstallerlangrabbitmq群集需要通过主机名相互访问,因此这两台计算机/etc/hosser

两台计算机使用rabbitmq进行通信时使用的安全策略是erlang.cookie。 也就是说,如果两个节点在随机字符串中不匹配,则无法将节点添加到群集

此cookie文件可能已在/var/lib/rabbit MQ/. Erlang.cookie或~/.erlang.cookie上启动计算机之一,并刚才启动了节点

将启动节点的. erlang.cookie复制到与其他节点相同的目录中

将. erlang.cookie复制到其他节点。 erlang.cookie是一个分布式erlang的token文件,群集中的所有节点必须具有相同的. erlang.cookie文件才能相互通信。

将server1上的. erlang.cookie文件复制到server3的相关路径下(在server1下运行)

修改scp/var/lib/rabbit MQ/. Erlang.cookie 192.168.56.1083360/var/lib/rabbit MQ /文件的权限(

sudo chmod 400/var/lib/rabbit MQ/. Erlang.cookie分别是server1, 在server3上安装rabbitmq-serversudoapt-getinstallrabbitmq-serversudoapt-getinstallrabitmq-server 3的rabbit MQ服务service sudoses 将server2节点加入rabbitmq群集sudo rabbitmqctl stop_app #,并将server2服务sudorabbitmqctljoin _ cluster rabbit @ server1# server 2 sudorabbitmqctlstart _ app # server 2服务rabbitmqctl cluster _ status # rabbit MQ的内存节点和磁盘节点角色,显示群集1的默认名称sudorabbitmqctlstart

RabbitMQ群集中的节点只有两种类型:内存节点/磁盘节点。 单节点系统只运行磁盘类型的节点。 在群集中,某些节点还可以配置为内存节点。

内存节点将所有队列、交换机、绑定关系、用户、权限和vhost元数据信息存储在内存中。

磁盘节点将这些信息存储在磁盘上,但内存节点性能更高。

为了保证群集的高可用性,必须确保群集中有两个或多个磁盘节点,并且如果一个磁盘节点崩溃,群集可以访问外部。

在上述操作中,可以通过以下方式设置新加入的节点是内存节点还是磁盘节点:

rabbitmqctljoin _ cluster-- ram rabbit @ server1#加入--ram表示内存节点,否则为、 磁盘节点指向server1的管理员用户sudorabbitmqctladd _ useradminmanagerserver 1的sudorabbitmqctlset _ permissions-p/admin '.* 表示要添加“.”的“admin用户角色设置: sudorabbitmqctlset _ user _ tagsadminadministrator显示群集的状态sudo rabbitmqctl cluster_status

在节点上运行:

在rabbitmqctlstoprabbitmqctl forget _ cluster _ node rabbit @ server3----offline上发送rabbitmqctlforget_cluster_node命令

“offline”参数。 如果不添加此参数,则表示服务器3节点上的RabbitMQ服务

运行状态,在这种情况下,如果server3不能先启动,则可以通过添加“-offline”参数在非运行状态下将nodel与当前集群断开连接。

方法2 :

在节点上执行:

rabbitmqctl stop_apprabbitmqctl reset

这样也能剔除该节点

分别在server2 和 server4 上安装haproxy sudo apt-get install haproxy 在server2上配置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 分别在server2 和 server3 上安装keepalived sudo apt-get install keepalived 在server2上配置keepalived ,默认在server2上启用虚拟IP:192.168.56.110 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 }} 在server4上配置keepalived, 默认是备份机 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集群是否正常

访问 RabbitMQ管理界面 在server1上添加一个queue,看能否在server2上看到该queue
登录http://192.168.56.102:15672/ 添加一个queue queue:new

在server1上发布一个消息到queue:new队列中

登录http://192.168.56.108:15672/ 查看等否看到 queue:new

在server3上看能否读取到该消息

验证能否通过代理读取到数据

登录代理服务器地址 通过虚拟IP访问 http://192.168.56.110:8804

测试VIP是否能够故障漂移

关闭server3上的keepalived服务,模拟 server3发生故障,看虚拟IP是否还能正常访问

再次访问 http://192.168.56.110:8804 仍能正常显示

最后测试能否让程序通过虚拟IP访问rabbitmq集群

编写创建rabbitmq客户端连接服务的go代码示例

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。