Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
milvus
milvus
提交
fa9fc850
M
milvus
项目概览
milvus
/
milvus
大约 1 年 前同步成功
通知
261
Star
22476
Fork
2472
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
milvus
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
fa9fc850
编写于
9月 09, 2021
作者:
T
ThyeeZz
提交者:
GitHub
9月 09, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[skip ci] remove useless tag (#7591)
Signed-off-by:
N
ThyeeZz
<
jialian.ji@zilliz.com
>
上级
d5f7e358
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
32 addition
and
38 deletion
+32
-38
docs/design_docs/dataservice_recovery_design.md
docs/design_docs/dataservice_recovery_design.md
+32
-38
未找到文件。
docs/design_docs/dataservice_recovery_design.md
浏览文件 @
fa9fc850
### timetick 相关改动
Datanode发送timetick msg需要有channel的信息,DataCoord根据channel来检查segment是否可以seal和flush
Datanode 发送 timetick msg 需要有 channel 的信息,DataCoord 根据 channel 来检查 segment 是否可以 seal 和 flush
### 服务发现
DataCoord
启动时检查是否有新的或重启过的DataNode,如果有重启过的,重新注册channel,并seek
到上次记录的位置
DataCoord
启动时检查是否有新的或重启过的 DataNode,如果有重启过的,重新注册 channel,并 seek
到上次记录的位置
通过
watch机制监听DataNode的状态,如果DataNode下线,其注册的channel重新分配到其他node,并seek
到上次的位置(重新分配不一定现在做)
通过
watch 机制监听 DataNode 的状态,如果 DataNode 下线,其注册的 channel 重新分配到其他 node,并 seek
到上次的位置(重新分配不一定现在做)
如果监听到
DataNode重新上线,向其注册channel,并seek
到上次记录的位置
如果监听到
DataNode 重新上线,向其注册 channel,并 seek
到上次记录的位置
如果监听到有新的
DataNode注册,记录其状态,后续向其注册channel或进行load balance(load balance
不一定现在做)
如果监听到有新的
DataNode 注册,记录其状态,后续向其注册 channel 或进行 load balance(load balance
不一定现在做)
DataNode
如果由于网络原因与etcd断开,应该重启服务发现,DataCoord会去重新注册channel,DataNode不能重复监听相同
channel
DataNode
如果由于网络原因与 etcd 断开,应该重启服务发现,DataCoord 会去重新注册 channel,DataNode 不能重复监听相同
channel
### 需要记录的信息
1.
cluster
信息(包括Datanode的节点及其上面的
channel)
2.
segment 分配信息(最后一次分配的过期时间,segment的上限等)
3.
stats 和 segment flush channel最后位置
4.
DataNode
向DataCoord发送channel
的最后位置
1.
cluster
信息(包括 Datanode 的节点及其上面的
channel)
2.
segment 分配信息(最后一次分配的过期时间,segment
的上限等)
3.
stats 和 segment flush channel
最后位置
4.
DataNode
向 DataCoord 发送 channel
的最后位置
### 重启恢复流程
1.
内存状态恢复:
1.
基本组件启动(meta, etcd等)
2.
恢复segment allocator和cluster状态
3.
2.
与DataNode节点交互:
1.
启动stats/segment flush channel,并seek到上次记录的位置
2.
启动timetick channel
1.
基本组件启动(meta, etcd 等)
2.
恢复 segment allocator 和 cluster 状态
2.
与 DataNode 节点交互:
3.
与Master交互:
1.
启动时不需要和Master交互,Collection信息为空,需要用到时向Master请求并缓存
2.
启动new segment channel
4.
启动服务发现
1.
启动 stats/segment flush channel,并 seek 到上次记录的位置
2.
启动 timetick channel
目前channel注册是segment allocation驱动的,每次请求segment时,检查其channel有没有被注册,没有则将其注册到DataNode,并保存到本地。这里有个问题,如果channel注册成功,DataCoord挂掉了,那么在重启后,DataCoord并不知道已经注册成功,来一个新的请求,还是会去注册,而且可能注册到不同的DataNode上面。类似Transaction的情况,需要有一套机制保证原子性在多节点写入,目前不太好解决。可以用以下步骤临时解决
:
3.
与 Master 交互
:
1.
在etcd上记录分配方法entry,状态是未完成
2.
向DataNode注册
3.
在etcd上将entry标记为完成
1.
启动时不需要和 Master 交互,Collection 信息为空,需要用到时向 Master 请求并缓存
2.
启动 new segment channel
重启时/分配时,如果发现有未完成的entry,重新向DataNode注册,需要DataNode保证幂等性。
这样保证了一个channel只向一个DataNode注册,如果DataNode挂掉或者与etcd断开,如果需要重新分配到其他DataNode,这些entry也跟着变。
4.
启动服务发现
目前 channel 注册是 segment allocation 驱动的,每次请求 segment 时,检查其 channel 有没有被注册,没有则将其注册到 DataNode,并保存到本地。这里有个问题,如果 channel 注册成功,DataCoord 挂掉了,那么在重启后,DataCoord 并不知道已经注册成功,来一个新的请求,还是会去注册,而且可能注册到不同的 DataNode 上面。类似 Transaction 的情况,需要有一套机制保证原子性在多节点写入,目前不太好解决。可以用以下步骤临时解决:
1.
在 etcd 上记录分配方法 entry,状态是未完成
2.
向 DataNode 注册
3.
在 etcd 上将 entry 标记为完成
DataCoord模块中,有些策略是可能频繁改变的,比如channel对DataNode的分配策略,可以是随机/顺序/平均/根据collection分散等等策略,比如检测到DataNode创建和下线,可能会不处理/balance/将下线节点的channel转移到其他节点等。比如segment allocation可能会根据文件大小/条数等来确定是否关闭。实现应该把这些策略相关抽出来,方便以后修改
。
重启时/分配时,如果发现有未完成的 entry,重新向 DataNode 注册,需要 DataNode 保证幂等性
。
这样保证了一个 channel 只向一个 DataNode 注册,如果 DataNode 挂掉或者与 etcd 断开,如果需要重新分配到其他 DataNode,这些 entry 也跟着变。
DataCoord 模块中,有些策略是可能频繁改变的,比如 channel 对 DataNode 的分配策略,可以是随机/顺序/平均/根据 collection 分散等等策略,比如检测到 DataNode 创建和下线,可能会不处理/balance/将下线节点的 channel 转移到其他节点等。比如 segment allocation 可能会根据文件大小/条数等来确定是否关闭。实现应该把这些策略相关抽出来,方便以后修改。
### TODO:
1.
segment allocation信息持久化及恢复
2.
cluster
信息(datanode及channel
信息)改动+持久化及恢复
3.
channel
与datanode分配策略实现(可选
load balance)
4.
stats/segment flush channel
记录位置及重启时seek
1.
segment allocation
信息持久化及恢复
2.
cluster
信息(datanode 及 channel
信息)改动+持久化及恢复
3.
channel
与 datanode 分配策略实现(可选
load balance)
4.
stats/segment flush channel
记录位置及重启时 seek
5.
服务注册与发现,以及对应事件的处理逻辑
6.
timetick channel的改动以及segment关闭逻辑改动
7.
datanode上报的binlog信息持久化及恢复
6.
timetick channel 的改动以及 segment 关闭逻辑改动
7.
datanode 上报的 binlog 信息持久化及恢复
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录