为什么微信推荐这么快?( 三 )

  • USER_FS:业务侧存放原始数据的分布式文件系统 , 可以是 WFS/HDFS , 该文件系统的路径及信息保存在表/任务的元信息中;
  • SimSvr_FS:Simsvr 使用的分布式文件系统 , 用于存放生成的索引文件或者原始的增量数据文件 。
  • worker
    • 负责对外提供检索服务 , 通过对 Chubby 的轮询检查索引的更新 , 进而将索引加载至本机以提供服务;
    • 每台 worker 负责的数据 , 由 master 进行调度 , worker 根据 master 保存在 Chubby 上的分配信息进行数据的加载/卸载;
    • worker 的数据是根据 master 分配得来的 , 除此之外没有其他状态的差别 , 因此 worker 是易于扩缩容的 。
  • master
    • 数据调度:通过表的元信息及 worker 状态 , 将未分配的数据或者失效 worker 上的数据调度给其他有效的 worker;
    • 生成路由表:根据 worker 的数据加载情况及状态 , 生成集群的路由表;
    • 感知数据更新:检查表的自动更新目录 , 若最大数字目录发生了增长 , 则建一个任务以供 trainer 进行索引的构建;
    • master 是一个无状态的服务 , 通过 Chubby 提供的分布式锁保证数据调度以及路由生成的唯一执行 。
  • trainer
    • 负责构建表的索引及资源回收;
    • trainer 单次可构建一张表中一个 sharding 的索引 , 因此如果表有多个 sharding 时 , 可通过增加 trainer 的个数实现构建索引的并发加速;
    • trainer 是无状态的服务 , 通常部署在微信 Yard 系统上 , 充分了利用微信闲置机器上的资源 。
  • 数据自动更新
    • 在建表时 , 对其指定了一个 fs 的目录 , 该目录下 , 是一系列数字递增的目录;
    • 当业务侧需要更新索引时 , 将最新的数据 dump 到更大的数字目录中;
    • master 感知最大数字目录的更新 , 从而更新了元信息;
    • trainer 感知元信息的更新并触发建索引;
    • worker 加载索引完成索引的更新 。
  • 数据任务式更新
    • 由业务侧主动通过接口的调用 , 创建一个索引任务;
    • 在索引任务中 , 指定了数据的配置信息(如 fs 信息及路径等);
    • trainer 按照表的任务序列 , 执行任务并构建索引;
    • worker 加载索引完成索引的更新 。
    3.3 数据调度 - 鸡蛋怎么放在多个篮子中
    • SimSvr 在每张表创建时就指定了 sharding 数 n 及 sect 数 m , 因此这张表拥有了 n * m 个 Conatiner 以供 master 调度;
    • master 会根据 worker 的健康情况及资源使用情况进行数据的调度及路由表的生成;
    • 路由表带有递增的版本号 , 可根据版本号感知路由的变化 。

    为什么微信推荐这么快?文章插图
    • worker 定期轮询 Chubby 获取数据的调度情况及最新的路由表信息;
    • client 首次请求时 , 将随机请求一台 worker 获取最新的路由表信息并将其缓存在本地;
    • client 在本地有路由表的情况下 , 将根据表的数据分布情况 , 带上版本号并发地向目标 worker 发起请求 , 最终合并所有 sharding 的结果 , 将其返回给业务端 。

    为什么微信推荐这么快?文章插图
    3.4 系统拓展 - 篮子装满了该怎么办
    • SimSvr 将表拆分成了更小粒度的数据调度单位 , 且不要求每台机器上的数据一样 , 因此可以用拓展机器的方式 , 将集群的存储容量扩大;
    • 对于单表而言 , 当读能力达到瓶颈时 , 可以单独扩展此表的读副本数;

    为什么微信推荐这么快?文章插图


    推荐阅读