mysql分布式一致性hash_分布式哈希一致性

问题

分布式哈希一致性的动机是什么?

相比其他有什么好处

概述

我们谈论的分布式哈希一致性常常使用在负载均衡,权衡一个策略的好坏,我们常常谈到扩展性和容错性。我们可以从以下两个方面来考量

扩展性 :水平扩展和垂直扩展,加减一台cluster 是否对整个集群有影响。

容错性 :假如一台cluster 是否会影响到其他的 cluster,是否可以用比较小的代价进行恢复。

负载均衡

负载均衡使用的策略 :

随机访问策略。系统随机访问,服务器负载压力不均衡,所以有可能分配的不合理。

轮询策略。请求均匀分配,如果服务器有性能差异,则无法实现性能好的服务器能够多承担一部分。

权重轮询策略。权值需要静态配置,无法自动调节,不适合对长连接和命中率有要求的场景。

Hash取模策略。不稳定,如果列表中某台服务器宕机,则会导致路由算法产生变化,由此导致命中率的急剧下降。 一致性哈希策略。

Hash取模策略

hash取模可以定义为 “ key % n = 目标cluster ”,key可以相当于 java 中的hashcode ,n 则为当前所有集群机器的数量。 但是它的缺点很明显,假如使用hash取模策略,若增加台cluster,(图片来自参考资料)

e3610196244922b2cb0220f2fbf6b563.png

减少台机器

c701557df68bd412a65ebeae62dc83bf.png

可以看到增加台机器,会导致key 重新映射,那么迁移工作将是巨大的,而减少一台也是同样的道理,最重要的原因是该策略是依赖机器的数量进行分配目标机器。

分布式一致性hash算法

直接上图(来源见参考资料)

ad3ee9951ba6197147aa53d90b9255ac.png

上面是hash环,cluster 分布在hash环上,请求经过hash 等到的key沿着顺时针,第一个到达的节点就是目标cluster .

扩展性和容错性

假如增加/减少了一台机器,对其他的cluster并没有什么影响,而某台cluster发生故障后,恢复的时候只需要将故障节点的keys 放在沿着hash环下一台节点就可以了。

虚拟节点

但是我们将节点分布在hash 环上的时候有可能分布不均,例如

c674c83153e4163c15b2dcc1cc8f760c.png

上图,服务器1接受的请求在平等条件下肯定比其他的多,我们可以通过增设虚拟节点的方式来解决这个问题,虚拟节点并不是真实的物理节点,是虚构出来的,这样可以解决节点在hash 环中不平衡的问题,同时也是根据权重不同可以分配多几个虚拟节点。

运用

rocketmq 集群消费端 和 dubbo (RPC) 对服务提供者负载均衡的时候会使用

MySQL 分库分表的实现也是可以使用一致性Hash 算法 (这个在后续的文章中会提到)

这里的dubbo中的一致性hash 算法的运用和 数据库的运用有点不同,为什么呢? dubbo 是 RPC ,某个节点down 或是增加了节点,并没有影响,而数据库就不同了,数据库存储的是数据,某个节点down 了数据就找不到了,后续文章再详细说明。

具体实现

我们看一下 dubbo 中关于hash 一致性算法的实现,,主要的实现是依靠  TreeMap 的 ceilingEntry  方法, 该方法的注解 :

The ceilingEntry(K key) method is used to return a key-value mapping associated with the least key greater than or equal to the given key, or null if there is no such key.

就是返回最相近的值,这和 一致性 hash 算法的key 绕着圈走到最近的节点思路一致。 dubbo 中的一致性hash实现在 ConsistentHashLoadBalance 类,我们直接看 doSelect 方法,其中 invokers 就是候选的节点,invocation 是调用者的封装,最后返回的 Invoker 自然就是目标 invoker .

