__consumer_offest的副本因子

           __consumer_offest不受server.properties中num.partitions和default.replication.factor参数的制约。相反地,它的分区数和备份因子分别由offsets.topic.num.partitions和offsets.topic.replication.factor参数决定。这两个参数的默认值分别是50和1,表示该topic有50个分区,副本因子是1。鉴于位移和group元数据等信息都保存在该topic中,实际使用过程中很多用户都会将offsets.topic.replication.factor设置成大于1的数以增加可靠性,这是推荐的做法。

              不过在0.11.0.0之前,这个设置是有缺陷的:假设你设置了offsets.topic.replication.factor = 3,只要Kafka创建该topic时可用broker数<3,那么创建出来的__consumer_offsets的备份因子就是2。也就是说Kafka并没有尊重我们设置的offsets.topic.replication.factor参数。好在这个问题在0.11.0.0版本得到了解决,现在用户在使用时,一旦需要创建__consumer_offsets了Kafka一定会保证凑齐足量的broker才会开始创建,否则就抛出异常给用户。

             日常使用中,另一个常见的问题是如何扩展该topic的副本因子。由于它依然是一个Kafka topic,因此我们可以调用bin/kafka-reassign-partitions.sh(bat)脚本来扩展replication factor。做法如下:

             1. 构造一个json文件,如下所示,其中1,2,3表示3台broker的ID

{"version":1, "partitions":[
{"topic":"__consumer_offsets","partition":0,"replicas":[1,2,3]}, 
{"topic":"__consumer_offsets","partition":1,"replicas":[2,3,1]},
{"topic":"__consumer_offsets","partition":2,"replicas":[3,1,2]},
{"topic":"__consumer_offsets","partition":3,"replicas":[1,2,3]},
...
{"topic":"__consumer_offsets","partition":49,"replicas":[2,3,1]}
]}

           2. 运行bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file reassign.json --execute

如果一切正常,你会发现__consumer_offsets的replication factor已然被扩展为3。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 Python 脚本,可以根据给定的寄存器说明列表生成 .h 宏定义文件: ```python # 寄存器说明列表 register_list = [ {'name': 'REGISTER_0', 'address': '0x00', 'data': '0x0000', 'bits': [ {'name': 'DTGC_WR_EN', 'position': 0}, {'name': 'REG_READ_EN', 'position': 2}, {'name': 'SOFTWARE_RESET', 'position': 3} ]}, {'name': 'REGISTER_1', 'address': '0x01', 'data': '0x0000', 'bits': [ {'name': 'LVDS_RATE_2X', 'position': 14}, {'name': 'GLOBAL_PDN', 'position': 13}, {'name': 'PAT_MODES_FCLK', 'position': 10, 'width': 3}, {'name': 'LOW_LATENCY_EN', 'position': 9}, {'name': 'AVG_EN', 'position': 8}, {'name': 'SEL_PRBS_PAT_FCLK', 'position': 7}, {'name': 'PAT_MODES', 'position': 4, 'width': 3}, {'name': 'SEL_PRBS_PAT_GBL', 'position': 3}, {'name': 'OFFSET_CORR_DELAY_FROM_TX_TRIG', 'position': 0, 'width': 6} ]}, {'name': 'REGISTER_2', 'address': '0x02', 'data': '0x0000', 'bits': [ {'name': 'SER_DATA_RATE', 'position': 15}, {'name': 'DIG_GAIN_EN', 'position': 14}, {'name': 'OFFSET_CORR_DELAY_FROM_TX_TRIG', 'position': 8, 'width': 2}, {'name': 'DIG_OFFSET_EN', 'position': 6}, {'name': 'ADC_RES', 'position': 0, 'width': 4} ]}, {'name': 'REGISTER_3', 'address': '0x03', 'data': '0x0000', 'bits': [ {'name': 'OFFSET_REMOVAL_SELF', 'position': 15}, {'name': 'OFFSET_REMOVAL_START_SEL', 'position': 14}, {'name': 'OFFEST_REMOVAL_START_MANUAL', 'position': 13}, {'name': 'AUTO_OFFSET_REMOVAL_ACC_CYCLES', 'position': 9, 'width': 4}, {'name': 'PAT_SELECT_IND', 'position': 8}, {'name': 'PRBS_SYNC', 'position': 7}, {'name': 'PRBS_MODE', 'position': 6}, {'name': 'PRBS_EN', 'position': 5}, {'name': 'MSB_FIRST', 'position': 4}, {'name': 'DATA_FORMAT', 'position': 3}, {'name': 'ADC_RES', 'position': 0, 'width': 3} ]}, {'name': 'REGISTER_4', 'address': '0x04', 'data': '0x0000', 'bits': [ {'name': 'CUSTOM_PATTERN', 'position': 0, 'width': 16} ]}, {'name': 'REGISTER_5', 'address': '0x05', 'data': '0x0000', 'bits': [ {'name': 'AUTO_OFFSET_REMOVAL_VAL_RD_CH_SEL', 'position': 8}, {'name': 'CHOPPER_EN', 'position': 0} ]}, {'name': 'REGISTER_6', 'address': '0x06', 'data': '0x0000', 'bits': []}, {'name': 'REGISTER_7', 'address': '0x07', 'data': '0x0000', 'bits': [ {'name': 'EN_DITHER', 'position': 4} ]} ] # 生成 .h 文件 with open('register_definitions.h', 'w') as f: f.write('#ifndef __REGISTER_DEFINITIONS_H__\n') f.write('#define __REGISTER_DEFINITIONS_H__\n\n') for register in register_list: f.write(f'#define {register["name"]}_ADDR {register["address"]}\n') f.write(f'#define {register["name"]}_DATA {register["data"]}\n') for bit in register['bits']: if 'width' in bit: f.write(f'#define {register["name"]}_{bit["name"]}_POS {bit["position"]}\n') f.write(f'#define {register["name"]}_{bit["name"]}_WIDTH {bit["width"]}\n') else: f.write(f'#define {register["name"]}_{bit["name"]}_POS {bit["position"]}\n') f.write('\n') f.write('#endif /* __REGISTER_DEFINITIONS_H__ */\n') ``` 这个脚本会将寄存器的名称、地址、数据以及各个位的位置和宽度写入 .h 文件中。你可以根据需要对生成的宏定义文件进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值