一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

数据访问方法、装置、设备及存储介质与流程

2021-10-24 04:39:00 来源:中国专利 TAG:
1.本技术涉及数据库
技术领域
:,特别涉及一种数据访问方法、装置、设备及存储介质。
背景技术
::2.随着数据库技术的发展,为了提高分布式数据库系统的数据访问性能以及可用性,将数据以多副本的形式进行存储已成为一种共识。多副本技术是指将一份数据复制多份,并将各数据副本分别存储在分布式数据库系统的不同节点上。例如,按照数据的价值高低,将不同价值的数据副本分别存储在不同的存储介质中。又例如,按照数据的数据类型,将不同类型的数据副本分别存储在不同的数据存储区域中。然而,基于上述多副本技术进行数据访问时,所有数据访问请求需要集中到一个主节点上进行处理,增加了负载均衡的实现难度,且容易造成较高的时间开销,导致数据访问延迟较高,分布式数据库系统的数据访问性能不佳。3.因此,亟需一种能够提升分布式数据库系统的数据访问性能的数据访问方法。技术实现要素:4.本技术实施例提供了一种数据访问方法、装置、设备及存储介质,能够有效提升分布式数据库系统的数据访问性能。该技术方案如下:5.一方面,提供了一种数据访问方法,应用于分布式数据库系统,该分布式数据库系统包括计算节点和多个存储节点,该方法包括:6.计算节点响应于第一数据读取请求,确定该第一数据读取请求的第一目标数据所属的第一数据分片,基于该第一数据分片,从该多个存储节点中确定多个第一存储节点,该多个第一存储节点用于存储该第一目标数据的多个副本;7.计算节点基于该第一数据读取请求,从该多个第一存储节点中确定第一目标存储节点,向该第一目标存储节点发送该第一数据读取请求,该第一目标存储节点的数据访问代价符合第一目标条件;8.第一目标存储节点基于该第一数据读取请求,读取该第一目标数据,向该计算节点发送第一数据读取结果。9.另一方面,提供了一种数据访问装置,应用于分布式数据库系统,该装置包括:10.第一确定模块,用于响应于第一数据读取请求,确定该第一数据读取请求的第一目标数据所属的第一数据分片,基于该第一数据分片,从该多个存储节点中确定多个第一存储节点,该多个第一存储节点用于存储该第一目标数据的多个副本;11.第二确定模块,用于基于该第一数据读取请求,从该多个第一存储节点中确定第一目标存储节点,向该第一目标存储节点发送该第一数据读取请求,该第一目标存储节点的数据访问代价符合第一目标条件;12.第一读取模块,用于基于该第一数据读取请求,读取该第一目标数据,向该计算模块发送第一数据读取结果。13.在一种可选地实现方式中,该第一读取模块包括:14.第一读取单元,用于若该第一目标数据为当前态数据,基于该第一数据读取请求和该第一目标存储节点的节点类型,读取该第一目标数据;15.第二读取单元,用于若该第一目标数据为历史态数据,基于该第一数据读取请求和该第一目标数据的事务完成时间,读取该第一目标数据。16.在一种可选地实现方式中,该第一读取单元用于下述任一项:17.若该第一目标存储节点为主存储节点,基于该第一数据读取请求,确定该第一目标数据的第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据,该第一读索引用于指示基于该第一数据读取请求读取该第一目标数据的最小读索引;18.若该第一目标存储节点为从存储节点,基于该第一数据读取请求,从该主存储节点中获取该第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据。19.在一种可选地实现方式中,该第一读取单元用于:20.更新当前时刻的提交索引,该提交索引用于指示日志列表中已提交日志的最大索引;21.按照第一顺序,扫描该日志列表中存储的日志,该第一顺序是指从该提交索引至该日志列表的执行索引,该执行索引用于指示该日志列表中已执行日志的最大索引;22.若存在第一目标日志,基于该第一目标日志的日志索引,确定该第一读索引,该第一目标日志所操作的数据为该第一目标数据;若不存在该第一目标日志,该第一目标存储节点基于该执行索引,确定该第一读索引。23.在一种可选地实现方式中,该装置还包括:24.第一存储模块,用于将该第一读索引存储至第一列表,该第一列表包括该第一目标数据、该第一读索引以及第一校验索引,该第一校验索引用于指示该第一目标存储节点确定该第一读索引时对应的提交索引,该提交索引用于指示日志列表中已提交日志的最大索引;25.第一查询模块,用于当该分布式数据库系统处理第二数据读取请求时,若该第二数据读取请求的数据为该第一目标数据,查询该第一列表以读取该第一目标数据。26.在一种可选地实现方式中,该第一读取单元用于:27.若该第一目标存储节点中存在该第一读索引对应的日志,对该第一读索引对应的日志进行持久化存储,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据;28.若该第一目标存储节点中不存在该第一读索引对应的日志,从该主存储节点中获取该第一读索引对应的日志,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据。29.在一种可选地实现方式中,该第二读取单元用于:30.若该第一目标数据的数据提交时间在该事务完成时间之前,基于该第一数据读取请求和该事务完成时间,按照第二顺序,扫描日志列表中存储的日志,确定第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据;31.若该第一目标数据的数据提交时间在该事务完成时间之后,基于该第一数据读取请求和该事务完成时间,按照第三顺序,扫描该日志列表中存储的日志,确定该第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据;32.其中,该第二顺序是指从该日志列表的提交索引至该日志列表的执行索引,该第三顺序是指从该日志列表的执行索引至该日志列表的提交索引,该提交索引用于指示该日志列表中已提交日志的最大索引,该执行索引用于指示该日志列表中已执行日志的最大索引,该第一读索引用于指示基于该第一数据读取请求读取该第一目标数据的最小读索引。33.在一种可选地实现方式中,该第二读取单元用于:34.若存在第二目标日志,且该第一目标数据的事务完成时间与该第二目标日志的事务完成时间相同,或该第一目标数据的事务完成时间在该第二目标日志的事务完成时间之后,基于该第二目标日志的日志索引,确定该第一读索引,该第二目标日志所操作的数据为该第一目标数据;35.若不存在该第二目标日志,基于该日志列表的执行索引,确定该第一读索引。36.在一种可选地实现方式中,该数据访问代价用于指示存储节点的执行时间、等待时间以及传输时间;37.该执行时间包括存储节点查询该第一目标数据的时间、处理数据量的时间以及元组构建时间;38.该等待时间包括存储节点的请求队列时间、设备负载延迟时间以及数据同步时间;39.该传输时间包括网络传输时间。40.在一种可选地实现方式中,该第一目标存储节点的数据访问代价符合第一目标条件,包括下述任一项:41.该第一目标存储节点中该第一目标数据的存储模式为列存模式,且该数据读取请求所需访问的列数与总列数之间的比值小于第一阈值,该存储模式用于指示数据在存储节点中的存储格式;42.该第一目标存储节点的节点负载小于该多个存储节点中除该第一目标存储节点以外的存储节点的节点负载;43.该第一目标存储节点与该计算节点之间的物理距离小于该多个存储节点中除该第一目标存储节点以外的存储节点与该计算节点之间的物理距离;44.该第一目标存储节点的数据同步状态在该多个存储节点中除该第一目标存储节点以外的存储节点的数据同步状态之后。45.在一种可选地实现方式中,该装置还包括:46.调整模块,用于对该第一目标数据的多个副本的存储模式进行动态调整,该存储模式用于指示数据在存储节点中的存储格式。47.在一种可选地实现方式中,该调整模块用于下述任一项:48.基于该多个第一存储节点的负载情况,切换该多个副本的存储模式;49.若该多个副本中存在至少一个副本异常,基于该至少一个副本,建立至少一个新副本;50.若该第一数据分片发生数据分裂,生成至少一个第二数据分片,基于该至少一个第二数据分片,建立该至少一个第二数据分片对应的多个副本;51.基于该多个第一存储节点的节点类型,调整该多个副本的存储模式。52.在一种可选地实现方式中,该基于该多个第一存储节点的负载情况,切换该多个副本的存储模式,包括下述任一项:53.基于该多个第一存储节点的节点负载大小和可用空间,切换该多个副本的存储模式;54.基于该多个第一存储节点的节点负载大小和每个存储模式下副本的数量,切换该多个副本的存储模式。55.在一种可选地实现方式中,该装置还包括:56.第三确定模块,用于响应于数据写入请求,若该数据写入请求的第二目标数据存在所属的第三数据分片,基于该第三数据分片,从该多个存储节点中确定多个第二存储节点,该多个第二存储节点用于存储该第二目标数据的多个副本;57.发送模块,用于向该多个第二存储节点中的主存储节点发送该数据写入请求;58.第一写入模块,用于基于该数据写入请求,写入该第二目标数据,向该计算节点发送第一数据写入结果。59.在一种可选地实现方式中,该第一写入模块用于:60.基于该数据写入请求,写入该第二目标数据,生成数据操作日志,向该多个存储节点中的从存储节点发送日志同步请求,该日志同步请求用于指示该从存储节点同步该数据操作日志后向该主存储节点发送数据同步消息;61.若该主存储节点接收到的该数据同步消息的数量大于或等于从存储节点数量的半数,确认该数据写入请求已操作成功。62.在一种可选地实现方式中,该装置还包括:63.第一持久化存储模块,用于对该第二目标数据进行持久化存储;64.第二持久化存储模块,用于基于该数据操作日志和该第二目标数据在该从存储节点中的存储模式,对该第二目标数据进行格式转换,对转换后的该第二目标数据进行持久化存储,该存储模式用于指示数据在存储节点中的存储格式。65.在一种可选地实现方式中,该装置还包括:66.第四确定模块,用于基于该数据操作日志的日志索引,确定该第二目标数据的第二读索引,该第二读索引用于指示基于第三数据读取请求读取该第二目标数据的最小读索引;67.第二存储模块,用于将该第二读索引存储至第二列表,该第二列表包括该第二目标数据、该第二读索引以及第二校验索引,该第二校验索引为该数据操作日志的日志索引;68.第二查询模块,用于当该分布式数据库系统处理该第三数据读取请求时,若该第三数据读取请求的数据为该第二目标数据,查询该第二列表以读取该第二目标数据。69.在一种可选地实现方式中,该装置还包括:70.第一建立模块,用于若该数据写入请求的第二目标数据不存在所属的第三数据分片,建立该第二目标数据的第三数据分片,向该多个存储节点发送副本创建请求;71.第二建立模块,用于基于该副本创建请求,建立该第三数据分片对应的多个副本。72.在一种可选地实现方式中,该第二建立模块用于:73.基于该副本创建请求和该第二目标数据在该多个存储节点中的存储模式,建立该第三数据分片对应的多个副本,该存储模式用于指示数据在存储节点中的存储格式。74.在一种可选地实现方式中,该装置还包括:75.第五确定模块,用于响应于数据读写请求,若该数据读写请求的第三目标数据存在所属的第四数据分片,基于该第四数据分片,从该多个存储节点中确定多个第三存储节点,该多个第三存储节点用于存储该第三目标数据的多个副本;76.第二读取模块,用于对于该数据读写请求中的读操作,基于该数据读写请求,从该多个第三存储节点中确定第二目标存储节点,向该第二目标存储节点发送该数据读写请求,该第二目标存储节点基于该数据读写请求,读取该第三目标数据,向该计算节点发送第二数据读取结果,该第二目标存储节点的数据访问代价符合第二目标条件;77.第二写入模块,用于对于该数据读写请求中的写操作,向该多个第三存储节点中的主存储节点发送该数据读写请求,该主存储节点基于该数据读写请求,写入该第三目标数据,向该计算节点发送第二数据写入结果。78.在一种可选地实现方式中,该多个第三存储节点中的从存储节点配置有内存锁,该内存锁用于在该写操作尚未完成时锁定该第三目标数据。79.在一种可选地实现方式中,该装置还包括:80.第六确定模块,用于当该多个存储节点中存在第四存储节点通过选举成为主存储节点时,该多个存储节点中的从存储节点基于当前存储模式和该从存储节点的写性能参数,确定超时时间,该存储模式用于指示数据在存储节点中的存储格式;81.状态切换模块,用于若存在第一从存储节点在对应的超时时间内,未接收到该主存储节点的消息,该第一从存储节点切换至候选状态,参与下一次选举。82.另一方面,提供了一种计算机设备,该计算机设备包括处理器和存储器,该存储器用于存储至少一条计算机程序,该至少一段计算机程序由该处理器加载并执行以实现本技术实施例中的数据访问方法中所执行的操作。83.另一方面,提供了一种计算机可读存储介质,该计算机可读存储介质中存储有至少一条计算机程序,该至少一条计算机程序由处理器加载并执行以实现如本技术实施例中数据访问方法中所执行的操作。84.另一方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机程序代码,该计算机程序代码存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机程序代码,处理器执行该计算机程序代码,使得该计算机设备执行上述各种可选实现方式中提供的数据访问方法。85.本技术实施例提供的技术方案带来的有益效果是:86.在分布式数据库系统中,当计算节点接收到数据读取请求时,先根据该数据读取请求的目标数据所属的数据分片,来确定存储有该目标数据的多个副本的多个存储节点,然后按照存储节点访问目标数据的数据访问代价,从这些存储节点中选出符合目标条件的目标存储节点,由该目标存储节点来读取目标数据。上述方法中,由于该目标存储节点是根据数据访问代价来确定的,因此主存储节点和从存储节点都可能成为目标存储节点,避免了由主存储节点处理所有的数据读取请求,从而既保证了多副本带来的高可用性,又提高了数据读取速度,有效提升了分布式数据库系统的数据访问性能。附图说明87.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。88.图1是根据本技术实施例提供的一种数据访问方法的实施环境示意图;89.图2是根据本技术实施例提供的一种htap数据库系统的架构示意图;90.图3是根据本技术实施例提供的一种数据访问方法流程图;91.图4是根据本技术实施例提供的一种数据访问方法流程图;92.图5是根据本技术实施例提供的一种确定第一读索引的示意图;93.图6是根据本技术实施例提供的一种存储第一读索引的示意图;94.图7是根据本技术实施例提供的一种主节点读请求处理流程的示意图;95.图8是根据本技术实施例提供的一种从节点读请求处理流程的示意图;96.图9是根据本技术实施例提供的一种确定第一读索引的示意图;97.图10是根据本技术实施例提供的一种旧数据读请求处理流程的示意图;98.图11是根据本技术实施例提供的一种非最新数据读请求处理流程的示意图;99.图12是根据本技术实施例提供的一种数据访问方法流程图;100.图13是根据本技术实施例提供的一种存储第二读索引的示意图;101.图14是根据本技术实施例提供的一种数据访问方法流程图;102.图15是根据本技术实施例提供的一种读半已提交问题的示意图;103.图16是根据本技术实施例提供的一种数据访问装置的结构示意图;104.图17是根据本技术实施例提供的一种服务器的结构示意图。具体实施方式105.为使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术实施方式作进一步地详细描述。106.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本技术相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本技术的一些方面相一致的装置和方法的例子。107.本技术中术语“第一”“第二”等字样用于对作用和功能基本相同的相同项或相似项进行区分,应理解,“第一”、“第二”、“第n”之间不具有逻辑或时序上的依赖关系,也不对数量和执行顺序进行限定。还应理解,尽管以下描述使用术语第一、第二等来描述各种元素,但这些元素不应受术语的限制。108.这些术语只是用于将一个元素与另一个元素区别开。例如,在不脱离各种示例的范围的情况下,第一存储节点能够被称为第二存储节点,并且类似地,第二存储节点也能够被称为第一存储节点。第一存储节点和第二存储节点都可以是存储节点,并且在某些情况下,可以是单独且不同的存储节点。109.其中,至少一个是指一个或一个以上,例如,至少一个存储节点可以是一个存储节点、两个存储节点、三个存储节点等任意大于等于一的整数个存储节点。而多个是指两个或者两个以上,例如,多个存储节点可以是两个存储节点、三个存储节点等任意大于等于二的整数个存储节点。110.在介绍本技术实施例之前,需要引入一些云
技术领域
:内的基本概念:111.云技术(cloudtechnology):是指在广域网或局域网内将硬件、软件、网络等系列资源统一起来,实现数据的计算、储存、处理和共享的一种托管技术,也即是基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、应用技术等的总称,可以组成资源池,按需所用,灵活便利。云计算技术将变成云
技术领域
:的重要支撑。技术网络系统的后台服务需要大量的计算、存储资源,如视频网站、图片类网站和更多的门户网站。伴随着互联网行业的高度发展和应用,将来每个物品都有可能存在自己的识别标志,都需要传输到后台系统进行逻辑处理,不同程度级别的数据将会分开处理,各类行业数据皆需要强大的系统后盾支撑,均能通过云计算来实现。112.云存储(cloudstorage):是在云计算概念上延伸和发展出来的一个新的概念,分布式云存储系统(以下简称存储系统)是指通过集群应用、网格技术以及分布存储文件系统等功能,将网络中大量各种不同类型的存储设备(存储设备也称之为存储节点)通过应用软件或应用接口集合起来协同工作,共同对外提供数据存储和业务访问功能的一个存储系统。113.数据库(database):简而言之可视为一种电子化的文件柜,也即是存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。114.本技术实施例所涉及的分布式数据库系统可以为基于多版本并发控制(multi‑versionconcurrencycontrol,mvcc)的任一类型的数据库系统。在本技术实施例中,对该分布式数据库系统的类型不作具体限定。115.在分布式数据库系统中可以包括至少一个节点设备,每个节点设备的数据库中可以存储有多个数据表,每个数据表可以用于存储一个或多个数据项(也称为变量版本)。其中,节点设备的数据库可以为任一类型的分布式数据库,可以包括关系型数据库或者非关系型数据库中至少一项,例如结构化查询语言(structuredquerylanguage,sql)数据库、nosql、newsql(泛指各种新式的可拓展/高性能数据库)等,在本技术实施例中对数据库的类型不作具体限定。116.在一些实施例中,本技术实施例还可以应用于一种基于区块链技术的分布式数据库系统(以下简称为“区块链系统”),上述区块链系统在本质上属于一种去中心化式的分布式数据库系统,采用共识算法保持区块链上不同节点设备所记载的账本数据一致,通过密码算法保证不同节点设备之间账本数据的加密传送以及不可篡改,通过脚本系统来拓展账本功能,通过网络路由来进行不同节点设备之间的相互连接。117.在区块链系统中可以包括一条或多条区块链,区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。118.区块链系统中节点设备之间可以组成点对点(peertopeer,p2p)网络,p2p协议是一个运行在传输控制协议(transmissioncontrolprotocol,tcp)协议之上的应用层协议。在区块链系统中,任一节点设备可以具备如下功能:1)路由,节点设备具有的基本功能,用于支持节点设备之间的通信;2)应用,用于部署在区块链中,根据实际业务需求而实现特定业务,记录实现功能相关的数据形成账本数据,在账本数据中携带数字签名以表示数据来源,将账本数据发送至区块链系统中的其他节点设备,供其他节点设备在验证账本数据来源以及完整性成功时,将账本数据添加至临时区块中,其中,应用实现的业务可以包括钱包、共享账本、智能合约等;3)区块链,包括一系列按照先后的时间顺序相互接续的区块,新区块一旦加入到区块链中就不会再被移除,区块中记录了区块链系统中节点设备提交的账本数据。119.在一些实施例中,每个区块中可以包括本区块存储交易记录的哈希值(本区块的哈希值)以及前一区块的哈希值,各区块通过哈希值连接形成区块链,另,区块中还可以包括有区块生成时的时间戳等信息。120.下面对本技术实施例所涉及到的一些基本术语进行介绍:121.多副本异构:同一份数据的多个副本在磁盘上采取了不同的存储结构。例如,一个副本是按照行存格式对数据进行存储,每一条存储记录是table的一整行数据的内容。一个副本是按照列存格式对数据进行存储,每一条存储记录是table一行数据的某个或某些列值的内容。122.数据分片:是指在分布式数据库系统中数据管理的最小逻辑单元,一个数据分片会拥有多个副本,这多个副本通过多副本一致性协议来控制数据间的副本一致性。在一些实施例中,当分布式数据库系统新建一个数据分片时,将该数据分片的分片信息进行存储。例如,该分片信息包括该数据分片的数据范围、多个副本各自的节点信息以及各个副本的存储模式信息等,本技术实施例对此不作限定。123.事务:事务是数据库系统在执行操作的过程中的一个逻辑单位,由一个有限的数据库操作序列构成,是数据库系统操作的最小执行单位。124.数据项:事务是数据库系统中的一个数据单位,数据项是数据库操作的作用者(或者说被操作的数据对象),在一些实施例中,数据项也称为变量。其中,一个数据项可以是一个元组(tuple)或者记录(record),也可以是一个页面(page)或者一个表(table)对象等。一个数据项可以包含若干数据项版本(在后文中也简称为“版本”),每当事务对数据项进行更新时,则会添加新的数据项版本,数据项的各个数据项版本可以以自然数作为版本号标识,版本号越大,则表示数据项版本越新。在一些实施例中,分布式数据库系统在接收到数据访问请求时,根据数据访问请求所需访问的数据项来确定所属的数据分片,例如,分布式数据库系统可以根据数据项标识来计算数据项所属的数据范围,从而确定该数据项所属的数据分片,本技术实施例对此不作限定。125.操作:一个数据库操作由操作类型、事务、数据项版本三部分构成,其中,操作类型可以包括读(read,r)和写(write,w)两种。126.分布式共识:共识是分布式系统最重要的抽象之一,具体是指分布式系统中所有的节点就某一项提议达成一致。即一个或多个进程对某个值进行提议后,采用一种全体认可的方法,使分布式系统中所有进程对这个值达成一致意见。127.raft:一种分布式共识协议,用于管理日志一致性,是一种在工程上使用较为广泛的一致性算法,具有强一致性、去中心化、易于理解和开发实现等特点。raft将分布式系统中的角色分为领导者(leader)、跟从者(follower)和候选者(candidate)。在一个raft集群中,有且只有一个leader节点(也可以称为主节点),该leader节点负责处理请求,并把数据同步到follower节点(也可以称为从节点)。同时,raft提供了完善的错误处理机制,从而保证了数据的高可用性。128.leader节点:raft协议通过选举机制来选出leader节点,负责接受终端请求和日志复制,leader节点接收请求后,将其写入自己的日志并向follower节点同步请求日志,当日志同步到大多数节点上后告诉follower节点提交日志。其中,leader节点在任期内采用“心跳”机制以通知follower节点该leader节点仍在正常工作。129.follower节点:用于接受并持久化leader同步的日志,在leader告之日志可以提交之后,提交日志。其中,follower节点在选举超时时间内没有收到leader节点发送的“心跳”,就会转换状态为candidate状态,并向其他节点发送消息以发起新一轮leader节点的选举。130.mvcc:是数据库系统常用的一种并发控制。意图解决读写锁造成的多个或长时间的读操作阻塞写操作的问题。每个事务读到的数据项都是一个快照。写操作不覆盖已有数据项,而是创建一个新的数据项版本,直至操作提交时才变为可见。131.全态数据:分布式数据库系统中的数据基于状态属性,可以包括三种状态:当前态、过渡态和历史态,该三种状态合称为“数据的全态”,简称全态数据,全态数据中的各个不同状态属性,可以用于标识数据在其生命周期轨迹中所处的状态。其中,当前态(currentstate):元组的最新版本的数据,是处于当前阶段的数据,换言之,处于当前阶段的数据的状态,称为当前态。过渡态(transitionalstate):不是元组的最新的版本也不是历史态版本,处于从当前态向历史态转变的过程中,处于过渡态的数据,称为半衰数据。历史态(historicalstate):元组在历史上的一个状态,其值是旧值,不是当前值。处于历史阶段的数据的状态,称为历史态。一个元组的历史态,可以有多个,反映了数据的状态变迁的过程。处于历史态的数据,只能被读取而不能被修改或删除。132.元数据:又称中介数据、中继数据,是指描述数据的数据(dataaboutdata),是关于数据的组织、数据域及其关系的信息,主要是描述数据属性(property)的信息,用来支持如指示数据分片的分片信息、存储位置、历史数据、资源查找、文件记录等功能。133.状态机(statemachine):是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。134.下面对本技术实施例提供的数据访问方法的实施环境进行介绍。135.图1是本技术实施例提供的一种数据访问方法的实施环境示意图。如图1所示,本技术实施例可以应用于分布式数据库系统,该系统中可以包括网关服务器101、全局时间戳生成集群102、分布式存储集群103以及分布式协调系统104(例如zookeeper),在分布式存储集群103中可以包括数据节点设备和协调节点设备。136.其中,网关服务器101用于接收外部的读写请求,并将读写请求对应的读写事务分发至分布式存储集群103,比如,用户在登录终端上的应用终端之后,触发应用终端生成读写请求,调用分布式数据库系统提供的应用程序编程接口(applicationprogramminginterface,api)将该读写请求发送至网关服务器101,比如,该api可以是mysqlapi(一种关系型数据库系统提供的api)。137.在一些实施例中,该网关服务器101可以与分布式存储集群103中的任一个数据节点设备或任一协调节点设备合并在同一个物理机上,也即是,让某个数据节点设备或协调节点设备充当网关服务器101。138.全局时间戳生成集群102用于生成全局事务的全局提交时间戳(globaltimestamp,gts),该全局事务又称为分布式事务,是指涉及到多个数据节点设备的事务,例如全局读事务可以涉及到对多个数据节点设备上存储数据的读取,又例如,全局写事务可以涉及到对多个数据节点设备上的数据写入。全局时间戳生成集群102在逻辑上可以视为一个单点,但在一些实施例中可以通过一主三从的架构来提供具有更高可用性的服务,采用集群的形式来实现该全局提交时间戳的生成,可以防止单点故障,也就规避了单点瓶颈问题。139.可选地,全局提交时间戳是一个在分布式数据库系统中全局唯一且单调递增的时间戳标识,能够用于标志每个事务全局提交的顺序,以此来反映出事务之间在真实时间上的先后关系(事务的全序关系),全局提交时间戳可以采用物理时钟、逻辑时钟、混合物理时钟或者混合逻辑时钟(hybridlogicalclock,hlc)中至少一项,本技术实施例不对全局提交时间戳的类型进行具体限定。140.在一个示例性场景中,全局提交时间戳可以采用混合物理时钟的方式生成,全局提交时间戳可以由八字节组成,其中,前44位可以为物理时间戳的取值(也即unix时间戳,精确到毫秒),这样共计可以表示244个无符号整数,因此理论上一共可以表示约为年的物理时间戳,其中,后20位可以为在某一毫秒内的单调递增计数,这样每毫秒有220个(约100万个)计数,基于上述数据结构,如果单机(任一数据节点设备)的事务吞吐量为10w/s,理论上可以支持包含1万个节点设备的分布式存储集群103,同时,全局提交时间戳的数量代表了系统理论上所能支持的总事务数,基于上述数据结构,理论上系统可以支持(244‑1)*220个事务。这里仅仅是对一种全局提交时间戳的定义方法的示例性说明,根据业务需求的不同,可以对全局提交时间戳的位数进行扩展,以满足对更多的节点数、事务处理数的支持,本技术实施例不对全局提交时间戳的定义方法进行具体限定。141.在一些实施例中,该全局时间戳生成集群102可以是物理独立的,也可以和分布式协调系统104(例如zookeeper)合并到一起。142.其中,分布式存储集群103可以包括数据节点设备和协调节点设备,每个协调节点设备可以对应于至少一个数据节点设备,数据节点设备与协调节点设备的划分是针对不同事务而言的,以某一全局事务为例,全局事务的发起节点可以称为协调节点设备,全局事务所涉及的其他节点设备称为数据节点设备,数据节点设备或协调节点设备的数量可以是一个或多个,本技术实施例不对分布式存储集群103中数据节点设备或协调节点设备的数量进行具体限定。由于本实施例所提供的分布式数据库系统中缺乏全局事务管理器,因此在该系统中可以采用xa(extendedarchitecture,x/open组织分布式事务规范)/2pc(two‑phasecommit,二阶段提交)技术来支持跨节点的事务(全局事务),保证跨节点写操作时数据的原子性和一致性,此时,协调节点设备用于充当2pc算法中的协调者,而该协调节点设备所对应的各个数据节点设备用于充当2pc算法中的参与者。143.可选地,每个数据节点设备或协调节点设备可以是单机设备,也可以采用主备结构(也即是为一主多备集群),如图1所示,以节点设备(数据节点设备或协调节点设备)为一主两备集群为例进行示意,每个节点设备中包括一个主机和两个备机,可选地,每个主机或备机都对应配置有代理(agent)设备,代理设备可以与主机或备机是物理独立的,当然,代理设备还可以作为主机或备机上的一个代理模块,以节点设备1为例,节点设备1包括一个主数据库及代理设备(主database agent,简称主db agent),此外还包括两备数据库及代理设备(备database agent,简称备db agent)。144.在一个示例性场景中,每个节点设备所对应的主机或备机的数据库实例集合称为一个set(集合),例如,假设某一节点设备为单机设备,那么该节点设备的set仅为该单机设备的数据库实例,假设某一节点设备为一主两备集群,那么该节点设备的set为主机数据库实例以及两个备机数据库实例的集合,此时可以基于云数据库的强同步技术来保证主机的数据与备机的副本数据之间的一致性,可选地,每个set可以进行线性扩容,以应付大数据场景下的业务处理需求,在一些金融业务场景下,全局事务通常是指跨set的转账。145.分布式协调系统104可以用于对网关服务器101、全局时间戳生成集群102或者分布式存储集群103中至少一项进行管理,可选地,技术人员可以通过终端上的调度器(scheduler)访问该分布式协调系统104,从而基于前端的调度器来控制后端的分布式协调系统104,实现对各个集群或服务器的管理。例如,技术人员可以通过调度器来控制zookeeper将某一个节点设备从分布式存储集群103中删除,也即是使得某一个节点设备失效。146.上述图1仅是提供了一种轻量级的全局事务处理的架构图,是一种类分布式数据库系统。整个分布式数据库系统可以看作是共同维护一个逻辑上的大表,这个大表中存储的数据通过主键被打散到分布式存储集群103中的各个节点设备中,每个节点设备上存储的数据是独立于其他节点设备的,从而实现了节点设备对逻辑大表的水平切分。由于在上述系统中能够将各个数据库中各个数据表水平切分后进行分布式地存储,因此,这种系统也可以形象地称为具有“分库分表”的架构。147.在一些实施例中,上述网关服务器101、全局时间戳生成集群102、分布式存储集群103以及分布式协调系统104所构成的分布式数据库系统,可以视为一种向用户终端提供数据服务的服务器,该服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(contentdeliverynetwork,cdn)、以及大数据和人工智能平台等基础云计算服务的云服务器。可选地,上述用户终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本技术在此不做限制。148.基于上述实施环境,在一些实施例中,上述分布式数据库系统可以为混合事务和分析处理(hybridtransactionandanalyticalprocess,htap)数据库系统。htap数据库系统是一种支持联机事务处理(on‑linetransactionprocessing,oltp)业务和联机分析处理(on‑lineanalyticalprocessing,olap)业务同时处理的数据库系统。换言之,htap数据库系统是一种既支持在线更新任务、又支持在线分析查询请求的数据库系统。需要说明的是,htap数据库避免了在线与离线数据的大量数据交互,其创新的计算存储框架也可以支持弹性扩容,更好的应对高并发带来的挑战。149.下面参考图2,对本技术实施例提供的一种htap数据库系统的架构进行说明。图2是本技术实施例提供的一种htap数据库系统的架构示意图。如图2所示,htap数据库系统可以包括四个部分:计算层201、分布式一致性协议层202、存储层203以及元数据管理层204。其中,150.计算层201具有下述几种功能:151.1)连接处理功能,用于根据终端发来的连接请求,与终端建立可靠连接。152.2)查询计划的制定功能,用于接收终端发送的数据访问请求,并对该数据访问请求进行语法分析等处理,从而生成查询计划(此部分内容会在后续实施例中进行详细说明,故在此不赘述)。153.3)执行功能(也可以称为封装功能),用于将数据访问请求涉及的操作用事务进行封装,并根据查询计划,将数据访问请求发送到对应的节点。154.在一些实施例中,计算层201配置有至少一个计算节点,用于实现上述功能,本技术实施例对此不作限定。155.分布式一致性协议层202具有下述几种功能:156.1)日志同步功能,用于控制数据同步,保证各个副本之间的数据一致性。可选地,该日志同步功能用于保证从节点执行读操作时,从节点具有与主节点同步的数据(此部分内容会在后续实施例中进行详细说明,故在此不赘述)。157.2)主节点选举功能,用于在主节点失效时,重新选举主节点(此部分内容会在后续实施例中进行详细说明,故在此不赘述)。158.3)状态机安全功能,用于接收和处理计算层201的数据访问请求,控制访问存储层203中的数据(此部分内容会在后续实施例中进行详细说明,故在此不赘述)。159.在一些实施例中,上述分布式一致性协议层202的功能由计算层201中所配置的至少一个计算节点实现,本技术实施例对此不作限定。160.存储层203具有下述几种功能:161.1)数据访问请求处理功能,用于接收和处理分布式一致性协议层202的数据访问请求。162.2)副本管理功能,用于管理数据的多个副本,保证各个副本之间的数据一致性。163.在一些实施例中,存储层203包括状态机和格式转换器。其中,状态机中具有不同存储模式的数据分片,一个数据分片存在多个副本,存放于不同的存储节点中,副本之间按照分布式一致性协议,通过日志(log)进行数据同步。log中的数据会经过日志回放的步骤持久化到状态机中,便于数据访问。格式转换器用于按照指定的存储模式,将数据转换成对应的存储格式,再由状态机进行持久化存储。例如,数据的多个副本的存储模式为行存格式和列存格式,本技术实施例对此不作限定。需要说明的是,图2所示的存储模式的组合方式仅为示意性地,各存储模式的副本数量可以依照系统和负载的实际情况进行组合配置,本申请实施例对此不作限定。164.在一些实施例中,存储层203配置有至少一个存储节点,用于实现上述功能,本技术实施例对此不作限定。165.元数据管理层204具有下述几种功能:166.1)记录功能,用于记录数据分片的分片信息以及数据各个副本的日志同步情况。167.2)路由功能,用于为计算层201和存储层203提供路由服务。168.需要说明的是,在上述图2所示的架构中,计算节点和存储节点的数量仅为示意性地,在一些实施例中,该htap数据库系统还可以包括更多或更少的计算节点和存储节点,本技术实施例对此不作限定。通过采用这种计算与存储分离的架构,便于改变存储节点的分布和配置,从而增加了分布式数据库系统的灵活性,使得分布式数据库系统适用于多种不同的场景,具有广泛的适用性。169.另外,上述计算层204可以配置有上述图1所示的网关服务器101,且上述图1所示的分布式协调系统104可以用于管理整个htap系统,也即是由分布式协调系统104来调度htap系统中涉及到的节点设备中的至少一项,本技术实施例对此不作限定。170.示意性地,上述图2所示的分布式数据库系统具有存储和计算功能。在存储层,系统会对数据进行分片,每个数据分片对应有若干个副本,理论上来说每个副本都提供数据访问功能。对于数据分片的不同副本,其存储模式不一定相同。在计算层,系统会根据分析统计,来判断数据访问请求的类型,从而确定性能更优的副本,考虑负载均衡,将数据访问请求发送给被选定的副本。该副本所在节点执行数据访问请求后,将数据返回给计算层,再经由计算层返回给终端。对于上层用户来说,并不会感知到底层存储模式的异构,而是由分布式数据库系统本身完成多副本异构的管理。基于这种分布式数据库系统,对数据采用多副本异构数据模型存储及访问的方法,既保证了多副本带来的高可用性以及多副本间的数据一致性,又增加了系统的并发度,提高了系统在混合负载下的性能表现。171.接下来将以上述图1和图2所示的分布式数据库系统为基础,对本技术实施例提供的数据访问方法进行说明。172.首先,数据多副本存储是分布式数据库系统中普遍采用的技术,多副本机制可以保证数据高可用性。但目前,分布式数据库系统普遍采用同构的多副本机制,即数据的副本采用相同的组织模型和存储结构。这种存储机制使得用户请求在各个副本上表现性能一样(在不考虑节点负载和硬件差异的情况下)。其次,采用分布式一致性协议管理数据的多个副本,可以保证数据的一致性,但相关分布式一致性协议中严格的主从机制使得所有请求需要集中到一个副本上处理,增加了负载均衡的实现难度,更有可能造成性能瓶颈。再次,在分布式一致性协议(例如raft)中,在执行读请求时必须先把数据从日志中执行(apply)到状态机,在执行写请求时必须等待主节点将相关日志执行(apply)到状态机才会认为写事务成功,这些过程引起较高的时间开销,导致读写操作延迟比较高,使得分布式数据库系统的数据访问性能不佳。173.因此,传统的多副本技术并没有充分发挥多副本的性能优势,仅仅只是提高了数据的可用性,同时传统的分布式一致性协议具有读写操作延迟开销高的问题。174.有鉴于此,本技术实施例提供了一种数据访问方法,在综合考虑负载均衡、数据同步状态以及用户请求类型等因素的前提下,为每个数据访问请求选择最合适的副本,从而提升分布式数据库系统整体的访问性能。针对数据读取请求,对管理数据副本所用的分布式一致性协议进行了修改,在保证数据一致性正确的前提下,增加了从节点响应数据读取请求的流程,并提出了基于放宽读索引(relaxedreadindex,rri)的数据读取方法,从而增大了系统并发度,加快了数据读取请求的处理速度,提高了分布式数据库系统整体的读性能。针对数据写入请求,对分布式一致性协议的写流程进行了优化,提出了基于提交退回(commitreturn,cr)的数据写入方法,从而提高了数据写入的速度,加快了数据写入请求的返回速度,提高了分布式数据库系统整体的写性能。针对数据读写请求,结合上述基于rri的数据读取方法和基于cr的数据写入方法,提高了读写事务的处理速度,加快了数据读写请求的返回速度,提高了分布式数据库系统整体的读写性能,提高了系统并发度,减少了磁盘和网络带宽的占用,有效提高了系统的吞吐量。175.下面将通过几个实施例,以不同类型的数据访问请求为例,对本技术实施例提供的数据访问方法进行说明。在下述实施例中,针对不同的数据访问请求,提供了相应的数据访问方法,从而有效提升了分布式数据库系统的数据访问性能。176.图3是本技术实施例提供的一种数据访问方法的流程图,如图3所示,该实施例应用于分布式数据库系统,该分布式数据库系统包括计算节点和多个存储节点。示意性地,在图3所示的实施例中,该数据访问方法适用于数据访问请求的请求类型为数据读取请求,该数据访问方法应用于如图2所示的htap数据库系统,以计算节点和存储节点之间的交互为例来进行说明。该实施例包括下述步骤。177.301、计算节点响应于第一数据读取请求,确定该第一数据读取请求的第一目标数据所属的第一数据分片,基于该第一数据分片,从多个存储节点中确定多个第一存储节点,该多个第一存储节点用于存储该第一目标数据的多个副本。178.在本技术实施例中,第一数据读取请求用于请求读取第一目标数据。可选地,该第一目标数据为当前态数据或历史态数据,本技术实施例对此不作限定。179.可选地,计算节点对第一数据读取请求进行解析,得到第一目标数据的数据项标识,根据该数据项标识,确定该第一目标数据在当前分布式数据库系统中所属的第一数据分片,并根据该第一数据分片的分片信息,从多个存储节点中确定多个第一存储节点。180.可选地,该分布式数据库系统包括元数据管理层,计算节点在确定第一目标数据所属的第一数据分片后,根据该第一数据分片的分片信息,向元数据管理层发送信息获取请求,并接收该元数据管理层返回的该第一数据分片的分片信息。例如,该分片信息包括:第一目标数据的多个副本各自对应的存储节点的节点信息(包括节点类型、节点负载、与计算节点之间的物理距离等等)、该多个副本各自对应的存储模式的存储信息、该多个副本的数据范围以及主存储节点的节点信息等,本技术实施例对于第一数据分片的分片信息的具体内容不作限定。181.302、计算节点基于该第一数据读取请求,从该多个第一存储节点中确定第一目标存储节点,向该第一目标存储节点发送该第一数据读取请求,该第一目标存储节点的数据访问代价符合第一目标条件。182.在本技术实施例中,多个第一存储节点基于分布式一致性协议实现数据一致性。其中,该多个第一存储节点包括主存储节点和至少一个从存储节点,每个第一存储节点均可以响应该第一数据读取请求,以读取对应节点中存储的第一目标数据的副本。可选地,多个第一存储节点基于分布式一致性协议实现数据一致性,例如,该分布式一致性协议为raft协议,本技术实施例对此不做限定。183.可选地,该分布式数据库系统包括元数据管理层,计算节点在确定第一目标数据所属的第一数据分片后,基于该元数据管理层,获取到该第一数据分片的相关信息,并根据该相关信息和第一数据读取请求,从多个第一存储节点中选出数据访问代价符合第一目标条件的存储节点,将该存储节点确定为第一目标存储节点(确定第一目标存储节点的具体实施方式将在后文进行介绍,此处不再赘述),向该第一目标存储节点发送该第一数据读取请求。184.303、第一目标存储节点基于该第一数据读取请求,读取该第一目标数据,向该计算节点发送第一数据读取结果。185.在本技术实施例中,该第一目标存储节点在接收到该第一数据读取请求后,基于该第一数据读取请求,从该第一目标数据对应的状态机中读取该第一目标数据,并将读取结果发送给计算节点。可选地,该第一目标存储节点根据自身的节点类型和第一目标数据的数据类型,确定相应的读取流程(确定读取流程的具体实施方式将在后文进行介绍,此处不再赘述),并根据该读取流程从该第一目标数据对应的状态机中读取该第一目标数据,并将读取结果发送给计算节点,本技术实施例对此不作限定。186.在本技术实施例提供的数据访问方法中,在分布式数据库系统中,当计算节点接收到数据读取请求时,先根据该数据读取请求的目标数据所属的数据分片,来确定存储有该目标数据的多个副本的多个存储节点,然后按照存储节点访问目标数据的数据访问代价,从这些存储节点中选出符合目标条件的目标存储节点,由该目标存储节点来读取目标数据。上述方法中,由于该目标存储节点是根据数据访问代价来确定的,因此主存储节点和从存储节点都可能成为目标存储节点,避免了由主存储节点处理所有的数据读取请求,从而既保证了多副本带来的高可用性,又提高了数据读取速度,有效提升了分布式数据库系统的数据访问性能。187.上述图3所示的实施例是对本技术提供的数据访问方法的简要说明,下面结合图4,对本技术实施例提供的数据访问方法进行详细介绍。188.图4是本技术实施例提供的一种数据访问方法的流程图,如图4所示,该实施例应用于分布式数据库系统,该分布式数据库系统包括计算节点和多个存储节点。示意性地,在图4所示的实施例中,该数据访问方法适用于数据访问请求的请求类型为数据读取请求,该数据访问方法应用于如图2所示的htap数据库系统,以计算节点和存储节点之间的交互为例来进行说明。该实施例包括下述步骤。189.401、计算节点基于终端发送的连接请求,与终端建立连接。190.在本技术实施例中,计算节点通过无线网络或有线网络与终端相连,终端响应于用户的操作,向计算节点发送连接请求,计算节点接收该连接请求,并基于该连接请求,与终端建立可靠连接。191.402、计算节点响应于第一数据读取请求,确定该第一数据读取请求的第一目标数据所属的第一数据分片,基于该第一数据分片,从多个存储节点中确定多个第一存储节点,该多个第一存储节点用于存储该第一目标数据的多个副本。192.在本技术实施例中,计算节点确定多个第一存储节点的方式与上述步骤301同理,故在此不再赘述。193.在一些实施例中,该多个副本的存储模式包括行存模式、列存模式以及交叉模式等,本技术实施例对此不作限定。其中,该存储模式用于指示数据在存储节点中的存储格式。下面对上述涉及到的几种存储模式进行介绍。194.第一种、行存模式。195.示意性地,参考表1(表中m和n为正整数),在存储节点的状态机中,每一个数据对应表1中的一行完整的记录,如表1中行(row)2所示。需要说明的是,在一些实施例中,行存模式的表格中,行序列(也可以称为排序列,本技术对此不作限定)可以根据需求进行调整。例如,以某一个数据为学生成绩为例,该数据表示为学生(学号,姓名,分数),则可以将学号对应的列(column,col)、姓名对应的列以及分数对应的列作为主行序列,本技术实施例对此不作限定。196.表1[0197]col1col2col3col4col5……colnrow1ꢀꢀꢀꢀꢀꢀꢀrow2xxxxxxxxxxxxxxxxxxxxxrow3ꢀꢀꢀꢀꢀꢀꢀrow4ꢀꢀꢀꢀꢀꢀꢀrow5ꢀꢀꢀꢀꢀꢀꢀ……ꢀꢀꢀꢀꢀꢀꢀrowmꢀꢀꢀꢀꢀꢀꢀ[0198]第二种、列存模式。[0199]示意性地,参考表2(表中m和n为正整数),在存储节点的状态机中,每一个数据对应表2中的某一行数据中某个列的值,如表2中行(row)3列(col)3所示。[0200]表2[0201]col1col2col3col4col5……colnrow1ꢀꢀꢀꢀꢀꢀꢀrow2ꢀꢀꢀꢀꢀꢀꢀrow3ꢀꢀxxxꢀꢀꢀꢀrow4ꢀꢀꢀꢀꢀꢀꢀrow5ꢀꢀꢀꢀꢀꢀꢀ……ꢀꢀꢀꢀꢀꢀꢀrowmꢀꢀꢀꢀꢀꢀꢀ[0202]第三种、交叉模式。[0203]示意性地,参考表3(表中m和n为正整数),在存储节点的状态机中,每一个数据对应表3中的若干行和若干列交叉的数据范围,如表3所示。在一些实施例中,该交叉模式也称为拼贴/瓦片(tile)模式,本技术实施例对此不作限定。[0204]表3[0205]col1col2col3col4col5……colnrow1xxxxxxxxxxxxxxxꢀꢀrow2xxxxxxxxxxxxxxxꢀꢀrow3xxxxxxxxxxxxxxxꢀꢀrow4xxxxxxꢀꢀꢀꢀꢀrow5xxxxxxꢀꢀꢀꢀꢀ……ꢀꢀꢀꢀꢀꢀꢀrowmꢀꢀꢀꢀꢀꢀꢀ[0206]需要说明的是,上述几种存储模式仅为示意性地,在一些实施例中,该多个副本还可以以其他存储模式存储于存储节点中,本技术实施例对于存储模式的具体类型不作限定。[0207]在一些实施例中,在分布式数据库系统的运行过程中,该多个第一存储节点对该多个副本的存储模式进行动态调整(也可以理解为对数据的多个副本进行动态管理)。下面对动态调整的几种情况进行介绍:[0208]情况一、多个第一存储节点基于该多个第一存储节点的负载情况,切换该多个副本的存储模式。[0209]其中,情况一包括下述两种场景:[0210]场景一、多个第一存储节点基于该多个第一存储节点的节点负载大小和可用空间,切换该多个副本的存储模式。[0211]其中,根据存储节点的节点负载大小和可用空间,场景一可以包括两种切换方案。下面以第一数据分片在存储节点a中存储的副本为例,记该副本的原存储模式为s1模式,切换后的该副本的存储模式为s2模式为例,对这两种切换方案进行介绍。[0212]第一种方案、存储节点a的节点负载较小且该节点的可用空间较大,在该存储节点a上切换副本的存储模式。[0213]示意性地,以分布式一致性协议为raft协议为例,存储节点a建立该第一数据分片的一个新的临时副本,该临时副本不计入raft成员(也即是该临时副本不参与raft的所有流程,只同步数据),存储节点a读取所有s1模式的副本的数据,将这些数据转换为存储模式为s2模式的新数据,通过该临时副本将s2模式的新数据持久化存储到状态机中,并将s1模式的副本还未持久化存储的日志同步到该临时副本中,当同步完成后,销毁s1模式的副本,将s2模式的临时副本作为新副本(也可以理解为新成员)加入raft组。[0214]第二种方案、存储节点a的节点负载较大或该节点的可用空间较小,在存储节点b上切换副本的存储模式,该存储节点b的节点负载较小且该节点的可用空间较大。[0215]示意性地,以分布式一致性协议为raft协议为例,存储节点b建立该第一数据分片的一个新的临时副本,该临时副本不计入raft成员(也即是该临时副本不参与raft的所有流程,只同步数据),将s1模式的副本的数据通过快照转移到存储节点b,将这些数据转换为存储模式为s2模式的新数据,通过该临时副本将s2模式的新数据持久化存储到状态机中,并将s1模式的副本还未持久化存储的日志同步到该临时副本中,当同步完成后,销毁s1模式的副本,将s2模式的临时副本作为新副本(也可以理解为新成员)加入raft组。[0216]需要说明的是,在上述两种切换方案中,raft组成员变更、数据在存储节点之间的转移以及快照持久化存储到状态机等,都可以通过raft协议的原有过程实现,因此,上述切换方案保证了分布式数据库系统的正确性。另外,由于存储模式的切换涉及状态机的读取和写入,因此,在切换过程中,通过节点负载大小和可用空间来选择相应的切换方案,充分考虑了状态机的运行情况,保证了分布式数据库系统的可用性。[0217]场景二、多个第一存储节点基于该多个第一存储节点的节点负载大小和每个存储模式下副本的数量,切换该多个副本的存储模式。[0218]其中,在分布式数据库系统中,每个存储模式下副本的数量并不是一成不变的,也可以理解为,多个副本的配置策略并不是一成不变的。多个第一存储节点根据自身的节点负载大小,在保证每个存储模式有可用副本的前提下,将节点负载较小的存储节点对应副本的存储模式切换为节点负载较大的存储节点对应副本的存储模式。[0219]示意性地,以多个副本的存储模式包括行存模式、列存模式以及交叉模式,行存模式下副本的数量为l,列存模式下副本的数量为m,交叉模式下副本的数量为n为例(l、m、n为正整数),当系统在某一时间段内,列存模式下副本所在存储节点处理的数据访问请求较多,且该列存模式下副本所在存储节点的节点负载较大时,将该时间段内处理数据访问请求较少(也即是节点负载较小)且副本数量大于1(也即是确保每个存储模式下存在可用副本)的存储模式下的副本切换为列存模式。[0220]需要说明的是,在系统运行的过程中,根据节点负载大小和每个存储模式下副本的数量来切换多个副本的存储模式,在保证每个存储模式有可用副本的前提下,及时切换副本的存储模式,可以更好的应对系统运行过程中负载发生变化的情况,从而有效提升分布式数据库系统的数据访问性能。[0221]情况二、若该多个副本中存在至少一个副本异常,多个第一存储节点基于该至少一个副本,建立至少一个新副本。[0222]其中,副本异常是指副本不可用,也可以理解为副本出现错误导致副本无法正常工作。当多个副本中存在至少一个副本异常,则多个第一存储节点基于该至少一个副本的数量,建立至少一个新副本,也即是副本的总数符合预设总数。[0223]对于至少一个新副本中的任一新副本,若系统中已存在同样存储模式的其他副本,且该其他副本已与主存储节点完成同步,则该新副本所在存储节点从该其他副本同步数据,若系统中不存在同样存储模式的其他副本,则通过快照转移的方式,从主存储节点中同步数据,并将数据转换为相应的存储模式进行持久化存储。[0224]在一些实施例中,至少一个新副本的存储模式与出现异常的至少一个副本的存储模式相同。在一些实施例中,至少一个新副本的存储模式与出现异常的至少一个副本的存储模式不同,由分布式数据库系统当前的副本配置策略决定,也即是,至少一个新副本的存储模式不一定与出现异常前的状态保持一致,本技术实施例对此不作限定。[0225]需要说明的是,在该情况二中,副本异常、建立新副本的过程中以及新副本建立后数据分片的可用性和副本数据的正确性由分布式一致性协议保证,例如,该分布式一致性协议为raft协议。另外,在系统运行的过程中,通过在副本出现异常的情况下及时建立新副本,确保了系统中各个副本的可用性,从而有效提升了分布式数据库系统的数据访问性能。[0226]情况三、若该第一数据分片发生数据分裂,生成至少一个第二数据分片,该多个第一存储节点基于该至少一个第二数据分片,建立该至少一个第二数据分片对应的多个副本。[0227]其中,数据分裂是指当一个数据分片过大或该数据分片过热时,为了均衡负载,分布式数据库系统对该数据分片进行再分裂操作,使该数据分片裂变为两个数据分片。[0228]在一些实施例中,该至少一个第二数据分片对应的多个副本的存储模式与第一数据分片的多个副本的存储模式相同。在一些实施例中,该至少一个第二数据分片对应的多个副本的存储模式与第一数据分片的多个副本的存储模式不同,由分布式数据库系统当前的副本配置策略决定,也即是,该至少一个第二数据分片对应的多个副本的存储模式不一定与发生数据分裂前的状态保持一致,本技术实施例对此不作限定。[0229]在一些实施例中,当行存模式副本进行数据分裂时,只需要分别迁移部分数据即可;当列存模式副本进行数据分裂时,由于列存模式下重新组织所有行代价较大,因此行存模式副本进行数据分裂后,将分裂后的数据转换为列存模式,完成转换后销毁被分裂的列存模式副本。通过这种方式,能够减少分布式数据库系统在数据分裂时所需处理的数据量,从而提高数据分裂效率。[0230]情况四、多个第一存储节点基于该多个第一存储节点的节点类型,调整该多个副本的存储模式。[0231]其中,多个第一存储节点中存在主存储节点和从存储节点,对于不同节点类型的存储节点,其存储模式不同。例如,主存储节点的存储模式为列存模式,从存储节点的存储模式包括行存模式以及交叉模式等,当某一存储节点通过选举称为主存储节点时,该存储节点将副本的存储模式调整为列存模式,本技术实施例对此不作限定。[0232]需要说明的是,上述几种动态调整的情况仅为示意性地,在一些实施例中,该多个第一存储节点还可以以其他方式对多个副本进行动态调整,本技术实施例对于动态调整的具体方式不作限定。另外,在一些实施例中,多个第一存储节点通过格式转换器来实现存储模式的切换,具体可参考上述图2所示的htap数据库系统中的存储层203,本技术在此不再赘述。[0233]通过在分布式数据库系统的运行过程中,对数据的多个副本进行动态调整,能够更好的应对系统运行过程中负载发生变化的情况,从而有效提升分布式数据库系统的数据访问性能。[0234]403、计算节点基于该第一数据读取请求,从该多个第一存储节点中确定第一目标存储节点,向该第一目标存储节点发送该第一数据读取请求,该第一目标存储节点的数据访问代价符合第一目标条件。[0235]在本技术实施例中,计算节点基于该第一数据读取请求和多个第一存储节点的节点信息,确定多个第一存储节点的数据访问代价,将符合第一目标条件的第一存储节点作为第一目标存储节点,并向该第一目标存储节点发送该第一数据读取请求。在一些实施例中,第一目标条件是指对应第一存储节点的数据访问代价最低。[0236]在一些实施例中,数据访问代价用于指示存储节点的执行时间、等待时间以及传输时间。其中,执行时间包括存储节点查询第一目标数据的时间、处理数据量(也即是输入输出(inputoutput,io)数据量)的时间以及元组构建时间;等待时间包括存储节点的请求队列时间、设备负载延迟时间以及数据同步时间;传输时间包括网络传输时间。[0237]示意性地,为了便于描述,上述数据访问代价所涉及的各项时间的表示形式如表4所示:[0238]表4[0239][0240]由表4可知,数据访问代价t=执行时间tproc 等待时间twait 传输时间ttrans。其中,执行时间tproc=查询时间tsearch 处理时间tio 元组构建时间tcons,等待时间twait=请求队列时间tqueue 设备负载延迟时间tload 数据同步时间tsync。[0241]在一些实施例中,该第一目标存储节点的数据访问代价符合第一目标条件,包括下述几种情况:[0242]情况一、该第一目标存储节点中该第一目标数据的存储模式为列存模式,且该数据读取请求所需访问的列数与总列数之间的比值小于第一阈值。[0243]其中,第一阈值为预设阈值,在一些实施例中,该第一阈值可以根据需求进行调整,本技术实施例对此不作限定。上述情况一还可以概括为该数据读取请求为宽表少列查询请求,也即是,该数据读取请求为在一个列的数量比较多的表(即“宽表”)上只涉及少部分列(即“少列”)的查询请求。[0244]需要说明的是,在分布式数据库系统中,副本的存储模式与存储节点的执行时间相关。示意性地,参考表4,查询列存模式副本所涉及的查询时间tsearch和处理时间tio少于查询行存模式副本所涉及的查询时间tsearch和处理时间tio,查询列存模式副本所涉及的列数越多,元组构建时间tcons越久。因此,对于数据读取请求,若该请求所需访问的列数与表中总列数之间的比值小于第一阈值,则存储有列存模式副本的存储节点的执行时间tproc最少,相应地,该存储节点的数据访问代价最低。[0245]情况二、该第一目标存储节点的节点负载小于该多个存储节点中除该第一目标存储节点以外的存储节点的节点负载。[0246]其中,副本所在存储节点的节点负载与存储节点的等待时间相关。示意性地,参考表4,存储节点的节点负载越小,该存储节点的请求队列时间tqueue和设备负载延迟时间tload越少。因此,若某一存储节点的节点负载最小,则该存储节点的等待时间twait最少,相应地,该存储节点的数据访问代价最低。[0247]情况三、该第一目标存储节点与该计算节点之间的物理距离小于该多个存储节点中除该第一目标存储节点以外的存储节点与该计算节点之间的物理距离。[0248]其中,副本所在存储节点与计算节点之间的物理距离与传输时间相关。示意性地,参考表4,存储节点与计算节点之间的物理距离越小,该存储节点的网络传输时间ttrans越少。因此,若某一存储节点与计算节点之间的物理距离最小,则该存储节点的传输时间ttrans最少,相应地,该存储节点的数据访问代价最低。另外,由于多个副本可能分散在不同机房甚至不同的数据中心,因此将距离计算节点最近的第一存储节点作为第一目标存储节点,可以有效减少网络传输的开销。[0249]情况四、该第一目标存储节点的数据同步状态在该多个存储节点中除该第一目标存储节点以外的存储节点的数据同步状态之后。[0250]其中,副本所在存储节点的数据同步状态与存储节点的等待时间相关。示意性地,参考表4,存储节点的数据同步状态越新,该存储节点的数据同步时间tsync越少。因此,对于数据读取请求而言,该请求需要等待存储节点的日志同步到最新状态,若存在某一存储节点的数据同步状态最新,则该存储节点的等待时间twait最少,相应地,该存储节点的数据访问代价最低。[0251]在一些实施例中,上述所示的四种情况也可以理解为计算节点通过数据访问代价来确定第一目标存储节点的四种策略,也即是,通过上述策略,从多个第一存储节点中选出数据访问代价最低的存储节点,将该存储节点作为第一目标存储节点。[0252]在一些实施例中,计算节点根据上述任一种策略来确定第一目标存储节点。在另一些实施例中,计算节点通过权重等方式将上述几种策略结合以确定第一目标存储节点。例如,参考表4,对于任一第一存储节点,其数据访问代价表示为:t1=a1(tsearch tio) 1/a1(tcons) a2(tqueue tload) a3(ttrans) a4(tsync),其中,a1、a2、a3以及a4分别表示上述四种策略对应的权重。应理解,上述权重以及策略的选择可以根据实际情况进行调整,例如,仅选择两种策略以权重的方式结合等等,本技术实施例对此不作限定。另外,在一些实施例中,由于节点性能、网络速度等因素的影响,存储节点的执行时间tproc、等待时间twait以及传输时间ttrans的量级存在差异,因此,权重的设置应保证尽可能加速总时间较长的部分。[0253]在一些实施例中,数据访问代价用于指示存储节点在单位时间内的执行时间、等待时间以及传输时间。也即是,在上述表4所示的数据访问代价t的基础上,将数据访问代价t与存储节点随机读取一个数据页的时间t0之比作为数据访问代价t′。通过这种方式,能够统一各个存储节点的数据访问代价,从而提高了计算节点确定第一目标存储节点的准确性。[0254]需要说明的是,经过上述步骤403,计算节点将多个第一存储节点中数据访问代价符合目标条件的存储节点作为第一目标存储节点,这一过程也可以称为计算节点制定查询计划的过程,在这一过程中,考虑到了存储模式、负载均衡以及请求的延迟时间等多方面的因素,最大限度发挥了多副本存储的并发和存储优势,提高系统整体性能。根据每个存储节点的数据访问代价,选择最佳副本作为访问目标,并向该副本对应的存储节点发送数据读取请求,有利于降低瓶颈发生的可能,提高系统的整体吞吐量。而且,在这一过程中,计算节点是根据数据访问代价来确定第一目标存储节点的,因此,无论是主存储节点还是从存储节点都有可能成为第一目标存储节点,换言之,在本技术实施例所涉及的分布式数据库系统中,允许从不同类型的存储节点中读取数据,从而提高了多副本存储的读操作并发度,保证了多副本带来的高可用性以及多副本间的数据一致性,又增加了系统的并发度,有效提高了系统的数据访问性能。[0255]经过上述步骤401至步骤403,计算节点在接收到终端发送的数据读取请求后,确定了该数据读取请求的第一目标数据的多个副本所在的存储节点,并根据各个存储节点的数据访问代价,从中确定了第一目标存储节点。下面将通过步骤404至步骤411,对第一目标存储节点读取第一目标数据的实施方式进行介绍。[0256]404、第一目标存储节点基于第一目标数据的数据类型,确定该第一目标数据为当前态数据。[0257]在本技术实施例中,第一目标存储节点根据第一目标数据的数据类型不同,采用不同的数据读取方式来读取第一目标数据。其中,当第一目标数据为当前态数据时,第一目标存储节点基于该第一数据读取请求和该第一目标存储节点的节点类型,读取该第一目标数据(也即是下述步骤405至步骤408)。[0258]405、若第一目标存储节点为主存储节点,则第一目标存储节点执行下述步骤406和步骤408,若第一目标存储节点为从存储节点,则第一目标存储节点执行下述步骤407和步骤408。[0259]在本技术实施例中,第一目标存储节点在接收到计算节点发送的数据读取请求时,根据当前节点的节点类型,采用不同的数据读取方式来读取第一目标数据。其中,当第一目标存储节点为主存储节点时,第一目标存储节点根据放宽读索引(relaxedreadindex,rri(为便于描述,以下均简称为rri))来读取第一目标数据(也即是下述步骤406,rri的含义会在下述步骤406中进行详细介绍,此处不再赘述)。当第一目标存储节点为从存储节点时,第一目标存储节点从主存储节点中获取rri后读取第一目标数据(也即是下述步骤407)。[0260]406、第一目标存储节点基于该第一数据读取请求,确定该第一目标数据的第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据,该第一读索引用于指示基于该第一数据读取请求读取该第一目标数据的最小读索引。[0261]在本技术实施例中,第一目标存储节点为主存储节点,该第一目标数据的第一读索引即为第一目标数据的rri,该第一读索引的值小于等于读索引(readindex)的值。通俗来讲,rri表示当前存储节点基于数据读取请求,能够接受的最小的读索引(readindex),只要保证执行索引(applyindex)大于rri,就能确保当前存储节点读到的都是最新的数据。在一些实施例中,第一目标存储节点根据rri读取第一目标数据的方式也可以称为放宽读(relaxedreadread,rrr)。[0262]应理解,在相关分布式一致性协议(例如raft协议)中,为保证数据的一致性,存储节点需要在读取数据之前将已经提交(commit)的日志全部执行(apply)到状态机中,以保证数据的一致性,这一过程引起较高的时间开销,导致数据访问性能不佳。而在本技术实施例中,通过引入rri这一索引,使得存储节点在保证读取的数据正确性的前提下,减少需要执行的日志的数量,实现了提前读取数据,提高了数据读取请求的处理效率,从而有效提升了分布式数据库系统的数据访问性能。[0263]下面对本步骤406中第一目标存储节点确定第一目标数据的第一读索引的具体实施方式进行介绍,包括下述步骤4061至步骤4063:[0264]4061、第一目标存储节点更新当前时刻的提交索引,该提交索引用于指示日志列表中已提交日志的最大索引。[0265]其中,第一目标存储节点更新当前时刻的提交索引(commitindex)是指将数据读取请求所需的读索引(readindex)设置为当前节点的提交索引(commitindex)。[0266]在一些实施例中,第一目标存储节点在确认节点类型为主存储节点之后,更新当前时刻的提交索引(commitindex)。由于可能出现的网络分区会导致该第一目标存储节点仍认为自己是主存储节点,但在集群中已经存在更新的主存储节点的情况,因此,通过这种先确认身份再更新提交索引的方式,能够避免上述情况的出现,从而确保数据读取的准确性。[0267]4062、第一目标存储节点按照第一顺序,扫描该日志列表中存储的日志,该第一顺序是指从该提交索引至该日志列表的执行索引,该执行索引用于指示该日志列表中已执行日志的最大索引。[0268]其中,在日志列表中,执行索引(applyindex)的值小于提交索引(commitindex)的值。第一目标存储节点按照第一顺序扫描日志列表中存储的日志也可以理解为第一目标存储节点从提交索引(commitindex)开始从后向前反向扫描日志列表,一直到执行索引(applyindex)为止。[0269]4063、若存在第一目标日志,该第一目标存储节点基于该第一目标日志的日志索引,确定该第一读索引,该第一目标日志所操作的数据为该第一目标数据;若不存在该第一目标日志,该第一目标存储节点基于该执行索引,确定该第一读索引。[0270]其中,第一目标存储节点在执行上述步骤4062的过程中,若扫描到一条日志所操作的数据为该第一目标数据,则该条日志即为第一目标日志,将该第一读索引设置为该第一目标日志的日志索引(logindex);若扫描结束后,该日志列表中不存在上述第一目标日志,则将该第一读索引设置为该日志列表的执行索引(applyindex)。[0271]下面参考图5,对上述步骤4061至步骤4063所示的确定第一读索引的方式进行举例说明。图5是本技术实施例提供的一种确定第一读索引的示意图。如图5所示,日志列表中日志索引(logindex)的值为1至8,分别代表日志1(log1)至日志8(log8),执行索引(applyindex)为2,提交索引(commitindex)为7。示意性地,第一目标存储节点从日志7(log7)开始,逐个向前扫描,若存在一条日志满足“日志所操作的数据为第一目标数据”,将第一读索引(也即rri)设置为该条日志的日志索引(logindex),并提前结束扫描。例如,以第一目标数据为x为例,该第一目标数据x的rri为7。同理,以第一目标数据为y为例,该第一目标数据y的rri为6;以第一目标数据为z为例,该第一目标数据z的rri为3;以第一目标数据为w为例,该第一目标数据w的rri为2。[0272]经过上述步骤4061至步骤4063,第一目标存储节点确定了第一目标数据的第一读索引,当该第一目标存储节点的状态机中的执行索引大于该第一读索引,即能以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据。通过这种方式,在确保读取的第一目标数据的正确性的前提下,减少了数据读取请求的处理时间,从而有效提升了分布式数据库系统的数据访问性能。[0273]在一些实施例中,当第一目标存储节点确定第一目标数据的第一读索引之后,将该第一读索引进行存储,以便再次接收到相同的数据读取请求时,通过查表来读取相应的数据。下面通过下述两个步骤来对这种可选实施方式进行介绍:[0274]步骤一、第一目标存储节点将该第一读索引存储至第一列表,该第一列表包括该第一目标数据、该第一读索引以及第一校验索引,该第一校验索引用于指示该第一目标存储节点确定该第一读索引时对应的提交索引,该提交索引用于指示日志列表中已提交日志的最大索引。[0275]步骤二、当该分布式数据库系统处理第二数据读取请求时,若该第二数据读取请求的数据为该第一目标数据,查询该第一列表以读取该第一目标数据。[0276]其中,当该分布式数据库系统处理查询第一列表以读取该第一目标数据的方式包括下述两种情况:[0277]情况一、第一列表中第一目标数据的提交索引(commitindex)等于对应的第一校验索引(checkindex),则将第一列表中该第一目标数据对应的rri作为第二数据读取请求对应的rri,用于读取第一目标数据。[0278]情况二、第一列表中第一目标数据的提交索引(commitindex)大于对应的第一校验索引(checkindex),表明此时的rri并不一定是最新的,也即是根据此时的rri读取到的数据并不一定是最新的数据。在该情况下,分布式数据库系统需要按照上述步骤4062至步骤4063所示的方法,扫描日志列表中存储的日志,来确定第二数据读取请求对应的rri。需要说明的是,在扫描时,从日志列表中提交索引(commitindex)对应的日志开始扫描,直至第一校验索引(checkindex)为止。[0279]在一些实施例中,若该第一列表中数据项的数量大于或等于预设阈值,则删除该第一列表中的至少一个数据项和对应的rri,该至少一个数据项的rri小于执行索引(applyindex)。例如,该预设阈值为100,本技术实施例对此不作限定。[0280]下面参考图6,对上述存储第一读索引以及处理第二数据读取请求的可选实施方式进行举例说明。图6是本技术实施例提供的一种存储第一读索引的示意图。如图6图所示,第一目标存储节点将扫描日志列表后的结果存储在列表中,该列表中包括数据项、数据项对应的rri以及校验索引(checkindex),其中,校验索引(checkindex)的值等于提交索引(commitindex)的值。当分布式数据库系统处理第二数据读取请求时,先在表中查看rri和校验索引(checkindex)。如果提交索引(commitindex)等于校验索引(checkindex),则按照表中rri的值作为第二数据读取请求对应的rri。示意性地,如图6中(a)和(b)图所示,当第二数据读取请求读取x时,由于表中的提交索引(commitindex)等于校验索引(checkindex),所以无需做额外操作。如果提交索引(commitindex)大于校验索引(checkindex),说明此时的rri不一定是最新的,需要扫描日志列表,扫描时从日志列表中提交索引(commitindex)对应的日志开始扫描,直至校验索引(checkindex)为止。图6中(c)和(d)图与(a)和(b)图同理,故在此不再赘述。[0281]需要说明的是,通过这种将第一读索引存储至第一列表的方式,能够避免多次重复扫描日志列表,减少数据处理量,从而节约计算资源。另外,由于该第一列表的信息是在每次处理数据读取请求时更新的,所以这种可选实施方法也可以称为读时更新法。应理解,实验表明执行索引(applyindex)和提交索引(commitindex)之间的差距一般不会超过10,因此第一列表的大小足以放置于内存中。如果出现了第一列表满了的情况,就说明此时当前存储节点的状态机远远落后于日志。因此可以暂停维护这张表,阻塞数据读取请求,等待执行索引(applyindex)等于提交索引(commitindex)时,再恢复服务。进一步地,因为第一列表的信息完全可以由任意时刻的分布式一致性协议的状态推出,所以不需要存放于持久化存储中。当需要做故障恢复时,只需要根据分布式一致性协议当时的状态,利用上述方法重构该表即可。[0282]经过步骤406,在第一目标存储节点为主存储节点的情况下,通过确定rri的方式,读取到了第一目标数据。这种数据读取的过程也可以概括为主节点读请求(leaderread)处理流程,下面参考图7,对这一主节点读请求处理流程进行示意性说明。图7是本技术实施例提供的一种主节点读请求处理流程的示意图。如图7所示,该主节点读请求处理流程由第一目标存储节点执行,包括下述步骤(1)至步骤(7):[0283](1)接收数据读取请求。[0284](2)判断当前存储节点是否为主存储节点,若是,执行下述步骤(4),若不是,执行下述步骤(3)。[0285](3)将数据读取请求转发给主存储节点。[0286](4)更新当前时刻的提交索引(commitindex)。[0287](5)确定第一读索引(也即是rri)。[0288](6)按照第一读索引,将日志执行到状态机中。[0289](7)从状态机中读取数据。[0290]需要说明的是,上述步骤(1)至步骤(7)的具体实施方式与步骤406同理,故在此不再赘述。[0291]应理解,相关技术中,raft协议为保障严格的一致性,确保上层应用不会因为读到旧的数据而导致业务逻辑出错,每次在读取数据之前都必须保证执行索引(applyindex)超过读索引(readindex)。由于raft协议在处理数据访问请求时,只有日志写入是同步的,而执行到状态机的过程是异步的,因此在raft正常运行时,经常会出现执行索引(applyindex)小于读索引(readindex)的情况。在执行索引(applyindex)增加到读索引(readindex)的这段时间里,用户都无法读取数据,即使要读的数据与这些操作没有关系。这一严格的限制提高了数据读取请求的延迟,降低了整体系统的性能。而本技术通过引入放宽读索引rri,不再要求存储节点必须在执行索引(applyindex)超过读索引(readindex)时才可以读取结果,而是在与数据读取请求相关指令日志执行到状态机后(也即是执行索引(applyindex)超过rri)即可从状态机中读取数据,从而减少数据读取请求的等待时间,并且确保了所读取的数据是最新的,有效提高了分布式数据库系统的数据访问性能。[0292]407、第一目标存储节点基于该第一数据读取请求,从该主存储节点中获取该第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据。[0293]在本技术实施例中,当第一目标存储节点为从存储节点时,该第一目标存储节点基于该第一数据读取请求,向主存储节点发送读索引获取请求,以获取第一目标数据的第一读索引。在一些实施例中,第一目标存储节点通过远程过程调用(remoteprocedurecall,rpc)与主存储节点通信,本技术实施例对此不作限定。[0294]在一些实施例中,该第一目标存储节点以该第一读索引为起点,从第一目标数据对应的状态机中读取第一目标数据的方式包括下述任一种情况:[0295]情况一、若第一目标存储节点中存在该第一读索引对应的日志,该第一目标存储节点对该第一读索引对应的日志进行持久化存储,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据。[0296]其中,第一目标存储节点在获取到第一读索引后,通过查询本地的日志列表,确定存在索引为第一读索引的日志记录,然后进行日志回放,将该条日志进行持久化存储(也即是将数据持久化到状态机),完成与主存储节点的数据同步,之后,第一目标存储节点以该第一读索引为起点,从该第一目标存储节点对应的状态机中读取该第一目标数据。[0297]需要说明的是,在一些实施例中,由于网络、机器硬件、io调度等原因,从存储节点和主存储节点持久化存储的时机不一定保持一致(也可以理解为日志和数据落盘的时机不一定保持一致),因此通过上述日志回放以持久化存储的方式能够确保数据一致性。[0298]情况二、若该第一目标存储节点中不存在该第一读索引对应的日志,该第一目标存储节点从该主存储节点中获取该第一读索引对应的日志,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据。[0299]其中,第一目标存储节点在获取到第一读索引后,通过查询本地的日志列表,未查询到索引为第一读索引的日志记录,然后该第一目标存储节点向主存储节点发送日志获取请求,以获取第一读索引对应的日志,之后,第一目标存储节点以该第一读索引为起点,从该第一目标存储节点对应的状态机中读取该第一目标数据。[0300]经过步骤407,在第一目标存储节点为从存储节点的情况下,通过向主存储节点获取第一读索引的方式,读取到了第一目标数据。这种数据读取的过程也可以概括为从节点读请求(followerread)处理流程,下面参考图8,对这一从节点读请求处理流程进行示意性说明。图8是本技术实施例提供的一种从节点读请求处理流程的示意图。如图8所示,该从节点读请求处理流程包括下述步骤(1)至步骤(5):[0301](1)从存储节点接收数据读取请求。[0302](2)从存储节点向主存储节点请求第一读索引(也即是rri)。[0303](3)主存储节点确定第一读索引(这一过程参考上述步骤406,在此不再赘述),并将第一读索引发送给从存储节点。[0304](4)从存储节点按照第一读索引,将日志执行到状态机中。[0305](5)从存储节点从状态机中读取数据。[0306]需要说明的是,上述步骤(1)至步骤(5)的具体实施方式与步骤407同理,故在此不再赘述。[0307]经过上述步骤405至步骤407,当第一目标数据为当前态数据时,第一目标存储节点基于该第一数据读取请求和该第一目标存储节点的节点类型,采用不同的数据读取方式,读取到了该第一目标数据。下面将通过步骤408至步骤410,对第一目标数据为历史态数据时,第一目标存储节点读取第一目标数据的方式进行介绍。[0308]408、第一目标存储节点向该计算节点发送第一数据读取结果。[0309]在本技术实施例中,第一目标存储节点基于从第一目标数据对应的状态机中读取到的第一目标数据,生成第一数据读取结果,将该第一数据读取结果发送给计算节点,由计算节点将第一数据读取结果反馈至终端。在一些实施例中,第一目标存储节点将从第一目标数据对应的状态机中读取到的第一目标数据作为第一数据读取结果,发送给计算节点,由计算节点将第一数据读取结果反馈至终端,本技术实施例对此不作限定。[0310]需要说明的是,上述步骤404至步骤408是第一目标数据为当前态数据时,第一目标存储节点读取第一目标数据的方式,在一些实施例中,上述步骤404至步骤408能够替换为下述步骤404′至步骤408′。[0311]404′、第一目标存储节点基于第一目标数据的数据类型,确定该第一目标数据为历史态数据。[0312]其中,当第一目标数据为历史态数据时,第一目标存储节点基于该第一数据读取请求和该第一目标数据的事务完成时间,读取该第一目标数据(也即是下述步骤405′至步骤408′)。[0313]405′、若该第一目标数据的数据提交时间在该事务完成时间之前,则该第一目标存储节点执行下述步骤406′和步骤408′,若该第一目标数据的数据提交时间在该事务完成时间之后,则第一目标存储节点执行下述步骤407′和步骤408′。[0314]在本技术实施例中,第一目标存储节点在接收到计算节点发送的数据读取请求时,获取第一目标数据的关键字(key)和该第一目标数据对应的事务完成时间,根据第一目标数据的数据提交时间是否在事务完成时间之前,采用不同的数据读取方式来读取第一目标数据。其中,当第一目标数据的数据提交时间在该事务完成时间之前时,第一目标存储节点按照第二顺序扫描日志列表,以确定第一读索引(也即是rri),从而读取第一目标数据(也即是下述步骤406′)。当第一目标数据的数据提交时间在事务完成时间之后时,第一目标存储节点按照第三顺序扫描日志列表,以确定第一读索引,从而读取第一目标数据(也即是下述步骤407′)。[0315]406′、第一目标存储节点基于第一数据读取请求和事务完成时间,按照第二顺序,扫描日志列表中存储的日志,确定第一读索引,以该第一读索引为起点,从第一目标数据对应的状态机中读取该第一目标数据。[0316]在本技术实施例中,该第二顺序是指从该日志列表的提交索引(commitindex)至该日志列表的执行索引(applyindex)。第一目标存储节点按照第二顺序扫描日志列表中存储的日志也可以理解为第一目标存储节点从提交索引(commitindex)开始从后向前反向扫描日志列表,一直到执行索引(applyindex)为止。[0317]其中,第一目标存储节点通过扫描日志列表来确定第一读索引,包括下述任一种情况:[0318]情况一、若存在第二目标日志,且该第一目标数据的事务完成时间与该第二目标日志的事务完成时间相同,或该第一目标数据的事务完成时间在该第二目标日志的事务完成时间之后,基于该第二目标日志的日志索引,确定该第一读索引,该第二目标日志所操作的数据为该第一目标数据。[0319]其中,日志列表中包括日志时间信息,该日志时间信息用于指示每条日志的事务完成时间。第一目标存储节点在扫描日志列表的过程中,扫描到一条日志所操作的数据为该第一目标数据,且第一目标数据的事务完成时间与该条日志的事务完成时间相同,或,第一目标数据的事务完成时间在该第二目标日志的事务完成时间之后,则该条日志即为上述第二目标日志,将该第一读索引设置为该第二目标日志的日志索引(logindex)。[0320]情况二、若不存在该第二目标日志,基于该日志列表的执行索引,确定该第一读索引。[0321]其中,第一目标存储节点扫描日志列表后,未扫描到上述第二目标日志,则将该第一读索引设置为该日志列表的执行索引(applyindex)。[0322]下面参考图9,对本步骤406′所示的确定第一读索引的方式进行举例说明。图9是本技术实施例提供的一种确定第一读索引的示意图。如图9所示,日志列表中包括日志时间信息,用于指示每条日志的事务完成时间,也可以称为事务完成时间戳(txncommitts)。日志列表中日志索引(logindex)的值为1至8,分别代表日志1(log1)至日志8(log8),执行索引(applyindex)为2,提交索引(commitindex)为7。示意性地,第一目标存储节点从日志7(log7)开始,逐个向前扫描,若存在一条日志满足“日志所操作的数据为第一目标数据”且“第一目标数据的事务完成时间戳大于或等于该条日志的事务完成时间戳”(这一过程也可以理解为旨在发现日志列表中未被执行的、且接下来会被读到的旧数据),将第一读索引(也即rri)设置为该条日志的日志索引(logindex),并提前结束扫描。若扫描结束后,不存在上述所示的日志,则将第一读索引设置为该条日志的执行索引(applyindex)。[0323]需要说明的是,对于本技术实施例所应用的分布式数据库系统而言,该分布式数据库系统为支持mvcc的数据库,读取某一版本之前的数据是一种需求。比如olap需要分析前天的统计数据,此时不需要最新的数据在状态机中,底层存储提供最新的数据并不是必要的。因此,上述步骤406′所示的读取第一目标数据的方式也可以称为读取旧数据,这一过程简称为旧数据读请求处理流程。下面参考图10,对这一旧数据读请求处理流程进行示意性说明。图10是本技术实施例提供的一种旧数据读请求处理流程的示意图。如图10所示,该旧数据读请求处理流程由第一目标存储节点执行,包括下述步骤(1)至步骤(7):[0324](1)获取第一目标数据的关键字(key)和第一目标数据的事务完成时间。[0325](2)从提交索引(commitindex)开始从后向前进行反向扫描日志列表,一直到执行索引(applyindex)为止。[0326](3)判断日志列表中是否存在第二目标日志,且该第一目标数据的事务完成时间与该第二目标日志的事务完成时间相同,或该第一目标数据的事务完成时间在该第二目标日志的事务完成时间之后,若是,执行下述步骤(4),若不是,执行下述步骤(5)。[0327](4)基于第二目标日志的日志索引确定第一读索引。[0328](5)基于日志列表的执行索引确定第一读索引。[0329](6)按照第一读索引,将日志执行到状态机中。[0330](7)从状态机中读取数据。[0331]需要说明的是,上述步骤(1)至步骤(7)的具体实施方式与步骤406′同理,故在此不再赘述。[0332]经过步骤406′,第一目标存储节点在第一目标数据为旧数据时,通过确定第一读索引,引入放宽读方法,从而减少了数据读取请求的处理时间,提高了分布式数据库系统的数据访问效率。[0333]407′、该第一目标存储节点基于该第一数据读取请求和该事务完成时间,按照第三顺序,扫描该日志列表中存储的日志,确定该第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据。[0334]在本技术实施例中,该第三顺序是指从该日志列表的执行索引(applyindex)至该日志列表的提交索引(commitindex)。第一目标存储节点按照第三顺序扫描日志列表中存储的日志也可以理解为第一目标存储节点从执行索引(applyindex)开始向前往后正向扫描日志列表,一直到提交索引(commitindex)为止。[0335]其中,第一目标存储节点通过扫描日志列表来确定第一读索引,包括下述任一种情况:[0336]情况一、若存在第三目标日志,且该第一目标数据的事务完成时间与该第三目标日志的事务完成时间相同,或该第一目标数据的事务完成时间在该第三目标日志的事务完成时间之后,基于该第三目标日志的日志索引,确定该第一读索引,该第三目标日志所操作的数据为该第一目标数据。[0337]其中,日志列表中包括日志时间信息,该日志时间信息用于指示每条日志的事务完成时间。第一目标存储节点在扫描日志列表的过程中,扫描到一条日志所操作的数据为该第一目标数据,且第一目标数据的事务完成时间与该条日志的事务完成时间相同,或,第一目标数据的事务完成时间在该第三目标日志的事务完成时间之后,则该条日志即为上述第三目标日志,将该第一读索引设置为该第三目标日志的日志索引(logindex)。[0338]情况二、若不存在该第三目标日志,基于该日志列表的执行索引,确定该第一读索引。[0339]其中,第一目标存储节点扫描日志列表后,未扫描到上述第三目标日志,则将该第一读索引设置为该日志列表的执行索引(applyindex)。[0340]下面继续参考图9,对本步骤407′所示的确定第一读索引的方式进行举例说明。如图9所示,日志列表中包括日志时间信息,用于指示每条日志的事务完成时间,也可以称为事务完成时间戳(txncommitts)。日志列表中日志索引(logindex)的值为1至8,分别代表日志1(log1)至日志8(log8),执行索引(applyindex)为2,提交索引(commitindex)为7。示意性地,第一目标存储节点从日志2(log2)开始,逐个向后扫描,若存在一条日志满足“日志所操作的数据为第一目标数据”且“第一目标数据的事务完成时间戳大于或等于该条日志的事务完成时间戳”(这一过程也可以理解为旨在发现日志列表中未被执行的、且接下来会被读到的非最新数据),将第一读索引(也即rri)设置为该条日志的日志索引(logindex),并提前结束扫描。若扫描结束后,不存在上述所示的日志,则将第一读索引设置为该条日志的执行索引(applyindex)。[0341]需要说明的是,对于本技术实施例所应用的分布式数据库系统而言,该分布式数据库系统为支持mvcc的数据库,读取某一版本之后的数据也是一种需求。比如事务需要读取某一时间戳之后的数据即可,并不需要数据是最新的。因此,上述步骤407′所示的读取第一目标数据的方式也可以称为读取非最新数据,这一过程简称为非最新数据读请求处理流程。下面参考图11,对这一非最新数据读请求处理流程进行示意性说明。图11是本技术实施例提供的一种非最新数据读请求处理流程的示意图。如图11所示,该非最新数据读请求处理流程由第一目标存储节点执行,包括下述步骤(1)至步骤(7):[0342](1)获取第一目标数据的关键字(key)和第一目标数据的事务完成时间。[0343](2)从执行索引(applyindex)开始向前往后进行正向扫描日志列表,一直到提交索引(commitindex)为止。[0344](3)判断日志列表中是否存在第三目标日志,且该第一目标数据的事务完成时间与该第三目标日志的事务完成时间相同,或该第一目标数据的事务完成时间在该第三目标日志的事务完成时间之后,若是,执行下述步骤(4),若不是,执行下述步骤(5)。[0345](4)基于第三目标日志的日志索引确定第一读索引。[0346](5)基于日志列表的执行索引确定第一读索引。[0347](6)按照第一读索引,将日志执行到状态机中。[0348](7)从状态机中读取数据。[0349]需要说明的是,上述步骤(1)至步骤(7)的具体实施方式与步骤407′同理,故在此不再赘述。[0350]经过步骤407′,第一目标存储节点在第一目标数据为非最新数据时,通过确定第一读索引,引入放宽读方法,从而减少了数据读取请求的处理时间,提高了分布式数据库系统的数据访问效率。[0351]408′、第一目标存储节点向该计算节点发送第一数据读取结果。[0352]在本技术实施例中,步骤408′与上述步骤408同理,故在此不再赘述。[0353]经过上述步骤404′至步骤408′,当第一目标数据为历史态数据时,第一目标存储节点基于该第一数据读取请求和第一目标数据的事务完成时间,采用不同的数据读取方式,读取到了该第一目标数据。这一过程也可以称为特殊时间版本数据的读取过程。通过确定放宽读索引的方式,减少了数据读取请求的处理时间,从而有效提升了分布式数据库系统的数据访问性能。[0354]在本技术实施例提供的数据访问方法中,当计算节点接收到数据读取请求时,先根据该数据读取请求的目标数据所属的数据分片,来确定存储有该目标数据的多个副本的多个存储节点,然后按照存储节点访问目标数据的数据访问代价,从这些存储节点中选出符合目标条件的目标存储节点,由该目标存储节点来读取目标数据。上述方法中,由于该目标存储节点是根据数据访问代价来确定的,因此主存储节点和从存储节点都可能成为目标存储节点,避免了由主存储节点处理所有的数据读取请求,从而既保证了多副本带来的高可用性,又提高了数据读取速度,有效提升了分布式数据库系统的数据访问性能。[0355]通过上述图4所示的实施例,以数据访问请求的请求类型为数据读取请求为例,对本技术实施例提供的数据访问方法进行了介绍。下面结合图12,对本技术实施例提供的另一种数据访问方法进行详细介绍。[0356]图12是本技术实施例提供的一种数据访问方法的流程图,如图12所示,该实施例应用于分布式数据库系统,该分布式数据库系统包括计算节点和多个存储节点。示意性地,在图12所示的实施例中,该数据访问方法适用于数据访问请求的请求类型为数据写入请求,该数据访问方法应用于如图2所示的htap数据库系统,以计算节点和存储节点之间的交互为例来进行说明。该实施例包括下述步骤。[0357]1201、计算节点基于终端发送的连接请求,与终端建立连接。[0358]在本技术实施例中,步骤1201与上述步骤401同理,故在此不再赘述。[0359]1202、计算节点响应于数据写入请求,确定该数据写入请求的第二目标数据是否存在所属的第三数据分片,若不存在,则由计算节点和多个存储节点分别执行下述步骤1203和步骤1204,若存在,则由计算节点执行下述步骤1205。[0360]在本技术实施例中,计算节点接收终端发送的数据写入请求,根据该数据写入请求的第二目标数据的数据内容,计算该第二目标数据所属的第三数据分片,判断该当前多个存储节点中是否存在该第三数据分片。若不存在,则需建立该第二目标数据所属的第三数据分片及对应的多个副本(也即是下述步骤1203和步骤1204),若存在,则计算节点根据第二目标数据的数据内容,确定该第二目标数据在当前分布式数据库系统中所属的第三数据分片,并根据该第三数据分片的分片信息,从多个存储节点中确定多个第二存储节点(也即是下述步骤1205)。[0361]1203、计算节点建立该第二目标数据所属的第三数据分片,向该多个存储节点发送副本创建请求。[0362]在本技术实施例中,计算节点基于第二目标数据的数据内容,建立该第二目标数据所属的第三数据分片,基于该第三数据分片的分片信息,向多个存储节点发送副本创建请求。可选地,该副本创建请求携带第二目标数据的数据内容、第三数据分片的分片信息以及副本的存储模式等,本技术实施例对此不作限定。在一些实施例中,计算节点将该第三数据分片的分片信息存储至元数据管理层。[0363]1204、多个存储节点基于该副本创建请求,建立该第三数据分片对应的多个副本。[0364]在本技术实施例中,多个存储节点接收到计算节点发送的副本创建请求后,基于该副本创建请求,在各自的存储节点上建立该第三数据分片对应的副本。[0365]在一些实施例中,多个存储节点基于该副本创建请求和该第二目标数据在多个存储节点中的存储模式,建立该第三数据分片对应的多个副本,该存储模式用于指示数据在存储节点中的存储格式。[0366]在一些实施例中,多个存储节点根据预设副本配置策略,建立该第三数据分片对应的多个副本。例如,预设副本配置策略如下:每个数据分片共建立n个副本,其中k个副本的存储模式为行存模式,n‑k个副本的存储模式为列存模式,其中,n和k为正整数,n个副本分散在n个物理节点上进行存储,通过分布式一致性协议管理,并通过选举机制选出主存储节点。应理解,副本的配置策略可根据实际情况进行调整,本技术实施例对此不作限定。[0367]需要说明的是,第三数据分片对应的多个副本的存储模式的具体内容可参考上述步骤402,故在此不再赘述。另外,在该第三数据分片对应的多个副本建立完成后,该多个存储节点对该多个副本的存储模式进行动态调整。这一过程与上述步骤402中所示的“多个第一存储节点对多个副本的存储模式进行动态调整”同理,故在此不再赘述。[0368]1205、计算节点基于该第三数据分片,从该多个存储节点中确定多个第二存储节点,该多个第二存储节点用于存储第二目标数据的多个副本。[0369]在本技术实施例中,计算节点确定多个第二存储节点的方式与上述步骤301和步骤402同理,故在此不再赘述。[0370]1206、计算节点向该多个第二存储节点中的主存储节点发送该数据写入请求。[0371]1207、主存储节点基于该数据写入请求,写入该第二目标数据,生成数据操作日志,向该多个存储节点中的从存储节点发送日志同步请求,该日志同步请求用于指示从存储节点同步该数据操作日志后向该主存储节点发送数据同步消息。[0372]在本技术实施例中,主存储节点在接收到数据写入请求后,先进行合法性判断,在数据写入请求合法的前提下,写入该第二目标数据,生成数据操作日志,向从存储节点发送日志同步请求,等待从存储节点返回数据同步消息。在一些实施例中,该数据操作日志包括操作类型、被操作的数据项以及操作时间等,本技术实施例对此不作限定。[0373]在一些实施例中,当主存储节点基于该数据写入请求,写入第二目标数据,生成数据操作日志之后,主存储节点确定该第二目标数据的第二读索引,并将该第二读索引进行存储,以便分布式数据库系统在接收到需要读取第二目标数据的数据读取请求时,通过查表来读取相应的数据。下面通过下述三个步骤来对这一可选实施方式进行介绍:[0374]步骤一、主存储节点基于该数据操作日志的日志索引,确定该第二目标数据的第二读索引,该第二读索引用于指示基于第三数据读取请求读取该第二目标数据的最小读索引。[0375]需要说明的是,第二目标数据的第二读索引也即是第二目标数据的rri,rri的具体含义与上述图4所示的实施例同理,故在此不再赘述。[0376]步骤二、将该第二读索引存储至第二列表,该第二列表包括该第二目标数据、该第二读索引以及第二校验索引,该第二校验索引为该数据操作日志的日志索引。[0377]其中,对于每条数据操作日志,该数据操作日志所操作的数据的rri为该条日志的日志索引(logindex),第二校验索引(checkindex)也为该条日志的日志索引(logindex)。[0378]在一些实施例中,若该第二列表中数据项的数量大于或等于预设阈值,则删除该第二列表中的至少一个数据项和对应的rri,该至少一个数据项的rri小于执行索引(applyindex)。例如,该预设阈值为100,本技术实施例对此不作限定。[0379]步骤三、当分布式数据库系统处理第三数据读取请求时,若该第三数据读取请求所需读取的数据为该第二目标数据,查询该第二列表以读取该第二目标数据。[0380]其中,该分布式数据库系统处理查询第二列表以读取该第二目标数据的方式与上述步骤406同理,故在此不再赘述。[0381]下面参考图13,对上述存储第二读索引以及处理第三数据读取请求的可选实施方式进行举例说明。图13是本技术实施例提供的一种存储第二读索引的示意图。如图13所示,主存储节点将数据操作日志的结果存储在列表中,该列表中包括数据项以及对应的rri和校验索引(checkindex),其中,校验索引(checkindex)的值等于日志索引(logindex)的值;该数据操作日志所操作的数据的rri为该条日志的日志索引(logindex)。示意性地,如图13中(a)和(b)图所示,当第二目标数据为x时,其对应的rri的值为7,当第二目标数据为y时,其对应的rri的值为6,等等。图13中(c)和(d)图与(a)和(b)图同理,故在此不再赘述。[0382]需要说明的是,通过这种将第二读索引存储至第二列表的方式,能够避免多次重复扫描日志列表,减少数据处理量,从而节约计算资源。另外,由于该第二列表的信息是在每次处理数据写入请求时更新的,所以这种可选实施方法也可以称为写时更新法。应理解,由于每次只需要更新与数据写入请求相关数据的参数,这种方法的单次更新量要小于上述步骤406中介绍的读时更新方法。与读时更新方法同理,第二列表的大小一般不会超过10项,足以存放于内存中,并且不需要同步到持久化存储中,故障恢复时按照相同策略重构该表即可。[0383]1208、若主存储节点接收到的数据同步消息的数量大于或等于从存储节点数量的半数,该主存储节点确认该数据写入请求已操作成功。[0384]在本技术实施例中,当从存储节点接收到主存储节点发送的日志同步请求后,将数据操作日志同步到各自的日志记录中,并将主存储节点发送数据同步消息,以通知主存储节点日志已同步成功。当主存储节点接收到的数据同步消息的数量大于或等于从存储节点数量的半数,则确认该数据写入请求已操作成功。[0385]需要说明的是,在相关分布式一致性协议(例如raft协议)中,主存储节点接收到数据写入请求后,把数据写入请求作为日志条目加入到自己的日志中,然后向其他从存储节点复制日志。当这条日志被复制到大多数从存储节点上时,主存储节点将这条日志持久化存储到自己的状态机中,之后才能将执行结果返回到终端,表示写入成功。在这个过程中,从存储节点的持久化是异步完成的,无需等待,但是主存储节点的持久化是同步的,需要等待持久化成功后才能返回执行结果。而在本技术实施例中,将主存储节点的持久化改为异步,即保证半数从存储节点复制了日志后,即可返回执行结果,不需要等待主存储节点持久化成功,从而减少了数据写入请求的等待时间,有效提升了数据写入请求的处理效率,提高了分布式数据库系统的数据访问性能。[0386]1209、主存储节点向计算节点发送第一数据写入结果。[0387]在本技术实施例中,主存储节点基于数据写入请求已操作成功,生成第一数据写入结果,将该第一数据写入结果发送给计算节点,由计算节点将第一数据写入结果反馈至终端。[0388]在一些实施例中,主存储节点向计算节点发送第一数据写入结果后,该数据访问方法还包括:主存储节点对该第二目标数据进行持久化存储;从存储节点基于该数据操作日志和该第二目标数据在该从存储节点中的存储模式,对该第二目标数据进行格式转换,对转换后的第二目标数据进行持久化存储。需要说明的是,这一过程也即是主从节点对写入数据进行异步持久化操作的过程。示意性地,主存储节点对数据根据本节点的配置进行落盘;从存储节点逐步进行数据落盘工作:取出一条日志记录,获得操作类型、数据项。从存储节点访问格式转换器,指定本节点所需记录的数据存储模式及数据项,得到转换后的数据,并对数据落盘至状态机。[0389]在上述步骤1201至步骤1209所示的数据访问方法中,当计算节点接收到数据写入请求时,先根据该数据写入请求的目标数据所属的数据分片,来确定存储有该目标数据的多个副本的多个存储节点,然后向多个存储节点的主存储节点发送该数据写入请求,当超过一半数量的从存储节点日志同步完成,则允许主存储节点未将日志信息持久化到状态机中就返回执行结果,这一过程也可以称为基于提交退回(commitreturn)的数据写入方法。这种方法加快了数据写入请求的返回速度,提高了整体系统的写性能,有效提升了分布式数据库系统的数据访问性能。[0390]通过上述图4和图12所示的实施例,分别以数据访问请求为数据读取请求和数据写入请求为例,对本技术实施例提供的数据访问方法进行了介绍。下面结合图14,对本技术实施例提供的另一种数据访问方法进行详细介绍。[0391]图14是本技术实施例提供的一种数据访问方法的流程图,如图14所示,该实施例应用于分布式数据库系统,该分布式数据库系统包括计算节点和多个存储节点。示意性地,在图14所示的实施例中,该数据访问方法适用于数据访问请求为数据读写请求,该数据访问方法应用于如图2所示的htap数据库系统,以计算节点和存储节点之间的交互为例来进行说明。该实施例包括下述步骤。[0392]1401、计算节点基于终端发送的连接请求,与终端建立连接。[0393]在本技术实施例中,步骤1401与上述步骤401同理,故在此不再赘述。[0394]1402、计算节点响应于数据读写请求,确定该数据读写请求的第三目标数据是否存在所属的第四数据分片,若不存在,则由计算节点和多个存储节点分别执行下述步骤1403和步骤1404,若存在,则由计算节点执行下述步骤1405至步骤1407。[0395]在本技术实施例中,步骤1402与上述步骤1202同理,故在此不再赘述。[0396]1403、计算节点建立该第三目标数据所属的第四数据分片,向该多个存储节点发送副本创建请求。[0397]在本技术实施例中,步骤1403与上述步骤1203同理,故在此不再赘述。[0398]1404、多个存储节点基于该副本创建请求,建立该第四数据分片对应的多个副本。[0399]在本技术实施例中,步骤1404与上述步骤1204同理,故在此不再赘述。[0400]1405、计算节点基于该第四数据分片,从该多个存储节点中确定多个第三存储节点,该多个第三存储节点用于存储第三目标数据的多个副本。[0401]在本技术实施例中,步骤1405与上述步骤1205同理,故在此不再赘述。[0402]1406、对于数据读写请求中的读操作,计算节点基于数据读写请求,从多个第三存储节点中确定第二目标存储节点,向第二目标存储节点发送数据读写请求,该第二目标存储节点的数据访问代价符合第二目标条件。[0403]1407、第二目标存储节点基于数据读写请求,读取该第三目标数据,向该计算节点发送第二数据读取结果。[0404]在本技术实施例中,步骤1406和步骤1407与上述步骤403至步骤411同理,故在此不再赘述。[0405]1408、对于该数据读写请求中的写操作,该计算节点向该多个第三存储节点中的主存储节点发送该数据读写请求。[0406]1409、主存储节点基于该数据读写请求,写入该第三目标数据,向该计算节点发送第二数据写入结果。[0407]在本技术实施例中,步骤1408和步骤1409与上述步骤1206至步骤1209同理,故在此不再赘述。[0408]需要说明的是,在本技术实施例中,分布式数据库系统是按照上述步骤1406至步骤1409来执行的,在一些实施例中,分布式数据库系统先执行步骤1408和步骤1409,再执行步骤1406和步骤1407。在另一些实施例中,分布式数据库系统同步执行上述步骤1406至步骤1409,本技术实施例对于上述步骤1406至步骤1409的执行顺序不作限定。[0409]在一些实施例中,该多个第三存储节点中的从存储节点配置有内存锁,该内存锁用于在该写操作尚未完成时锁定该第三目标数据。通过这种方式能够确保并发事务的可串行化调度。[0410]在上述步骤1401至步骤1409所示的数据访问方法中,当计算节点接收到数据读写请求时,先根据该数据读写请求的目标数据所属的数据分片,来确定存储有该目标数据的多个副本的多个存储节点,然后针对数据读写请求中的读操作和写操作,分别进行数据读取和数据写入。[0411]对于读操作,按照目标数据的数据访问代价,从这些存储节点中选出符合目标条件的目标存储节点,由该目标存储节点来读取目标数据,这一过程中,由于该目标存储节点是根据数据访问代价来确定的,因此主存储节点和从存储节点都可能成为目标存储节点,避免了由主存储节点处理所有的数据读取请求,从而既保证了多副本带来的高可用性,又提高了数据读取速度,有效提升了分布式数据库系统的数据访问性能。[0412]对于写操作,向多个存储节点的主存储节点发送该数据写入请求,当超过一半数量的从存储节点日志同步完成,则允许主存储节点未将日志信息持久化到状态机中就返回执行结果,这一方法加快了数据写入请求的返回速度,提高了整体系统的写性能,有效提升了分布式数据库系统的数据访问性能。[0413]经过上述图3、图4、图12以及图14所示的实施例,对本技术提供的数据访问方法进行了介绍,下面对上述数据访问方法中涉及的选举机制进行介绍,其中,从存储节点参与选举的处理流程包括下述步骤1501和步骤1502:[0414]1501、当多个存储节点中存在第三存储节点通过选举成为主存储节点时,该多个存储节点中的从存储节点基于当前存储模式和该从存储节点的写性能参数,确定超时时间,该存储模式用于指示数据在存储节点中的存储格式。[0415]其中,主存储节点的选举机制也称为leader选举机制,用于保证顺序一致性。当第三存储节点通过选举称为主存储节点时,该第三存储节点向多个存储节点中的从存储节点发送通知消息以确立leader身份。从存储节点在接收到主存储节点发送的通知消息后,基于当前存储模式和该存储节点的写性能参数,设置超时时间。在一些实施中,不同存储模式的存储节点设置不同的随机时间范围。例如,某一存储节点的随机超时范围为(t1,t2),该存储节点的写性能参数为p,则该存储节点从(t1‑p/f,t2‑p/f)的时间范围内确定超时时间,写性能参数p越大,超时时间越短,也即是写性能越好的存储节点,其超时时间越短,其中,f为规范因子,可根据集群性能合理设定,本技术实施例对此不作限定。需要说明的是,此处举例仅为示意性地,在一些实施例中,存储节点的超时时间的设置有多种方式,只要是将存储模式和存储节点的写性能参数纳入超时时间的确定过程的方案,均落在本技术的保护范围内。[0416]通过将存储模式和存储节点的写性能参数纳入超时时间的确定过程,使得写性能好的存储节点更有可能称为主存储节点,从而提升分布式数据库系统整体的数据访问性能。[0417]1502、若存在第一从存储节点在对应的超时时间内,未接收到该主存储节点的消息,该第一从存储节点切换至候选状态,参与下一次选举。[0418]其中,第一从存储节点在对应的超时时间内,未接收到该主存储节点的消息,表明主存储节点已经失效,则该第一从存储节点切换至候选状态,参与下一次选举。需要说明的是,由于写性能好的存储节点被设置了更短的超时时间,因此有更大概率率先切换至候选状态并参与下一次选举,从而更有可能成为主存储节点。[0419]另外,当主存储节点失效后,新主尚未选出的期间,分布式数据库系统不支持任何数据读写请求,也不支持从存储节点数据读取请求。原因在于,如果选择的从存储节点上没有最新版本的数据,而此时主存储节点不工作,从存储节点无法获得数据一致性点,如果服务上层发送的数据读取请求,则有可能造成数据不一致的状况。因此,这种方式能够避免出现数据不一致的状况出现,保证系统的正确性。[0420]由于在本技术所提供的数据访问方法中,对分布式一致性协议进行了修改,因此,下面将对本技术所涉及的修改对分布式事务的影响进行介绍,包括下述两个部分,分别是“线性一致性证明”以及“分布式事务设置内存锁”。[0421]第一部分、线性一致性证明。[0422]在本技术实施例中,上述数据访问方法确保了数据的线性一致性,即只要一个新的值vnew被写入或者被读到,后续的所有数据读取请求都可以读到这个新值vnew,直到vnew被覆盖。[0423]以raft协议为例,虽然上述数据访问方法放宽了raft协议中读流程和写流程的限制,但是并不会改变raft协议的线性一致性。上述图12所示的数据访问方法对数据写入流程进行了从数据落盘后返回写成功到更新日志达成共识即返回写成功的改动(即基于cr的数据写入方法);上述图4所示的数据访问方法对数据读取流程放松了等待执行索引(applyindex)与读索引(readindex)相同的限制,记录每个数据项的更新索引,只要写索引与写请求涉及数据项的更新索引相同即可进行读取(即基于rri的数据读取方法)。关于从节点读请求处理流程中,从节点处理数据读取请求前会强制与主节点进行数据同步,因此从节点读请求处理流程在一致性角度与主节点处理数据读取请求没有区别。[0424]下面以主节点处理数据读取请求为例,通过形式化证明这一组改动(cr和rri)没有破坏raft协议的线性一致性,包括下述两种情况:[0425]情况一、写后读。[0426]在本技术实施例中,一个新值vnew被写入是指,对vnew的更新日志已经在raft集群中达成共识(即过半节点已保存更新日志)。假设对vnew的更新日志索引为n1,当前的commitindex为c1,可知c1≥n1,vnew的放宽读索引i1=n1。当主节点在上述的数据写入请求返回之后接收新的数据读取请求,假设此时的applyindex是a2,当前的commitindex是c2,数据读取请求的readindex(r2)将被设为c2,即r2=c2,因此我们可以得到r2=c2≥c1≥n1且c2≥a2,即r2≥n1与r2≥a2。[0427]此时,假如n1>a2,vnew还未落盘,此时i2=i1,此时数据读取请求将被阻塞,直到applyindex更新到a3=n1=i2,数据读取请求将从状态机中读取数据并返回结果。由于此时a3=n1,对vnew的更新已经落盘,因此从状态机中读取数据可以获得最新的vnew的值。[0428]若假设n1≤a2,此时对vnew的放宽读索引i2=a2,数据读取请求可以直接从状态机中读取数据并返回结果。由于n1≤a2,vnew已经落盘,因此数据读取请求可以读到最新的vnew的值。[0429]假设上述两种情况(n1>a2以及n1≤a2)下读到的vnew不是最新,说明在这个数据读取请求到达之前有对vnew的最新的更新操作被提交,与rri的设计矛盾。因此本技术提供的数据访问方法保证了在新的值vnew的数据写入请求被提交后,后续数据读取请求可以在vnew被覆盖之前读到vnew。[0430]情况二、读后读。[0431]当新值vnew被读索引为r1的读请求读到后,设第一次读到vnew的数据读取请求返回时节点的commitindex为c1,写入vnew的数据写入请求的索引为n1,vnew的放宽读索引为i1,数据读取请求读到vnew,此时的applyindex(设为a1)不小于i1,则有r1=c1≥a1≥i1≥n1,新的放宽读索引i2=a1。当有新的数据读取请求到来时,设其readindex为r2,有r2>r1,设主节点接收这个新的数据读取请求时的commitindex为c2、applyindex为a2,有r2=c2≥c1≥n1,那么可以得到r2≥n1和r2≥a2,与上述情况一中同理,可以证明新的数据读取请求依然能在vnew被覆盖之前读到vnew。[0432]综上,根据本技术实施例提供的数据访问方法,只要一个新的值vnew被写入或者被读到,后续的所有数据读取请求都可以读到这个新值vnew,直到vnew被覆盖。本技术提供的数据访问方法维持了raft算法的线性一致性。[0433]第二部分、分布式事务设置内存锁。[0434]在本技术实施例中,增加了从节点读取数据的功能,而从节点在读取数据时,可能会出现读半已提交问题。针对读半已提交问题,本技术在从节点中增加内存锁,基于封锁并发访问机制实现并发事务的可串行化调度。[0435]下面通过一个例子来证明。[0436]首先参考图15,对读半已提交问题进行介绍。图15是本技术实施例提供的一种读半已提交问题的示意图。如图15所示,图中包括两个物理节点,分别为节点nodea和节点nodeb,其中,nodea对应账户x,nodeb对应账户y,x与y的初始值都为1。两个物理节点都可以从从节点读取数据。[0437]例如,现在第一个写事务,要从x账户向y账户转账1元,当此写事务在nodea节点完成提交,但nodeb节点尚没有提交,从节点还未同步日志信息。此时,另外一个分布式事务读事务要做对账操作,需要分别读取两个物理节点上x、y的值。由于nodea的写事务已提交,则读事务读到的x的值为0。在读取y的值时,计算层指定从节点响应数据读取请求,但是由于对y值修改的操作还未提交,所以读事务从从节点读到的y的值为1,则总账为“x‑1 y”,出现了数据不一致,称为读半已提交。[0438]为解决该读半已提交问题,本技术实施例在从节点中增加内存锁,这样,对于上述读写事务,在对y的修改没有提交之前(即出现图15中的状态),不允许对账读事务从任何节点读取y数据项的值,只能令读事务等待。直到对x和y的修改都提交之后,才允许读事务读取x和y的值。[0439]通过上述图2至图15,从分布式数据库系统的架构、不同类型的数据访问请求对应不同的数据访问方法以及对分布式事务的影响等多个方面,对本技术提供的数据访问方法进行了介绍,下面将以上述内容为基础,对本技术提供的数据访问方法所带来的有益效果进行总结性说明,主要包括下述9点。[0440]1、本技术的数据访问方法基于多副本异构存储模型的支持,使得系统在混合负载下,不同类型的数据访问请求可以在不同存储模式的副本上,从而更好的发挥磁盘读取优势,减少网络带宽的占用(详见图4所示实施例)。[0441]2、本技术的数据访问方法允许从不同类型的节点读取数据,从而提高了多副本存储的读操作并发度,保证了多副本带来的高可用性以及多副本间的数据一致性,又增加了系统的并发度(详见图4所示实施例中的步骤403)。[0442]3、本技术的数据访问方法提出了多副本动态管理策略,可以更好的应对系统运行过程中负载发生变化的情况(详见图4所示实施例中的步骤402)。[0443]4、本技术的数据访问方法对查询计划的制订进行了修改,在计算节点制定查询计划的过程中,增加了多因素的考量,对请求类型和系统状态综合判断,选择最佳数据副本作为访问目标,有利于降低瓶颈发生可能,提高系统的整体吞吐(详见图4所示实施例中的步骤403)。[0444]5、本技术的数据访问方法通过基于放宽读索引(relaxedreadindex,rri)的数据读取方法,增大了系统并发度,加快了数据读取请求的处理速度,提高了分布式数据库系统整体的读性能。读取数据时允许不将所有的日志信息持久化到状态机中,够缩短底层状态机处理的时间,加快读请求返回的速度,提高整体系统的读性能(详见图4所示实施例中的步骤406和步骤407)。[0445]6、本技术的数据访问方法通过读取特殊版本数据,读取某个时间戳之前或者之后的特殊版本数据时,可以通过日志时间信息允许不将所有的日志信息持久化到状态机中,提高这类特殊读请求的返回时间(详见图4所示实施例中的步骤409和步骤410)。[0446]7、本技术的数据访问方法通过基于提交退回(commitreturn)的数据写入方法,在处理数据写入请求时,允许主节点未将日志信息持久化到状态机中就返回执行结果,加快写请求的返回速度,提高整体系统的写性能(详见图12所示实施例中的步骤1208)。[0447]8、本技术的数据访问方法采用计算与存储分离架构,方便改变存储节点分布和配置(详见图2所示的htap数据库系统)。[0448]9、整体而言,本技术的数据访问方法解决了多副本存储模式下,系统并发度和存储优势没有被完全发挥的问题,提高了系统并发度,减少了磁盘和网络带宽的占用,最终达到提高系统吞吐的效果。[0449]图16是根据本技术实施例提供的一种数据访问装置的结构示意图。该数据访问装置应用于分布式数据库系统,参见图16,该数据访问装置包括:第一确定模块1601、第二确定模块1602以及第一读取模块1603。[0450]第一确定模块1601,用于响应于第一数据读取请求,确定该第一数据读取请求的第一目标数据所属的第一数据分片,基于该第一数据分片,从该多个存储节点中确定多个第一存储节点,该多个第一存储节点用于存储该第一目标数据的多个副本;[0451]第二确定模块1602,用于基于该第一数据读取请求,从该多个第一存储节点中确定第一目标存储节点,向该第一目标存储节点发送该第一数据读取请求,该第一目标存储节点的数据访问代价符合第一目标条件;[0452]第一读取模块1603,用于基于该第一数据读取请求,读取该第一目标数据,向该计算模块发送第一数据读取结果。[0453]在一种可选地实现方式中,该第一读取模块1603包括:[0454]第一读取单元,用于若该第一目标数据为当前态数据,基于该第一数据读取请求和该第一目标存储节点的节点类型,读取该第一目标数据;[0455]第二读取单元,用于若该第一目标数据为历史态数据,基于该第一数据读取请求和该第一目标数据的事务完成时间,读取该第一目标数据。[0456]在一种可选地实现方式中,该第一读取单元用于下述任一项:[0457]若该第一目标存储节点为主存储节点,基于该第一数据读取请求,确定该第一目标数据的第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据,该第一读索引用于指示基于该第一数据读取请求读取该第一目标数据的最小读索引;[0458]若该第一目标存储节点为从存储节点,基于该第一数据读取请求,从该主存储节点中获取该第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据。[0459]在一种可选地实现方式中,该第一读取单元用于:[0460]更新当前时刻的提交索引,该提交索引用于指示日志列表中已提交日志的最大索引;[0461]按照第一顺序,扫描该日志列表中存储的日志,该第一顺序是指从该提交索引至该日志列表的执行索引,该执行索引用于指示该日志列表中已执行日志的最大索引;[0462]若存在第一目标日志,基于该第一目标日志的日志索引,确定该第一读索引,该第一目标日志所操作的数据为该第一目标数据;若不存在该第一目标日志,该第一目标存储节点基于该执行索引,确定该第一读索引。[0463]在一种可选地实现方式中,该装置还包括:[0464]第一存储模块,用于将该第一读索引存储至第一列表,该第一列表包括该第一目标数据、该第一读索引以及第一校验索引,该第一校验索引用于指示该第一目标存储节点确定该第一读索引时对应的提交索引,该提交索引用于指示日志列表中已提交日志的最大索引;[0465]第一查询模块,用于当该分布式数据库系统处理第二数据读取请求时,若该第二数据读取请求的数据为该第一目标数据,查询该第一列表以读取该第一目标数据。[0466]在一种可选地实现方式中,该第一读取单元用于:[0467]若该第一目标存储节点中存在该第一读索引对应的日志,对该第一读索引对应的日志进行持久化存储,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据;[0468]若该第一目标存储节点中不存在该第一读索引对应的日志,从该主存储节点中获取该第一读索引对应的日志,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据。[0469]在一种可选地实现方式中,该第二读取单元用于:[0470]若该第一目标数据的数据提交时间在该事务完成时间之前,基于该第一数据读取请求和该事务完成时间,按照第二顺序,扫描日志列表中存储的日志,确定第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据;[0471]若该第一目标数据的数据提交时间在该事务完成时间之后,基于该第一数据读取请求和该事务完成时间,按照第三顺序,扫描该日志列表中存储的日志,确定该第一读索引,以该第一读索引为起点,从该第一目标数据对应的状态机中读取该第一目标数据;[0472]其中,该第二顺序是指从该日志列表的提交索引至该日志列表的执行索引,该第三顺序是指从该日志列表的执行索引至该日志列表的提交索引,该提交索引用于指示该日志列表中已提交日志的最大索引,该执行索引用于指示该日志列表中已执行日志的最大索引,该第一读索引用于指示基于该第一数据读取请求读取该第一目标数据的最小读索引。[0473]在一种可选地实现方式中,该第二读取单元用于:[0474]若存在第二目标日志,且该第一目标数据的事务完成时间与该第二目标日志的事务完成时间相同,或该第一目标数据的事务完成时间在该第二目标日志的事务完成时间之后,基于该第二目标日志的日志索引,确定该第一读索引,该第二目标日志所操作的数据为该第一目标数据;[0475]若不存在该第二目标日志,基于该日志列表的执行索引,确定该第一读索引。[0476]在一种可选地实现方式中,该数据访问代价用于指示存储节点的执行时间、等待时间以及传输时间;[0477]该执行时间包括存储节点查询该第一目标数据的时间、处理数据量的时间以及元组构建时间;[0478]该等待时间包括存储节点的请求队列时间、设备负载延迟时间以及数据同步时间;[0479]该传输时间包括网络传输时间。[0480]在一种可选地实现方式中,该第一目标存储节点的数据访问代价符合第一目标条件,包括下述任一项:[0481]该第一目标存储节点中该第一目标数据的存储模式为列存模式,且该数据读取请求所需访问的列数与总列数之间的比值小于第一阈值,该存储模式用于指示数据在存储节点中的存储格式;[0482]该第一目标存储节点的节点负载小于该多个存储节点中除该第一目标存储节点以外的存储节点的节点负载;[0483]该第一目标存储节点与该计算节点之间的物理距离小于该多个存储节点中除该第一目标存储节点以外的存储节点与该计算节点之间的物理距离;[0484]该第一目标存储节点的数据同步状态在该多个存储节点中除该第一目标存储节点以外的存储节点的数据同步状态之后。[0485]在一种可选地实现方式中,该装置还包括:[0486]调整模块,用于对该第一目标数据的多个副本的存储模式进行动态调整,该存储模式用于指示数据在存储节点中的存储格式。[0487]在一种可选地实现方式中,该调整模块用于下述任一项:[0488]基于该多个第一存储节点的负载情况,切换该多个副本的存储模式;[0489]若该多个副本中存在至少一个副本异常,基于该至少一个副本,建立至少一个新副本;[0490]若该第一数据分片发生数据分裂,生成至少一个第二数据分片,基于该至少一个第二数据分片,建立该至少一个第二数据分片对应的多个副本;[0491]基于该多个第一存储节点的节点类型,调整该多个副本的存储模式。[0492]在一种可选地实现方式中,该基于该多个第一存储节点的负载情况,切换该多个副本的存储模式,包括下述任一项:[0493]基于该多个第一存储节点的节点负载大小和可用空间,切换该多个副本的存储模式;[0494]基于该多个第一存储节点的节点负载大小和每个存储模式下副本的数量,切换该多个副本的存储模式。[0495]在一种可选地实现方式中,该装置还包括:[0496]第三确定模块,用于响应于数据写入请求,若该数据写入请求的第二目标数据存在所属的第三数据分片,基于该第三数据分片,从该多个存储节点中确定多个第二存储节点,该多个第二存储节点用于存储该第二目标数据的多个副本;[0497]发送模块,用于向该多个第二存储节点中的主存储节点发送该数据写入请求;[0498]第一写入模块,用于基于该数据写入请求,写入该第二目标数据,向该计算节点发送第一数据写入结果。[0499]在一种可选地实现方式中,该第一写入模块用于:[0500]基于该数据写入请求,写入该第二目标数据,生成数据操作日志,向该多个存储节点中的从存储节点发送日志同步请求,该日志同步请求用于指示该从存储节点同步该数据操作日志后向该主存储节点发送数据同步消息;[0501]若该主存储节点接收到的该数据同步消息的数量大于或等于从存储节点数量的半数,确认该数据写入请求已操作成功。[0502]在一种可选地实现方式中,该装置还包括:[0503]第一持久化存储模块,用于对该第二目标数据进行持久化存储;[0504]第二持久化存储模块,用于基于该数据操作日志和该第二目标数据在该从存储节点中的存储模式,对该第二目标数据进行格式转换,对转换后的该第二目标数据进行持久化存储,该存储模式用于指示数据在存储节点中的存储格式。[0505]在一种可选地实现方式中,该装置还包括:[0506]第四确定模块,用于基于该数据操作日志的日志索引,确定该第二目标数据的第二读索引,该第二读索引用于指示基于第三数据读取请求读取该第二目标数据的最小读索引;[0507]第二存储模块,用于将该第二读索引存储至第二列表,该第二列表包括该第二目标数据、该第二读索引以及第二校验索引,该第二校验索引为该数据操作日志的日志索引;[0508]第二查询模块,用于当该分布式数据库系统处理该第三数据读取请求时,若该第三数据读取请求的数据为该第二目标数据,查询该第二列表以读取该第二目标数据。[0509]在一种可选地实现方式中,该装置还包括:[0510]第一建立模块,用于若该数据写入请求的第二目标数据不存在所属的第三数据分片,建立该第二目标数据的第三数据分片,向该多个存储节点发送副本创建请求;[0511]第二建立模块,用于基于该副本创建请求,建立该第三数据分片对应的多个副本。[0512]在一种可选地实现方式中,该第二建立模块用于:[0513]基于该副本创建请求和该第二目标数据在该多个存储节点中的存储模式,建立该第三数据分片对应的多个副本,该存储模式用于指示数据在存储节点中的存储格式。[0514]在一种可选地实现方式中,该装置还包括:[0515]第五确定模块,用于响应于数据读写请求,若该数据读写请求的第三目标数据存在所属的第四数据分片,基于该第四数据分片,从该多个存储节点中确定多个第三存储节点,该多个第三存储节点用于存储该第三目标数据的多个副本;[0516]第二读取模块,用于对于该数据读写请求中的读操作,基于该数据读写请求,从该多个第三存储节点中确定第二目标存储节点,向该第二目标存储节点发送该数据读写请求,该第二目标存储节点基于该数据读写请求,读取该第三目标数据,向该计算节点发送第二数据读取结果,该第二目标存储节点的数据访问代价符合第二目标条件;[0517]第二写入模块,用于对于该数据读写请求中的写操作,向该多个第三存储节点中的主存储节点发送该数据读写请求,该主存储节点基于该数据读写请求,写入该第三目标数据,向该计算节点发送第二数据写入结果。[0518]在一种可选地实现方式中,该多个第三存储节点中的从存储节点配置有内存锁,该内存锁用于在该写操作尚未完成时锁定该第三目标数据。[0519]在一种可选地实现方式中,该装置还包括:[0520]第六确定模块,用于当该多个存储节点中存在第四存储节点通过选举成为主存储节点时,该多个存储节点中的从存储节点基于当前存储模式和该从存储节点的写性能参数,确定超时时间,该存储模式用于指示数据在存储节点中的存储格式;[0521]状态切换模块,用于若存在第一从存储节点在对应的超时时间内,未接收到该主存储节点的消息,该第一从存储节点切换至候选状态,参与下一次选举。[0522]在本技术实施例中,提供了一种数据访问装置,当接收到数据读取请求时,先根据该数据读取请求的目标数据所属的数据分片,来确定存储有该目标数据的多个副本的多个存储节点,然后按照存储节点访问目标数据的数据访问代价,从这些存储节点中选出符合目标条件的目标存储节点,由该目标存储节点来读取目标数据。上述过程中,由于该目标存储节点是根据数据访问代价来确定的,因此主存储节点和从存储节点都可能成为目标存储节点,避免了由主存储节点处理所有的数据读取请求,从而既保证了多副本带来的高可用性,又提高了数据读取速度,有效提升了分布式数据库系统的数据访问性能。[0523]需要说明的是:上述实施例提供的数据访问装置在进行数据访问时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的数据访问装置与数据访问方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。[0524]本技术实施例还提供了一种计算机设备,该计算机设备包括处理器和存储器,该存储器用于存储至少一条计算机程序,该至少一段计算机程序由该处理器加载并执行以实现本技术实施例中的数据访问方法中计算节点或存储节点所执行的操作。[0525]在一些实施例中,本技术实施例所涉及的计算机程序可被部署在一个计算机设备上执行,或者在位于一个地点的多个计算机设备上执行,又或者,在分布在多个地点且通过有线网络或无线网络互连的多个计算机设备上执行,分布在多个地点且通过有线网络或无线网络互连的多个计算机设备可以组成区块链系统。[0526]以计算机设备为服务器为例,图17是根据本技术实施例提供的一种服务器的结构示意图,该服务器1700可因配置或性能不同而产生比较大的差异,能够包括一个或一个以上处理器(centralprocessingunits,cpu)1701和一个或一个以上的存储器1702,其中,该存储器1702中存储有至少一条计算机程序,该至少一条计算机程序由处理器1701加载并执行以实现上述各个方法实施例提供的数据访问方法。当然,该服务器还能够具有有线或无线网络接口、键盘以及输入输出接口等部件,以便进行输入输出,该服务器还能够包括其他用于实现设备功能的部件,在此不做赘述。[0527]本技术实施例还提供了一种计算机可读存储介质,该计算机可读存储介质应用于计算机设备,该计算机可读存储介质中存储有至少一条计算机程序,该至少一条计算机程序由处理器加载并执行以实现上述实施例的数据访问方法中计算机设备所执行的操作。[0528]本技术实施例还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机程序代码,该计算机程序代码存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机程序代码,处理器执行该计算机程序代码,使得该计算机设备执行上述各种可选实现方式中提供的数据访问方法。[0529]本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。[0530]以上所述仅为本技术的可选实施例,并不用以限制本技术,凡在本技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献

  • 日榜
  • 周榜
  • 月榜