1. 消息的存储结构
RocketMQ消息存储
2.同步刷盘与异步刷盘
RocketMQ消息存储:内存+磁盘存储,两种刷盘方式
异步刷盘
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协调者
5.1NameServer 的功能
5.2RocketMQ为什么不使用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;