假设我有一个数据集,刚开始这个数据集可能很小,但是最终会变得很大,例如{e1, e2, e3, ..., e1,000,000}。这个数据集中的元素可以被删除,新的元素也可以被加入到集合。
请问如何平摊数据集到多个服务实例呢?如何应对“元素被删除”和“添加新元素”等情况?
当然,服务实例的数量也是可变的,它会因为数据集的变化而变化。服务实例的数量变化时,应该怎么重新分布呢?
1
zooo 2020-12-01 22:23:40 +08:00
hadoop?
|
2
liprais 2020-12-01 22:25:00 +08:00
看你是要 share disk 还是 share nothing 了
|
3
DoctorCat 2020-12-02 00:27:43 +08:00
集群分区做 sharding,需要一个协调者来进行健康检查和读写请求路由;
重新分布涉及到数据迁移了,最好还是做冗余,例如 HDFS 那样。坏了的节点摘掉替换就好,然后再复制一份数据给新节点。 |
4
user8341 2020-12-02 00:36:53 +08:00
这题是要考察一致性哈希吧?
|
5
DoctorCat 2020-12-02 00:39:54 +08:00
对于重新分布,可以参考一致性 hash 和 Range based 策略
|
6
xcstream 2020-12-02 03:18:21 +08:00
这是个考试题 还是个实际项目
|
7
yzbythesea 2020-12-02 03:36:09 +08:00
Sharding & Circular Hashing
|
8
xuanbg 2020-12-02 08:59:35 +08:00
每个服务服务于固定大小的数据集就行了,譬如设定每个服务 10 万数据,那么数据量增加到 9 万的时候就启动第二台服务器,从第 100001 个数据开始就是第二台服务器的事情了。以此类推
|
9
xuanbg 2020-12-02 09:02:21 +08:00
至于删除后的空余位置,不多的话就空着好了。太多的话,可以参考磁盘文件系统的做法,给数据建立索引,然后就可以用空位填充新数据了。
|
10
JasonLaw OP |
12
jones2000 2020-12-02 14:34:56 +08:00
数据建索引, 索引数据单独存, 其他数据可以分开存到不同的服务器上,查询先查索引数据, 通过索引读取对应服务器上的数据。
|