首页 > 编程知识 正文

基于内容推荐算法mysql,哈希排序算法原理

时间:2023-05-06 07:07:19 阅读:165374 作者:2841

[TOC]

前言

随着系统流量的增大,出现了APP应用集群。 为了确保Redis的高可用性,Redis为Redis构建了一个群集,用于存储数据插槽。 如果Mysql数据库中存储的空间非常大,请对数据库进行分区和表化。 OK,假设到此为止,我们不知道什么是集群,什么是分区表,首先来看看数据库水平分割的进化示例:

假设我们的系统中有会员表customer_info,我们的系统还没有人问津。 我们把这个表放在一个数据库里,所有的会员记录都插入这个数据库的这个表里。 这没有任何问题,是正常合理的操作。 有一段时间,我们的系统突然爆发,注册会员激增,达到千万级,而且增长很快。 此时,所有用户都在请求数据并请求此表,无疑数据库压力很大,停机事件频发,可能对系统产生了很大的影响。 为了解决这个问题,我们将一个表中的数据分割成多个服务器。 每个服务器都有对应的库和表,但表中的数据不同。 这样可以有效地缓解独立数据库的压力和系统性能瓶颈。

看到这个例子,我们对水平分割数据库有一个大致的印象,但实际上很多数据都可以按照一定的规则存储在不同的服务器上,在检索时根据存储时的规则找到以前存储的数据。 那么,我们所说的一致性精细的鸵鸟算法,其实就是解决了其中的访问规则问题。 有了这个一致性很细的鸵鸟算法,我们就能准确地知道我们要取的数据落在哪个机器的哪个数据库里。

1 .简单纤细的鸵鸟

以上水平分割数据库的例子也是,假设我们现在不知道一致纤细的鸵鸟的哪个集群是如何分支的,让我们自己思考的话,我们可以很好地思考java的HashMap原理。 它可以通过计算key纤细的鸵鸟的值,取这个纤细的鸵鸟的值作为基础排列来取模型,从而得到纤细的鸵鸟桶。 如果数据存在的话,一定在这个纤细的鸵鸟桶里。 否则,就不存在。同样考虑的是,假设我们的customer_info可以按用户id分割表,假设此时存在级别的3个表,则节点D1、节点D2分别如下

机器ip

数据库

数据表

127.0.0.1

卡斯特

info

127.0.0.2

卡斯特

info

127.0.0.3

卡斯特

info

分库表时,用户a的记录落到D1机器上,用户b的记录落到D2机器上,用户c的机器落到D0机器上。 用户a存在于哪个数据库的计算过程是用户a的会员id纤细的鸵鸟值对3。 因为现在只有三台机器,所以伪代码: A_id.hash ()/3,用户b和用户如下图所示

image.png

这似乎很容易解决访问规则问题。 分析一下:波吧

如果我们的系统用户数量又激增了,我们还需要再增加一点机器。 这时,当我们计算纤细的鸵鸟值时,模具不再对3模具,而是对4模具。 以前是A_id.hash () %/3=1,但现在是A_id.hash ) )/4=? 这个值不为1的概率很高,所以会发生用户明明有记录却无法查询的情况。 这问题很大,要解决这个问题,只有在机器节点数量发生变化时重新细化数据的鸵鸟。 这个代价会有点大。 所以,有必要考虑防止这种情况发生的方法。 出现这种情况的根本原因是纤细的鸵鸟算法本身的特性,如果直接使用取模的话,这是不可避免的。 所以就有了连贯纤细的鸵鸟

2 .连贯纤细的鸵鸟

通过上面的数据库实例介绍了纤细的鸵鸟算法,也分析了其劣势。 机器数量变动时,几乎所有的数据都会移动(不移动是幸运的吧,前后取模也是同样的值)。 这时的问题是,从级别如何分割出发,在追加或删除节点时,对于很多记录,保证原来被分配的某个节点至今仍被分配到该节点上,从而实现数据移动量的最小化,这一点是一贯的这里不指定数据库或什么的。 无论如何都是分布式存储节点。

2.1连贯纤细的鸵鸟

