原来redis分布式的问题是key是业务端决定的,无限大.
问题: 做不到动态配置一个 key 对应到redis上.
怎么实现呢?
答案:
算法一: 很巧妙的利用了二级分类和二级引用(二级索引) . 将变化的东西转变成不变的.
将所有的key 通过hash变成 1024(可配,初始化,不可变)个slot .
当然这个值可以很大,大的你可以不用担心. 这些元数据的从存储.但是对于数据重 hash 来说就不是那么难了.
这样就可以配置某个slot具体对应到redis实例上.
有效避免了数据出错之后的问题.
缺点: 如果有热点,很有可能还是导致某个 slot 过大.
算法二:
hash 完的值后排序. 把每个 slot 的范围存储在元服务器上(可以是字符串).
类似 mongodb
b) 配置服务器(Config Server)。它存储了所有Shard节点的配置信息,每个chunk的Shard key范围,chunk在各Shard的分布情况以及集群中所有DB和collection的Shard配置信息。
缺点: 只需要 hash 后从元数据数组里找到对应的 slot 即可. 只需消耗比较少的数据.
问题: 迁移的时候不能写. 一个slot迁移完,通知各个dbproxy之前不可服务?
如何实现.
mongodb 的 hash 分片也是用了这个原理. 分片分裂原理?