《重新定义Spring Cloud实战》——3.3.3 Peer to Peer架构

举报
华章计算机 发表于 2019/06/04 14:52:26 2019/06/04
【摘要】 本书摘自《重新定义Spring Cloud实战》——书中第3章,第3.3.3节,作者是许进、叶志远、钟尊发、蔡波斯、方志朋、郭芳碧、朱德明。

3.3.3 Peer to Peer架构

一般而言,分布式系统的数据在多个副本之间的复制方式,可分为主从复制和对等复制。

1.主从复制

主从复制也就是广为人知的Master-Slave模式,即有一个主副本,其他副本为从副本。所有对数据的写操作都提交到主副本,最后再由主副本更新到其他从副本。具体更新的方式,还可以细分为同步更新、异步更新、同步及异步混合。

对于主从复制模式来讲,写操作的压力都在主副本上,它是整个系统的瓶颈,但是从副本可以帮主副本分担读请求。

2.对等复制

即Peer to Peer的模式,副本之间不分主从,任何副本都可以接收写操作,然后每个副本之间相互进行数据更新。

对于对等复制模式来讲,由于任何副本都可以接收写操作请求,不存在写操作压力瓶颈。但是由于每个副本都可以进行写操作处理,各个副本之间的数据同步及冲突处理是一个比较棘手的问题。

Eureka Server采用的就是Peer to Peer的复制模式。这里我们分为客户端及服务端两个角度来阐述。

(1)客户端

Client端一般通过如下配置Eureka Server的peer节点:

eureka:

    client:

        serviceUrl:

            defaultZone:

http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/

实际代码里支持preferSameZoneEureka,即有多个分区的话,优先选择与应用实例所在分区一样的其他服务的实例,如果没找到则默认使用defaultZone。客户端使用quarantineSet维护了一个不可用的Eureka Server列表,进行请求的时候,优先从可用的列表中进行选择,如果请求失败则切换到下一个Eureka Server进行重试,重试次数默认为3。

另外为了防止每个Client端都按配置文件指定的顺序进行请求造成Eureka Server节点请求分布不均衡的情况,Client端有个定时任务(默认5分钟执行一次)来刷新并随机化Eureka Server的列表。

(2)服务端

Eureka Server本身依赖了Eureka Client,也就是每个Eureka Server是作为其他Eureka Server的Client。在单个Eureka Server启动的时候,会有一个syncUp的操作,通过Eureka Client请求其他Eureka Server节点中的一个节点获取注册的应用实例信息,然后复制到其他peer节点。

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

Eureka Server由于采用了Peer to peer的复制模式,其重点要解决的另外一个问题就是数据复制的冲突问题。针对这个问题,Eureka采用如下两个方式来解决:

lastDirtyTimestamp标识

heartbeat

针对数据的不一致,一般是通过版本号机制来解决,最后在不同副本之间只需要判断请求复制数据的版本号与本地数据的版本号高低就可以了。Eureka没有直接使用版本号的属性,而是采用一个叫作lastDirtyTimestamp的字段来对比。

如果开启SyncWhenTimestampDiffers配置(默认开启),当lastDirtyTimestamp不为空的时候,就会进行相应的处理:

如果请求参数的lastDirtyTimestamp值大于Server本地该实例的lastDirtyTimestamp值,则表示Eureka Server之间的数据出现冲突,这个时候就返回404,要求应用实例重新进行register操作。

如果请求参数的lastDirtyTimestamp值小于Server本地该实例的lastDirtyTimestamp值,如果是peer节点的复制请求,则表示数据出现冲突,返回409给peer节点,要求其同步自己最新的数据信息。

peer节点之间的相互复制并不能保证所有操作都能够成功,因此Eureka还通过应用实例与Server之间的heartbeat也就是renewLease操作来进行数据的最终修复,即如果发现应用实例数据与某个Server的数据出现不一致,则Server返回404,应用实例重新进行register操作。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200