1 public class ConsistentHashLoadBalance extendsAbstractLoadBalance {2 public static final String NAME = "consistenthash";3

4 /**

5 * Hash nodes name6 */

7 public static final String HASH_NODES = "hash.nodes";8

9 /**

10 * Hash arguments name11 */

12 public static final String HASH_ARGUMENTS = "hash.arguments";13

14 private final ConcurrentMap> selectors = new ConcurrentHashMap>();15

16 @SuppressWarnings("unchecked")17 @Override18 protected Invoker doSelect(List>invokers, URL url, Invocation invocation) {19 String methodName =RpcUtils.getMethodName(invocation);20 String key = invokers.get(0).getUrl().getServiceKey() + "." +methodName;21 //using the hashcode of list to compute the hash only pay attention to the elements in the list

22 int invokersHashCode =invokers.hashCode();23 ConsistentHashSelector selector = (ConsistentHashSelector) selectors.get(key);24 if (selector == null || selector.identityHashCode !=invokersHashCode) {25 selectors.put(key, new ConsistentHashSelector(invokers, methodName, invokersHashCode));26 selector = (ConsistentHashSelector) selectors.get(key);27 }28 //该给 ConsistentHashSelector 方法

29 returnselector.select(invocation);30 }31

32 private static final class ConsistentHashSelector{33

34 private final TreeMap>virtualInvokers;35

36 private final intreplicaNumber;37

38 private final intidentityHashCode;39

40 private final int[] argumentIndex;41

42 ConsistentHashSelector(List> invokers, String methodName, intidentityHashCode) {43 this.virtualInvokers = new TreeMap>();44 this.identityHashCode =identityHashCode;45 URL url = invokers.get(0).getUrl();46 this.replicaNumber = url.getMethodParameter(methodName, HASH_NODES, 160);47 String[] index = COMMA_SPLIT_PATTERN.split(url.getMethodParameter(methodName, HASH_ARGUMENTS, "0"));48 argumentIndex = new int[index.length];49 for (int i = 0; i < index.length; i++) {50 argumentIndex[i] =Integer.parseInt(index[i]);51 }52 //replicaNumber就是复制的节点,默认是 160 ,假如invokers 的数量是 5 ,那么总的节点数就是 5*160

53 for (Invokerinvoker : invokers) {54 String address =invoker.getUrl().getAddress();55 for (int i = 0; i < replicaNumber / 4; i++) {56 byte[] digest = md5(address +i);57 for (int h = 0; h < 4; h++) {58 long m =hash(digest, h);59 //virtualInvokers 是个 TreeMap

60 virtualInvokers.put(m, invoker);61 }62 }63 }64 }65

66 public Invokerselect(Invocation invocation) {67 String key =toKey(invocation.getArguments());68 byte[] digest =md5(key);69 return selectForKey(hash(digest, 0));70 }71

72 privateString toKey(Object[] args) {73 StringBuilder buf = newStringBuilder();74 for (inti : argumentIndex) {75 if (i >= 0 && i

82 private Invoker selectForKey(longhash) {83 //看这里!!调用 ceilingEntry 方法

84 Map.Entry> entry =virtualInvokers.ceilingEntry(hash);85 if (entry == null) {86 entry =virtualInvokers.firstEntry();87 }88 returnentry.getValue();89 }90

91 private long hash(byte[] digest, intnumber) {92 return (((long) (digest[3 + number * 4] & 0xFF) << 24)93 | ((long) (digest[2 + number * 4] & 0xFF) << 16)94 | ((long) (digest[1 + number * 4] & 0xFF) << 8)95 | (digest[number * 4] & 0xFF))96 & 0xFFFFFFFFL;97 }98

99 private byte[] md5(String value) {100 MessageDigest md5;101 try{102 md5 = MessageDigest.getInstance("MD5");103 } catch(NoSuchAlgorithmException e) {104 throw newIllegalStateException(e.getMessage(), e);105 }106 md5.reset();107 byte[] bytes =value.getBytes(StandardCharsets.UTF_8);108 md5.update(bytes);109 returnmd5.digest();110 }111

112 }113

114 }

上面使用了hash 算法 ,在和 https://github.com/RJ/ketama 该地址下看到的有点相似,这里我们只需要知道hash 的作用是使得使值均匀分布。

总结

通过本文了解了分布式哈希一致性相对与其他的负载均衡策略的优势。

参考资料

https://www.acodersjourney.com/system-design-interview-consistent-hashing/

https://www.cnblogs.com/jajian/p/10896624.html

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

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

相关文章

css3 - target

通过CSS3伪元素target&#xff0c;我们可以实现拉风琴 源码 1 <!DOCTYPE HTML>2 <html lang"en-US">3 4 <head>5 <meta charset"UTF-8">6 <title>垂直手风琴</title>7 <style type"text/css"…

javascript中打印对象显示[object object]_js如何打印object对象

这篇文章主要介绍了js如何打印object对象,需要的朋友可以参考下 js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来…

弹弹堂sf发布网_私服冒险岛,新开私服冒险岛,心动sf冒险岛发布网,最新开的私服冒险岛应该如何快速的获取魅力呢?...

私服冒险岛,新开私服冒险岛,心动sf冒险岛发布网,最新开的私服冒险岛应该如何快速的获取魅力呢&#xff1f;不同的游戏&#xff0c;我们在操作的时候&#xff0c;最主要的一点就是想要去涨经验&#xff0c;只有通过经验的积累才可以快速的升级&#xff0c;才可以进入到更多的地图…

svm解决兵王问题_机器学习: svm

本周学习内容为SVM的基本原理和运用。参考资料&#xff1a;耳东陈&#xff1a;零基础学SVM—Support Vector Machine(一)1、什么是SVMSVM的全称是Support Vector Machine&#xff0c;即支持向量机&#xff0c;主要用于解决模式识别领域中的数据分类问题&#xff0c;属于有监督学…

Django基础11(Django中form表单)

Form介绍 之前在HTML页面中利用form表单向后端提交数据时&#xff0c;都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验&#xff0c;比如校验用户是否输入&#xff0c;输入的长度和格式等正不正确。如果用户输入的…

mysql上k8s_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷

上一篇"通过实例快速掌握k8s(Kubernetes)核心概念"讲解了k8s的核心概念&#xff0c;有了核心概念整个骨架就完整了&#xff0c;应付无状态程序已经够了&#xff0c;但还不够丰满。应用程序分成两种&#xff0c;无状态和有状态的。一般的前段和后端程序都是无状态的&a…

python简单笔记

Remarks&#xff1a;python中注意缩进&#xff08;Tab键或者4个空格&#xff09; print&#xff08;输出&#xff09; 格式&#xff1a;print&#xff08;values&#xff09; 字符串、数字、变量等都可以输出&#xff1a; 实例&#xff1a; print(1)->1 print(11)->2 a …

【Alpha阶段】第一次Scrum Meeting

PS&#xff1a;因为安装android的SDK插件出现问题&#xff0c;在eclipse和android studio中安装都不成功&#xff0c;项目不能运行&#xff0c;且一直在下载一些插件&#xff0c;安装了3天都没有成功&#xff0c;按照网上的解决办法进行解决都没有成功&#xff0c;导致项目不能…

581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况

&#xff3b;抄题&#xff3d;&#xff1a; Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too. You need to find the shortest suc…

python三阶魔方_三阶魔方自动求解及动态可视化matlab代码

三阶魔方自动求解及动态可视化matlab代码思路与步骤三阶魔方有6个面&#xff0c;每个面有333\times333小块&#xff0c;用一个6336\times3\times3633的矩阵来保存魔方的状态&#xff1b;定义412种魔方旋转行为&#xff1a;整体旋转(左右上下共4种方式AaCc)&#xff0c;侧面(6个…

Qt 常用类——QStandardItemModel

转载&#xff1a;落叶知秋时 类QabstractItemModel&#xff0c;QabstractListModel&#xff0c;QAbstractTableModel不保存数据&#xff0c;用户需要从这些类派生出子类&#xff0c;并在子类中定义某种数据结构来保存数据。 与此不同&#xff0c;类QStandardItemModel负责保存数…

ad19原理图标注_AD19中原理图的模板如何进行编辑?

我们在进行原理图设计的时候&#xff0c;有时候不想去用软件自带默认的模板&#xff0c;想要用自己设计的模板&#xff0c;就涉及到我们的模板怎么去编辑的呢&#xff1f;我们应该如何去编辑原理图自己设计的模板&#xff1f;操作步骤是怎么的呢&#xff1f;我们今天就以AD19为…

mysql+秘密_mysql不被人知的秘密

http://blog.csdn.net/yueguanghaidao/article/details/69333872011先建立两张表。1.student表2.grade表一&#xff1a;mysql的复制技术1.表与数据的复制->>实现表结构和数据的同步create table desttable select * from srctable;(desttable:目标表&#xff0c;srctable…

mysql一个表几亿数据_如何在mysql 造1亿条记录的大容量数据表?

背景及目标&#xff1a;现有数据1000w单表&#xff0c;为压力测试准备1亿条数据。步骤&#xff1a;1.将1000w条记录&#xff0c;除id外都导入到多个文件中&#xff1a;//DELIMITERDROP PROCEDURE if EXISTS createManyTable;create PROCEDURE createManyTable()BEGINDECLARE i …

windows键盘在mac上怎么识别_Mac电脑怎么使用pc键盘?

苹果电脑一般需要使用配套的mac键盘&#xff0c;毕竟按键和普通pc键盘不一样。但是总会遇到一些情况&#xff0c;比如配套的mac键盘坏了&#xff0c;而刚好有一个pc键盘&#xff0c;那么这时候苹果电脑要怎么用pc键盘呢&#xff1f;这边小编跟大家介绍mac电脑连接pc键盘以及设置…

LOJ#6002. 「网络流 24 题」最小路径覆盖

模板。 1 #include<iostream>2 #include<cstring>3 #include<cstdio>4 //#include<time.h>5 //#include<complex>6 //#include<set>7 //#include<queue>8 #include<algorithm>9 #include<stdlib.h>10 using namespace s…

zabbix mysql设置中文乱码_解决zabbix监控因php问题导致图形界面中文乱码方法

解决因编译php中添加了-enable-gd-jis-conv选项导致Zabbix监控系统图形界面中文乱码问题现象&#xff1a;php编译参数&#xff1a;说明&#xff1a;如果PHP编译时启用–enable-gd-jis-conv选项的话&#xff0c;那么非ASCII字符(例如汉字、拼音、希腊文和箭头) 会被当成EUC-JP编…

熟悉常用的HDFS操作

一、Hadoop提供的Shell命令完成相同任务&#xff1a; 在本地Linux文件系统的“/home/hadoop/”目录下创建一个文件txt&#xff0c;里面可以随意输入一些单词.在本地查看文件位置&#xff08;ls&#xff09;在本地显示文件内容使用命令把本地文件系统中的“txt”上传到HDFS中的当…

mysql 低端_mysql入门

相关了解(重点内容从标题一开始)目前主流数据库有:sqlserver, mysql, Qracle, SQLite, Access, MS SQL Server等, 我主要说的是mysql;以下几点需要记住!!!SQL包括了所有对数据库的操作, 主要由4个部分组1. 数据库定义语言(DDL): 用于定义和管理数据库对象, 包括数据库, 基本表,…

阿里云服务器由于被检测到对外攻击,已阻断该服务器对其它服务器端口的访问...

问题&#xff1a; (系统&#xff1a;CentOS 7.2 ) 前几天在阿里云服务器安装了Redis, 刚开始没有设置redis密码, 后台阿里云发送多次邮件提示如下&#xff1a; 经过几次波折才发现并彻底解决了问题&#xff1a; 原因&#xff1a; 估计是因为 Redis服务开启时没有设置密码 &…