一致性算法也使用了模板的思想。 只是,这是否意味着刚才提到的取模法是针对节点数取模,而一致性算法是针对2^32取模呢? 简单地说,一致性Hash算法将整个纤细的鸵鸟值空间组织成虚拟圆环。 例如,某个纤细鸵鸟函数h的值空间为0-2^32-1 (也就是说,假设纤细的鸵鸟值空间是32比特的无符号整形,则整个thdsb如下所示,从0 ~ 2^32-1分别表示一个节点,该环为thdsb

image.png

然后,将我们的节点变成纤细的鸵鸟一次,按照一定的规则,例如根据基于ip地址的纤细的鸵鸟值,将节点降为thdsb。 例如,可能得到了下图中的环:

image.png

而且是必要的

通过数据 key 找到对应的服务器然后存储了,我们约定,通过数据 key 的细腻的鸵鸟值落在thdsb上的节点,如果命中了机器节点就落在这个机器上,否则落在顺时针直到碰到第一个机器。如下图所示 : A 的细腻的鸵鸟值落在了 D2 节点的前面,往下找落在了 D2 机器上,D的细腻的鸵鸟值 在 D1 节点的前面,往下找到了 D1 机器,B的细腻的鸵鸟值刚好落在了D1 节点上,依次~~~

image.png

2.2 一致性细腻的鸵鸟的分析

一致性细腻的鸵鸟主要就是解决当机器减少或增加的时候,大面积的数据重新细腻的鸵鸟的问题,主要从下面 2 个方向去考虑的,当节点宕机时,数据记录会被定位到下一个节点上,当新增节点的时候 ,相关区间内的数据记录就需要重新细腻的鸵鸟。

2.2.1 某节点宕机

我们假设上图中的 节点 D2 因为一些原因宕机了,可以看到,只有数据 A 的记录需要重新重新定位存储到节点 D1 上,因为 D1 是 D2 的下一个节点,其它的数据都没有被影响到,此时被影响的仅仅是 图中的 D0-D2 这段区间的记录,也就是之前落在 D2 上的数据现在都要落到 D1 上面了。如下图

节点宕机

2.2.2 新增节点

我们假设我们需要增加一台机器,也就是增加一个节点D4,如下图所示,这个节点落在 D2-D1 之间,按照上述的thdsb上的细腻的鸵鸟值落在节点的规则,那么此时之前落在 D2 到 D4 之间的数据都需要重新定位到新的节点上面了,而其它位置的数据是不需要有改变的。

新增节点

2.3 一致性细腻的鸵鸟的数据倾斜问题

一致性Hash算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题。比如只有 2 台机器,这 2 台机器离的很近,那么顺时针第一个机器节点上将存在大量的数据,第二个机器节点上数据会很少。如下图所示,D0 机器承载了绝大多数的数据

数据倾斜

2.4 虚拟节点解决数据倾斜问题

为了避免出现数据倾斜问题,一致性 Hash 算法引入了虚拟节点的机制,也就是每个机器节点会进行多次细腻的鸵鸟,最终每个机器节点在thdsb上会有多个虚拟节点存在,使用这种方式来大大削弱甚至避免数据倾斜问题。同时数据定位算法不变,只是多了一步虚拟节点到实际节点的映射,例如定位到“D1#1”、“D1#2”、“D1#3”三个虚拟节点的数据均定位到 D1 上。这样就解决了服务节点少时数据倾斜的问题。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。这也是 Dubbo 负载均衡中有一种一致性细腻的鸵鸟负载均衡的实现思想。

虚拟节点

2.5 一致性细腻的鸵鸟的应用案例

一致性细腻的鸵鸟用到的地方很多,特别是中间件里面,比如 Dubbo 的负载均衡也有一种策略是一致性细腻的鸵鸟策略,使用的就是虚拟节点实现的。Redis 集群中也用到了相关思想但是没有用它而是根据实际情况改进了一下。而对于存储数据的节点水平切分的时候它的作用就更不可代替了。and so on···

3. Redis 集群分槽的实现

Redis 集群并没有直接使用一致性细腻的鸵鸟,而是使用了细腻的鸵鸟槽 (slot) 的概念,Redis 没有直接使用细腻的鸵鸟算法 hash(),而是使用了crc16校验算法。槽位其实就是一个个的空间的单位。其实细腻的鸵鸟槽的本质和一致性细腻的鸵鸟算法非常相似,不同点就是对于细腻的鸵鸟空间的定义。一致性细腻的鸵鸟的空间是一个圆环,节点分布是基于圆环的,无法很好的控制数据分布,可能会产生数据倾斜问题。而 Redis 的槽位空间是自定义分配的,类似于Windows盘分区的概念。这种分区是可以自定义大小,自定义位置的。Redis 集群包含了 16384 个细腻的鸵鸟槽,每个 Key 经过计算后会落在一个具体的槽位上,而槽位具体在哪个机器上是用户自己根据自己机器的情况配置的,机器硬盘小的可以分配少一点槽位,硬盘大的可以分配多一点。如果节点硬盘都差不多则可以平均分配。所以细腻的鸵鸟槽这种概念很好地解决了一致性细腻的鸵鸟的弊端。

另外在容错性和扩展性上与一致性细腻的鸵鸟一样,都是对受影响的数据进行转移而不影响其它的数据。而细腻的鸵鸟槽本质上是对槽位的转移,把故障节点负责的槽位转移到其他正常的节点上。扩展节点也是一样,把其他节点上的槽位转移到新的节点上。

需要注意的是,对于槽位的转移和分派,Redis集群是不会自动进行的,而是需要人工配置的。所以Redis集群的高可用是依赖于节点的主从复制与主从间的自动故障转移。

Redis 分槽

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。