GridDB集群持续重置且列名丢失,寻求解决办法
问题分析与解决思路
核心问题定位
你遇到的10014错误是GridDB集群分裂的典型表现,根源是节点间心跳检测失败,导致集群无法维持多数节点共识,进而触发重置,这也是容器列名消失的直接原因。同时你的Schema定义存在明显错误,会加剧容器的异常状态。
分步解决思路
1. 修复集群心跳与稳定性问题
集群分裂的核心是节点间通信或配置异常,按以下步骤排查:
- 检查网络与集群模式:
- 如果是多节点集群,确认所有节点能互相访问多播地址
239.0.0.1和端口31999,关闭防火墙或添加对应放行规则。 - 若是单节点个人项目,直接切换为GridDB单机模式:修改节点配置文件
gs_cluster.json,将clusterMode设为false,重启服务,避免不必要的集群心跳机制干扰。
- 如果是多节点集群,确认所有节点能互相访问多播地址
- 同步节点时间:
- 所有集群节点的系统时间差不能超过5秒,用NTP服务强制同步时间,避免因时间偏移触发心跳超时判定。
- 调整心跳参数:
- 修改
gs_cluster.json中的heartbeatInterval和heartbeatTimeout,如果网络环境较差,可适当调大超时时间(比如设为20秒),重启集群生效。
- 修改
2. 修正Schema定义错误
你的容器Schema中存在重复列名name(出现两次),会导致容器创建时元数据异常,直接删除重复列:
const conInfo = new griddb.ContainerInfo({ 'name': "usedcaranalysis", 'columnInfoList': [ ["Sales_ID", griddb.Type.INTEGER], ["name", griddb.Type.STRING], ["year", griddb.Type.INTEGER], ["selling_price", griddb.Type.INTEGER], ["km_driven", griddb.Type.INTEGER], ["Region", griddb.Type.STRING], ["State or Province", griddb.Type.STRING], ["City", griddb.Type.STRING], ["fuel", griddb.Type.STRING], ["seller_type", griddb.Type.STRING], ["transmission", griddb.Type.STRING], ["owner", griddb.Type.STRING], ["mileage", griddb.Type.DOUBLE], ["engine", griddb.Type.INTEGER], ["max_power", griddb.Type.DOUBLE], ["torque", griddb.Type.STRING], ["seats", griddb.Type.INTEGER], ["sold", griddb.Type.STRING] ], 'type': griddb.ContainerType.COLLECTION, 'rowKey': true });
3. 规范容器创建流程
避免重复创建容器导致的元数据冲突,在代码中先判断容器是否存在,不存在再创建:
async function createContainerIfNotExists() { try { // 尝试获取已存在的容器 await store.getContainer("usedcaranalysis"); console.log("容器已存在"); } catch (e) { // 容器不存在时创建 await store.putContainer(conInfo, true); console.log("容器创建成功"); } } createContainerIfNotExists();
内容的提问来源于stack exchange,提问作者Ismail Vohra
相关产品推荐
相关产品推荐

