先了解分布式和集群的概念:分布式是单系统拆分成多模块系统,集群是单个应用分成多个应用协同工作,分布式因为拆分成多个应用协同工作,所以也是集群,但集群的应用不一定拆分成模块系统,所以不一定是模块系统.
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ebec6e6b3066af7e8fff0d4f69c8b525.png)
一致性hash算法:
hash算法的使用范围:数据加密,数据存储和查找时 序列用的就是hash和b树
hash存储方式 根据你的数据产生一个固定的hash码 比如1 hash码就是1, 然后再查找时就根据你输入数据的hash码进行查询, 有值就是存在,没有就是空.
hash冲突:当两个数据通过计算得出的hash值相同了,那么就叫hash冲突;如何解决hash冲突?
开放寻址法:出现hash冲突时,可以将后来的数据存入到相邻的空闲位置(一般不用,添加数据无法添加)
拉链法:当出现hash冲突,将冲突的下标位进行纵向扩展.
如果hash算法设计的很好,那么查询效率会接近于O(1),hash表查询的速率是由hash算法决定的,而且这个算法一直在更新
普通hash算法在服务器扩容和缩容时会出现session问题
将int的取值范围形成为一个闭环 成为hash环 然后服务器均匀的分布在hash环上,成为hash节点, 每个用户请求都在一个点上,按顺时针查找最近的hash节点,也就是服务器,当有一个服务器宕机时,用户请求的是消失的hash节点的话,那么就按顺时针再找下一个hash节点;如果增加了新服务器,新增了hash节点,那么新增的hash节点与上一个节点之间的用户 将会被重新路由到新节点,之前是路由新hash节点的下一个节点,
缺陷:如果hash节点过少,会导致某一hash节点压力过大,造成数据倾斜.
解决这个缺陷:利用虚拟节点;单个真实节点求多个hash值 来造出映射的虚拟hash节点 这样就可以解决数据倾斜问题