CN110532225A - 存储引擎切换方法、装置、电子设备和介质 - Google Patents
存储引擎切换方法、装置、电子设备和介质 Download PDFInfo
- Publication number
- CN110532225A CN110532225A CN201910828325.1A CN201910828325A CN110532225A CN 110532225 A CN110532225 A CN 110532225A CN 201910828325 A CN201910828325 A CN 201910828325A CN 110532225 A CN110532225 A CN 110532225A
- Authority
- CN
- China
- Prior art keywords
- engine
- data
- target
- migrated
- current
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 143
- 230000008569 process Effects 0.000 claims abstract description 55
- 230000004913 activation Effects 0.000 claims abstract description 10
- 230000005012 migration Effects 0.000 claims description 132
- 238000013508 migration Methods 0.000 claims description 132
- 230000015654 memory Effects 0.000 claims description 20
- 238000012217 deletion Methods 0.000 claims description 18
- 230000037430 deletion Effects 0.000 claims description 18
- 238000011084 recovery Methods 0.000 claims description 17
- 238000012545 processing Methods 0.000 claims description 13
- 238000012163 sequencing technique Methods 0.000 claims description 4
- 230000003213 activating effect Effects 0.000 abstract description 5
- 238000013500 data storage Methods 0.000 abstract description 4
- 230000007704 transition Effects 0.000 abstract 3
- 230000008901 benefit Effects 0.000 description 22
- 238000007726 management method Methods 0.000 description 14
- 230000006870 function Effects 0.000 description 13
- 238000010586 diagram Methods 0.000 description 7
- 238000004891 communication Methods 0.000 description 4
- 238000004590 computer program Methods 0.000 description 4
- PCHJSUWPFVWCPO-UHFFFAOYSA-N gold Chemical compound [Au] PCHJSUWPFVWCPO-UHFFFAOYSA-N 0.000 description 4
- 239000010931 gold Substances 0.000 description 4
- 229910052737 gold Inorganic materials 0.000 description 4
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000008447 perception Effects 0.000 description 3
- 230000036316 preload Effects 0.000 description 3
- 238000013461 design Methods 0.000 description 2
- 230000008676 import Effects 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 239000004973 liquid crystal related substance Substances 0.000 description 2
- 230000001174 ascending effect Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 238000013523 data management Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000010295 mobile communication Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000001151 other effect Effects 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 230000001953 sensory effect Effects 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/11—File system administration, e.g. details of archiving or snapshots
- G06F16/119—Details of migration of file systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0604—Improving or facilitating administration, e.g. storage management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0646—Horizontal data movement in storage systems, i.e. moving data in between storage devices or systems
- G06F3/0647—Migration mechanisms
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请公开了一种存储引擎切换方法、装置、电子设备和介质,涉及数据存储技术领域。具体实现方案为:响应存储引擎切换请求,获取目标存储引擎类型;基于目标存储引擎类型创建第一空引擎,并将所述第一空引擎的状态设置为激活状态,其中,处于激活状态的所述第一空引擎用于接收实时的新数据,并对外提供服务;将数据从当前旧引擎迁移到所述第一空引擎,并在迁移过程中保留所述数据的最新值。本申请不仅实现引擎间自动切换,而且在切换过程中通过创建空引擎并激活,让激活的空引擎接收实时的新数据,然后在数据从旧引擎向空引擎的迁移过程中保留数据最新值,不仅不影响实时新数据的存储,对上层无感知,而且还保证迁移过程中数据的稳定性和一致性。
Description
技术领域
本申请实施例涉及计算机技术领域,尤其涉及数据存储技术领域,具体涉及一种存储引擎切换方法、装置、电子设备和介质。
背景技术
存储引擎是存储系统中负责数据存储和管理的组件,处于业务应用和存储设备之间,对上接收来自于业务的数据,对下将数据存储在存储设备上,因此,在设计和实现上需要全面考虑硬件的特性和业务的特征。
存储硬件发展迅速,类型众多,每一种类型的存储设备特征差异比较大,同时,不同的业务对引擎也有不同的需求。因此,就出现对多种存储引擎的需求,不仅同时支持多种类型的存储引擎存在,也能从一个存储引擎演进到另一个引擎。
在引擎演进的过程中,涉及旧引擎的退休和新引擎的加入。传统的方法更多采用先离线导出旧引擎的数据,经过转换后再导入新引擎,且通常是根据引擎定制导入导出的外部工具来实现。然而,工具的开发要求对引擎内部结构了解足够深,不然容易影响数据的可靠性。而且,外部工具还依赖人工或者脚本来处理,在引擎数据切换过程中会引入额外的不稳定因素,影响数据的一致性。
发明内容
本申请实施例提供了一种存储引擎切换方法、装置、电子设备和介质,以提高不同引擎切换过程中数据的可靠性和一致性。
第一方面,本申请实施例提供了一种存储引擎切换方法,包括:
响应存储引擎切换请求,获取目标存储引擎类型;
基于所述目标存储引擎类型创建空引擎,并将所述空引擎的状态设置为激活状态,其中,处于激活状态的所述空引擎用于接收实时的新数据,并对外提供服务;
将数据从当前旧引擎迁移到所述空引擎,并在迁移过程中保留所述数据的最新值。
上述申请中的一个实施例具有如下优点或有益效果:不仅实现引擎间自动切换,而且在切换过程中通过创建空引擎并激活,让激活的空引擎接收实时的新数据,然后在数据从旧引擎向空引擎的迁移过程中保留数据最新值,不仅不影响实时新数据的存储,对上层无感知,而且还保证迁移过程中数据的稳定性和一致性。
可选的,在所述将数据从当前旧引擎迁移到所述空引擎的执行过程中,所述方法还包括:
响应对任一目标数据的读操作,在所述空引擎中查询是否存在所述目标数据的key;
如果存在,则从所述空引擎中读取所述目标数据的值;
如果不存在,则在所述当前旧引擎中查询是否存在所述目标数据的key,如果在所述当前旧引擎中存在,则从所述当前旧引擎中读取所述目标数据的值。
上述申请中的一个实施例具有如下优点或有益效果:在引擎间数据迁移的过程中,若有读请求出现,则按照从空引擎到当前旧引擎的顺序进行读数据,由于空引擎的数据较新,从而确保读取到最新的数据。
可选的,在所述将数据从当前旧引擎迁移到所述空引擎的执行过程中,所述方法还包括:
响应对任一目标数据的删除操作,在所述当前旧引擎中查询是否存在所述目标数据的key;
如果存在,则在所述当前旧引擎中删除所述目标数据的值;
如果不存在,则在所述空引擎中查询是否存在所述目标数据的key,如果在所述空引擎中存在,则在所述空引擎中删除所述目标数据的值。
上述申请中的一个实施例具有如下优点或有益效果:在引擎间数据迁移的过程中,若有数据删除请求出现,则按照从当前旧引擎到空引擎的顺序进行数据删除,由于空引擎的数据是实时新数据,当前旧引擎的数据是旧数据,从而确保不会将当前新产生的数据删除。
可选的,如果所述存储引擎切换请求是基于对增量数据的存储需求而生成,则在所述创建空引擎之前,所述方法还包括:
依据所述目标存储引擎类型创建第一增量引擎,将所述第一增量引擎的状态设置为预加载,其中,所述第一增量引擎的预加载表示正在将所述增量数据迁移到所述第一增量引擎,并且在预加载阶段所述第一增量引擎不对外提供服务;
如果预加载成功,则将所述第一增量引擎的状态设置为已加载;
相应的,所述将所述空引擎的状态设置为激活状态之后,所述方法还包括:
将状态为已加载的所述第一增量引擎的状态设置为激活状态,激活后所述第一增量引擎对外提供服务;
相应的,所述将数据从当前旧引擎迁移到所述空引擎,包括:
将所述第一增量引擎的数据迁移到所述空引擎,并在迁移完毕后,将所述当前旧引擎的数据迁移到所述空引擎。
上述申请中的一个实施例具有如下优点或有益效果:提供了增量加载的功能,并确保增量加载时不同引擎数据迁移后数据的一致性。
可选的,如果所述存储引擎切换请求是基于对冷备数据的恢复需求而生成,则在所述创建空引擎之前,所述方法还包括:
依据所述目标存储引擎类型创建第二增量引擎,将所述第二增量引擎的状态设置为预加载,其中,所述第二增量引擎的预加载表示正在将所述冷备数据迁移到所述第二增量引擎,并且在预加载阶段所述第二增量引擎不对外提供服务;
相应的,在将所述空引擎的状态设置为激活状态之后,所述方法还包括:
如果所述第二增量引擎预加载成功,则将所述第二增量引擎的状态设置为激活状态,激活后所述第二增量引擎对外提供服务;
相应的,所述将数据从当前旧引擎迁移到所述空引擎,包括:
将所述第二增量引擎的数据迁移到所述空引擎,并在迁移完毕后,将所述当前旧引擎的数据迁移到所述空引擎。
上述申请中的一个实施例具有如下优点或有益效果:提供了冷备恢复的功能,并确保冷备恢复时不同引擎数据迁移后数据的一致性。
可选的,在所述第一/第二增量引擎与空引擎,以及当前旧引擎与空引擎之间进行数据迁移的过程中,所述方法还包括:
响应对任一目标数据的读操作,按照从空引擎到第一/第二增量引擎到当前旧引擎的顺序,查询是否存在所述目标数据的key,并从查询到存在该key的引擎中读取所述目标数据的值。
上述申请中的一个实施例具有如下优点或有益效果:在三个引擎之间进行数据迁移的过程中,若出现数据读请求,则按照从最新到最旧的顺序进行读数据,确保读到最新的数据。
可选的,在所述第一/第二增量引擎与空引擎,以及当前旧引擎与空引擎之间进行数据迁移的过程中,所述方法还包括:
响应对任一目标数据的删除操作,按照从当前旧引擎到第一/第二增量引擎到空引擎的顺序,查询是否存在所述目标数据的key,并在查询到存在该key的引擎中删除所述目标数据的值。
上述申请中的一个实施例具有如下优点或有益效果:在三个引擎之间进行数据迁移的过程中,若出现数据删除请求,则按照从最旧到最新的顺序进行数据删除,确保不会将实时的最新数据删除。
可选的,在所述任两个引擎之间的数据迁移过程中,将待迁移数据所在的引擎作为源引擎,将迁移到的引擎作为目标引擎,从源引擎到目标引擎进行数据迁移的操作,包括:
对所述源引擎中的任一当前待迁移数据,判断该当前待迁移数据的key是否在所述目标引擎中存在;
如果存在,则判断为当前待迁移数据为旧数据,并在所述源引擎中删除当前待迁移数据;
如果不存在,则将当前待迁移数据迁移到所述目标引擎,并在所述源引擎中删除当前待迁移数据。
上述申请中的一个实施例具有如下优点或有益效果:在两个引擎之间执行数据迁移时,依次对每个数据进行迁移,并且先判断数据的key是否在目标引擎中存在,如果存在则说明当前这个数据是旧数据,无需迁移,可直接删除,否则进行迁移,从而确保数据的一致性。
可选的,在所述任两个引擎之间的数据迁移过程中,将待迁移数据所在的引擎作为源引擎,将迁移到的引擎作为目标引擎,从源引擎到目标引擎进行数据迁移的操作,包括:
将所述源引擎中的任一数据作为当前待迁移数据,如果该当前待迁移数据有效,则对该当前待迁移数据的key进行加锁;
判断所述当前待迁移数据的key是否在所述源引擎中被删除,如果未被删除,则判断所述目标引擎中是否存在所述当前待迁移数据的key,如果不存在,则将所述当前待迁移数据迁移到所述目标引擎,如果存在,则放弃迁移所述当前待迁移数据;
从所述源引擎中删除所述当前待迁移数据的key,并释放该key的锁;
对所述源引擎中的每个数据重复执行上述操作,直到所述源引擎中没有有效数据为止;
释放所述源引擎,并删除与所述源引擎有关的信息。
可选的,在将所述空引擎的状态设置为激活状态之前,所述方法还包括:
将所述空引擎加入到引擎队列中,并存储所述空引擎的元数据和属性信息,其中,所述引擎队列用于记录所有创建的引擎,并按照创建时间顺序对引擎进行排序。
可选的,在所述引擎队列中,引擎队列的头部对应最早创建的引擎,尾部对应最新创建的引擎;其中,所述方法还包括:
从所述引擎队列的尾部向头部对引擎进行遍历,确定满足如下条件的引擎对:任一引擎向外并未与任何引擎之间进行数据迁移,且引擎内部也没有进行任何数据迁移;
将所述引擎对中创建在先的引擎作为源引擎,将创建在后的引擎作为目标引擎,将所述源引擎的数据迁移到所述目标引擎。
上述申请中的一个实施例具有如下优点或有益效果:通过对符合条件的引擎对执行数据平滑迁移操作,在确保数据一致性的基础上,缓解了引擎数量增加后带来的存储容量和性能开销。
可选的,应用于引擎管理层,所述引擎管理层位于存储引擎框架中的schema层和多个存储引擎之间,并且所述引擎管理层的特定文件中存储所有引擎的元数据和属性信息;其中,所述方法还包括:
如果所述存储引擎框架重启,则检查所述特定文件是否存在;
如果不存在,则创建特定文件,并将当前已加载的引擎作为第一个引擎记录到所述特定文件中;
如果存在,则遍历所述特定文件,并依据各引擎的状态采取相应的策略逐个加载;
其中,如果引擎处于预加载状态或已加载状态,则将该引擎添加到引擎队列中,并加载该引擎;如果引擎处于缺少数据的状态,则不加载该引擎,并将该引擎的状态设置为数据缺失状态。
上述申请中的一个实施例具有如下优点或有益效果:当引擎框架重启后,确保重启前各引擎状态的正确恢复,保证各引擎数据的稳定性。
第二方面,本申请实施例还提供了一种存储引擎切换装置,包括:
引擎类型获取模块,用于响应存储引擎切换请求,获取目标存储引擎类型;
引擎创建模块,用于基于所述目标存储引擎类型创建空引擎,并将所述空引擎的状态设置为激活状态,其中,处于激活状态的所述空引擎用于接收实时的新数据,并对外提供服务;
数据迁移模块,用于将数据从当前旧引擎迁移到所述空引擎,并在迁移过程中保留所述数据的最新值。
第三方面,本申请实施例还提供了一种电子设备,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行本申请任意实施例所述的存储引擎切换方法。
第四方面,本本申请实施例还提供了一种存储有计算机指令的非瞬时计算机可读存储介质,其特征在于,所述计算机指令用于使所述计算机执行本申请任意实施例所述的存储引擎切换方法。
上述申请中的一个实施例具有如下优点或有益效果:实现了引擎切换的功能,通过激活新创建的空引擎,让空引擎接收实时的新数据,然后在将数据从当前旧引擎迁移到空引擎的过程中,确保数据的最新值,以提高数据的一致性和稳定性,从而实现同时支持多种类型的存储引擎。
具体的,在不同引擎之间进行数据迁移时,通过判断key的存在,以确定正在迁移的是新数据还是旧数据,如果是新数据则迁移,如果是旧数据,则删除,从而在迁移数据时保证数据的实时性和一致性。在数据迁移的过程中,针对读请求,基于引擎创建的时间顺序,按照从最新到最旧的顺序进行读数据,针对删除数据请求,按照从最旧到最新的顺序进行数据删除,确保不会删除实时的新数据,从而进一步提高数据的一致性和稳定性。此外,本申请实施例还实现了数据增量加载和冷备恢复等功能。在整体上,实现对用户无感知的情况下完成不同引擎之间的热插拔操作。
上述可选方式所具有的其他效果将在下文中结合具体实施例加以说明。
附图说明
附图用于更好地理解本方案,不构成对本申请的限定。其中:
图1是本申请实施例的一种存储引擎切换方法的流程示意图;
图2是本申请实施例的另一种存储引擎切换方法的流程示意图;
图3是本申请实施例的另一种存储引擎切换方法的流程示意图;
图4是本申请实施例的另一种存储引擎切换方法的流程示意图;
图5是本申请实施例的存储引擎框架重启后的处理流程示意图;
图6是本申请实施例的存储引擎切换装置的结构示意图;
图7是用来实现本申请实施例的存储引擎切换方法的电子设备的框图。
具体实施方式
以下结合附图对本申请的示范性实施例做出说明,其中包括本申请实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本申请的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
图1是本申请实施例的存储引擎切换方法的流程示意图,本实施例可适用于管理多个存储引擎的情况,并在需要时自动实现不同存储引擎间的数据迁移。该方法应用于引擎管理层,所述引擎管理层位于存储引擎框架中的schema层和多个存储引擎之间,用于对多个存储引擎进行管理。具体的,引擎管理层提供引擎的添加、激活、切换等接口,并通过状态机的方法维护多个引擎的状态变化,同时负责多引擎并存时的加载和关闭。引擎管理层还用于将所有引擎信息(包括uuid、引擎状态、路径等)记录到特定文件(manifest)中,并维护引擎信息,比如在引擎状态发生变更时实时将引擎状态持久化到manfiest文件中。
该方法可由一种存储引擎切换装置来执行,该装置采用软件和/或硬件的方式实现,优选是配置于电子设备中。如图1所示,该方法具体包括如下:
S101、响应存储引擎切换请求,获取目标存储引擎类型。
根据存储硬件的特性和上层业务的特征,当发生需要更换存储引擎时,则可以由技术人员发出存储引擎切换请求,并指定需要更换的存储引擎类型,即为所述目标存储引擎类型。该类型可以是任一种存储引擎类型,本申请实施例对此不作任何限定。
S102、基于所述目标存储引擎类型创建空引擎,并将所述空引擎的状态设置为激活状态,其中,处于激活状态的所述空引擎用于接收实时的新数据,并对外提供服务。
新创建的空引擎中没有数据,将其状态更改为激活后,则对外提供服务,并接收实时的新数据,存储在该空引擎中。其中,对外提供服务是指上层业务对数据的读、写和删除等操作。
可选的,在将所述空引擎的状态设置为激活状态之前,所述方法还包括:
将所述空引擎加入到引擎队列中,并存储所述空引擎的元数据和属性信息,其中,所述引擎队列用于记录所有创建的引擎,并按照创建时间顺序对引擎进行排序。
具体的,引擎管理层可以用来创建并维护该引擎队列,按照引擎创建的顺序将各引擎加入该引擎队列。因此,引擎队列的头部对应最早创建的引擎,尾部对应最新创建的引擎。通过引擎队列可以便于引擎管理层对各引擎进行管理。所述元数据和属性信息可以存储在特定文件(manifest文件)中,其中,元数据例如包括引擎中所存储的数据的键(key),属性信息例如包括引擎的类型、UUID、大小或路径等相关信息。
此外,创建新的空引擎之前,还可以对请求中携带的目标存储引擎类型的合法性进行校验,如果校验不通过,则可以不进行创建,返回失败。如果校验通过,并且引擎队列中已经存在相同类型和UUID的激活状态的引擎,则可以无需重新创建,直接启动引擎间的数据迁移操作。还需要说明的是,如果待创建的引擎的路径已经存在,则说明上一次切换引擎时,没有将相关信息记录到manifest文件中,因此,可以删除该路径后,再继续执行新引擎的创建和迁移操作。
S103、将数据从当前旧引擎迁移到所述空引擎,并在迁移过程中保留所述数据的最新值。
引擎之间执行数据迁移时,由于空引擎正在实时接收新数据,同时又要做到对上层业务不感知,因此,需要确保数据的稳定性和一致性,避免数据错误和混乱。通常,引擎中的数据可以以键值对的形式进行存储,而任一数据的值又可能是随时发生变化的。那么例如对于游戏业务而言,用户的游戏金币数量会随着游戏的进度增加,如果第一天用户的金币数量是10个,第二天增加到了15个,那么在第二天进行数据迁移时,就需要确定key为金币数量的这个数据的值,在执行迁移的两个引擎中,哪个引擎存储的是最新的数据,哪个引擎存储的是旧数据。如果空引擎是第二天创建的,并存储了15个金币的最新值,那么在执行数据迁移时,就不应当将10个金币的旧数据进行迁移,否则会覆盖新数据,影响数据的实时性,造成数据不一致的现象。
因此,可选的,在任两个引擎之间的数据迁移过程中,将待迁移数据所在的引擎作为源引擎,将迁移到的引擎作为目标引擎,从源引擎到目标引擎进行数据迁移的操作,包括:
对所述源引擎中的任一当前待迁移数据,判断该当前待迁移数据的key是否在所述目标引擎中存在;
如果存在,则判断为当前待迁移数据为旧数据,并在所述源引擎中删除当前待迁移数据;
如果不存在,则将当前待迁移数据迁移到所述目标引擎,并在所述源引擎中删除当前待迁移数据。
此外,引擎间的数据迁移为了不影响上层业务,做到不感知,在迁移过程中,当发生对数据的读请求或删除请求时,也需要保证数据的准确性、一致性。
可选的,在所述将数据从当前旧引擎迁移到所述空引擎的执行过程中,所述方法还包括:
响应对任一目标数据的读操作,在所述空引擎中查询是否存在所述目标数据的key;
如果存在,则从所述空引擎中读取所述目标数据的值;
如果不存在,则在所述当前旧引擎中查询是否存在所述目标数据的key,如果在所述当前旧引擎中存在,则从所述当前旧引擎中读取所述目标数据的值。
具体的,所述读操作中可以指定要读取的目标数据的key,先在空引擎中查询是否存在该key,如果存在,那么由于空引擎激活后存储的是实时的新数据,则直接在空引擎中读取该目标数据的key对应的值即可;反之,如果不存在,则说明空引擎中尚未接收并存储该key对应的最新值,此时,则可以从当前旧引擎中读取即可,若当前旧引擎中也不存在目标数据的key,则说明尚未存储过该目标数据,返回相应的提示信息即可。
可选的,在所述将数据从当前旧引擎迁移到所述空引擎的执行过程中,所述方法还包括:
响应对任一目标数据的删除操作,在所述当前旧引擎中查询是否存在所述目标数据的key;
如果存在,则在所述当前旧引擎中删除所述目标数据的值;
如果不存在,则在所述空引擎中查询是否存在所述目标数据的key,如果在所述空引擎中存在,则在所述空引擎中删除所述目标数据的值。
具体的,针对删除操作,则是按照从旧引擎到新引擎的顺序进行删除。先在当前旧引擎中查询是否存在目标数据的key,如果存在,则直接删除该key对应的值,如果不存在,则在空引擎中查询,并删除,如果空引擎中也不存在,则说明尚未存储该目标数据,返回相应的提示信息即可。
通过上述操作,在实现引擎间执行数据迁移的同时,使得针对读操作返回最新值,针对删除操作,删除旧数据,避免误伤新数据,从而确保数据的一致性。
本申请实施例的技术方案,实现了引擎切换的功能,通过激活新创建的空引擎,让空引擎接收实时的新数据,然后在将数据从当前旧引擎迁移到空引擎的过程中,确保数据的最新值,以提高数据的一致性和稳定性,从而实现同时支持多种类型的存储引擎。
具体的,在不同引擎之间进行数据迁移时,通过判断key的存在,以确定正在迁移的是新数据还是旧数据,如果是新数据则迁移,如果是旧数据,则删除,从而在迁移数据时保证数据的实时性和一致性。在数据迁移的过程中,针对读请求,基于引擎创建的时间顺序,按照从最新到最旧的顺序进行读数据,针对删除数据请求,按照从最旧到最新的顺序进行数据删除,确保不会删除实时的新数据,从而进一步提高数据的一致性和稳定性。
图2是本申请实施例的另一种存储引擎切换方法的流程图,本实施例在上述实施例的基础上进一步进行优化,在本实施例中,所述存储引擎切换请求是基于对增量数据的存储需求而生成,因此,接下来对增量加载情形进行详细说明。如图2所示,该方法具体包括如下:
S201、响应存储引擎切换请求,获取目标存储引擎类型,其中,所述存储引擎切换请求是基于对增量数据的存储需求而生成。所述增量数据可以是来自于任一上层业务场景下的增量数据,本申请实施例对此不作任何限定。
S202、依据所述目标存储引擎类型创建第一增量引擎,将所述第一增量引擎的状态设置为预加载,其中,所述第一增量引擎的预加载表示正在将所述增量数据迁移到所述第一增量引擎,并且在预加载阶段所述第一增量引擎不对外提供服务。
S203、如果预加载成功,则将所述第一增量引擎的状态设置为已加载。
增量数据的加载不能影响正常的实时数据存储,因此,先创建一个增量引擎,在增量引擎的预加载过程中,将增量数据迁移到该增量引擎,并且先不对外提供服务。当前旧引擎则继续执行存储实时数据的任务。当增量引擎预加载成功后,再将其状态设置为已加载,表明已经将增量数据加载成功。如果预加载失败,则可以返回错误或失败信息。
S204、基于所述目标存储引擎类型创建空引擎,并将所述空引擎的状态设置为激活状态,其中,处于激活状态的所述空引擎用于接收实时的新数据,并对外提供服务。
S205、将状态为已加载的所述第一增量引擎的状态设置为激活状态,激活后所述第一增量引擎对外提供服务。
S206、将所述第一增量引擎的数据迁移到所述空引擎,并在迁移完毕后,将所述当前旧引擎的数据迁移到所述空引擎。
增量数据加载成功后,接下来就应该执行引擎间的数据迁移了。首先创建空引擎并激活,用于存储实时的新数据,并对外提供服务。然后将状态为已加载的第一增量引擎的状态设置为激活,让其对外提供服务,也即增量数据可以对外提供服务了。
在迁移时,具体的,先将第一增量引擎的数据迁移到空引擎,完毕后,再将当前旧引擎的数据迁移到空引擎。这里需要说明的是,由于空引擎的数据比增量引擎的数据新,增量引擎的数据又比旧引擎的数据新,因此,在执行迁移操作时,先在最新的两个引擎之间执行数据迁移,再将旧引擎的数据迁移过来,能够确保始终保留数据的最新值。因为迁移过程中,如果相应数据的key已经在要迁移到的较新的引擎中存在,则不执行迁移,并且删除该数据,因此,能够保证迁移后始终保留数据的最新值。
此处需要说明的是,针对增量数据,在增量引擎预加载过程中,是可以将实时的新数据继续存储在当前旧引擎中的,因此,在预加载阶段,可以无需创建空引擎。当增量引擎加载成功后,再创建空引擎,且空引擎激活后即可接收实时的新数据,最后再按照一定的顺序,在三个引擎中执行数据迁移。
可选的,在所述第一增量引擎与空引擎,以及当前旧引擎与空引擎之间进行数据迁移的过程中,所述方法还包括:
响应对任一目标数据的读操作,按照从空引擎到第一增量引擎到当前旧引擎的顺序,查询是否存在所述目标数据的key,并从查询到存在该key的引擎中读取所述目标数据的值;
响应对任一目标数据的删除操作,按照从当前旧引擎到第一增量引擎到空引擎的顺序,查询是否存在所述目标数据的key,并在查询到存在该key的引擎中删除所述目标数据的值。
也即,在涉及三个引擎之间的数据迁移过程中,针对读操作请求,按照引擎创建时间降序的优先级顺序,进行数据读,而针对删除操作请求,则按照引擎创建时间升序的优先级顺序,进行数据删除,从而能够在读数据时保证读到最新数据,而在删除数据时,不会将最新产生的数据的值误删,从而确保数据的稳定性和一致性。
本申请实施例的技术方案,实现了增量加载的功能,通过创建一个增量引擎对增量数据进行预加载,并在预加载阶段不对外提供服务,保证数据的稳定性。当预加载成功后,创建空引擎并激活,用于接收实时的新数据,然后再激活增量引擎对外提供服务,最终按照一定的顺序,先将增量引擎的数据迁移到空引擎,再将旧引擎的数据迁移到空引擎,确保数据的稳定性和一致性。
图3是本申请实施例的另一种存储引擎切换方法的流程示意图,本实施例在上述各个实施例的基础上进一步进行优化。在本实施例中,所述存储引擎切换请求是基于对冷备数据的恢复需求而生成,因此,接下来对冷备恢复情形进行详细说明。如图3所示,该方法具体包括如下:
S301、响应存储引擎切换请求,获取目标存储引擎类型,其中,所述存储引擎切换请求是基于对冷备数据的恢复需求而生成。所述冷备数据可以是来自于任一上层业务场景下产生的冷备数据,本申请实施例对此不作任何限定。
S302、依据所述目标存储引擎类型创建第二增量引擎,将所述第二增量引擎的状态设置为预加载,其中,所述第二增量引擎的预加载表示正在将所述冷备数据迁移到所述第二增量引擎,并且在预加载阶段所述第二增量引擎不对外提供服务。
S303、基于所述目标存储引擎类型创建空引擎,并将所述空引擎的状态设置为激活状态,其中,处于激活状态的所述空引擎用于接收实时的新数据,并对外提供服务。
此处需要说明的是,冷备恢复的过程与上述实施例中描述的增量加载过程略有不同,也即,在冷备恢复时,是在预加载阶段就创建空引擎以接收实时的新数据,因为冷备数据是相对当前旧引擎中的数据而言更新的数据,在迁移冷备数据时,不能将实时的新数据写入当前的旧引擎,因此,需要在预加载阶段同时创建空引擎以接收实时的新数据,否则后面将无法在保证数据一致性的前提下进行引擎间的数据迁移。
S304、如果所述第二增量引擎预加载成功,则将所述第二增量引擎的状态设置为激活状态,激活后所述第二增量引擎对外提供服务。
S305、将所述第二增量引擎的数据迁移到所述空引擎,并在迁移完毕后,将所述当前旧引擎的数据迁移到所述空引擎。
可选的,为了确保数据迁移过程中,在执行数据读和数据删除请求时,也能确保数据的一致性,在所述第二增量引擎与空引擎,以及当前旧引擎与空引擎之间进行数据迁移的过程中,所述方法还包括:
响应对任一目标数据的读操作,按照从空引擎到第二增量引擎到当前旧引擎的顺序,查询是否存在所述目标数据的key,并从查询到存在该key的引擎中读取所述目标数据的值;
响应对任一目标数据的删除操作,按照从当前旧引擎到第二增量引擎到空引擎的顺序,查询是否存在所述目标数据的key,并在查询到存在该key的引擎中删除所述目标数据的值。
本申请实施例的技术方案,实现了冷备恢复的功能,通过创建一个增量引擎对增量数据进行预加载,并在预加载阶段创建空引擎用以接收实时的新数据,当增量引擎预加载成功后再激活,增量引擎对外提供服务,最终按照一定的顺序,先将增量引擎的数据迁移到空引擎,再将旧引擎的数据迁移到空引擎,确保数据的稳定性和一致性。
图4是本申请实施例的另一种存储引擎切换方法的流程示意图,本实施例在上述各个实施例的基础上进一步进行优化。如图4所示,该方法具体包括如下:
S401、响应存储引擎切换请求,获取目标存储引擎类型。
S402、基于所述目标存储引擎类型创建空引擎,将所述空引擎加入到引擎队列中,并存储所述空引擎的元数据和属性信息,其中,所述引擎队列用于记录所有创建的引擎,并按照创建时间顺序对引擎进行排序。
S403、将所述空引擎的状态设置为激活状态,其中,处于激活状态的所述空引擎用于接收实时的新数据,并对外提供服务。
S404、将数据从当前旧引擎迁移到所述空引擎,并在迁移过程中保留所述数据的最新值。
S405、从所述引擎队列的尾部向头部对引擎进行遍历,确定满足如下条件的引擎对:任一引擎向外并未与任何引擎之间进行数据迁移,且引擎内部也没有进行任何数据迁移,其中,在所述引擎队列中,引擎队列的头部对应最早创建的引擎,尾部对应最新创建的引擎。
S406、将所述引擎对中创建在先的引擎作为源引擎,将创建在后的引擎作为目标引擎,将所述源引擎的数据迁移到所述目标引擎。
在存储引擎框架中,当引擎的数量增加,维护多个存储引擎的数据,会带来存储容量和查询性能的开销,而通过引擎间的数据平滑迁移机制将多个引擎的数据合并为一,则可以减小这种性能开销。实现时,为了确保数据的一致性,按照从最新往最旧的方向,依次将各个引擎的数据进行合并。而且同一时刻,只允许一个引擎在做迁移操作,如果在迁移过程中又增加了新引擎,也要等到该数据迁移操作结束后,在迁移到最新创建的引擎中。
具体的,则是通过从尾部向头部遍历引擎队列,若任一引擎向外并未与任何引擎之间进行数据迁移,且引擎内部也没有进行任何数据迁移,那么符合该条件的引擎对则可以按照创建时间顺序执行数据平滑迁移。
可选的,从源引擎到目标引擎进行数据迁移的操作,包括:
将所述源引擎中的任一数据作为当前待迁移数据,如果该当前待迁移数据有效,则对该当前待迁移数据的key进行加锁;
判断所述当前待迁移数据的key是否在所述源引擎中被删除,如果未被删除,则判断所述目标引擎中是否存在所述当前待迁移数据的key,如果不存在,则将所述当前待迁移数据迁移到所述目标引擎,如果存在,则放弃迁移所述当前待迁移数据;
从所述源引擎中删除所述当前待迁移数据的key,并释放该key的锁;
对所述源引擎中的每个数据重复执行上述操作,直到所述源引擎中没有有效数据为止;
释放所述源引擎,并删除与所述源引擎有关的信息。
其中,加锁后则无法对该数据进行写操作,迁移后再执行写入新数据,从而保证数据与上层业务的一致性。
本申请实施例的技术方案,通过对符合条件的引擎对执行数据平滑迁移操作,在确保数据一致性的基础上,缓解了引擎数量增加后带来的存储容量和性能开销。
图5是本申请实施例的存储引擎框架重启后的处理流程示意图,用于在存储引擎框架重启后,确保各引擎的正常运行,以及各引擎数据的稳定性和一致性。如图5所示,存储引擎框架重启后的处理流程包括:
S501、检查特定文件(manifest文件)是否存在,如果不存在,则执行S502,否则执行S503。
S502、创建manifest文件,并将当前已加载的引擎作为第一个引擎记录到所述特定文件中。
S503、遍历manifest文件,并依据各引擎的状态采取相应的策略逐个加载。
其中,如果引擎处于预加载状态或已加载状态,则将该引擎添加到引擎队列中,并加载该引擎;如果引擎处于缺少数据的状态,则不加载该引擎,并将该引擎的状态设置为数据缺失状态。
在具体执行引擎加载时,针对处于预加载状态的引擎按照如下操作进行加载:如果数据未导入,则将源数据路径下的数据导入到引擎的本地数据路径中;将该引擎添加到引擎队列中;设置当前正在加载的引擎为该引擎;启动异步加载引擎任务;针对处于已加载状态的引擎按照如下操作进行加载:将该引擎添加到引擎队列中,同步加载该引擎。
此外,在加载引擎之前,还可以对manifest文件中的引擎状态进行校验:
如果引擎处于预加载状态,并且引擎的本地数据路径下的数据不存在,运行的源数据路径也不存在,则设置该引擎的状态为数据缺失状态;若引擎的本地数据路径下的数据存在,但是引擎的源数据路径也存在,则结束本次引擎启动操作,返回错误信息。否则,则可以将该预加载状态的引擎添加到引擎队列中进行加载;
如果引擎处于已加载状态,并且引擎源数据路径下的数据存在,或者本地数据路径不存在,则结束本次引擎启动操作,返回错误信息。反之,则可以对该已加载状态的引擎添加到引擎队列中进行加载。
本申请实施例的技术方案,当引擎框架重启后,确保重启前各引擎状态的正确恢复,保证各引擎数据的稳定性。
图6是本申请实施例的存储引擎切换装置的结构示意图,本实施例可适用于管理多个存储引擎的情况,并在需要时自动实现不同存储引擎间的数据迁移。该装置可实现本申请任意实施例所述的存储引擎切换方法。该装置600具体包括如下:
引擎类型获取模块601,用于响应存储引擎切换请求,获取目标存储引擎类型;
引擎创建模块602,用于基于所述目标存储引擎类型创建空引擎,并将所述空引擎的状态设置为激活状态,其中,处于激活状态的所述空引擎用于接收实时的新数据,并对外提供服务;
数据迁移模块603,用于将数据从当前旧引擎迁移到所述空引擎,并在迁移过程中保留所述数据的最新值。
可选的,所述装置还包括读操作处理模块,用于在数据迁移模块603进行数据迁移的过程中,执行如下操作:
响应对任一目标数据的读操作,在所述空引擎中查询是否存在所述目标数据的key;
如果存在,则从所述空引擎中读取所述目标数据的值;
如果不存在,则在所述当前旧引擎中查询是否存在所述目标数据的key,如果在所述当前旧引擎中存在,则从所述当前旧引擎中读取所述目标数据的值。
可选的,所述装置还包括删除操作处理模块,用于在数据迁移模块603进行数据迁移的过程中,执行如下操作:
响应对任一目标数据的删除操作,在所述当前旧引擎中查询是否存在所述目标数据的key;
如果存在,则在所述当前旧引擎中删除所述目标数据的值;
如果不存在,则在所述空引擎中查询是否存在所述目标数据的key,如果在所述空引擎中存在,则在所述空引擎中删除所述目标数据的值。
可选的,所述装置还包括增量加载模块,用于在存储引擎切换请求是基于对增量数据的存储需求而生成时,执行如下操作:
在引擎创建模块602创建空引擎之前,依据所述目标存储引擎类型创建第一增量引擎,将所述第一增量引擎的状态设置为预加载,其中,所述第一增量引擎的预加载表示正在将所述增量数据迁移到所述第一增量引擎,并且在预加载阶段所述第一增量引擎不对外提供服务;
如果预加载成功,则将所述第一增量引擎的状态设置为已加载;
在引擎创建模块602将所述空引擎的状态设置为激活状态之后,将状态为已加载的所述第一增量引擎的状态设置为激活状态,激活后所述第一增量引擎对外提供服务;
相应的,所述数据迁移模块603还用于将所述第一增量引擎的数据迁移到所述空引擎,并在迁移完毕后,将所述当前旧引擎的数据迁移到所述空引擎。
可选的,所述装置还包括冷备恢复模块,用于在所述存储引擎切换请求是基于对冷备数据的恢复需求而生成时,执行如下操作:
在引擎创建模块602创建空引擎之前,依据所述目标存储引擎类型创建第二增量引擎,将所述第二增量引擎的状态设置为预加载,其中,所述第二增量引擎的预加载表示正在将所述冷备数据迁移到所述第二增量引擎,并且在预加载阶段所述第二增量引擎不对外提供服务;
在引擎创建模块602将所述空引擎的状态设置为激活状态之后,如果所述第二增量引擎预加载成功,则将所述第二增量引擎的状态设置为激活状态,激活后所述第二增量引擎对外提供服务;
相应的,所述数据迁移模块603还用于将所述第二增量引擎的数据迁移到所述空引擎,并在迁移完毕后,将所述当前旧引擎的数据迁移到所述空引擎。
可选的,所述读操作处理模块还用于:
在所述第一/第二增量引擎与空引擎,以及当前旧引擎与空引擎之间进行数据迁移的过程中,响应对任一目标数据的读操作,按照从空引擎到第一/第二增量引擎到当前旧引擎的顺序,查询是否存在所述目标数据的key,并从查询到存在该key的引擎中读取所述目标数据的值。
可选的,所述删除操作处理模块还用于:
在所述第一/第二增量引擎与空引擎,以及当前旧引擎与空引擎之间进行数据迁移的过程中,响应对任一目标数据的删除操作,按照从当前旧引擎到第一/第二增量引擎到空引擎的顺序,查询是否存在所述目标数据的key,并在查询到存在该key的引擎中删除所述目标数据的值。
可选的,在所述任两个引擎之间的数据迁移过程中,将待迁移数据所在的引擎作为源引擎,将迁移到的引擎作为目标引擎,则所述数据迁移模块用于从源引擎到目标引擎进行数据迁移,并具体用于执行如下操作:
对所述源引擎中的任一当前待迁移数据,判断该当前待迁移数据的key是否在所述目标引擎中存在;
如果存在,则判断为当前待迁移数据为旧数据,并在所述源引擎中删除当前待迁移数据;
如果不存在,则将当前待迁移数据迁移到所述目标引擎,并在所述源引擎中删除当前待迁移数据。
可选的,在所述任两个引擎之间的数据迁移过程中,将待迁移数据所在的引擎作为源引擎,将迁移到的引擎作为目标引擎,则所述数据迁移模块用于从源引擎到目标引擎进行数据迁移,并具体用于执行如下操作:
将所述源引擎中的任一数据作为当前待迁移数据,如果该当前待迁移数据有效,则对该当前待迁移数据的key进行加锁;
判断所述当前待迁移数据的key是否在所述源引擎中被删除,如果未被删除,则判断所述目标引擎中是否存在所述当前待迁移数据的key,如果不存在,则将所述当前待迁移数据迁移到所述目标引擎,如果存在,则放弃迁移所述当前待迁移数据;
从所述源引擎中删除所述当前待迁移数据的key,并释放该key的锁;
对所述源引擎中的每个数据重复执行上述操作,直到所述源引擎中没有有效数据为止;
释放所述源引擎,并删除与所述源引擎有关的信息。
可选的,所述装置还包括引擎队列管理模块,用于在引擎创建模块602将所述空引擎的状态设置为激活状态之前,将所述空引擎加入到引擎队列中,并存储所述空引擎的元数据和属性信息,其中,所述引擎队列用于记录所有创建的引擎,并按照创建时间顺序对引擎进行排序。
可选的,所述装置还包括数据平滑迁移模块,用于执行如下操作:
从所述引擎队列的尾部向头部对引擎进行遍历,确定满足如下条件的引擎对:任一引擎向外并未与任何引擎之间进行数据迁移,且引擎内部也没有进行任何数据迁移;
将所述引擎对中创建在先的引擎作为源引擎,将创建在后的引擎作为目标引擎,将所述源引擎的数据迁移到所述目标引擎;
其中,在所述引擎队列中,引擎队列的头部对应最早创建的引擎,尾部对应最新创建的引擎。
可选的,所述装置配置于引擎管理层,所述引擎管理层位于存储引擎框架中的schema层和多个存储引擎之间,并且所述引擎管理层的特定文件中存储所有引擎的元数据和属性信息;相应的,所述装置还包括重启模块,用于执行如下操作:
如果所述存储引擎框架重启,则检查所述特定文件是否存在;
如果不存在,则创建特定文件,并将当前已加载的引擎作为第一个引擎记录到所述特定文件中;
如果存在,则遍历所述特定文件,并依据各引擎的状态采取相应的策略逐个加载;
其中,如果引擎处于预加载状态或已加载状态,则将该引擎添加到引擎队列中,并加载该引擎;如果引擎处于缺少数据的状态,则不加载该引擎,并将该引擎的状态设置为数据缺失状态。
本申请实施例所提供的存储引擎切换装置600可执行本申请任意实施例所提供的存储引擎切换方法,具备执行方法相应的功能模块和有益效果。本实施例中未详尽描述的内容可以参考本申请任意方法实施例中的描述。
根据本申请的实施例,本申请还提供了一种电子设备和一种可读存储介质。
如图7所示,是根据本申请实施例的存储引擎切换方法的电子设备的框图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本申请的实现。
如图7所示,该电子设备包括:一个或多个处理器701、存储器702,以及用于连接各部件的接口,包括高速接口和低速接口。各个部件利用不同的总线互相连接,并且可以被安装在公共主板上或者根据需要以其它方式安装。处理器可以对在电子设备内执行的指令进行处理,包括存储在存储器中或者存储器上以在外部输入/输出装置(诸如,耦合至接口的显示设备)上显示GUI的图形信息的指令。在其它实施方式中,若需要,可以将多个处理器和/或多条总线与多个存储器和多个存储器一起使用。同样,可以连接多个电子设备,各个设备提供部分必要的操作(例如,作为服务器阵列、一组刀片式服务器、或者多处理器系统)。图7中以一个处理器701为例。
存储器702即为本申请所提供的非瞬时计算机可读存储介质。其中,所述存储器存储有可由至少一个处理器执行的指令,以使所述至少一个处理器执行本申请所提供的存储引擎切换方法。本申请的非瞬时计算机可读存储介质存储计算机指令,该计算机指令用于使计算机执行本申请所提供的存储引擎切换方法。
存储器702作为一种非瞬时计算机可读存储介质,可用于存储非瞬时软件程序、非瞬时计算机可执行程序以及模块,如本申请实施例中的存储引擎切换方法对应的程序指令/模块(例如,附图6所示的引擎类型获取模块601、引擎创建模块602和数据迁移模块603)。处理器701通过运行存储在存储器702中的非瞬时软件程序、指令以及模块,从而执行服务器的各种功能应用以及数据处理,即实现上述方法实施例中的存储引擎切换方法。
存储器702可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储根据实现本申请实施例的存储引擎切换方法的的电子设备的使用所创建的数据等。此外,存储器702可以包括高速随机存取存储器,还可以包括非瞬时存储器,例如至少一个磁盘存储器件、闪存器件、或其他非瞬时固态存储器件。在一些实施例中,存储器702可选包括相对于处理器701远程设置的存储器,这些远程存储器可以通过网络连接至实现本申请实施例的存储引擎切换方法的电子设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
实现本申请实施例的存储引擎切换方法的电子设备还可以包括:输入装置703和输出装置704。处理器701、存储器702、输入装置703和输出装置704可以通过总线或者其他方式连接,图7中以通过总线连接为例。
输入装置703可接收输入的数字或字符信息,以及产生与实现本申请实施例的存储引擎切换方法的电子设备的用户设置以及功能控制有关的键信号输入,例如触摸屏、小键盘、鼠标、轨迹板、触摸板、指示杆、一个或者多个鼠标按钮、轨迹球、操纵杆等输入装置。输出装置704可以包括显示设备、辅助照明装置(例如,LED)和触觉反馈装置(例如,振动电机)等。该显示设备可以包括但不限于,液晶显示器(LCD)、发光二极管(LED)显示器和等离子体显示器。在一些实施方式中,显示设备可以是触摸屏。
此处描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、专用ASIC(专用集成电路)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。
这些计算程序(也称作程序、软件、软件应用、或者代码)包括可编程处理器的机器指令,并且可以利用高级过程和/或面向对象的编程语言、和/或汇编/机器语言来实施这些计算程序。如本文使用的,术语“机器可读介质”和“计算机可读介质”指的是用于将机器指令和/或数据提供给可编程处理器的任何计算机程序产品、设备、和/或装置(例如,磁盘、光盘、存储器、可编程逻辑装置(PLD)),包括,接收作为机器可读信号的机器指令的机器可读介质。术语“机器可读信号”指的是用于将机器指令和/或数据提供给可编程处理器的任何信号。
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。
根据本申请实施例的技术方案,实现了引擎切换的功能,通过激活新创建的空引擎,让空引擎接收实时的新数据,然后在将数据从当前旧引擎迁移到空引擎的过程中,确保数据的最新值,以提高数据的一致性和稳定性,从而实现同时支持多种类型的存储引擎。
具体的,在不同引擎之间进行数据迁移时,通过判断key的存在,以确定正在迁移的是新数据还是旧数据,如果是新数据则迁移,如果是旧数据,则删除,从而在迁移数据时保证数据的实时性和一致性。在数据迁移的过程中,针对读请求,基于引擎创建的时间顺序,按照从最新到最旧的顺序进行读数据,针对删除数据请求,按照从最旧到最新的顺序进行数据删除,确保不会删除实时的新数据,从而进一步提高数据的一致性和稳定性。此外,本申请实施例还实现了数据增量加载和冷备恢复等功能。在整体上,实现对用户无感知的情况下完成不同引擎之间的热插拔操作。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本发申请中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本申请公开的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本申请保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本申请的精神和原则之内所作的修改、等同替换和改进等,均应包含在本申请保护范围之内。
Claims (26)
1.一种存储引擎切换方法,其特征在于,包括:
响应存储引擎切换请求,获取目标存储引擎类型;
基于所述目标存储引擎类型创建空引擎,并将所述空引擎的状态设置为激活状态,其中,处于激活状态的所述空引擎用于接收实时的新数据,并对外提供服务;
将数据从当前旧引擎迁移到所述空引擎,并在迁移过程中保留所述数据的最新值。
2.根据权利要求1所述的方法,其特征在于,在所述将数据从当前旧引擎迁移到所述空引擎的执行过程中,所述方法还包括:
响应对任一目标数据的读操作,在所述空引擎中查询是否存在所述目标数据的key;
如果存在,则从所述空引擎中读取所述目标数据的值;
如果不存在,则在所述当前旧引擎中查询是否存在所述目标数据的key,如果在所述当前旧引擎中存在,则从所述当前旧引擎中读取所述目标数据的值。
3.根据权利要求1所述的方法,其特征在于,在所述将数据从当前旧引擎迁移到所述空引擎的执行过程中,所述方法还包括:
响应对任一目标数据的删除操作,在所述当前旧引擎中查询是否存在所述目标数据的key;
如果存在,则在所述当前旧引擎中删除所述目标数据的值;
如果不存在,则在所述空引擎中查询是否存在所述目标数据的key,如果在所述空引擎中存在,则在所述空引擎中删除所述目标数据的值。
4.根据权利要求1所述的方法,其特征在于,如果所述存储引擎切换请求是基于对增量数据的存储需求而生成,则在所述创建空引擎之前,所述方法还包括:
依据所述目标存储引擎类型创建第一增量引擎,将所述第一增量引擎的状态设置为预加载,其中,所述第一增量引擎的预加载表示正在将所述增量数据迁移到所述第一增量引擎,并且在预加载阶段所述第一增量引擎不对外提供服务;
如果预加载成功,则将所述第一增量引擎的状态设置为已加载;
相应的,所述将所述空引擎的状态设置为激活状态之后,所述方法还包括:
将状态为已加载的所述第一增量引擎的状态设置为激活状态,激活后所述第一增量引擎对外提供服务;
相应的,所述将数据从当前旧引擎迁移到所述空引擎,包括:
将所述第一增量引擎的数据迁移到所述空引擎,并在迁移完毕后,将所述当前旧引擎的数据迁移到所述空引擎。
5.根据权利要求1所述的方法,其特征在于,如果所述存储引擎切换请求是基于对冷备数据的恢复需求而生成,则在所述创建空引擎之前,所述方法还包括:
依据所述目标存储引擎类型创建第二增量引擎,将所述第二增量引擎的状态设置为预加载,其中,所述第二增量引擎的预加载表示正在将所述冷备数据迁移到所述第二增量引擎,并且在预加载阶段所述第二增量引擎不对外提供服务;
相应的,在将所述空引擎的状态设置为激活状态之后,所述方法还包括:
如果所述第二增量引擎预加载成功,则将所述第二增量引擎的状态设置为激活状态,激活后所述第二增量引擎对外提供服务;
相应的,所述将数据从当前旧引擎迁移到所述空引擎,包括:
将所述第二增量引擎的数据迁移到所述空引擎,并在迁移完毕后,将所述当前旧引擎的数据迁移到所述空引擎。
6.根据权利要求4或5所述的方法,其特征在于,在所述第一/第二增量引擎与空引擎,以及当前旧引擎与空引擎之间进行数据迁移的过程中,所述方法还包括:
响应对任一目标数据的读操作,按照从空引擎到第一/第二增量引擎到当前旧引擎的顺序,查询是否存在所述目标数据的key,并从查询到存在该key的引擎中读取所述目标数据的值。
7.根据权利要求4或5所述的方法,其特征在于,在所述第一/第二增量引擎与空引擎,以及当前旧引擎与空引擎之间进行数据迁移的过程中,所述方法还包括:
响应对任一目标数据的删除操作,按照从当前旧引擎到第一/第二增量引擎到空引擎的顺序,查询是否存在所述目标数据的key,并在查询到存在该key的引擎中删除所述目标数据的值。
8.根据权利要求1-5中任一项所述的方法,其特征在于,在所述任两个引擎之间的数据迁移过程中,将待迁移数据所在的引擎作为源引擎,将迁移到的引擎作为目标引擎,从源引擎到目标引擎进行数据迁移的操作,包括:
对所述源引擎中的任一当前待迁移数据,判断该当前待迁移数据的key是否在所述目标引擎中存在;
如果存在,则判断为当前待迁移数据为旧数据,并在所述源引擎中删除当前待迁移数据;
如果不存在,则将当前待迁移数据迁移到所述目标引擎,并在所述源引擎中删除当前待迁移数据。
9.根据权利要求1-5中任一项所述的方法,其特征在于,在所述任两个引擎之间的数据迁移过程中,将待迁移数据所在的引擎作为源引擎,将迁移到的引擎作为目标引擎,从源引擎到目标引擎进行数据迁移的操作,包括:
将所述源引擎中的任一数据作为当前待迁移数据,如果该当前待迁移数据有效,则对该当前待迁移数据的key进行加锁;
判断所述当前待迁移数据的key是否在所述源引擎中被删除,如果未被删除,则判断所述目标引擎中是否存在所述当前待迁移数据的key,如果不存在,则将所述当前待迁移数据迁移到所述目标引擎,如果存在,则放弃迁移所述当前待迁移数据;
从所述源引擎中删除所述当前待迁移数据的key,并释放该key的锁;
对所述源引擎中的每个数据重复执行上述操作,直到所述源引擎中没有有效数据为止;
释放所述源引擎,并删除与所述源引擎有关的信息。
10.根据权利要求1所述的方法,其特征在于,在将所述空引擎的状态设置为激活状态之前,所述方法还包括:
将所述空引擎加入到引擎队列中,并存储所述空引擎的元数据和属性信息,其中,所述引擎队列用于记录所有创建的引擎,并按照创建时间顺序对引擎进行排序。
11.根据权利要求10所述的方法,其特征在于,在所述引擎队列中,引擎队列的头部对应最早创建的引擎,尾部对应最新创建的引擎;其中,所述方法还包括:
从所述引擎队列的尾部向头部对引擎进行遍历,确定满足如下条件的引擎对:任一引擎向外并未与任何引擎之间进行数据迁移,且引擎内部也没有进行任何数据迁移;
将所述引擎对中创建在先的引擎作为源引擎,将创建在后的引擎作为目标引擎,将所述源引擎的数据迁移到所述目标引擎。
12.根据权利要求10所述的方法,其特征在于,应用于引擎管理层,所述引擎管理层位于存储引擎框架中的schema层和多个存储引擎之间,并且所述引擎管理层的特定文件中存储所有引擎的元数据和属性信息;其中,所述方法还包括:
如果所述存储引擎框架重启,则检查所述特定文件是否存在;
如果不存在,则创建特定文件,并将当前已加载的引擎作为第一个引擎记录到所述特定文件中;
如果存在,则遍历所述特定文件,并依据各引擎的状态采取相应的策略逐个加载;
其中,如果引擎处于预加载状态或已加载状态,则将该引擎添加到引擎队列中,并加载该引擎;如果引擎处于缺少数据的状态,则不加载该引擎,并将该引擎的状态设置为数据缺失状态。
13.一种存储引擎切换装置,其特征在于,包括:
引擎类型获取模块,用于响应存储引擎切换请求,获取目标存储引擎类型;
引擎创建模块,用于基于所述目标存储引擎类型创建空引擎,并将所述空引擎的状态设置为激活状态,其中,处于激活状态的所述空引擎用于接收实时的新数据,并对外提供服务;
数据迁移模块,用于将数据从当前旧引擎迁移到所述空引擎,并在迁移过程中保留所述数据的最新值。
14.根据权利要求13所述的装置,其特征在于,所述装置还包括读操作处理模块,用于在所述数据迁移模块进行数据迁移的过程中,执行如下操作:
响应对任一目标数据的读操作,在所述空引擎中查询是否存在所述目标数据的key;
如果存在,则从所述空引擎中读取所述目标数据的值;
如果不存在,则在所述当前旧引擎中查询是否存在所述目标数据的key,如果在所述当前旧引擎中存在,则从所述当前旧引擎中读取所述目标数据的值。
15.根据权利要求13所述的装置,其特征在于,所述装置还包括删除操作处理模块,用于在所述数据迁移模块进行数据迁移的过程中,执行如下操作:
响应对任一目标数据的删除操作,在所述当前旧引擎中查询是否存在所述目标数据的key;
如果存在,则在所述当前旧引擎中删除所述目标数据的值;
如果不存在,则在所述空引擎中查询是否存在所述目标数据的key,如果在所述空引擎中存在,则在所述空引擎中删除所述目标数据的值。
16.根据权利要求13所述的装置,其特征在于,所述装置还包括增量加载模块,用于在所述存储引擎切换请求是基于对增量数据的存储需求而生成时,执行如下操作:
在所述引擎创建模块创建空引擎之前,依据所述目标存储引擎类型创建第一增量引擎,将所述第一增量引擎的状态设置为预加载,其中,所述第一增量引擎的预加载表示正在将所述增量数据迁移到所述第一增量引擎,并且在预加载阶段所述第一增量引擎不对外提供服务;
如果预加载成功,则将所述第一增量引擎的状态设置为已加载;
在所述引擎创建模块将所述空引擎的状态设置为激活状态之后,将状态为已加载的所述第一增量引擎的状态设置为激活状态,激活后所述第一增量引擎对外提供服务;
相应的,所述数据迁移模块还用于:将所述第一增量引擎的数据迁移到所述空引擎,并在迁移完毕后,将所述当前旧引擎的数据迁移到所述空引擎。
17.根据权利要求13所述的装置,其特征在于,所述装置还包括冷备恢复模块,用于在所述存储引擎切换请求是基于对冷备数据的恢复需求而生成时,执行如下操作:
在所述引擎创建模块创建空引擎之前,依据所述目标存储引擎类型创建第二增量引擎,将所述第二增量引擎的状态设置为预加载,其中,所述第二增量引擎的预加载表示正在将所述冷备数据迁移到所述第二增量引擎,并且在预加载阶段所述第二增量引擎不对外提供服务;
在所述引擎创建模块将所述空引擎的状态设置为激活状态之后,如果所述第二增量引擎预加载成功,则将所述第二增量引擎的状态设置为激活状态,激活后所述第二增量引擎对外提供服务;
相应的,所述数据迁移模块还用于:将所述第二增量引擎的数据迁移到所述空引擎,并在迁移完毕后,将所述当前旧引擎的数据迁移到所述空引擎。
18.根据权利要求16或17所述的装置,其特征在于,所述读操作处理模块还用于:
在所述第一/第二增量引擎与空引擎,以及当前旧引擎与空引擎之间进行数据迁移的过程中,响应对任一目标数据的读操作,按照从空引擎到第一/第二增量引擎到当前旧引擎的顺序,查询是否存在所述目标数据的key,并从查询到存在该key的引擎中读取所述目标数据的值。
19.根据权利要求16或17所述的装置,其特征在于,所述删除操作处理模块还用于:
在所述第一/第二增量引擎与空引擎,以及当前旧引擎与空引擎之间进行数据迁移的过程中,响应对任一目标数据的删除操作,按照从当前旧引擎到第一/第二增量引擎到空引擎的顺序,查询是否存在所述目标数据的key,并在查询到存在该key的引擎中删除所述目标数据的值。
20.根据权利要求13-17中任一项所述的装置,其特征在于,在所述任两个引擎之间的数据迁移过程中,将待迁移数据所在的引擎作为源引擎,将迁移到的引擎作为目标引擎,则所述数据迁移模块用于从源引擎到目标引擎进行数据迁移,并具体用于执行如下操作:
对所述源引擎中的任一当前待迁移数据,判断该当前待迁移数据的key是否在所述目标引擎中存在;
如果存在,则判断为当前待迁移数据为旧数据,并在所述源引擎中删除当前待迁移数据;
如果不存在,则将当前待迁移数据迁移到所述目标引擎,并在所述源引擎中删除当前待迁移数据。
21.根据权利要求13-17中任一项所述的装置,其特征在于,在所述任两个引擎之间的数据迁移过程中,将待迁移数据所在的引擎作为源引擎,将迁移到的引擎作为目标引擎,则所述数据迁移模块用于从源引擎到目标引擎进行数据迁移,并具体用于执行如下操作:
将所述源引擎中的任一数据作为当前待迁移数据,如果该当前待迁移数据有效,则对该当前待迁移数据的key进行加锁;
判断所述当前待迁移数据的key是否在所述源引擎中被删除,如果未被删除,则判断所述目标引擎中是否存在所述当前待迁移数据的key,如果不存在,则将所述当前待迁移数据迁移到所述目标引擎,如果存在,则放弃迁移所述当前待迁移数据;
从所述源引擎中删除所述当前待迁移数据的key,并释放该key的锁;
对所述源引擎中的每个数据重复执行上述操作,直到所述源引擎中没有有效数据为止;
释放所述源引擎,并删除与所述源引擎有关的信息。
22.根据权利要求13所述的装置,其特征在于,所述装置还包括引擎队列管理模块,用于在所述引擎创建模块将所述空引擎的状态设置为激活状态之前,将所述空引擎加入到引擎队列中,并存储所述空引擎的元数据和属性信息,其中,所述引擎队列用于记录所有创建的引擎,并按照创建时间顺序对引擎进行排序。
23.根据权利要求22所述的装置,其特征在于,所述装置还包括数据平滑迁移模块,用于执行如下操作:
从所述引擎队列的尾部向头部对引擎进行遍历,确定满足如下条件的引擎对:任一引擎向外并未与任何引擎之间进行数据迁移,且引擎内部也没有进行任何数据迁移;
将所述引擎对中创建在先的引擎作为源引擎,将创建在后的引擎作为目标引擎,将所述源引擎的数据迁移到所述目标引擎;
其中,在所述引擎队列中,引擎队列的头部对应最早创建的引擎,尾部对应最新创建的引擎。
24.根据权利要求22所述的装置,其特征在于,所述装置配置于引擎管理层,所述引擎管理层位于存储引擎框架中的schema层和多个存储引擎之间,并且所述引擎管理层的特定文件中存储所有引擎的元数据和属性信息;相应的,所述装置还包括重启模块,用于执行如下操作:
如果所述存储引擎框架重启,则检查所述特定文件是否存在;
如果不存在,则创建特定文件,并将当前已加载的引擎作为第一个引擎记录到所述特定文件中;
如果存在,则遍历所述特定文件,并依据各引擎的状态采取相应的策略逐个加载;
其中,如果引擎处于预加载状态或已加载状态,则将该引擎添加到引擎队列中,并加载该引擎;如果引擎处于缺少数据的状态,则不加载该引擎,并将该引擎的状态设置为数据缺失状态。
25.一种电子设备,其特征在于,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-12中任一项所述的存储引擎切换方法。
26.一种存储有计算机指令的非瞬时计算机可读存储介质,其特征在于,所述计算机指令用于使所述计算机执行权利要求1-12中任一项所述的存储引擎切换方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910828325.1A CN110532225A (zh) | 2019-09-03 | 2019-09-03 | 存储引擎切换方法、装置、电子设备和介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910828325.1A CN110532225A (zh) | 2019-09-03 | 2019-09-03 | 存储引擎切换方法、装置、电子设备和介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110532225A true CN110532225A (zh) | 2019-12-03 |
Family
ID=68666668
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910828325.1A Pending CN110532225A (zh) | 2019-09-03 | 2019-09-03 | 存储引擎切换方法、装置、电子设备和介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110532225A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111258954A (zh) * | 2020-01-10 | 2020-06-09 | 北京百度网讯科技有限公司 | 数据迁移方法、装置、设备及存储介质 |
CN113641641A (zh) * | 2021-07-27 | 2021-11-12 | 欧电云信息科技(江苏)有限公司 | 文件存储服务的切换方法、切换系统、设备及存储介质 |
CN114202365A (zh) * | 2021-12-15 | 2022-03-18 | 广东电力信息科技有限公司 | 一种基于电力行业营销系统实时数据的监控方法 |
-
2019
- 2019-09-03 CN CN201910828325.1A patent/CN110532225A/zh active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111258954A (zh) * | 2020-01-10 | 2020-06-09 | 北京百度网讯科技有限公司 | 数据迁移方法、装置、设备及存储介质 |
CN111258954B (zh) * | 2020-01-10 | 2023-12-05 | 北京百度网讯科技有限公司 | 数据迁移方法、装置、设备及存储介质 |
CN113641641A (zh) * | 2021-07-27 | 2021-11-12 | 欧电云信息科技(江苏)有限公司 | 文件存储服务的切换方法、切换系统、设备及存储介质 |
CN114202365A (zh) * | 2021-12-15 | 2022-03-18 | 广东电力信息科技有限公司 | 一种基于电力行业营销系统实时数据的监控方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN114341792B (zh) | 存储集群之间的数据分区切换 | |
US11048688B2 (en) | Deleting configuration items in a configuration management database | |
US11301154B2 (en) | Distributed storage method and device | |
US9720989B2 (en) | Dynamic partitioning techniques for data streams | |
US8132043B2 (en) | Multistage system recovery framework | |
US20210224226A1 (en) | Asynchronous queries on secondary data cores in a distributed computing system | |
CN111273872A (zh) | 一种数据迁移方法、装置、设备和介质 | |
CN110532225A (zh) | 存储引擎切换方法、装置、电子设备和介质 | |
CN112948091B (zh) | 应用系统的迁移方法、装置、电子设备及存储介质 | |
CN113364877B (zh) | 数据处理方法、装置、电子设备和介质 | |
US10620871B1 (en) | Storage scheme for a distributed storage system | |
CN113961510B (zh) | 一种文件处理方法、装置、设备及存储介质 | |
US10860431B2 (en) | System and method for fault tolerant backup generation in a virtual environment | |
US10503428B2 (en) | System and method for concurrent multipoint backup | |
CN111767169B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN114063883B (zh) | 存储数据方法、电子设备和计算机程序产品 | |
CN113760847A (zh) | 日志数据处理方法、装置、设备及存储介质 | |
US10979303B1 (en) | Segmentation of maintenance on distributed systems | |
US9933953B1 (en) | Managing copy sessions in a data storage system to control resource consumption | |
US8621260B1 (en) | Site-level sub-cluster dependencies | |
CN113220650A (zh) | 数据存储方法、装置、设备、存储介质及程序 | |
CN115470303A (zh) | 一种数据库访问方法、装置、系统、设备及可读存储介质 | |
CN111258954B (zh) | 数据迁移方法、装置、设备及存储介质 | |
US11119994B1 (en) | Record-by-record live migration using segmentation | |
US11675668B2 (en) | Leveraging a cloud-based object storage to efficiently manage data from a failed backup operation |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |