业务中碰到单锚点同步多项数据问题,举个例子说明以备忘之。
概念解释:
锚点同步:client用自己得到的最后一次操作编号,来获取之后所有的操作,重放以达到状态一致。
问题描述:
多从库环境下,用一个锚点通过两次DAO去同步两类业务数据,有可能会因为两个从库的同步状态不一致,导致丢数据。
比如:用100锚点去同步时,先A业务,再B业务,同步A时,拉到123,同步B时拉到125,两次取数据间A业务产生了124操作。下次client用125来同步,会丢失124操作。
后续:
演练时发现跟是否双从或是否主从无关,只有主库的情况下同样有可能出现类似问题,两次操作有时差,没法保障数据一致(不可能锁上不让操作)。
解决办法:
每次同步时,记录每个业务的最大值操作编号max(a,b,c,d,...),下次以最大编号来拉时,每个业务按自己上次记录的编号拉。
问题:
有可能会出现用125来拉时,拉到124操作。相比之前的124操作丢失,会更好。
从单个业务看,一直是连续的不会丢,如果各业务间操作不耦合,不会有影响。
如果多业务间有时续要求,需要根据业务依赖关系来确定兼容方案,会更复杂,有两种方式可以解决:
1、拉完A后拉B,如果B小于A,则以A为准,可以结束;如果B大于A,拉B后再拉A(记做A1),丢弃掉A1中比B大的部分,以B为准。如果是多从库,必拉一次小的且拉小的数据的操作从主库进行。
2、耦合的业务操作,只重放到小编号的数据。这么做很安全,缺点是及时性差,而且如果某个业务较冷的时候,滞后会非常严重。
推荐方案1。