AP 优于 CP
ZooKeeper 是CP
Eureka 是AP
Consistency 数据一致性
consist
英 [kən’sɪst] 美 [kən’sɪst]
vi. 组成;在于;符合
consistent
英 [kən’sɪst(ə)nt] 美 [kən’sɪstənt]
adj. 始终如一的,一致的;坚持的
consistency
英 [kən’sɪst(ə)nsɪ] 美 [kən’sɪstənsi]
n. [计] 一致性;稠度;相容性
数据写入部分副本成功,部分副本失败
Availability
availability
英 [ə,veɪlə’bɪlətɪ] 美 [ə,velə’bɪləti]
n. 可用性;有效性;实用性
avail
英 [ə’veɪl] 美 [ə’vel]
n. 效用,利益
vt. 有益于,有益于;使对某人有利。
vi. 有益于,有益于;使对某人有利。
available
英 [ə’veɪləb(ə)l] 美 [ə’veləbl]
adj. 可获得的;可购得的;可找到的;有空的
在任何时候客户端对集群进行读写操作时,请求能够正常的响应。
Partition Tolerance 分区容忍性,发生通信故障的时候,集群仍然可用。
tolerant
英 ['tɒl(ə)r(ə)nt] 美 ['tɑlərənt]
adj. 宽容的;容忍的;有耐药力的
tolerance
英 ['tɒl(ə)r(ə)ns] 美 ['tɑlərəns]
n. 公差;宽容;容忍
eureka, 在生产和实践中,服务注册及发现中心,保留可用及过期的数据,总比丢掉可用的数据好。
客户端能够支持负载均衡及失败重试,ribbon
Peer to peer 架构
分布式系统的数据在多个副本之间的复制方式,
分为主从复制 和 对等复制
peer
英 [pɪə] 美 [pɪr]
n. 贵族;同等的人;同龄人
vi. 凝视,盯着看;窥视
vt. 封为贵族;与…同等
主从复制
Mster-Slave模式
slave
英 [sleɪv] 美 [sleɪv]
n. 奴隶;从动装置
vi. 苦干;拼命工作
一个主副本,其他是从副本。
写操作提交到主副本,读操作从副本。
再有祝福本更新到其他副本。
更新包括:同步更新,异步更新,同步即异步混合
对等复制
即是 Peer to Peer
不分主从,任何副本都可以接受写操作,
然后每个副本之间,相互进行数据更新。
每个副本都可以进行写操作,各个副本之间的数据同步及冲突处理是一个比较棘手的问题。
eureka Sever 采用的就是 对等复制
客户端
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
服务端
server 本身依赖了 client
sync
英 [sɪŋk] 美 [sɪŋk]
n. 同步,同时
vi. 同时发生
vt. 使同步
asyc
【网络】渐近准则 同步并车控制 高级安全概念
启动的时候,先获取注册的应用实例信息。
数据复制冲突问题:两个解决
1,lastDirtyTimestamp表示。(类似版本号)
2, heartbeat 最终修复
heartbeat
英 ['hɑːtbiːt] 美 ['hɑrtbit]
n. 心跳;情感
参数调优
为什么服务下线了,Eureka Server 上的信息还在?
为什么服务上线了,Eureka Client 不能及时获取到。(不能正常使用)
server 会保留过时的实例信息因为:
1,实例没有告知eureka Server 要下线。这时需要 EvictionTask 去剔除
2,告知了,但Server有缓存,要等缓存过期
3,server 开户了,SELF PRESERVATION self preservation自我保护模式,导致registry的信息不会因为过期而被剔除
evict
英 [ɪ’vɪkt] 美 [ɪ’vɪkt]
vt. 驱逐;逐出
eviction
英 [ɪ’vɪkʃ(ə)n] 美 [ɪ’vɪkʃən]
n. 逐出;赶出;收回
preserve
英 [prɪ’zɜːv] 美 [prɪ’zɝv]
vt. 保存;保护;维持;腌;禁猎
1,client下线没有通知server,可以调整 EvictionTask的调度频率。
eureka:
server:
eviction-interval-timer-in-ms: 5000
就是剔除任务,从默认的60秒执行一次,改成5秒执行一次。
2,针对server端有缓存的问题,可以关闭缓存。或者把缓存的保留时间调小
eureka:
server:
use-read-only-response-cache: false 或者 response-cache-auto-expiration-in-seconds: 60 #默认180
3,针对 server端的自我保护,也可以关闭
eureka:
server:
enable-self-preservation: false #关闭自我保护模式
服务上线,eureka server端没有及时获取到,client端不能及时使用
提高client端拉取Server注册信息的频率
eureka:
client:
registry-fetch-interval-seconds: 5 //默认30秒,拉取一次。这里应该配置到客户端,如果是多 eureka ,server端也要配置
SELF PRESERVATION
self preservation 自我保护模式
处理 网络偶尔抖动 或 短暂不可用 时造成的误判
client 和 server 有个租约,client 定时发送心跳 来维持这个心跳
server 通过当前注册的实例数,去计算每分钟 应该受到的心跳数。
如果最近一分钟接收到的续约的次数,小于等于 指定阀值的话,
则关闭租约失效剔除。禁止定时任务剔除,保护注册信息。
eureka 在线扩容
建立config-server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
@EnableConfigServer
bootstrap.yml 配置:
spring:
application:
name: config-server
profiles:
active: native
server:
port: 8888
native
英 ['neɪtɪv] 美 ['netɪv]
adj. 本国的;土著的;天然的;与生俱来的;天赋的
n. 本地人;土产;当地居民
默认放在 resource/config目录下
eureka server 和 eureka client
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
@RestController
@RequestMapping("/query")
public class QueryController {
@Autowired
EurekaClientConfigBean eurekaClientConfigBean;
@GetMapping("/eureka-server")
public Object getEurekaServerUrl(){
return eurekaClientConfigBean.getServiceUrl();
}
}
spring:
application:
name: eureka-server
cloud:
config:
uri: http://localhost:8888
management:
endpoints:
web:
exposure:
include: '*'
eureka:
server:
peer-eureka-nodes-update-interval-ms: 10000 #默认是10分钟即600000,这里为了验证改为10秒
配置中心配置client:
server:
port: 8081
spring:
application:
name: eureka-client1
eureka:
client:
serviceUrl:
# defaultZone: http://localhost:8761/eureka/ # one eureka server
# defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/ # two eureka server
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/ # three eureka server
配置中心配置eureka-pee1.yml
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
preferIpAddress: true
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
# defaultZone: http://localhost:8761/eureka/ # one eureka server
# defaultZone: http://localhost:8762/eureka/ # two eureka server
defaultZone: http://localhost:8762/eureka/,http://localhost:8763/eureka/ # three eureka server
server:
waitTimeInMsWhenSyncEmpty: 0
enableSelfPreservation: false
E:\master\spring-cloud-code-master\ch3-1\ch3-1-eureka-server\target>mvn spring-b
oot:run -Dspring.profiles=active=peer2
正确的写法:
java -jar eureka-server-1.0.0.jar --spring.profiles.active=peer1
刷新指定项目的配置:
curl -i -X POST http://localhost:8761/actuator/refresh