基于kafka与哈希共享内存的分布式数据中心
技术领域
本发明涉及数据中心
技术领域
,尤其涉及一种基于kafka与哈希共享内存的分布式数据中心。背景技术
对于数据中心而言,目前一般使用redis(redis是一个key-value存储系统)或数据库做存储,其仅有一个中心数据库或读写分离的数据库。随着数据量的增大,中心数据库的数据愈发庞大,数据中心的写入及访问频次也随之增大,访问的压力不断接近数据中心的极限,导致中心数据库访问压力过大,且数据中心的性能也限制了业务的不断增长,由于数据中心采用的是redis或数据库存储数据,业务对数据的访问速度具有一定速率的要求,在跨区域甚至跨国时,数据的访问效率达不到业务的需求,即数据中心的访问效率达不到业务处理能力,很难实现快速、实时地进行数据的访问及检验,跨区域访问中心数据库的数据访问速度慢。
因此,现有技术存在缺陷,需要改进。
发明内容
本发明的目的是克服现有技术的不足,提供一种基于kafka与哈希共享内存的分布式数据中心。
本发明的技术方案如下:
一种基于kafka与哈希共享内存的分布式数据中心,包括:
中心数据库,所述中心数据库用于建立对应常量表的数据更新表,并将所述常量表的增加/修改的数据写入所述数据更新表中;
新增数据读取服务端,其与所述中心数据库连接,所述新增数据读取服务端用于定时读取所述数据更新表中新增的数据,并将读取到的数据推送到kafka中;
根数据中心服务端,其与所述中心数据库和kafka连接,其还连接共享内存,所述根数据中心服务端用于在查询到与之连接的共享内存中不存在数据时,读取所述中心数据库的全量数据,全量数据读取完成后再持续从所述kafka中消费新增的数据,并将数据写入所述共享内存中,以及用于在查询到与之连接的共享内存中已存有数据时直接消费所述kafka中新增的数据并将数据写入所述共享内存中;
若干页节点数据中心服务端,每一所述页节点数据中心服务端对应一个服务器,每一所述服务器均设有共享内存,每一所述所述页节点数据中心服务端用于在查询到与之对应的服务器设有的共享内存中不存在数据时,将所述根数据中心服务端的全量数据同步到本节点,然后再消费所述kafka中新增的数据,并把新增的数据存储到共享内存中,以及用于在查询到与之对应的服务器设有的共享内存中不存在数据时,直接消费所述kafka中新增的数据,并把新增的数据存储到共享内存中。
进一步地,所述中心数据库中通过mysql的建表语句建立已存在的常量表的相同字段的数据更新表,并通过mysql的创建触发器的语句创建对应数据表的触发器以触发mysql的数据表的插入及更新操作,从而使得新增的数据或修改的中心数据库的数据通过该触发器插入到所述数据更新表中。
进一步地,所述新增数据读取服务端定时读取所述数据更新表的前128条数据,并将mysql的查询语句查询到的数据读取出来,读取的数据推送到所述kafka中。
进一步地,所述新增数据读取服务端读取的数据是以json的形式推送到所述kafka中。
进一步地,所述新增数据读取服务端通过索引使用mysql的删除数据的语句将对应的已读取的数据从所述数据更新表中删除以避免对数据的重复读取。
进一步地,所述共享内存包括共享内存头和数据区,所述共享内存头存储的信息包括插入数据的次数、删除数据的次数、更新数据的次数、数据版本、共享内存的数据量之中的多种,所述数据区用于存储所述根数据中心服务端从所述中心数据库读取的数据。
进一步地,所述根数据中心服务端通过boost库创建的接口打开所述共享内存,并查询所述共享内存中是否存在数据;所述根数据中心服务端在读取到共享内存中不存在数据时,读取所述中心数据库的全量数据,读取到的数据存储到所述共享内存的数据区中,读取完中心数据库的全量数据后,再从所述kafka中消费更新的数据,然后将消费到的数据通过boost库的接口写入到所述共享内存的数据区中;所述根数据中心服务端在读取到共享内存中存在数据时,直接从kafka中消费数据,并将消费到的数据通过boost库的接口写入所述共享内存中。
进一步地,每一所述页节点数据中心服务端通过boost库创建的接口打开共享内存,并查询所述共享内存中是否存在数据;每一所述页节点数据中心服务端在查询到共享内存中不存在数据时,通过文件同步的形式将全量数据从所述根数据中心服务端同步到与该页节点数据中心服务端所对应的服务器,然后开始消费kafka中新增的数据,再通过boost库的插入共享内存数据的接口将新增的数据存储到共享内存中;每一所述页节点数据中心服务端在查询到共享内存中存在数据时,直接开始消费kafka的新增数据,并通过boost库的插入共享内存数据的接口将数据存储到共享内存中。
进一步地,每一所述页节点数据中心服务端在查询到共享内存中不存在数据时,所述页节点数据中心服务端消费kafka中新增的数据是根据同步过来的数据中的kafka的offset值开始消费;
每一所述页节点数据中心服务端在查询到共享内存中存在数据时,所述页节点数据中心服务端消费kafka中新增的数据是直接从对应的offset值开始消费。
进一步地,所述共享内存为哈希共享内存。
采用上述方案,本发明具有以下有益效果:
1、本发明通过将中心数据库的数据同步到各个服务器的共享内存中,降低了中心数据库的访问压力,有效解决了跨区域及跨国访问速度过慢的问题,实现了数据的分布式查询,极大地提升了业务查询及数据校验的速率,解决了本地业务对查询校验的快速需求;
2、优选方案中kafka的应用,使得业务服务与服务器更新互不干扰,无需停止服务来更新服务器,保证服务器更新过程中业务服务的正常运行。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图示出的结构获得其他的附图。
图1为本发明基于kafka与哈希共享内存的分布式数据中心的流程图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
以下结合附图和具体实施例,对本发明进行详细说明。
参照图1所示,本发明提供一种基于kafka与哈希共享内存的分布式数据中心,包括:
中心数据库1,所述中心数据库1建立对应常量表的数据更新表,并通过触发器将所述常量表的增加/修改的数据写入所述数据更新表中;具体的,所述中心数据库1中通过mysql(mysql是一个关系型数据库管理系统)的建表语句建立已存在的常量表的相同字段的mysql表(mysql表称为数据更新表,在下文中均用数据更新表来替代mysql表),并通过mysql的创建触发器的语句创建对应数据表的触发器,从而触发mysql的数据表的插入及更新操作,进而使得新增的数据或修改的中心数据库1的数据通过该触发器插入到所述数据更新表中;
新增数据读取服务端2,所述新增数据读取服务端2定时从对应的数据更新表中读取新增的数据,并将读取到的数据以json的形式推送到kafka(kafka是一种高吞吐量的分布式发布订阅消息系统)中;具体的,所述新增数据读取服务端2连接所述中心数据库1,其定时读取所述中心数据库1的数据更新表的前128条数据,当mysql的查询语句查询到所述数据更新表中有数据时,所述新增数据读取服务端2将mysql的查询语句查询到的数据更新表中的数据读取出来,并以json的形式推送到kafka中;为了保证数据的不重复读取,所述新增数据读取服务端2通过索引使用mysql的删除数据的语句将对应的已读取的数据从所述数据更新表中删除;
根数据中心服务端3,所述根数据中心服务端3首先查询与之连接的共享内存中是否存在数据,其中,所述共享内存优选的为哈希共享内存,所述共享内存的结构分为共享内存头和数据区,所述共享内存头存储的信息包括插入数据的次数、删除数据的次数、更新数据的次数、数据版本、共享内存的数据量之中的多种,所述数据区用于存储所述根数据中心服务端3从所述中心数据库1读取的数据,如果哈希共享内存中不存在数据,则所述根数据中心服务端3从所述中心数据库1中的全量表中读取全量数据,读取完所述中心数据库1的全量数据后,所述根数据中心服务端3再持续从所述kafka中不断消费新增的数据,并将数据写入哈希共享内存中,而如果哈希共享内存中已存有数据,则所述根数据中心服务端3直接消费所述kafka中新增的数据,并将数据写入哈希共享内存中,即所述根数据中心服务端3通过查询哈希共享内存中是否存在数据来判断其是否需要从所述中心数据库1中的全量表中读取全量数据,当哈希共享内存中不存在数据时,所述根数据中心服务端3先从所述中心数据库1中的全量表中读取全量数据,读取完中心数据库1的全量数据后再持续从所述kafka中不断消费新增的数据,并将数据写入哈希共享内存中,而当哈希共享内存中已存有数据时,所述根数据中心服务端3直接消费所述kafka中的新增的数据,并将数据写入哈希共享内存中;为防止服务器重启导致根数据中心服务端3重新访问中心数据库1读取全量数据,所述根数据中心服务端3定时将哈希共享内存中的数据保存到文件中,从而解决了服务器提供服务慢的问题;具体的,所述根数据中心服务端3分别连接所述中心数据库1、kafka和哈希共享内存,所述根数据中心服务端3启动时首先通过boost库创建用于打开哈希共享内存的接口,并判断是否存在名称与上述接口(即boost库创建的接口)的名称相同的哈希共享内存,如果不存在名称与上述接口的名称相同的哈希共享内存,那么所述根数据中心服务端3调用boost库创建新的用于打开哈希共享内存的接口,如果存在名称与上述接口的名称相同的哈希共享内存,那么所述根数据中心服务端3使用上述接口(即boost库创建的接口)打开哈希共享内存,并通过读取所述共享内存头存储的共享内存的数据量判断哈希共享内存中是否存在数据,如果哈希共享内存中不存在数据,所述根数据中心服务端3连接所述中心数据库1并读取中心数据库1的全量表中的全量数据(即所述根数据中心服务端3连接所述中心数据库1后,所述根数据中心服务端3根据表名读取mysql的数据表中的全部数据),并将读取到的数据存储到哈希共享内存的数据区中,读取完上述全量数据后再从所述kafka中消费更新的数据(即从kafka中获取插入或者更新的中心数据库1的数据),然后将消费到的数据通过boost库的接口写入到与之连接的所述哈希共享内存的数据区中,而如果哈希共享内存中存在数据,所述根数据中心服务端3直接从kafka中消费数据,并将消费到的数据通过boost库的接口写入与所述根数据中心服务端3连接的哈希共享内存中;
若干页节点数据中心服务端4,每一所述页节点数据中心服务端4对应一个服务器,每一所述服务器均设有共享内存,该共享内存优选的为哈希共享内存,每一所述页节点数据中心服务端4首先查询与其相对应的服务器的哈希共享内存中是否存在数据,如果与该页节点数据中心服务端4对应的服务器的哈希共享内存中不存在数据,则该页节点数据中心服务端4从所述根数据中心服务端3通过文件同步的形式将全量数据同步到本节点(即其自身所对应的节点),然后根据同步过来的数据中的kafka的offset值开始消费kafka中新增的数据,并把新增的数据存储到哈希共享内存中,而如果与该页节点数据中心服务端4对应的服务器的哈希共享内存中已存在数据,则该页节点数据中心服务端4直接从对应的offset值开始消费kafka中新增的数据,并把新增的数据存储到哈希共享内存中;即每一所述页节点数据中心服务端4通过查询本地哈希共享内存(即与该页节点数据中心服务端4相对应的服务器所设有的哈希共享内存)中是否存在数据来判断是否需要从所述根数据中心服务端3同步全量数据,当哈希共享内存中不存在数据时,那么所述页节点数据中心服务端4先从所述根数据中心服务端3通过文件同步的形式将全量数据同步到该页节点数据中心服务端4对应的节点,再根据同步过来的数据中的kafka的offset值开始消费kafka中新增的数据,并把新增的数据存储到哈希共享内存中,而当哈希共享内存中遗存有数据时,那么所述页节点数据中心服务端4直接从对应的offset值开始消费kafka的新增数据,并把新增的数据存储到哈希共享内存中;具体的,每一所述页节点数据中心服务端4均连接所述根数据中心服务端3和kafka,每一所述页节点数据中心服务端4启动时首先通过boost库创建用于打开哈希共享内存的接口,并判断是否存在名称与上述接口的名称相同的哈希共享内存,如果不存在名称与上述接口的名称相同的哈希共享内存,则所述页节点数据中心服务端4调用boost库创建新的用于打开哈希共享内存的接口,如果存在名称与上述接口的名称相同的哈希共享内存,则所述页节点数据中心服务端4使用boost库的接口(即上述接口)打开哈希共享内存,并通过读取所述共享内存头存储的共享内存的数据量判断哈希共享内存中是否存在数据,如果哈希共享内存中不存在数据,所述页节点数据中心服务端4连接所述根数据中心服务端3并通过文件同步的形式将全量数据从所述根数据中心服务端3同步到与该页节点数据中心服务端4所对应的服务器,然后根据同步过来的数据中的kafka的offset值开始消费kafka中新增的数据,再通过boost库的插入共享内存数据的接口将新增的数据存储到哈希共享内存中,而如果如果哈希共享内存中已存有数据,所述页节点数据中心服务端4直接从对应的offset值开始消费kafka的新增数据,并通过boost库的插入共享内存数据的接口将数据存储到哈希共享内存中。
与现有技术相比,本发明具有以下有益效果:
1、本发明通过将中心数据库的数据同步到各个服务器的共享内存中,降低了中心数据库的访问压力,有效解决了跨区域及跨国访问速度过慢的问题,实现了数据的分布式查询,极大地提升了业务查询及数据校验的速率,解决了本地业务对查询校验的快速需求;
2、优选方案中kafka的应用,使得业务服务与服务器更新互不干扰,无需停止服务来更新服务器,保证服务器更新过程中业务服务的正常运行。
以上仅为本发明的较佳实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。