当前位置:   article > 正文

SpringCloud - Eureka Server的数据同步过程?_eureka集群同步数据的过程

eureka集群同步数据的过程

step 1 - 启动时 

Eureka Server也是一个Client,在启动时,通过请求其中一个节点(Server),将自身注册到Server上,并获取注册服务信息;

Step 2 - 信息变更时

每当Eureka Server信息变更后(client发起注册,续约,注销请求时),就将信息通知给其他Server,来保持数据同步;

Step 3 - 解决Eureka Server之间的数据同步死循环

如果自己的信息变更是另一个Eureka Server同步过来的,这是再同步回去的话就出现数据同步死循环了。
在这里插入图片描述

Eureka Server 在执行复制操作的时候,使用 HEADER_REPLICATION 这个 http header 来区分普通应用实例的正常请求,说明这是一个复制请求这样其他 peer 节点收到请求时,就不会再对其进行复制操作,从而避免死循环。

Step 4 - 解决数据冲突

还有一个问题,就是数据冲突,比如 server A 向 server B 发起同步请求,如果 A 的数据比 B 的还旧,B 不可能接受 A 的数据,那么 B 是如何知道 A 的数据是旧的呢?这时 A 又应该怎么办呢?

数据的新旧一般是通过版本号来定义的,Eureka 是通过 lastDirtyTimestamp 这个类似版本号的属性来实现的
lastDirtyTimestamp 是注册中心里面服务实例的一个属性,表示此服务实例最近一次变更时间。

比如 Eureka Server A 向 Eureka Server B 复制数据(把A的数据同步到B),数据冲突有2种情况:

(1)A 的数据比 B 的新,B 返回 404,A 重新把这个应用实例注册到 B。

(2)A 的数据比 B 的旧,B 返回 409,要求 A 同步 B 的数据。

相关文章:

Eureka数据同步原理

Eureka Server 的数据同步过程?

Eureka集群没有主从概念,所有节点全部平等,集群间数据通过5个Http接口完成数据同步,下面介绍这几种接口以及同步流程。

同步流程

1) Get-获取注册列表

假设Eureka1服务最早启动,Eureka2服务启动时将Eureka1作为自己的上报服务(每个Eureka-Client只给一个Eureka-Server上报信息),首先调用GET /eureka/apps/获取已有注册列表。

  1. GET /eureka/apps/ HTTP/1.1
  2. Accept application/json
  3. DiscoveryIdentity-Name DefaultClient
  4. DiscoveryIdentity-Version 1.4
  5. DiscoveryIdentity-Id 10.10.11.9
  6. Accept-Encoding gzip
  7. Host 10.10.11.9:8082
  8. User-Agent Java-EurekaClient/v1.6.2
  9. Authorization Basic ZGRzaHVhaToxMjM0NTY=
  10. Connection keep-alive
  11. {
  12. "applications": {
  13. "versions__delta": "1",
  14. "apps__hashcode": "UP_1_",
  15. "application": [{
  16. "name": "ZUUL-DEV",
  17. "instance": [{
  18. "instanceId": "10.10.11.9:28723",
  19. "hostName": "10.10.11.9",
  20. "app": "ZUUL-DEV",
  21. "ipAddr": "10.10.11.9",
  22. "status": "UP",
  23. "overriddenstatus": "UNKNOWN",
  24. "port": {
  25. "$": 28723,
  26. "@enabled": "true"
  27. },
  28. "securePort": {
  29. "$": 443,
  30. "@enabled": "false"
  31. },
  32. "countryId": 1,
  33. "dataCenterInfo": {
  34. "@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
  35. "name": "MyOwn"
  36. },
  37. "leaseInfo": {
  38. "renewalIntervalInSecs": 30,
  39. "durationInSecs": 90,
  40. "registrationTimestamp": 1544160173785,
  41. "lastRenewalTimestamp": 1544160173785,
  42. "evictionTimestamp": 0,
  43. "serviceUpTimestamp": 1544160173786
  44. },
  45. "metadata": {
  46. "@class": "java.util.Collections$EmptyMap"
  47. },
  48. "homePageUrl": "http://10.10.11.9:28723/",
  49. "statusPageUrl": "http://10.10.11.9:28723/info",
  50. "healthCheckUrl": "http://10.10.11.9:28723/health",
  51. "vipAddress": "zuul-dev",
  52. "secureVipAddress": "zuul-dev",
  53. "isCoordinatingDiscoveryServer": "false",
  54. "lastUpdatedTimestamp": "1544160173786",
  55. "lastDirtyTimestamp": "1544160168179",
  56. "actionType": "ADDED"
  57. }]
  58. }]
  59. }
  60. }

 2) Post-注册服务

获取到注册列表后,将自己添加到注册列表中,并发送注册信息到Eureka1上

  1. POST /eureka/apps/EUREKA-SERVER HTTP/1.1
  2. Accept-Encoding gzip
  3. Content-Type application/json
  4. Accept application/json
  5. DiscoveryIdentity-Name DefaultClient
  6. DiscoveryIdentity-Version 1.4
  7. DiscoveryIdentity-Id 10.10.11.9
  8. Content-Length 877
  9. Host 10.177.14.9:28721
  10. User-Agent Java-EurekaClient/v1.6.2
  11. Authorization Basic ZGRzaHVhaToxMjM0NTY=
  12. Connection keep-alive
  13. {
  14. "instance": {
  15. "instanceId": "10.10.11.9:8082",
  16. "hostName": "10.10.11.9",
  17. "app": "EUREKA-SERVER",
  18. "ipAddr": "10.10.11.9",
  19. "status": "DOWN",
  20. "overriddenstatus": "UNKNOWN",
  21. "port": {
  22. "$": 8082,
  23. "@enabled": "true"
  24. },
  25. "securePort": {
  26. "$": 443,
  27. "@enabled": "false"
  28. },
  29. "countryId": 1,
  30. "dataCenterInfo": {
  31. "@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
  32. "name": "MyOwn"
  33. },
  34. "leaseInfo": {
  35. "renewalIntervalInSecs": 30,
  36. "durationInSecs": 90,
  37. "registrationTimestamp": 0,
  38. "lastRenewalTimestamp": 0,
  39. "evictionTimestamp": 0,
  40. "serviceUpTimestamp": 0
  41. },
  42. "metadata": {
  43. "@class": "java.util.Collections$EmptyMap"
  44. },
  45. "homePageUrl": "http://10.10.11.9:8082/",
  46. "statusPageUrl": "http://10.10.11.9:8082/info",
  47. "healthCheckUrl": "http://10.10.11.9:8082/health",
  48. "vipAddress": "eureka-server",
  49. "secureVipAddress": "eureka-server",
  50. "isCoordinatingDiscoveryServer": "false",
  51. "lastUpdatedTimestamp": "1544159697067",
  52. "lastDirtyTimestamp": "1544164155198"
  53. }
  54. }

3). Post-广播2步骤的节点新增信息

将Eureka2注册的事件写入自己的注册列表中,并以广播的形式通知剩余全部节点,收到通知的服务将Eureka2注册到自己的注册列表中

  1. POST /eureka/peerreplication/batch/ HTTP/1.1
  2. Accept application/json
  3. Content-Type application/json
  4. DiscoveryIdentity-Name DefaultServer
  5. DiscoveryIdentity-Version 1.0
  6. DiscoveryIdentity-Id 10.10.11.9
  7. Accept-Encoding gzip
  8. Content-Length 1026
  9. Host 10.177.14.9:28721
  10. User-Agent Java-EurekaClient-Replication/v1.6.2
  11. Authorization Basic ZGRzaHVhaToxMjM0NTY=
  12. Connection keep-alive
  13. {
  14. "replicationList": [{
  15. "appName": "ZUUL-DEV",
  16. "id": "10.10.11.9:28723",
  17. "lastDirtyTimestamp": 1544160168179,
  18. "status": "UP",
  19. "instanceInfo": {
  20. "instanceId": "10.10.11.9:28723",
  21. "hostName": "10.10.11.9",
  22. "app": "ZUUL-DEV",
  23. "ipAddr": "10.10.11.9",
  24. "status": "UP",
  25. "overriddenstatus": "UNKNOWN",
  26. "port": {
  27. "$": 28723,
  28. "@enabled": "true"
  29. },
  30. "securePort": {
  31. "$": 443,
  32. "@enabled": "false"
  33. },
  34. "countryId": 1,
  35. "dataCenterInfo": {
  36. "@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
  37. "name": "MyOwn"
  38. },
  39. "leaseInfo": {
  40. "renewalIntervalInSecs": 30,
  41. "durationInSecs": 90,
  42. "registrationTimestamp": 0,
  43. "lastRenewalTimestamp": 0,
  44. "evictionTimestamp": 0,
  45. "serviceUpTimestamp": 0
  46. },
  47. "metadata": {
  48. "@class": "java.util.Collections$EmptyMap"
  49. },
  50. "homePageUrl": "http://10.10.11.9:28723/",
  51. "statusPageUrl": "http://10.10.11.9:28723/info",
  52. "healthCheckUrl": "http://10.10.11.9:28723/health",
  53. "vipAddress": "zuul-dev",
  54. "secureVipAddress": "zuul-dev",
  55. "isCoordinatingDiscoveryServer": "false",
  56. "lastUpdatedTimestamp": "1544160173786",
  57. "lastDirtyTimestamp": "1544160168179",
  58. "actionType": "ADDED"
  59. },
  60. "action": "Register"
  61. }]
  62. }

4) Get-获取注册列表变化信息

这次与第一步骤类似,但是这次只获取注册列表的变化信息。

  1. GET /eureka/apps/delta HTTP/1.1
  2. Accept application/json
  3. DiscoveryIdentity-Name DefaultClient
  4. DiscoveryIdentity-Version 1.4
  5. DiscoveryIdentity-Id 10.10.11.9
  6. Accept-Encoding gzip
  7. Host 10.177.14.9:28721
  8. User-Agent Java-EurekaClient/v1.6.2
  9. Authorization Basic ZGRzaHVhaToxMjM0NTY=
  10. Connection keep-alive
  11. {
  12. "applications": {
  13. "versions__delta": "167299",
  14. "apps__hashcode": "UP_20_",
  15. "application": []
  16. }
  17. }

5) 每30s上报一次健康心跳

Eureka2之后每30s向Eureka1上报健康信息,也就是续约。

  1. PUT /eureka/apps/EUREKA-SERVER/10.10.11.9:8082?status=UP&lastDirtyTimestamp=1544159712387 HTTP/1.1
  2. DiscoveryIdentity-Name DefaultClient
  3. DiscoveryIdentity-Version 1.4
  4. DiscoveryIdentity-Id 10.10.11.9
  5. Accept-Encoding gzip
  6. Content-Length 0
  7. Host 10.177.14.9:28721
  8. User-Agent Java-EurekaClient/v1.6.2
  9. Authorization Basic ZGRzaHVhaToxMjM0NTY=
  10. Connection keep-alive

6.) Post-广播心跳信息

过程与第二步一致。

原文:Spring Cloud Eureka - 集群间数据同步

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/395436
推荐阅读
相关标签
  

闽ICP备14008679号