原作者:http://blog.csdn.net/engourdi/article/details/19334961
1.rabbitmq集群
单机多实例的集群测试
10.5.16.222上
$ RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detached
$ RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=hare1 rabbitmq-server -detached
$ rabbitmqctl -n hare stop_app
$ rabbitmqctl -n hare join_cluster rabbit@`beta`
$ rabbitmqctl -n hare start_app
停掉
root@beta:~# rabbitmqctl -n hare1 stop
Stopping and halting node hare1@beta ...
...done.
root@beta:~# rabbitmqctl -n rabbit1 cluster_status
Cluster status of node rabbit1@beta ...
[{nodes,[{disc,[hare1@beta,rabbit1@beta]}]},
{running_nodes,[rabbit1@beta]},
{partitions,[]}]
...done.
重新启动hare1
root@beta:~# rabbitmqctl -n hare1 cluster_status
Cluster status of node hare1@beta ...
[{nodes,[{disc,[hare1@beta,rabbit1@beta]}]},
{running_nodes,[rabbit1@beta,hare1@beta]},
{partitions,[]}]
...done.
单机简单集群搭建完毕,使用消息发送与接收测试,增加节点客户端消息接收器需重启,删除节点不需重新配置,使用镜像队列可防止消息单节点丢失,但性能会打折扣。
减少客户端配置可以使用dns服务器来代替ip+端口,也可以使用下一节调研的负载均衡器。
2.负载均衡(可选)
于是在另外一台128上搭建tcp负载均衡器
10.5.16.128
apt安装haproxy
配置 /etc/haproxy/haproxy.cfg:
listen rabbitmq 0.0.0.0:56720
mode tcp
balance roundrobin
option tcpka
server rabbit1 10.5.16.222:5672 check inter 5000 rise 2fall 5
server hare1 10.5.16.222:5673 check inter 5000 rise 2fall 5
客户端配置到haproxy所在服务器的地址与监听端口
stats uri /haproxy-stats
stats realm Haproxy\ statistics
stats auth franklin:111111
状态监听http://XXX/haproxy-stats
3.镜像队列
spring 镜像队列配置
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" reply-queue-arguments="haArgs" />
<rabbit:queue auto-delete="true" durable="false"id="mailQueue"
name="#{config.project.mailQueueName}" queue-arguments="haArgs"></rabbit:queue>
<rabbit:queue-arguments id="haArgs">
<entry key="x-ha-policy" value="all" />
</rabbit:queue-arguments>
4.额外参考说明
不做镜像队列的话,节点down掉则必须等他回复,不然消息就丢失了。master节点退出集群会选一个slave作为master,那么要是不幸选中了一个刚刚加入集群的节点怎么办?不就丢消息了么?放心RabbitMQ会维护节点的状态是否已经同步,使用rabbitmqctl的synchronised_slave_pids参数,就可以查看状态. 对于publish,客户端任意连接集群的一个节点,转发给创建queue的节点存储消息的所有信息;
对于consumer,客户端任意连接集群中的一个节点,如果数据不在该节点中,则从存储该消息data的节点拉取。可见当存储有queue内容的节点失效后,只要等待该节点恢复后,queue中存在的消息才可以获取消费的到。显然增加集群的节点,可以提高整个集群的吞吐量,但是在高可用方面要稍微差一些
mirror queue是为rabbitMQ高可用的一种方案,相对于普通的集群方案来讲,queue中的消息每个节点都会存在一份copy,这个在单个节点失效的情况下,整个集群仍旧可以提供服务。但是由于数据需要在多个节点复制,在增加可用性的同时,系统的吞吐量会有所下降。
在实现机制上,mirror queue内部实现了一套选举算法,有一个master和多个slave,queue中的消息以master为主,对于publish,可以选择任意一个节点进行连接,rabbitmq内部若该节点不是master,则转发给master,master向其他slave节点发送该消息,后进行消息本地化处理,并组播复制消息到其他节点存储,对于consumer,可以选择任意一个节点进行连接,消费的请求会转发给master,为保证消息的可靠性,consumer需要进行ack确认,master收到ack后,才会删除消息,ack消息会同步(默认异步)到其他各个节点,进行slave节点删除消息。若master节点失效,则mirror queue会自动选举出一个节点(slave中消息队列最长者)作为master,作为消息消费的基准参考;在这种情况下可能存在ack消息未同步到所有节点的情况(默认异步),若slave节点失效,mirror queue集群中其他节点的状态无需改变。
相关推荐
多个RabbitMQ节点可以组成集群,提供高可用性和负载均衡。队列可以在节点间镜像,保证即使有节点故障,数据也不会丢失。 9. **持久化与消息策略**: 消息可以被持久化,即使RabbitMQ重启,队列和消息依然存在。还...
- **集群部署**:多个RabbitMQ实例组成集群,提高可用性和扩展性。 - **高可用集群**:通过Erlang分布式的特性,实现无单点故障的集群。 - **网络分区容错**:使用 Federation 插件和 Shovel 插件进行跨集群的...
- **节点(Node)**:RabbitMQ服务器的实例称为节点,可以是单机部署或集群部署。 - **队列(Queue)**:消息的存储区域,多个消费者可以从同一个队列中消费消息,但每个消息只被消费一次。 - **交换器(Exchange)*...
1. **集群(Clustering)**:通过将多个RabbitMQ节点组成集群,实现高可用性和负载均衡。如果一个节点故障,其他节点可以接管其职责。 2. **镜像队列(Mirrored Queues)**:在集群中,队列可以被镜像到多个节点,...
- **节点与集群**:RabbitMQ服务器可以单机运行,也可以组建集群,实现高可用性和负载均衡。 - **Exchange**:消息的路由中心,根据预设的绑定规则将消息分发到相应的队列。 - **Queue**:消息的存储容器,消费者...
1. **节点(Nodes)**:RabbitMQ服务器的实例称为节点,可以是单机或集群模式,提供高可用性和容错性。 2. **虚拟主机(Vhosts)**:类似于Unix系统的目录,用于隔离不同的应用或用户,提供安全策略管理。 3. **...
- **工作队列**: 工作队列模式常用于负载均衡和并发处理,多个消费者可以从队列中取出并处理消息。 - **持久化**: 通过设置消息和队列的持久化,可以在RabbitMQ重启后保持数据,确保消息不丢失。 - **集群**: 多个...
1. **节点(Node)**:RabbitMQ服务运行的实例,可以是单机或集群模式。 2. **交换机(Exchange)**:根据预定义的路由规则,负责将消息分发到正确的队列。 3. **队列(Queue)**:存储消息的容器,消息在此等待被消费者...
Nginx反向代理服务器及负载均衡服务器配置实战 利用keepalived+Nginx实战Nginx高可用方案 基于Nginx实现访问控制、连接限制 Nginx动静分离实战 Nginx Location ReWrite 等语法配置及原理分析 Nginx提供https...
5. **负载均衡**:在处理人群请求时,负载均衡技术是必不可少的。Nginx、HAProxy等工具可以将请求分发到不同的服务器,防止单一节点过载,提升整体服务的可用性和响应速度。 6. **数据库优化**:优化SQL查询,合理...