【另类见解】一致性哈希就能解决分库分表问题了?

开局一问:分库分表行为中,一致性哈希到底用处大不大?

c97c7f7ebb9735c7af13804eb57a7161.png
装B脑图

现在是大数据的时代,其中一个体现就是数据量非常庞大。当然大数据的概念绝非是数据量就可以定义的,我自己给大数据下的定义是:无处不在的大量数据,这些数据是要经过收集,加工,转化,然后输出具有业务意义的数据,比如:现在人物画像。

回归主题,那到底什么样的场景下才开始分库分表呢:

  • 数据量大

  • 存储压力大

  • 提高写操作IO

  • 提高读操作IO

这里多啰嗦一句,如果你的分库分表存储最终还是落在一个物理磁盘上,其实整体IO的提高并不明显,应该把分出的库(分区表)散落在多个物理磁盘,利用并行IO来提高性能。

设计到分库分表策略,我建议选择有业务意义的键值作为分的依据。举个例子,拿用户信息来说,如果业务中多数是根据用户ID来取用户信息的场景,那应该利用用户id作为分的策略主键。

接下来的部分就以用户信息的场景来举例说明。

分库分表行为属于变动性行为,因为,随着数据量的不断增大,分库分表的策略会随着改变,最简单的例子,现在分了10个表,当数据量到达10个表的巅峰容量时候,就需要继续分,这就是变动因子。最致命的是这个变动因子会影响已有数据的定位。

现在有很多缓存的应用场景和分库分表思想类似,但是却又有本质的区别,因为缓存数据不需要持久化,所以就算是定位错了,重新加载即可,数据库可就不一样了

简单哈希有用吗?

分库分表最简单的策略就是对业务数据键取模(%),以余数来作为导向。带来的问题也显而易见:

  • 数据很有可能分布不均匀

  • 数据量迁移量大

所以真实的落地项目中,用简单哈希分库分表的很少,这就诞生了简单哈希无用论。

26c3308c64d9cde17830426d933d1867.png

一致性哈希

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题。一致性hash算法提出了在动态变化的Cache环境中,断定哈希算法好坏的四个定义:

  1. 平衡性(Balance):平衡性是指哈希的结果可以尽量分布到全部的缓冲中去,这样可使得全部的缓冲空间都获得利用。不少哈希算法都可以知足这一条件。

  2. 单调性(Monotonicity):单调性是指若是已经有一些内容经过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应可以保证原有已分配的内容能够被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其余缓冲区。

  3. 分散性(Spread):在分布式环境中,终端有可能看不到全部的缓冲,而是只能看到其中的一部分。当终端但愿经过哈希过程将内容映射到缓冲上时,因为不一样终端所见的缓冲范围有可能不一样,从而致使哈希的结果不一致,最终的结果是相同的内容被不一样的终端映射到不一样的缓冲区中。这种状况显然是应该避免的,由于它致使相同内容被存储到不一样缓冲中去,下降了系统存储的效率。分散性的定义就是上述状况发生的严重程度。好的哈希算法应可以尽可能避免不一致的状况发生,也就是尽可能下降分散性。

  4. 负载(Load):负载问题其实是从另外一个角度看待分散性问题。既然不一样的终端可能将相同的内容映射到不一样的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不一样的用户映射为不一样 的内容。与分散性同样,这种状况也是应当避免的,所以好的哈希算法应可以尽可能下降缓冲的负荷。

看完上边这几条比较官方的介绍应该大体了解了一致性哈希的特性,用作分库分表场景下也无可厚非,对比简单哈希,它要好很多。

其实,一致性哈希算法也是使用取模的方法,但是它把分母扩大到了2^32,纵观所有的业务场景,能把数据库(表)分到2的32次方个的也是个“人才”了。一致性哈希把2的32次方想象成一个圆形,这个圆形上有2^32个点。具体的一致性哈希请移步这里

分布式缓存

一致性哈希虽然解决了一些问题,但是数据倾斜问题依然存在,为了使数据最大程度上平均分布,所以引入了虚拟哈希节点的玩法:对同一个物理服务器节点,通过不同的哈希算法或者其他手段得到多个不同的哈希值,均匀分布在哈希环上。

其实一致性哈希环点的个数没有必要是2的32次方个,我觉得只要足够大得支撑将来业务的扩展即可,同时能满足最大平均分配的原则。

共识算法

