Schema Registry 为元数据提供了一个服务层。它提供了RESTful API 来存储和检索Avro schemas。它基于subject 的命名规则保存了所有schema 的历史版本,并且支持多种兼容(compatibility)机制,允许schema 根据兼容机制进行更新。它通过在kafka client 中提供序列化的方式来支持发送至kafka 的消息进行schema 的存储。
Schema Registry 与kafka 集群独立。生产者和消费者通过与kafka 集群建立会话来生产和消费数据,同时它也会向Schema Registry发送和检索schema 信息。
Schema Registry 是Avro Schemas 的一个分布式存储层,它具有以下特点:
- 为每个注册的schema 提供一个全局唯一ID,分配的ID 保证单调递增,但不一定是连续的。
- kafka 为Schema Registry 的状态和它包含的schema 提供一个持久的后端
- Schema Registry 是一个分布式的单主架构,由kafka 或者zookeeper 协调主节点的选举。
- 生产者在发送含schema 的消息时,会先判断schema 的消息是否在本地内存中,如果不在本地内存中,说明schema 尚未注册到Schema Registry,则需要进行注册,否则,无需注册
- 消费者在反序列化消息时,会先判断schema 是否在本地内存中,如果不在本地内存中,则需要从Schema Registry 中获取schema,否则,无需获取。
kafka 协调器辅助选举
使用kafka 协调器辅助选举是在<kafkastore.connection.url>
未设置,而 <kafkastore.bootstrap.servers>
设置的情况下使用。kafka 组协议从配置为master.eligibility=true
的Schema Registry节点中选举一个节点作为主节点,基于kafka 的主节点选举用于zookeeper 不可用的情况。
zk 辅助选举
zk 辅助选举时在<kafkastore.connection.url>
设置为zk 的url 时使用。Schema Registry的当前主节点会将数据维护至临时节点/<schema.registry.zk.namespace>/schema_registry_master
,Schema Registry 监听该路径的数据变化,如果发现有delete 该znode 的事件,则触发选举。选举规则为:
- 从配置为
master.eligibility=true
的Schema Registry节点中选举 - ‘first writer wins’ 原则,先在
/<schema.registry.zk.namespace>/schema_registry_master
写数据的节点即为主节点。