陕西手机网站制作,广州网站开发 找亦客公司优质,东莞市住房城乡建设局官网,网站域名不备案吗目录 引言 一、环境准备 二、利用虚拟机搭建
三、镜像集群配置 四、HAProxy实现负载均衡(主用虚拟机操作) 五、测试RabbitMQ集群搭建情况 引言 在现代分布式系统中#xff0c;消息队列#xff08;Message Queue#xff09;扮演着至关重要的角色,而 RabbitMQ 作为…目录 引言 一、环境准备 二、利用虚拟机搭建
三、镜像集群配置 四、HAProxy实现负载均衡(主用虚拟机操作) 五、测试RabbitMQ集群搭建情况 引言
在现代分布式系统中消息队列Message Queue扮演着至关重要的角色,而 RabbitMQ 作为最流行的开源消息代理之一广泛应用于异步通信、任务队列、事件驱动架构等场景。然而单节点的 RabbitMQ 存在单点故障SPOF, Single Point of Failure风险一旦宕机整个消息系统就会瘫痪。因此 搭建 RabbitMQ 集群 成为保障系统高可用性High Availability, HA和负载均衡Load Balancing的关键措施。 为了保证MQ 中间件的可靠性、并发性、吞吐量在生产环境上一般都会考虑使用 RabbitMQ 的集群方案。当然本搭建过程只是用于测试阶段如用于上线产品需要更严格的搭建流程。 一、环境准备
本搭建过程搭建需要四台虚拟机同时他们都已经安装了相同版本的RabbitMQ我建议是由一台主用虚拟机克隆复制出另外三台。完成后如下 使用远程连接工具finalshell 二、利用虚拟机搭建 这里利用我本地的虚拟机模拟三台真实的机器 服务器信息表 IP地址主机名操作系统192.168.93.135rabbitmq01CentOS7(64位)192.168.93.136rabbitmq02CentOS7(64位)192.168.93.137rabbitmq03CentOS7(64位) 进行下一步前可以在本地windows的cmd中测试ping一下上面的三个虚拟机的IP地址。如果都能ping通那可以进行下一步。 (1)下面修改三台机器的hosts配置文件,为了方便机器间的相互访问三台centos都执行 vim /etc/hosts 添加下边的配置依次执行
#将三台机器上hosts都修改内容如下
vim /etc/hosts192.168.93.135 rabbitmq01
192.168.93.136 rabbitmq02
192.168.93.137 rabbitmq03#通过ping命令看主机名是否生效
ping rabbitmq02#修改三台主机的主机名 vim /etc/hostname
#修改主机名会导致这台主机上RabbitMQ的数据丢失,可以只改后两台主机名,或者修改前备份
#rabbitmq01 修改为 rabbitmq01.localdomain
#rabbitmq02 修改为 rabbitmq02.localdomain
vim /etc/hostname#然后重启每台机器
reboot 对应修改如下: (2)如果上述都已准确完成进行下一步 保持三台机器的.erlang.cookie 内容一致 这个cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 中文件是 400 的权限 必须保证各节点cookie 一致 , 才能使节点之间相互通信 例如: 全部使用 rabbitmq01 的 /.erlang.cookie #查看rabbitmq01的.erlang.cookie
cat erlang.cookie#修改rabbitmq02和rabbitmq03的.erlang.cookie
vim /var/lib/rabbitmq/.erlang.cookie#该文件是只读的,加上写权限
chmod uw /var/lib/rabbitmq/.erlang.cookie
vim /var/lib/rabbitmq/.erlang.cookie 将另外两台都改成与这一样的即可。 最后启动三台机器上的rabbitMQ服务
#每台机器的RabbitMQ服务的访问地址和控制台的访问地址分别是
#192.168.93.135:5672 192.168.93.135:15672
#192.168.93.136:5672 192.168.93.136:15672
#192.168.93.137:5672 192.168.93.137:15672#启动RabbitMQ服务
service rabbitmq-server start (3)将rabbitmq02,rabbitmq03作为内存节点加入rabbitmq01节点集群中 开放端口
#这里需要开放25672和4369
firewall-cmd --zonepublic --add-port25672/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reloadfirewall-cmd --zonepublic --add-port4369/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reload 在进行操作
#在rabbitmq02机器下执行
#停掉rabbit应用
rabbitmqctl stop_app #加入rabbitmq01
rabbitmqctl join_cluster --ram rabbitrabbitmq01#启动rabbit应用
rabbitmqctl start_app#查看所有节点状态
rabbitmqctl cluster_status 最后查看所有节点状态时 到此 三、镜像集群配置 上面已经完成RabbitMQ 默认集群模式但并不保证队列的高可用性尽管队列 , 交换机 , 绑定这些可以复制到集群里的任何一个节点但是队列内容不会复制. 为了保证队列中的内容也能复制, 要使用镜像队列 , 镜像队列再添加一些策略。 在网页上打开三个虚拟机的任意一个RabbitMQ的控制台,按照以下添加策略: 当然如果不想用上面的方式可以执行下面一行命令来完成操作(任意虚拟机即可)
策略参数解读:# ha-all为策略名称;
# ^my为匹配符只有一个^代表匹配所有^abc为匹配名称以abc开头的queue或exchange,^.则
匹配所有
# ha-mode为同步模式一共3种模式
# all-所有所有的节点都同步消息
# exctly-指定节点的数目需配置ha-params参数此参数为int类型比如2在集群中随机
抽取2个节点同步消息
# nodes-指定具体节点需配置ha-params参数此参数为数组类型比如
[rabbitrabbitmq01,rabbitrabbitmq02]明确#指定在这两个节点上同步消息。
# ha-sync-mode
#ha-sync-modemanual(默认)镜像队列中的消息不会主动同步到新节点,除非显式调用同步命令,
调用同步命令后队列开始阻塞无法对其进行操作直到同步完毕
#ha-sync-modeautomatic 新加入节点时会默认同步已知的镜像队列#执行该命令等效于上面的页面添加策略操作
rabbitmqctl set_policy ha-all ^. {ha-mode:all,ha-sync-mode:automatic}
测试:
#关闭rabbitmq01
rabbitmqctl stop_app 四、HAProxy实现负载均衡(主用虚拟机操作) HAProxy提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理支持虚拟主机它是免费、快速并且可靠的一种解决方案, 包括 Twitter Reddit StackOverflow GitHub 在内的多家知名互联网公司在使用。HAProxy 实现了一种事件驱动、单一进程模型此模型支持非常大的并发连接数。 安装HAProxy: yum install -y haproxyhaproxy -v
看到下面则安装成功 在 HAProxy 的 /etc/haproxy/haproxy.cfg 中添加如下配置 ### haproxy 监控页面地址是http://192.168.93.134:9188/haproxy_statuslisten admin_statsbind *:9188mode httplog 127.0.0.1 local3 errstats refresh 60sstats uri /haproxy_statusstats realm welcome login\ Haproxystats auth admin:123456 ##记得改成自己的账号和密码stats hide-versionstats admin if TRUE### rabbitmq 集群配置转发到listen rabbitmq_clusterbind *:5672mode tcpbalance roundrobinserver rabbitnode1 192.168.93.135:5672 check inter 2000 rise 2 fall 3 weight 1server rabbitnode2 192.168.93.136:5672 check inter 2000 rise 2 fall 3 weight 1server rabbitnode3 192.168.93.137:5672 check inter 2000 rise 2 fall 3 weight 1
添加后 完成上述的修改和配置后启动
haproxy -f /etc/haproxy/haproxy.cfg
在网页上访问http://192.168.93.134:9188/haproxy_status
看到下图说明已经配置成功 可以看到三个虚拟机已经和HAProxy实现了负载均衡当有信息发送到三台主机中的任意一个rabbitMQ时尽管两外一台或两台出现宕机的情况仍然不妨碍我们使用。 五、测试RabbitMQ集群搭建情况 完成上面的所有配置后下面使用IDEA来连接RabbitMQ测试搭建情况 连接三台中任意一台虚拟机即可
public class SimpleProducer {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂,并且设置RabbitMQ相关的连接参数ConnectionFactory connectionFactory new ConnectionFactory();connectionFactory.setHost(192.168.93.135);connectionFactory.setPort(5672); //设置rabbitMq的默认端口 不修改可以不设置//connectionFactory.setUsername(admin);//connectionFactory.setPassword(123456);//connectionFactory.setVirtualHost(myVH);//2.根据连接工厂创建一个连接,根据这个连接创建一个channelConnection connection connectionFactory.newConnection();Channel channel connection.createChannel();//3.创建一个队列(Queue)//设置队列名、是否持久化、是否独占、是否被消费后自动删除、队列参数等等channel.queueDeclare(hello,true,false,false,null);//4.发布一条消息//设置交换机名称、routingKey、信息属性、消息内容channel.basicPublish(,hello,null,Hello,World.getBytes());//5.释放资源channel.close();connection.close();}
}
发送信息后查看任意页面 当故意关闭三台中的任意一台或两台虚拟机(模拟宕机)时仍可以继续发送信息再次启动“宕机”的虚拟机会自动同步消息应为三台机器已经构成一个集群可以实现信息互相同步当出问题时信息会立刻同步到正常的机器上去宕机修复后又可以同步这里不再演示此过程。