<!--StartFragment-->
为了帮助企业更好地进行大数据处理,我们在此前 [TDengine](https://www.taosdata.com/?utm_source=amazoncloud&utm_medium=article&utm_campaign=240123 "TDengine") 3.x 系列版本中进行了几项与集群相关的优化和新功能开发,以提升集群的稳定性和在异常情况下的恢复能力。这些优化包括 clusterID 隔离、leader rebalance、raft learner 和 restore dnode。本文将对这几项重要优化进行详细阐述,以解答企业在此领域的疑问,并帮助大家更好地应对相关挑战。
### clusterID 隔离
1. **问题**
* firstEp 节点挂掉后,磁盘挂载错误,挂载了一个空白磁盘启动,或者 firstEp 数据被意外删除;
* firstEp 再次重启。严重点是这个出错的节点,导致其他节点也无法工作,整个集群都挂掉,集群失去了高可用特性。
2. **造成的后果**
firstEp 节点在无数据的情况下重新启动,相当于新创建了一个集群,它重新初始化为一个新集群(重新生成了 clusterid),但此时原集群(旧的 clusterId)中的其它 N-1 个节点仍然向它们所保存的 firstEp 发送心跳,而收到心跳消息的 firstEp 已经是一个新的集群了,所以会拒绝心跳消息,返回节点不存在,要求心跳发送方下线,这些节点收到下线通知后会主动下线,**直接导致原集群中的所有节点都不可用**。
3. **解决办法**
为节点心跳、raft 心跳增加对 clusterid 的判断,即对 clusterid 进行隔离,让具有不同 clusterid 的节点可以独立运行。这种解决办法可以应对节点已经在空白数据上重启的情况。
4. **解决后的效果**
在出现磁盘故障后,firstEp 节点启动后,会形成两个集群,一个是 firstEp 节点形成的单节点新集群,另一个是所有其他节点保持旧 clusterid 的旧集群。两个集群可以独立且互不干扰的正常运行。
### RAFT Leader Rebalance(TDengine Enterprise 企业版)
1. **问题**
比较常见的使用场景,在滚动升级后,**所有的 leader 都被赶到一个节点上,整个集群严重失衡**。
2. **解决办法**
增加 `balance vgroup leader;` 的 SQL 命令,由 DBA 人工触发集群再平衡,该命令会依次顺序对每个 vgroup 强制重新选举 RAFT leader。因为选举是随机的,所以我们可以通过选举让 leader 迁移到其他的节点上。
3. **解决后的效果**
选举理论上随机选出 leader,导致 leader 散开的结果。理论上会均匀,实际上不会绝对均匀。
### Raft Learner
1. **问题**
在副本变更时(create mnode, alter db replia),如果存量数据(元数据或[时序数据](https://www.taosdata.com/?utm_source=amazoncloud&utm_medium=article&utm_campaign=240123 "时序数据"))量比较大时,**相应操作会执行很长时间**,要等待存量数据同步完成后命令才能执行完成,**并且在此期间会阻塞数据写入**。
2. **解决办法**
在 Leader/Follower/Candidate 之外引入第四种 Raft 角色——Raft learner。Raft Learner 只同步数据不参与选主,也不参与数据写入时的一致性协议。当 Raft Learner 的数据同步进度被追上后才会变身为 Follower,成为 Raft 集群的一部分。**这样命令虽然执行很长时间,但不会阻塞写入**。
3. **受影响的命令**
```
Create mnode on dnode id;
ALTER DATABASE power replica 3;
```
4. **解决后的效果**
副本变更时,不会再阻塞写入。相应的命令执行可以很快返回。
### Restore dnode(TDengine Enterprise 企业版)
1. **问题**
**数据盘出现问题,重新挂载新数据盘,这个节点上所有数据目录都丢失**。
2. **解决办法**
增加命令:
```
restore dnode <dnode_id>;# 恢复dnode上的mnode,所有vnode和qnode
restore mnode on dnode <dnode_id>;# 恢复dnode上的mnode
restore vnode on dnode <dnode_id> ;# 恢复dnode上的所有vnode
restore qnode on dnode <dnode_id>;# 恢复dnode上的qnode
```
该命令,从 mnode 读取节点中关于 mndoe、vnode、qnode 的信息,按照这些在节点重建 mnode、vnode、qnode,在重建结束后,会开始从其他副本复制数据。
3. **解决后的效果**
按照原有的 taos.cfg 的配置启动 taosd,该节点会自动加入群,并且 dnode 显示为 ready,即 online 状态。在节点变为 online 后,通过命令可恢复全部 mnode、vnode、qnode,也可以分别恢复。
4. **功能限制**
该功能是基于已有的复制功能的恢复,不是灾难恢复或者备份恢复,所以对于 mnode 和 vnode 来说,使用该命令一定是还存在其他 mnode 和 vnode 的其他副本。该命令不能修复数据目录中个别文件的损坏或者丢失,是整体的恢复一个 mnode 或者 vnode。
### 写在最后
通过本文,相信大家已经初步了解了上述几项功能优化。如果你对这些功能有进一步的了解需求,或者希望进一步讨论在应用中遇到的问题,欢迎与我们专业的解决方案架构师直接沟通。
<!--EndFragment-->