[TOC]
前言
伴随着系统流量的增大,出现了应用集群。在 Redis 中为了保证 Redis 的高可用也为 Redis 搭建了集群对数据进行分槽存放。在 Mysql数据库要存储的量达到一个很高的地步的时候,我们会对数据库进行分库分表操作。OK,到这儿先假设我们不知道什么是集群、什么是分库分表,我们先来看一个数据库水平切分演变的例子:
假设我们的系统中有一张会员表 customer_info, 我们的系统刚开始无人问津,我们在一个单个的数据库中放这张表,所有的会员记录都插入到这个数据库的这张表中,这没什么问题,是一个很正常且合理的操作。某段时间,我们的系统突然火爆了起来,注册会员激增,达到了千万级别并且还在快速增长,这时候所有的用户请求数据都会请求这张表,毫无疑问数据库的压力很大,于是可能会经常发生宕机事件,给系统造成了很大影响。为了解决这件事情,我们将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据不同。 这样做能够有效的缓解单机数据库的压力和系统的性能瓶颈。
看完了这个例子,我们对水平拆分数据库有了一个大致的印象,其实就是把很多的数据按照一定的规则存放在不同的服务器上,然后查找的时候能够根据存放的时候的规则去找到前面存放的数据。那么我们要说的一致性哈希算法,其实就是解决了这里面的 存取规则 的问题,有了这个一致性哈希算法,我们能够准确的知道我们要取的数据落在哪个机器的哪个数据库中。
1. 简单哈希
还是上面水平拆分数据库的例子,假设我们现在不知道什么一致性哈希什么集群分槽,就让我们自己想的话,我们可以很容器的想到 java 中的 HashMap 的原理,它通过计算了一个 key 的哈希值,然后拿这个哈希值对底层数组取模就得到了一个哈希桶ÿ