共识算法在分库分表的场景中很少有人提出,它现在广泛用于分布式系统中,像喜闻乐见的Paxis,Raft都属于共识算法。

分库分表业务场景下,就算了一致性哈希做到极致,当服务器节点增加或者减少的时候,总有需要数据需要迁移,只不过是多少的问题。那有没有办法不用迁移数据呢?

首先说明一点:数据库不像缓存服务一样,可以随时减少节点。数据库是有状态的,一般只增不减。

利用共识算法,我认为在只增加节点的情况下是可以做到不迁移数据的。因为共识算法的特性就是:一个值达成一致之后,这个值就不会变化了。

假设:现在对用户信息表已经分了5张表,用户id为1的会落在表1,id为2的会落在表2.....依此类推(这里可以先不考虑一致性哈希虚拟节点,因为原理类似),当增加分表6的时候,按照简单哈希原则,id为6的用户信息应该在表6中,但是现实情况是在表1中,按照以往的经验,这条数据是需要迁移的。

但是引入了共识算法之后,id为6的用户数据被算法认为仍然在表1中,因为已经达成了共识。前提是你需要开发一套共识算法服务来保证,为什么很少有人这么用呢,也许是共识算法门槛过高的原因,但是它却能真正的解决我们的问题。

83dc6115da98edfe809c658b999c4449.png

自增型数据

以上的说明都是针对散乱型数据而言,其实还有一种log型数据,简单来说就一直追加型的数据,比如操作日志,这种数据的典型特点就是时间有序,这样的数据进行分库分表,完全可以按照时间维度来进行的,比如:可以设计一个月为一个表,类似table_202109

写在最后

无论哪种分表方式,都避免不了热点问题,就像微博,一个明星出轨了,这条数据就会成为热点,而这一条数据只能存储于一个表中。解决这种热点问题从来都不能依靠数据库,像缓存,CDN等解决方案才是正解。

702afdf94ad04f9fec23acb44ec3443f.png

END

c951cd53f5102ba2e40db5e2ed6310b8.png

往期回顾

#

【另类见解】那些要保证缓存和数据库数据一致性的最后怎么了?

#

愚蠢的领导才会用程序员祭天!!

#

【另类见解】秒杀并非高不可攀

#

 我把负载均衡讲出了花,领导却不给我涨工资

分享收藏点赞在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pomForSSH

2019独角兽企业重金招聘Python工程师标准>>> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache…

WPF 实现展示反应盘、者试剂仓控件

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织由于微信群人数太多入群请添加小编微信号&#xff08;yanjinhuawechat&#xff09;或&#xff08;W_Feng_aiQ&#xff09;邀请入群&#xff08;需备注WPF开发者&#xff09;PS&#xff1a;有更好的…

渣男劈腿,两个女生逼他做出选择,结果......

1 生一个女儿有多重要&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 真实版眼睛瞪得像铜铃&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 地表最强撞衫&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 过年时最怕遇见的人&#xff08;素材…

记录一次C#爬虫记录,获取必应图片

起因事情是这样的&#xff0c;我创建了一个仓库&#xff0c;里面有2018年到目前为止每日的必应壁纸&#xff0c;在八月份的时候我看到微软有接口文档&#xff0c;于是写了一个服务&#xff0c;每天早上八点钟会获取必应壁纸&#xff08;目前已经可以作为api来使用了&#xff0c…

word打出计算机图形符号,在word插入符号和特殊符号-word技巧-电脑技巧收藏家

在word插入符号和特殊符号打开“插入”菜单&#xff0c;单击“特殊字符”命令&#xff0c;打开“插入特殊符号”对话框&#xff0c;在这个对话框中有六个选项卡&#xff0c;分别列出了六类不同的特殊符号&#xff1b;从列表中选择要插入的特殊字符&#xff0c;单击“确定”按钮…

Android插件化开发基础之静态代理模式

一 Proxy模式 意图&#xff1a; 为其他对象提供一种代理以控制这个对象的访问。 适用性&#xff1a; l 远程代理&#xff08; Remote Proxy &#xff09;&#xff1a; 为一个对象在不同的地址空间提供局部代表。 l 虚代理&#xff08;Virtual Proxy&#xff09;根据需要创建…

史上最强数学科普!

全世界只有3.14 % 的人关注了爆炸吧知识“中国现代数学之父”华罗庚曾说过宇宙之大&#xff0c;粒子之微火箭之速&#xff0c;化工之巧地球之变&#xff0c;生物之谜日用之繁&#xff0c;无处不用数学回首往昔数学始终伴随我们左右纵横交错的几何、繁琐复杂的运算难以求解的方程…

