本发明涉及数据存储,具体的涉及基于无冲突复制数据类型的异地多主存储方法及装置。
背景技术:
1、无论是为了异地容灾,还是为了就近提高服务的响应速度,很多企业都会做异地多活的数据中心。虽然是多个数据中心,其本质上主还是集中在一个地方,写入数据由专线实时同步到其他中心,这样的缺点是跨机房写入的延迟较大,并且当主所在的数据中心出现问题时,还需要把主切换到其他中心,故障消耗的时间也较长,这种方案其实是单向同步。如果是多主,就需要解决数据在同步中的冲突问题。
2、因此,本发明专利申请旨在解决异地多主数据中心的无冲突数据同步,多主数据中心的数据达到最终一致性的发明目的。
技术实现思路
1、为了解决上述技术问题,本发明提供基于无冲突复制数据类型的异地多主存储方法及装置,具体地,采用了如下技术方案:
2、基于无冲突复制数据类型的异地多主存储方法,包括:
3、在主数据中心a的每台机器和主数据中心b的每台机器上分别部署同步服务;
4、主数据中心a的同步服务中的数据通过负载均衡服务与主数据中心b的同步服务中的数据进行数据同步;
5、同步的所述数据包括hash集合,针对所述hash集合进行有状态存储,hash集合的存储结构包括:
6、meta信息,包括meta key和meta value,所述的meta key存储业务key,所述的meta value包括version存储集合、update_time存储集合和size,所述的version存储集合包含主数据中心a设置的值a和主数据中心b设置的值b,update_time存储集合包含主数据中心a和主数据中心b更新的时间戳;
7、field信息,包括field key和field value,所述的field key存储业务key、field和主数据中心的self_version,所述field value包括update_time存储集合和实际的value,所述的update_time存储集合存储由主数据中心a和主数据中心b更新的时间戳集合。
8、作为本发明的可选实施方式,本发明所述的基于无冲突复制数据类型的异地多主存储方法,针对所述hash集合执行hset命令操作包括:
9、主数据中心a执行hset命令操作,设置meta信息中的version存储集合和update_time存储集合,更新field信息中field key的self_version,field value中更新本地的update_time时间戳和value值,此时主数据中心a中meta信息存储的meta value为version{a,b},update_time为{a,b};
10、主数据中心b侧接收到主数据中心a的同步数据后,更新meta信息,如果主数据中心b本地存储的meta信息中主数据中心a侧的version小于同步数据的meta信息中主数据中心a侧的version,则更新北京侧的version和update_time,更新field信息,判断同步数据中的update_time时间戳是否比主数据中心b本地存储的主数据中心a侧update_time和主数据中心b侧update_time都大,大则更新主数据中心a侧的update_time,比任何一个值小都不执行。
11、作为本发明的可选实施方式,本发明的基于无冲突复制数据类型的异地多主存储方法,针对所述hash集合执行hdel命令操作包括:
12、主数据中心a执行hdel命令操作,删除对应field,更新meta信息中主数据中心a的update_time为当前时间戳;
13、主数据中心b侧接收到主数据中心a的同步数据后,meta信息不变,更新field信息,判断同步数据中的update_time时间戳是否比主数据中心b本地存储的主数据中心a侧update_time和主数据中心b侧update_time都大,大则删除field,同时更新meta信息中主数据中心a侧的update_time为当前时间戳。
14、作为本发明的可选实施方式,本发明的基于无冲突复制数据类型的异地多主存储方法,针对所述hash集合执行del命令操作包括:
15、时刻t1:主数据中心a执行del命令操作,删除key,meta信息中主数据中心a侧version加1,update_time为t1,field信息删除;
16、时刻t2:主数据中心b接收到主数据中心a的同步数据后,扫描所有的field信息,针对同一field,主数据中心a侧update_time比同步数据的meta信息中update_time小,删除field;
17、其中,所述的时刻t1与时刻t2为两个相邻时刻。
18、作为本发明的可选实施方式,本发明的基于无冲突复制数据类型的异地多主存储方法,针对所述hash集合执行del命令操作包括:
19、时刻t1:主数据中心a执行del命令操作,删除key,meta信息中主数据中心a侧version加1,update_time为t1,field信息删除;
20、时刻t2:主数据中心b接收到主数据中心a时刻t1的同步数据后,时刻t2与时刻t1存在延迟,需根据version和update_time共同判断执行,若主数据中心b中本地侧meta信息的version比同步数据中主数据中心b侧meta信息的version大,忽略本次同步数据。
21、作为本发明的可选实施方式,本发明的基于无冲突复制数据类型的异地多主存储方法,针对value进行有状态存储,所述的value的数据类型包括string类型;
22、主数据中心a针对string类型执行set命令操作,主数据中心b接收到主数据中心a的数据同步时,主数据中心b中存储的string类型数据按照时间偏序,根据value的update_time时间戳,最晚写入的为最终value值。
23、作为本发明的可选实施方式,本发明的基于无冲突复制数据类型的异地多主存储方法,针对value进行counter操作后执行del操作,在本地数据中心执行时将del操作转换成在del操作之前针对数据进行counter操作的反操作。
24、本发明同时提供基于无冲突复制数据类型的异地多主存储装置,包括:
25、同步服务模块,分别部署在主数据中心a的每台机器和主数据中心b的每台机器上;
26、负载均衡服务模块,主数据中心a的同步服务中的数据通过负载均衡服务模块与主数据中心b的同步服务中的数据进行数据同步;
27、同步的所述数据包括hash集合,针对所述hash集合进行有状态存储,hash集合的存储结构包括:
28、meta信息,包括meta key和meta value,所述的meta key存储业务key,所述的meta value包括version存储集合、update_time存储集合和size,所述的version存储集合包含主数据中心a设置的值a和主数据中心b设置的值b,update_time存储集合包含主数据中心a和主数据中心b更新的时间戳;
29、field信息,包括field key和field value,所述的field key存储业务key、field和主数据中心a的self_version,所述field value包括update_time存储集合和实际的value,所述的update_time存储集合存储由主数据中心a和主数据中心b更新的时间戳集合。
30、本发明还提供一种计算机可读存储介质,存储有计算机可执行程序,所述计算机可执行程序被执行时,实现所述基于无冲突复制数据类型的异地多主存储方法。
31、本发明同时提供一种电子设备,包括处理器和存储器,所述存储器用于存储计算机可执行程序,当所述计算机程序被所述处理器执行时,所述处理器执行所述基于无冲突复制数据类型的异地多主存储方法。
32、与现有技术相比,本发明的有益效果:
33、本发明的基于无冲突复制数据类型的异地多主存储方法,针对异地多主数据中心同步数据的冲突问题,本发明基于无冲突复制数据类型(crdt)设计了一种新的异地多主存储方法,实现类redis存储协议。crdt需要保证三大定律,交换律、结合律和幂等律。幂等律基于raft的logindex保证,logindex在同一个raft集群中全局唯一,且只会被应用一次,这是由raft协议保证。数据同步(sync)时带上logindex和分片id,远端数据中心以分片id维度记录当前执行的logindex用于去重,而下次执行前进行swap(交换)判断,如果是新的才执行。这样每个请求只执行了一次,相当于满足了幂等律。对于远端存储的记录,一个集群的分片数是有限的,并且数据类型也是整数,消耗的内存可控。
34、本发明的基于无冲突复制数据类型的异地多主存储方法,对于集合有状态的数据操作使用or-set和lww,对于value有状态的数据操作使用counter和lww,将counter的删除操作转换为普通的加减操作。通过针对各个数据类型存储协议的改造,能够在多个主的情况下,保证数据同步无冲突,且最终一致。