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

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

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,一经查实,立即删除!

相关文章

DNS resolving 占用大量日志

公司内部DNS配置好后,测试解析正常,只是几乎每秒都有无法解析的日志产生。但分析日志时发现,每天的日志都有2G左右。日志中几乎全是类似network unreachable resolving www.baidu.com/A/IN:2001:5023:c27::2:30#53network unreachable resolv…

SQL Server 2008之DMF

陈述式管理架构,一个用于SQL Server数据库引擎的新的基于策略的管理框架 DMF是一个基于政策的用于管理一个或多个SQL Server 2008实例的系统。要使用DMF,SQL Server政策管理员使用SQL Server 管理套件创建政策,这些政策管理服务器上的实体&am…

Android之ActivityManage长用方法总结

Android 如何判断一个应用在运行 在一个应用中,或一个Service 、Receiver中判断一个应用是否正在运行,以便进行一些相关的处理。这个时候我们需要得到一个ActivityManager,这个Manager顾名思意就是管理Activity的,它有一个方法叫g…

计算机网络就业范围分析,计算机网络技术专业就业前景怎么样「就业形势分析」...

计算机网络技术专业作为目前的热门专业之一,在就业方向上可以有哪些选择?计算机网络技术专业就业前景如何?下文小编给大家整理了计算机网络技术专业的最新就业形势分析,供参考!1.掌握计算机网络技术专业的基本理论、基本知识;2.掌握计算机网络技术专业…

Codeforces Round #358 (Div. 2) A. Alyona and Numbers 水题

A. Alyona and Numbers题目连接: http://www.codeforces.com/contest/682/problem/A Description After finishing eating her bun, Alyona came up with two integers n and m. She decided to write down two columns of integers — the first column containing…

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;有更好的…

向linux内核版本号添加字符/为何有时会自动添加“+”号

转载&#xff1a;http://blog.csdn.net/adaptiver/article/details/7225980 1. 引子 编译2.6.35.7 kernel版本的时候发现&#xff0c;“2.6.35.7“的内核版本编译成功后生成的版本号变成了“2.6.35.7”&#xff0c;为什么后面会多一个加号呢&#xff1f;问题出现在linux的版本…

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

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

安卓判断服务器返回的状态码,AppsFlyer返回状态码400

我实现Appsflyer我的样本项目&#xff0c;但是当我运行它&#xff0c;服务器返回错误代码400AppsFlyer返回状态码400I/AppsFlyer_1.18-117182240: response code: 400还有就是我MainActivty.javapublic class MainActivity extends AppCompatActivity {public static final Str…

java多进程、多线程讲解

一、 什么是进程、线程&#xff1f;线程和进程的区别&#xff1f; 1. 进程 当一个程序进入内存运行时&#xff0c;即变成一个进程。进程是处于运行过程中的程序。 进程是操作系统进行资源分配和调度的一个独立单位。 进程的三个特征&#xff1a; 独立性 独立存在的实体&#xf…

fstream实现文件复制(并将文件名小写改成大写)

使用C的fstream类来实现char* filename "C:\\grldr.mbr";//须复制文件路径 int len strlen(filename); while( *(filenamelen-1)!\\){ len--; }//获得文件名 char temp[32]; strcpy(temp,(filenamelen)); for (int i 0; i<s…

AsyncHttpClient的连接池使用逻辑

AsyncHttpClient的连接池结构很简单, NettyConnectionsPool内部重要的几个变量如下 // 连接池, 通过 host 区分不同的池private final ConcurrentHashMap<String, ConcurrentLinkedQueue<IdleChannel>> connectionsPool new ConcurrentHashMap<String, Concurr…

记录一次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;无处不用数学回首往昔数学始终伴随我们左右纵横交错的几何、繁琐复杂的运算难以求解的方程…

FastCgi与PHP-fpm之间的关系

我在网上查fastcgi与php-fpm的关系&#xff0c;查了快一周了&#xff0c;基本看了个遍&#xff0c;真是众说纷纭&#xff0c;没一个权威性的定义。网上有的说&#xff0c;fastcgi是一个协议&#xff0c;php-fpm实现了这个协议&#xff1b; 有的说&#xff0c;php-fpm是fastcgi进…

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&#…