QQ在线联系代码

添加图文模块,标题地址:tencent://message/?uin你的QQ号&Sitemyqq&Menuyes “你的QQ号”就写您自己的Q号 图片地址写:http://wpa.qq.com/pa?p1:你的QQ号:13 “你的QQ号”改为您自己的。“13”为图片样式的序号&#xff0c;可以为1-17。 样式1&#xff1a;样式2&#…

C# 死锁的原理与排查方法详解

01—死锁的原理线程死锁是指由于两个或者多个线程互相持有对方所需要的资源&#xff0c;并且互相等待对方释放资源&#xff0c;导致这些线程都处于等待状态&#xff0c;无法继续执行。如果线程都不主动释放所占有的资源&#xff0c;将产生死锁。如果死锁发生在UI线程&#xff0…

人生没有对与错,只是选择不同

全世界只有3.14 % 的人关注了爆炸吧知识你用碎片时间学习、赚钱、与时俱进&#xff0c;还是拿来聊天&#xff0c;消遣&#xff0c;刷视频&#xff1f;碎片时间&#xff0c;拉开人生差距&#xff0c;没有对与错&#xff0c;只是选择不同。人生很多地方都有岔路口&#xff0c;很多…

Android之ActivityManager与Proxy模式的运用

二 Android中ActivityManager 从官方文档的介绍可以看到ActivityManager的作用&#xff1a; 是与系统所有正在运行着的Acitivity进行交互&#xff0c;对系统所有运行中的Activity相关信息&#xff08;Task&#xff0c;Memory&#xff0c;Service&#xff0c;App&#xff09; 进…

化学到底有多难难难难!为了让学生搞懂化学,竟然...

▲ 点击查看提到化学&#xff0c;大家脑子里都会想到什么呢&#xff1f;枯燥的化学式&#xff1f;还是难背的元素周期表&#xff1f;还是让人头疼的化学考试题&#xff1f;在由NHK&#xff0c;NHK Educational Corp、西南德国广播&#xff08;SWR&#xff09;、卡塔尔半岛电视台…

面试题--特别是字节对齐

来源&#xff1a;http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html 【1】设置或者清除某位。 示例代码如下: 1 #include<iostream>2 using namespace std;3 4 #define BIT3 (0x1<<3)5 6 void Set_bit3(int &a)7 {8 a|BIT3;9 } 10 11…

配置基于python的VIM环境

配置基于python的VIM环境 安装插件管理工具 为防止过多插件管理的麻烦&#xff0c;首先安装vim的插件管理工具Vundle。vundle本身的github软件已经有相关的中文文档&#xff0c;地址如下&#xff1a; vundle官方中文文档 复制其配置&#xff0c; set nocompatible …

Npgsql 6.0.2 发布,赶紧升级!!!

❝PostgreSQL 是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;是以加州大学计算机系开发的 POSTGRES&#xff0c;4.2版本为基础的对象关系型数据库管理系统。POSTGRES 的许多领先概念只是在比较迟的时候才出现在商业网站数…

Android之中获取应用程序(包)的信息-----PackageManager的使用(一)

转载&#xff1a;http://blog.csdn.net/qinjuning/article/details/6867806 本节内容是如何获取Android系统中应用程序的信息&#xff0c;主要包括packagename、label、icon、占用大小等。具体分为两个 部分&#xff0c;计划如下&#xff1a; 第一部分&#xff1a; 获取应用程…

dnf公共频道服务器不稳定已从初始化状态,DNF公共频道跨区列表 组队连不上必看...

DNF公共频道组队连接不上&#xff1f;在大转移版本之后很多玩家表示DNF公共频道不能组队&#xff0c;实际上这个和大家所在的DNF公共频道跨区有关&#xff0c;位于同一个跨区的玩家之间才能够组队&#xff0c;这里是一份DNF公共频道跨区列表&#xff0c;除此之外还有公共频道的…

了解开源文化

开放源码软件运动是计算机科学领域的一种文化现象&#xff0c;源自***对智慧成果共享、自由的追求。开源运动发展到现在&#xff0c;这种能够积极促进人类文明发展的文化已经***到信息、教育、健康等领域&#xff0c;融入了哲学范畴。开放源码运动的史前史包括了整个Unix&#…