1. 消息的存储结构
![](https://img.haomeiwen.com/i1824809/2a46ebcb205d7c8d.png)
![](https://img.haomeiwen.com/i1824809/d744a70d56ed28ce.png)
RocketMQ消息存储
2.同步刷盘与异步刷盘
RocketMQ消息存储:内存+磁盘存储,两种刷盘方式
异步刷盘
![](https://img.haomeiwen.com/i1824809/207f4be3fe843b01.png)
![](https://img.haomeiwen.com/i1824809/f74d9e3ec03a58c8.png)
![](https://img.haomeiwen.com/i1824809/ca2937ff6a64fcec.png)
![](https://img.haomeiwen.com/i1824809/663466de02f94340.png)
![](https://img.haomeiwen.com/i1824809/918efa2bfe62a08c.png)
RocketMQ存储--同步刷盘和异步刷盘
3.同步复制与异步复制
- 同一组Broker有Master-Slave角色
- 异步复制
- 同步复制
如果一个broker组有Master和Slave,消息需要从Master复制到Slave上,有同步和异步两种复制方式。
复制方式 | 描述 | 优点 | 缺点 |
---|---|---|---|
同步 | 等Master和Slave均写成功后才反馈给客户端写成功状态 | 如果Master出故障,Slave上有全部的备份数据,容易恢复,消费者仍可以从Slave消费, 消息不丢失 | 增大数据写入延迟,降低系统吞吐量,性能比异步复制模式略低,大约低10%左右,发送单个Master的响应时间会略高 |
异步 | 只要Master写成功即可反馈给客户端写成功状态 | 系统拥有较低的延迟和较高的吞吐量. Master宕机之后,消费者仍可以从Slave消费,此过程对应用透明,不需要人工干预,性能同多个Master模式几乎一样 | 如果Master出了故障,有些数据因为没有被写入Slave,而丢失少量消息。 |
4.高可用机制
BrokerId
Master读、写,Slave只读
当Master繁忙或者不可用时,可以自动切换到Slave读取消息
5.NameServer协调者
![](https://img.haomeiwen.com/i1824809/076fdac8745c858d.png)
5.1NameServer 的功能
NameServer 是整个消息队列中的状态服务器,集群的各个组件通过它来了解全局的信息。各个角色的机器都要定期向NameServer 上报自己的状态,超时不上报的话, NameServer 会认为某个机器出故障不可用了,其他的组件会把这个机器从可用列表里移除
NamServer 可以部署多个,相互之间独立,其他角色同时向多个NameServer机器上报状态信息,从而达到热备份的目的。
NameServer 本身是无状态的, NameServer 中的Broker 、Topic 等状态信息不会持久存储,都是由各个角色定时上报并存储到内存中的( NameServer 支持配置参数的持久化, 一般用不到)。
5.2RocketMQ为什么不使用ZooKeeper
ZooKeeper可以提供Master选举功能,比如Kafka用来给每个分区选一个broker作为leader,但对于RocketMQ来说,topic的数据在每个Master上是对等的,没有哪个Master上有topic上的全部数据,所以这里选举leader没有意义;RockeqMQ集群中,需要有构件来处理一些通用数据,比如broker列表,broker刷新时间,虽然ZooKeeper也能存放数据,并有一致性保证,但处理数据之间的一些逻辑关系却比较麻烦,而且数据的逻辑解析操作得交给ZooKeeper客户端来做,如果有多种角色的客户端存在,自己解析多级数据确实是个麻烦事情;既然RocketMQ集群中没有用到ZooKeeper的一些重量级的功能,只是使用ZooKeeper的数据一致性和发布订阅的话,与其依赖重量级的ZooKeeper,还不如写个轻量级的NameServer,NameServer也可以集群部署,NameServer与NameServer之间无任何信息同步,只有一千多行代码的NameServer稳定性肯定高于ZooKeeper,占用的系统资源也可以忽略不计
NameServer是整个集群的状态服务器
NameServer部署、相互独立
集群状态的存储结构
NameServer维护的主要信息:
/**
* 存储所有Topic的属性信息
*/
private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
/**
* 存储BrokerName对应的属性信息
*/
private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
/**
* 存储集群的信息
*/
private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
/**
* 存储Broker机器的实时状态
*/
private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
/**
* 存储过滤服务器信息
*/
private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
网友评论