两学一做 投稿网站,wordpress feed源,广告设计网站排行榜前十名,企业所得税税收优惠转载自 玻璃猫 程序员小灰一年之前——未来两年内#xff0c;系统预估的总订单数量可达一亿条左右。
按Mysql单表存储500万条记录来算#xff0c;暂时不必分库#xff0c;单库30个分表是比较合适的水平分表方案。
于是小灰设计了这样的分表逻辑#xff1a;
订单表创建单库3…转载自 玻璃猫 程序员小灰一年之前——未来两年内系统预估的总订单数量可达一亿条左右。
按Mysql单表存储500万条记录来算暂时不必分库单库30个分表是比较合适的水平分表方案。
于是小灰设计了这样的分表逻辑
订单表创建单库30个分表对用户ID和30进行取模取模结果决定了记录存于第几个分表查询时需要以用户ID作为条件根据取模结果确定查询哪一个分表
分表方式如下图为了便于描述简化为5个分表过了两个月——又过了半年多——小灰的回忆告一段落——1.首先我们把全量的缓存空间当做一个环形存储结构。环形空间总共分成2^32个缓存区在Redis中则是把缓存key分配到16384个slot。2.每一个缓存key都可以通过Hash算法转化为一个32位的二进制数也就对应着环形空间的某一个缓存区。我们把所有的缓存key映射到环形空间的不同位置。3.我们的每一个缓存节点Shard也遵循同样的Hash算法比如利用IP做Hash映射到环形空间当中。4.如何让key和节点对应起来呢很简单每一个key的顺时针方向最近节点就是key所归属的存储节点。所以图中key1存储于node1key2key3存储于node2key4存储于node3。1.增加节点
当缓存集群的节点有所增加的时候整个环形空间的映射仍然会保持一致性哈希的顺时针规则所以有一小部分key的归属会受到影响。有哪些key会受到影响呢图中加入了新节点node4处于node1和node2之间按照顺时针规则从node1到node4之间的缓存不再归属于node2而是归属于新节点node4。因此受影响的key只有key2。最终把key2的缓存数据从node2迁移到node4就形成了新的符合一致性哈希规则的缓存结构。
2.删除节点
当缓存集群的节点需要删除的时候比如节点挂掉整个环形空间的映射同样会保持一致性哈希的顺时针规则同样有一小部分key的归属会受到影响。有哪些key会受到影响呢图中删除了原节点node3按照顺时针规则原本node3所拥有的缓存数据就需要“托付”给node3的顺时针后继节点node1。因此受影响的key只有key4。最终把key4的缓存数据从node3迁移到node1就形成了新的符合一致性哈希规则的缓存结构。如上图所示假如node1的ip是192.168.1.109那么原node1节点在环形空间的位置就是hash“192.168.1.109”。
我们基于node1构建两个虚拟节点node1-1 和 node1-2虚拟节点在环形空间的位置可以利用IP后缀计算例如
hash“192.168.1.109#1”hash“192.168.1.109#2”
此时环形空间中不再有物理节点node1node2只有虚拟节点node1-1node1-2node2-1node2-2。由于虚拟节点数量较多缓存key与虚拟节点的映射关系也变得相对均衡了。