背景技术
云计算(Cloud Computing)是网格计算(Grid Computing)、分布式计算(Distributed Computing)、并行计算(Parallel Computing)、效用计算(UtilityComputing)、网络存储(Network Storage Technologies)、虚拟化(Virtualization)、负载均衡(Load Balance)等传统的计算机技术和网络技术发展融合的产物,它旨在通过网络把多个成本相对较低的计算实体整合成一个具有强大计算能力的系统。
分布式缓存系统是云计算范围中的一个领域,可以提供海量数据的分布式存储服务,并具备高速读写访问的能力。在分布式缓存系统中,保持数据的一致性是比较难解决的问题。分布式缓存系统是由若干服务器和客户端互相连接构成的;服务器负责数据的存储,客户端负责对服务器做数据的写入、读取、更新、删除等操作。一般来说写入的数据不可能只保存在单个服务器上,而是在多台服务器上保存同一个数据的副本,可以互为备份。所述数据由键(Key)和值(Value)构成,Key相当于数据的索引,Value是Key所代表的数据内容,逻辑上Key和Value是一一对应的关系。
如果对某个Key对应的Value反复进行写入、更新、删除等动作,而在这些动作期间存在网络故障或各种软件、硬件故障等问题,则可能在不同的服务器上保存的该Key以及与其对应的Value是不一致的,而这时如果要通过Key读取Value,如何实现能够返回正确的Value是亟待解决的问题,即数据一致性问题。现有技术中,保持数据一致性有四种方法:
第一种方法是依赖于全局一致的时钟,给每个Value加上时间戳,以时间戳大小决定数据版本的新旧;在一秒钟几万次操作的场景中,时间戳是一样的,因为这种方法的缺点是精确度较低;
第二种方法是由某个中心节点赋予版本号,即每个数据都从一个中心节点得到一个版本号,通过版本号来决定数据版本的新旧;这种方法的缺点是中心节点会导致运行效率的瓶颈;
第三种方法是客户端在每次写入、更新、删除操作之前都执行读取操作,从服务器读出数据的版本号,并在执行写入、更新、删除操作时将读取到的版本号带到服务器,表示是基于这个版本号的操作,服务器收到操作指令后进行判断,如果当前保存的数据版本号与这个操作基于的版本号一致,则执行操作并更新版本号,否则拒绝操作;这种方法的缺点是如果同时对同一个Key进行操作,则先发到服务器的成功,后发到服务器的失败,但实际上在大多数应用中,应该是以后发到的数据为准;
第四种方法是向量版本号、多版本的方案,与第三种方法类似,即在写入、更新、删除操作前客户端都执行读取版本号的操作,客户端会将版本号带到服务器,服务器参考当前版本号和客户端携带的版本号并根据一定规则决定新的版本号,这里的版本号是按一定规则生成的向量版本号,这个方案的优点是如果同一个Key有多个版本号,则大多数版本号之间是可以比较的;如果不可比较,则多个版本都被保存,当客户端读取该Key对应的Value时,将所有不可比较的版本返回给客户端;这个方案的缺点是大多数应用中,客户端在得到多个版本号的返回时,同样无从知道哪个Value是新的。
发明内容
有鉴于此,本发明的主要目的在于提供一种保持数据一致性的方法及系统,准确、高效的保证各个服务器中数据一致。
为达到上述目的,本发明的技术方案是这样实现的:
本发明公开一种保持数据一致性的方法,包括:
协同服务器将所有的版本号进行相互比较,当两个版本号不可比较时,根据强制合并规则确定新的版本号;
协同服务器在本地更新版本号和与其对应的数据,并将数据更新请求、新的版本号和与其对应的数据发送给各个副本服务器。
上述方法中,所述协同服务器将所有的版本号进行相互比较,当两个版本号不可比较时,根据强制合并规则确定新的版本号为:
如果相同的版本号的数量超过收到的版本号的总数的一半,则协同服务器确定所述相同的版本号作为新的版本号;如果相同的版本号的数量没有超过收到的版本号的总数的一半,则协同服务器根据大小比较方法,将不同的版本号进行相互比较,协同服务器确定将其中最大的版本号作为新的版本号;当存在两个版本号之间不可比较的情况时,协同服务器根据强制合并规则确定新的版本号。
上述方法中,所述强制合并规则为:以优先级最高的服务器所存储的版本号为新的版本号,或以服务器无故障运行时间最长的服务器所存储的版本号为新的版本号。
上述方法中,用于数据更新时,所述协同服务器将所有的版本号进行相互比较之前还包括:
协同服务器收到客户端发送的数据更新请求后,读取自身存储的版本号和与其对应的数据内容,并发送数据读取请求给各个副本服务器;副本服务器读取自身存储的版本号和与其对应的数据内容,并发送给协同服务器。
上述方法中,用于数据更新时,还包括:
副本服务器进行数据更新,将自身的更新结果返回给协同服务器;协同服务器将总体的更新结果返回给客户端。
上述方法中,用于数据读取时,所述协同服务器将所有的版本号进行相互比较之前还包括:
协同服务器收到客户端发送的数据读取请求后,读取自身存储的版本号和与其对应的数据,并发送数据读取请求和读取的版本号给副本服务器;副本服务器将收到的版本号和自身存储的版本号进行比较,当自身存储的版本号更新或不可比较时,将读取的版本号和与其对应的数据发送给协同服务器,当收到的版本号更新时,返回比较结果。
上述方法中,用于数据更新时,还包括:
协同服务器将新的版本号和与其对应的数据发送给客户端;副本服务器进行数据更新,将更新结果返回给协同服务器。
本发明还公开一种保持数据一致性的系统,包括:协同服务器、副本服务器;其中,
协同服务器,用于将所有的版本号进行相互比较,当两个版本号不可比较时,根据强制合并规则确定新的版本号;在本地更新版本号和与其对应的数据,并将数据更新请求、新的版本号和与其对应的数据发送给各个副本服务器;
副本服务器,用于接收协同服务器发送的数据更新请求、新的版本号和与其对应的数据。
上述系统中,用于数据更新时,
所述协同服务器还用于,收到客户端发送的数据更新请求后,读取自身存储的版本号和与其对应的数据内容,并发送数据读取请求给各个副本服务器;所述副本服务器还用于,收到数据读取请求时,读取自身存储的版本号和与其对应的数据内容,并发送给协同服务器;
所述副本服务器还用于,进行数据更新,将自身的更新结果返回给协同服务器;所述协同服务器还用于,将总体的更新结果返回给客户端。
上述系统中,用于数据读取时,
所述协同服务器还用于,收到客户端发送的数据读取请求后,读取自身存储的版本号和与其对应的数据;发送数据读取请求和读取的版本号给副本服务器;所述副本服务器还用于,将收到的版本号和自身存储的版本号进行比较;当自身存储的版本号更新或不可比较时,将读取的版本号和与其对应的数据发送给协同服务器,当收到的版本号更新时,返回比较结果;
所述协同服务器还用于,将新的版本号和与其对应的数据发送给客户端;所述副本服务器还用于,进行数据更新,将更新结果返回给协同服务器。
本发明提供的保持数据一致性的方法及系统,协同服务器将所有的版本号进行相互比较,当两个版本号不可比较时,根据强制合并规则确定新的版本号;协同服务器在本地更新版本号和与其对应的数据,并将数据更新请求、新的版本号和与其对应的数据发送给各个副本服务器,不依赖于时钟,从而提高了数据的准确度;不依赖于中心节点分配版本号,避免了中心节点带来的运行效率的瓶颈,提高了数据读取和更新的运行效率;此外,针对同一个key所对应的版本号和与其对应的数据,在每个协同服务器和副本服务器上最多只保留一个版本的数据,协同服务器返回给客户端的也只有一个版本的数据,从而客户端可以得到最新版本的数据。
具体实施方式
本发明的基本思想是:协同服务器将所有的版本号进行相互比较,当两个版本号不可比较时,根据强制合并规则确定新的版本号;协同服务器在本地更新版本号和与其对应的数据,并将数据更新请求、新的版本号和与其对应的数据发送给各个副本服务器。
下面通过附图及具体实施例对本发明再做进一步的详细说明。
本发明提供一种保持数据一致性的方法,图1是本发明数据更新时保持数据一致性的方法的流程示意图,如图1所示,该方法包括以下步骤:
步骤101,协同服务器收到客户端发送的数据更新请求后,读取自身存储的版本号和与其对应的数据内容;
具体的,客户端中保存数据的key与服务器的对应关系的列表,当需要对某个数据进行更新时,客户端根据该数据的key,将数据更新请求发送给与其对应的服务器,该服务器称为本次操作的协同服务器;协同服务器收到客户端发送的数据更新请求后,从本地读取自身存储的与该key对应的版本号和与该版本号对应的数据内容;其中,key、版本号和数据内容是一一对应的,所述版本号为向量版本号。
步骤102,协同服务器发送数据读取请求给各个副本服务器;
具体的,协同服务器保存该key与可能保存与该key对应的数据内容的副本服务器的对应关系的列表,协同服务器将数据读取请求发送给各个可能保存与该key对应的数据内容的副本服务器。
步骤103,副本服务器读取自身存储的版本号和与其对应的数据内容,并发送给协同服务器;
具体的,每个副本服务器收到数据读取请求后,尝试读取自身存储的版本号和与其对应的数据内容,如果能够读取出版本号和与其对应的数据内容,表示本地已经保存版本号和与其对应的数据内容,则副本服务器将读取出的版本号和与其对应的数据内容发送给协同服务器;如果没有读取出版本号和与其对应的数据内容,则副本服务器通知协同服务器没有数据。
步骤104,协同服务器将所有的版本号进行相互比较,当两个版本号不可比较时,根据强制合并规则确定新的版本号;
具体的,本实施例中的版本号是向量版本号,使用向量版本号的优点是,针对同一个key的大部分的不同的版本的不同的版本号之间是可以相互比较的;向量版本号中每个分量的数值表示的是,这个分量对应的服务器为协同服务器时,数据变更操作的次数,所述变更操作指的是写入、更新、删除操作;例如,X、Y、Z分别代表三台服务器,客户端第一次写入数据时选择X为协同服务器,则向量版本号为(1,0,0),然后如果客户端更新数据时,X出现故障,则客户端可能会选择Y为协同服务器,此时产生的向量版本号为(1,1,0),将两个向量版本号进行比较,得出向量版本号为(1,1,0)的版本比向量版本号为(1,0,0)的版本新;如果向量版本号为(3,2,3)与向量版本号为(1,2,4)的两个版本号进行比较,则这两个版本号是不可比较的,因为前者向量版本号中的向量既有大于后者的向量版本号中的向量,也有小于后者的向量版本号中的向量,这种情况下,两个向量版本号是不可比较的;
协同服务器收到各个副本服务器返回的版本号和与其对应的数据内容,或没有数据的通知,当协同服务器收到的副本服务器的响应的数量超过副本服务器总数的一半时,协同服务器将在步骤101中读取的自身的版本号和收到的多个版本号之间进行相互比较;如果存在相同的版本号的数量超过收到的版本号的总数的一半,则协同服务器确定这些相同的版本号作为新的版本号;如果不存在相同的版本号的数量超过收到的版本号的总数的一半,则协同服务器根据上述大小比较方法,将若干不同的版本号进行相互比较,协同服务器确定将其中最大的版本号作为新的版本号;当存在两个版本号之间不可比较的情况时,协同服务器根据强制合并规则确定新的版本号;其中,强制合并规则可以是服务器的优先级,或服务器无故障运行时间;例如,可以设置服务器的优先级,当存在两个版本号之间不可比较的情况时,以优先级最高的服务器所存储的版本号为新的版本号;或,以服务器无故障运行时间最长的服务器所存储的版本号为新的版本号;
协同服务器保存与副本服务器的交互记录,协同服务器中还具有计数器,根据记录协同服务器可以知道发送的副本服务器的总数,并可以利用计数器统计收到的副本服务器的响应数量,从而协同服务器可以确定,何时收到的副本服务器的响应的数量超过副本服务器总数的一半。
步骤105,协同服务器在本地更新版本号和与其对应的数据,并将数据更新请求、新的版本号和与其对应的数据发送给各个副本服务器;
具体的,协同服务器在确定新的版本号后,在本地将新的版本号和与其对应的数据,替换原来存储的版本号和与其对应的数据,实现版本号和与其对应的数据的更新;协同服务器将数据更新请求、确定的新的版本号和与其对应的数据发送给各个副本服务器。
步骤106,副本服务器进行数据更新,将自身的更新结果返回给协同服务器,协同服务器将总体的更新结果返回给客户端;
具体的,副本服务器收到协同服务器发送数据更新请求、新的版本号和与其对应的数据后,进行版本号和与其对应的数据的更新,将新的版本号和与其对应的数据替换原先在自身存储的版本号和与其对应的数据,并将更新结果返回给协同服务器,更新结果包括更新成功和更新失败;当协同服务器收到的副本服务器的更新结果的数量超过副本服务器总数的一半时,协同服务器将更新成功的结果返回给客户端;如果协同服务器收到的副本服务器的更新结果的数量最终没有超过副本服务器总数的一半,协同服务器将更新失败的结果返回给客户端。
图2是本发明数据读取时保持数据一致性的方法的流程示意图,如图2所示,该方法包括以下步骤:
步骤201,协同服务器收到客户端发送的数据读取请求后,读取自身存储的版本号和与其对应的数据;
具体的,客户端中保存数据的key与服务器的对应关系的列表,当需要对某个数据进行读取时,客户端根据该数据的key,将数据读取请求发送给与其对应的服务器,该服务器称为本次操作的协同服务器;协同服务器收到客户端发送的数据读取请求后,从本地读取自身存储的与该key对应的版本号和与该版本号对应的数据内容;其中,key、版本号和数据内容是一一对应的,所述版本号为向量版本号。
步骤202,协同服务器发送数据读取请求和读取的版本号给副本服务器;
具体的,协同服务器保存该key与可能保存与该key对应的数据内容的副本服务器的对应关系的列表,协同服务器将数据读取请求和在步骤201中读取的版本号发送给各个可能保存与该key对应的数据内容的副本服务器。
步骤203,副本服务器将收到的版本号和自身存储的版本号进行比较;
具体的,每个副本服务器收到数据读取请求后,尝试读取自身存储的版本号和与其对应的数据内容,如果能够读取出版本号和与其对应的数据内容,表示本地已经保存版本号和与其对应的数据内容,则副本服务器将读取出的版本号与收到的版本号进行比较,如果读取出的版本号比收到的版本号新,或两个版本号不可比较,则执行步骤204;如果收到的版本号新,或两个版本号相同容,则执行步骤208;如果没有读取出版本号和与其对应的数据内容,则副本服务器通知协同服务器没有数据。
步骤204,副本服务器将读取的版本号和与其对应的数据发送给协同服务器。
步骤205同步骤104。
步骤206,协同服务器在本地更新版本号和与其对应的数据,并将新的版本号和与其对应的数据发送给客户端,将数据更新请求、新的版本号和与其对应的数据发送给各个副本服务器;
具体的,协同服务器在确定新的版本号后,在本地将新的版本号和与其对应的数据,替换原来存储的版本号和与其对应的数据,实现版本号和与其对应的数据的更新;协同服务器将新的版本号和与其对应的数据发送给客户端,并将数据更新请求、确定的新的版本号和与其对应的数据发送给各个副本服务器。
步骤207,副本服务器进行数据更新,将更新结果返回给协同服务器,结束当前流程;
具体的,副本服务器收到协同服务器发送数据更新请求、新的版本号和与其对应的数据后,进行版本号和与其对应的数据的更新,将新的版本号和与其对应的数据替换原先在自身存储的版本号和与其对应的数据,并将更新结果返回给协同服务器,更新结果包括更新成功和更新失败。
步骤208,副本服务器返回比较结果;
具体的,如果副本服务器确定收到的版本号新,或收到的版本号和读取的版本号相同,副本服务器将上述比较结果返回给协同服务器,结束流程。
本实施例中,当副本服务器确定协同服务器的版本号新或两个版本号不可比较时,返回读取到的版本号和与其对应的数据内容,否则只返回比较结果给协同服务器,提示两个版本号相同或收到的版本号新,从而可以节省大量的带宽,提高自身的执行效率。
上述方法中,当存在两个版本号不可比较时,根据一定的规则进行强制合并,最后确定一个新的版本号,因此针对同一个key所对应的版本号和与其对应的数据,在每个协同服务器和副本服务器上最多只保留一个版本的数据,协同服务器返回给客户端的也只有一个版本的数据,弥补了背景技术中第四种方法的不足;此外,服务器易于得到更多的版本号作为参考,相对来说判断的较为准确,所以在服务器进行版本号的比较比在客户端进行比较更加具有优势。
为实现上述方法,本发明还提供一种保持数据一致性的系统,图3是本发明实现保持数据一致性的系统的结构示意图,如图3所示,该系统包括:协同服务器31、副本服务器32;其中,
协同服务器31,用于将所有的版本号进行相互比较,当两个版本号不可比较时,根据强制合并规则确定新的版本号;在本地更新版本号和与其对应的数据,并将数据更新请求、新的版本号和与其对应的数据发送给各个副本服务器32;
副本服务器32,用于接收协同服务器发送的数据更新请求、新的版本号和与其对应的数据。
用于数据更新时,
所述协同服务器31还用于,收到客户端发送的数据更新请求后,读取自身存储的版本号和与其对应的数据内容,并发送数据读取请求给各个副本服务器32;所述副本服务器32还用于,收到数据读取请求时,读取自身存储的版本号和与其对应的数据内容,并发送给协同服务器31;
所述副本服务器32还用于,进行数据更新,将自身的更新结果返回给协同服务器31;所述协同服务器31还用于,将总体的更新结果返回给客户端。
用于数据读取时,
所述协同服务器31还用于,收到客户端发送的数据读取请求后,读取自身存储的版本号和与其对应的数据;发送数据读取请求和读取的版本号给副本服务器32;所述副本服务器32还用于,将收到的版本号和自身存储的版本号进行比较;当自身存储的版本号更新或不可比较时,将读取的版本号和与其对应的数据发送给协同服务器31,当收到的版本号更新时,返回比较结果;
所述协同服务器31还用于,将新的版本号和与其对应的数据发送给客户端;所述副本服务器32还用于,进行数据更新,将更新结果返回给协同服务器31。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。