赞
踩
归纳为两种
请求的负载均衡,如 nginx 的 ip_hash 策略
for (i = 0; i < (ngx_uint_t) iphp->addrlen; i++) {
hash = (hash * 113 + iphp->addr[i]) % 6271;
}
分布式存储:如 Redis 集群、MySQL 分库分表
普通 hash 过来的请求会一直路由到集群的一台服务器
缩容时,如果该服务器宕机下线,那么请求就得不到响应,需要对客户端的 ip 重新 hash,迁移全部请求,计算量大
扩容时,集群增加服务器后,同样需要对客户端的 ip 重新 hash,迁移全部请求,计算量大
把服务器的 ip 或者主机名的 hash 值映射到一个从0到2的32次方-1的圆形闭环,这样的环叫哈希环。接收客户端的请求时根据 ip 的 hash 值对应到环上的某个位置,然后顺时针找到最近的服务器节点。
缩容时,原来路由到服务器3的客户端重新路由到服务器4,不影响其他客户端,避免大量迁移请求
扩容时,原路由到服务器3的客户端重新路由到服务器5,不影响其他客户端,避免大量迁移请求
虚拟节点机制
采用一致性哈希算法,如果服务器节点太少时,节点分布不均,会造成某个节点处理大量的请求,产生数据倾斜问题,可以使用虚拟节点,哈希环上多个节点对应一个真实服务器节点
使用 ngx_http_upstream_consistent_hash 第三方模块根据参数配置选择不同的策略
场景
操作
# 第一种:各自使用 ntpdate 同步 NTP 服务器(上海)的时间 ntpdate -u ntp.api.bz # 第二种,以某台服务器时间为准 # 修改 /etc/ntp.conf 文件,放开局域⽹同步功能,172.17.0.0是你的局域⽹⽹段 restrict 172.17.0.0 mask 255.255.255.0 nomodify notrap server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 # 重启⽣效并配置ntpd服务开机⾃启动 service ntpd restart chkconfig ntpd on # 集群中其他节点可以从该服务器同步时间 ntpdate 172.17.0.17 # 使用 Linux 的定时任务定期同步时间 * /5 * * * * ntpdate -u ntp.api.bz
分库分表之后如果仍然使用数据库的自增 ID 作为主键,会出现重复,分布式环境下需要全局唯一的主键。
雪花算法可以产生一个 long 型的 ID
优点
缺点
优点
缺点
两层含义
特点:
主要功能:
分布式调度协调
在分布式环境中,任务能够按指定的调度策略执⾏,并且能够避免同⼀任务多实例重复执⾏
丰富的调度策略
基于成熟的定时任务作业框架 Quartz cron 表达式执⾏定时任务
弹性扩容缩容
当集群中增加某⼀个实例,它应当也能够被选举并执⾏任务;当集群减少⼀个实例时,它所执⾏的任务能被转移到别的实例来执⾏。
失效转移
某实例在任务执⾏失败后,会被转移到其他实例执⾏
错过执⾏作业重触发
若因某种原因导致作业错过执⾏,⾃动记录错过执⾏的作业,并在上次作业完成后⾃动触发。
⽀持并⾏调度
⽀持任务分⽚,任务分⽚是指将⼀个任务分为多个⼩任务项在多个实例同时执⾏。
作业分⽚⼀致性
当任务被分⽚后,保证同⼀分⽚在分布式环境中仅⼀个执⾏实例。
只需一个 jar 和 Zookeeper 即可完成分布式调用, 此处 Zookeeper 的本质功能是存储和通知
引入jar
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
编写定时任务类,实现com.dangdang.ddframe.job.api.simple.SimpleJob
配置分布式协调服务(注册中心)Zookeeper
ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("localhost:2181","data-archive-job");
CoordinatorRegistryCenter coordinatorRegistryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
coordinatorRegistryCenter.init();
配置任务:时间事件(包括任务分片)、定时任务业务逻辑、调度器
JobCoreConfiguration jobCoreConfiguration =
JobCoreConfiguration.newBuilder("archive-job", "*/2 * * * * ?", 3)
.shardingItemParameters("0=bachelor,1=master,2=doctor").build();
SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(jobCoreConfiguration,ArchivieJob.class.getName());
JobScheduler jobScheduler = new JobScheduler(coordinatorRegistryCenter, LiteJobConfiguration.newBuilder(simpleJobConfiguration).overwrite(true).build());
jobScheduler.init();
集群环境下,客户端第二次请求轮询到另一台服务器,由于 HTTP 是无状态的,因此服务器无法识别是否登录过,导致重复登录, 即 Session 丢失问题。
使用 Nginx 的 ip_hash,同⼀个客户端IP的请求都会被路由到同⼀个⽬标服务器(会话粘滞)
优点:配置简单,不入侵应用,不需要额外修改代码
缺点:
服务器重启 Session 会丢失
存在单点负载高的风险(恶意客户端发出大量请求到同一个目标服务器)
单点故障
使用 Redis 缓存 Session
优点
能适应各种负载均衡策略
服务器重启或宕机不会丢失 Session
扩展能力强,集群扩容同样使用 Redis 缓存,可以直接扩容
适合大集群数量使用
缺点:对应用有入侵,引入了和 Redis 的交互代码
引入 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>
配置 Redis
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
添加注解 @EnableRedisHttpSession 到启动类
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。