模块六_Cluster模式潜在问题及解决方案

2020-09-12  本文已影响0人  西西弗斯XD

序言:

文章内容输出来源:拉勾教育Java高薪训练营。
本篇文章是学习课程中的一部分课后笔记

一、一致性Hash问题及解决方案

1、Hash算法应⽤场景
2、普通Hash算法存在的问题

以ip_hash为例,假定下载⽤户ip固定没有发⽣改变,现在tomcat3出现了问题,down机了,服务器数量由3个变为了2个,之前所有的求模都需要重新计算。

普通hash算法问题.png

如果在真实⽣产情况下,后台服务器很多台,客户端也有很多,那么影响是很⼤的,缩容和扩容都会存在这样的问题,⼤量⽤户的请求会被路由到其他的⽬标服务器处理,⽤户在原来服务器中的会话都会丢失

3、⼀致性Hash算法
一致性hash算法.png

⾸先有⼀条直线,直线开头和结尾分别定为1和2的32次⽅(int最大值)减1,这相当于⼀个地址,对于这样⼀条线,弯过来构成⼀个圆环形成闭环,这样的⼀个圆环称为hash环
我们把服务器的ip或者主机名求hash值然后对应到hash环上,那么针对客户端ip进⾏hash求值,也对应到环上某个位置;
然后按照顺时针⽅向找最近的服务器节点

顺时针找服务器节点.png 缩容.png 扩容.png 数据倾斜问题.png

二、集群时钟同步配置

1、时钟不同步导致的问题

时钟此处指服务器时间,如果集群中各个服务器时钟不⼀致势必导致⼀系列问题。
电商并发下订单情况:

并发订单问题.png
2、集群时钟同步配置

操作⽅式:
windows有计划任务
Linux也有定时任务,crond
可以使⽤linux的定时任务,每隔10分钟执⾏⼀次ntpdate命令

 ntpdate -u ntp.api.bz
 使⽤ ntpdate ⽹络时间同步命令 
 从⼀个时间服务器同步时间

三、分布式ID解决⽅案

1、UUID

UUID 是指Universally Unique Identifier,翻译为中⽂是通⽤唯⼀识别码,产⽣重复 UUID 并造成错误的情况⾮常低,是故⼤可不必考虑此问题。
Java中得到⼀个UUID,可以使⽤java.util包提供的⽅法

public class MyTest {
 public static void main(String[] args) {
 System.out.println(java.util.UUID.randomUUID().toString());
 }
}
2、独⽴数据库的⾃增ID

单独的创建⼀个Mysql数据库,创建⼀张表,这张表的ID设置为⾃增,其他地⽅需要全局唯⼀ID的时候,就模拟向这个Mysql数据库的这张表中模拟插⼊⼀条记录,此时ID会⾃增,然后通过Mysql的select last_insert_id()获取到刚刚这张表中⾃增⽣成的ID。

insert into DISTRIBUTE_ID(createtime) values(NOW());
select LAST_INSERT_ID();
3、SnowFlake 雪花算法

雪花算法是Twitter推出的⼀个⽤于⽣成分布式ID的策略。
⽣成的ID是⼀个long型,那么在Java中⼀个long型是8个字节,算下来是64bit。


雪花算法.png
4、Redis的Incr命令获取全局唯⼀ID

Redis Incr 命令将 key 中储存的数字值增⼀。
如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执⾏ INCR 操作。


incr.png

四、分布式调度问题

调度—>定时任务。Quartz
分布式调度—>在分布式集群环境下定时任务这件事。
Elastic-job(当当⽹开源的分布式调度框架)

1、什么是分布式调度
2、定时任务与消息队列的区别

1 )共同点

2)本质不同
定时任务作业是时间驱动,⽽MQ是事件驱动
时间驱动是不可代替的,⽐如⾦融系统每⽇的利息结算,不是说利息来⼀条(利息到来事件)就算⼀下,⽽往往是通过定时任务批量计算;
所以,定时任务作业更倾向于批处理MQ倾向于逐条处理

3、分布式调度框架Elastic-Job
1、主要功能
2、 Elastic-Job-Lite轻量级去中⼼化的特点
轻量级&去中心化.png
3、任务分⽚

⼀个⼤的⾮常耗时的作业Job,
⽐如:⼀次要处理⼀亿的数据,那这⼀亿的数据存储在数据库中,如果⽤⼀个作业节点处理⼀亿数据要很久,在互联⽹领域是不太能接受的,互联⽹领域更希望机器的增加去横向扩展处理能⼒。
所以,ElasticJob 可以把作业分为多个的task(每⼀个task就是⼀个任务分⽚),每⼀个task交给具体的⼀个机器实例去处理(⼀个机器实例是可以处理多个task的)

任务分片.png

分片部分代码:


1.png 2.png
4、任务分⽚扩容
分片扩容.png

新增加⼀个运⾏实例app3,它会⾃动注册到注册中⼼,注册中⼼发现新的服务上线,注册中⼼会通知ElasticJob 进⾏重新分⽚。

注意:
1)分⽚项也是⼀个JOB配置,修改配置,重新分⽚,在下⼀次定时运⾏之前会重新调⽤分⽚算法,那么这个分⽚算法的结果就是:哪台机器运⾏哪⼀个⼀⽚,这个结果存储到zk中的,主节点会把分⽚给分好放到注册中⼼去,然后执⾏节点从注册中⼼获取信息(执⾏节点在定时任务开启的时候获取相应的分⽚)。

2)如果所有的节点挂掉值剩下⼀个节点,所有分⽚都会指向剩下的⼀个节点,这也是ElasticJob的⾼可⽤。

五 、Session共享问题

1、问题
问题.png

Http协议是⽆状态的协议,客户端和服务端在某次会话中产
⽣的数据不会被保留下来,所以第⼆次请求服务端⽆法认识到你曾经来过。

2、解决Session⼀致性的⽅案

1) Nginx的 IP_Hash 策略
同⼀个客户端IP的请求都会被路由到同⼀个⽬标服务器,也叫做会话粘滞

2)Session复制

3) redis共享


redis共享.png

Spring Session使得基于Redis的Session共享应⽤起来⾮常之简单
引入jar

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
 <groupId>org.springframework.session</groupId>
 <artifactId>spring-session-data-redis</artifactId>
</dependency>
spring session
上一篇 下一篇

猜你喜欢

热点阅读