数据的处理方法及装置、存储介质与流程

文档序号:17489504发布日期:2019-04-23 20:19阅读:210来源:国知局
数据的处理方法及装置、存储介质与流程

本发明涉及计算机领域,具体而言,涉及一种数据的处理方法及装置、存储介质。



背景技术:

开发迅速和易于部署是采用php(professionalhypertextpreprocessor,服务器端编程语言)语言编写处理http(hypertexttransportprotocol,超文本传输协议)请求的主要原因,而且每个执行php脚本的fpm进程都是互相独立互不影响的,相当于将每个请求进行隔离,因此也避免全局变量的污染及相关全局参数的修改,方便问题进行追查。

但是随着项目复杂度的不断提升及同时在线客户端越来越多,请求越来越复杂,需要扩展更多的php进程来满足日益增长的并发http请求。之前每个http请求都拥有独立的php进程服务的优点,随着并发服务的进程增多,每个进程都会创建各自独立的数据库连接,也即意味着mysql的连接数也会以1:1的比例随之增加。

通过压测发现:一台72核512g内存的安装linux操作系统的机器上部署数据库管理系统mysql,模拟线上数据库queryinfo结果压测发现,数据库的qps会随着连接数的增多而性能指标有不同程度的下降。例如随着连接数增多至2万,每个连接使用率不高且频繁创建/断开的情况下,qps是连接数2千情况下的5分之一。

由此可见,传统的php+mysql架构存在两个问题:1)数据库的连接数随着php工作进程的增多而增多;2)单个数据库连接利用率不高,而整体的数据库性能却急剧下降。因此降低数据库连接数,提高连接的利用率是随着php进程数扩展引入的亟待解决的问题。

对此,相关技术中采用以下方式来解决上述问题:

方式(1),对于部分静态编译语言,在本身处理http请求的进程中提供了数据库连接池概念,例如java语言的java.sql.connectionpool.java类,提供了基于jdbc(javadatabaseconnectivity)的连接池功能,当工作线程需要对数据库中的数据进行操作的时候,需要从连接池中获取一个空闲连接,通过将要传递给mysql的数据发送给连接线程,连接线程转发数据到数据库,再将数据库中返回的结果转发给上层工作线程。从本质上说连接池和工作线程属于同个进程的不同线程。

方式(2),第三方数据库中间件方案也提供了类似连接池功能。例如社区知名项目atlas、mycat等中间件,通过代理转发上层业务进程发送过来的数据库请求,在中间件层建立数据库连接,通过主从分离,负载均衡的一系列功能最终将请求转发到不同的数据库实例,并将结果收集后转发回业务层进程。

但是,基于上述方式(1)和方式(2),对于已经上线的项目,如果要接入第三方中间件,则无法避免对已有的业务进行大规模的修改,原本在业务层区分的对数据库读写主从分离的代码需要重新逐条添加配置适应中间件。而且引入新的中间件服务也在一定程度提高系统复杂度,一旦中间件服务不可用,则会影响客户端响应,尤其对于登录/计费等功能,不能实时响应则是不可接受的。

针对相关技术中的上述问题,目前尚未存在有效的解决方案。



技术实现要素:

本发明实施例提供了一种数据的处理方法及装置、存储介质,以至少解决相关技术中引入第三方数据库的中间件导致系统复杂度高的问题。

根据本发明的一个实施例,提供了一种数据的处理方法,包括:代理进程向数据库系统转发接收到的由访问进程发送的用于访问所述数据库系统的数据;所述代理进程接收所述数据库系统执行所述数据后反馈的结果;在所述结果指示当前数据库访问结束的情况下,所述代理进程回收所述访问进程释放的连接资源。

根据本发明的另一个方面,提供了一种数据的处理装置,应用于代理进程侧,包括:转发模块,用于向数据库系统转发接收到的由访问进程发送的用于访问所述数据库系统的数据;接收模块,用于接收所述数据库系统执行所述数据后反馈的结果;回收模块,用于在所述结果指示当前数据库访问结束的情况下,回收所述访问进程释放的连接资源。

根据本发明的又一个实施例,还提供了一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。

通过本发明,代理进程来转发用于访问数据库系统的数据,进而执行相应访问数据库的操作,从而解决了相关技术中引入第三方数据库的中间件导致系统复杂度高的问题,达到了在提高数据库通信连接率的同时降低了系统复杂度的效果。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的数据的处理方法的流程图;

图2是根据本发明实施例的代理进程的内部拓扑结构示意图;

图3是根据本发明实施例的worker状态迁移的示意图;

图4是根据本发明实施例的php进程选取空闲worker进行数据库操作的方法流程图;

图5是根据本发明实施例的数据的处理装置的结构示意图。

具体实施方式

下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。

实施例1

在本实施例中提供了一种数据的处理方法,图1是根据本发明实施例的数据的处理方法的流程图,如图1所示,该流程包括如下步骤:

步骤s102,代理进程向数据库系统转发接收到的由访问进程发送的用于访问数据库系统的数据;

步骤s104,代理进程接收数据库系统执行数据后反馈的结果;

步骤s106,在结果指示当前数据库访问结束的情况下,代理进程回收访问进程释放的连接资源。

通过上述步骤s102至步骤s106,在本申请中可以通过代理进程来转发用于访问数据库系统的数据,进而执行相应访问数据库的操作,从而解决了相关技术中引入第三方数据库的中间件导致系统复杂度高的问题,达到了在提高数据库通信连接率的同时降低了系统复杂度。

在本实施例的可选实施方式中,对于本实施例步骤s102中涉及到的代理进程向数据库系统转发接收到的由访问进程发送的用于访问数据库系统的数据的方式,可以通过如下方式来实现:

步骤s102-11,在接收到数据后,代理进程判断代理进程中是否存在空闲的工作子进程;

步骤s102-12,在代理进程中存在空闲的工作子进程的情况下,代理进程通过空闲的工作子进程将数据向数据库系统转发;

步骤s102-13,在代理进程中不存在空闲的工作子进程的情况下,代理进程判断非空闲的工作子进程的等待队列中用于传输访问数据库系统的数据的连接数是否超过预设阈值;

步骤s102-14,在连接数未超过预设阈值的情况下,代理进程将用于访问数据库系统的数据插入到非空闲的工作子进程的等待队列中以等待被转发;在连接数超过预设阈值的情况下,代理进程断开连接数超过预设阈值的工作子进程与数据库系统的连接。

通过上述步骤s102-12至步骤s102-14可知,如果代理进程中有空闲的工作子进程,则通过该空闲的工作子进程来进行数据的转发;如果代理进程中不存在空闲的工作子进程,由于每个非空闲的工作子进程都有对应的等待队列,队列中等待有需要被转发的数据;但是每个等待队列的等待数量,即连接数是否超过了最大允许的连接数,如果是,则直接断开异常返回,避免服务器堆积过多的请求造成数据库雪崩;如果否,则等待状态变为空闲的工作子进程结束后唤醒。

需要说明的是,本实施例中涉及到的代理进程除了包括上述工作子进程外,还包括:服务子进程和管理子进程。

其中,代理进程通过服务子进程监听访问进程与代理进程之间的套接字连接;以及通过该服务子进程启停代理进程中的整个子进程以及重配置工作子进程的状态。而代理进程通过服务子进程可以启动管理子进程;进而代理进程通过管理子进程启动工作子进程,并通过管理子进程对工作子进程的状态进行管理。

在本实施例的可选实施方式中,本实施例中涉及到的代理进程可以是proxyserver。基于此,本实施例中涉及到的数据库系统为mysql,以及访问进程可以是php进程。

因此,在本实施例的具体应用场景中该代理进程三种子线程,一个server进程(服务子进程),一个manager进程(管理子进程),和若干个worker子进程(工作子进程)。每个group代表连接不同mysql实例的一组worker子进程集合。需要说明的是,group本身不是单独的进程。图2是根据本发明实施例的代理进程的内部拓扑结构示意图。

因此,该server作为主线程,在代理进程中所起的作用为:

1)初始化配置,启动manager子线程;

2)监听php和proxyserver的tcp连接及接收套接字发送来的事件并进行处理,例如给worker子线程或manager子线程发送signal信号,增加/退出新的worker子进程等;

3)启停整个进程和reload配置文件的信号接收并通知manager进行配置重载。

而manager子进程用来创建/管理子进程,具体如下:

1)负责启动worker子进程;

2)负责对子进程的退出监听,如果异常退出则需要重新启动;

3)对将超过默认最小连接数且当前处于idle状态的worker进行回收,保证随着业务压力的变化而新增的连接可以在空闲的时候进行回收。

需要说明的是,worker子进程是实际的工作进程,在本实施例中可以有7种状态:

1)del状态,此状态是由manager进行recycle已经回收的;

2)idle状态,此状态表示当前worker处于空闲,可以被使用;

3)busy状态,当前worker正在处理mysql操作;

4)recycle_busy状态,应该立刻被回收,回收重启后转换成busy;

5)recycling_busy状态,将recycle状态的worker进行重启过程中的状态,仍然表示服务不可用;

6)recycle_idle状态,应该立即回收,但是没有排队phpfpm进程,回收重启后转换成idle;

7)recycling_idle状态,将recycle_idle进行重启过程中的状态,仍然表示服务不可用。

图3是根据本发明实施例的worker状态迁移的示意图,如图3所示,idle->del:由manager定时检查,如果发现当前的idleworker超过最小空闲worker数,则将worker进行回收,worker退出,worker的状态置位del。

idle->busy:某个php进程发现要访问的数据库对应的group有一个空闲的worker,则将worker设置成busy,并通过和worker交互数据进行mysql数据库查询。

busy->idle:php进程结束mysql操作后,发现如果没有排队等待服务的其他php进程,则将worker置为idle。

busy->recycle:由于apache进程退出没有释放worker,或事务没有提交/回滚等操作,或apache等待超时返回没有释放worker,应该重启worker,则将worker置为recycle;

recycle->recycling:manager正在重启被标记为recycle状态的worker;

recycling->busy:worker重启后检查当前group中是否有正在等待服务端php进程,如果有,则通过signal唤醒php,并置自己的状态为idle;

recycling->idle:worker重启后发现并无等待服务的php进程,则将自己置为idle,等待新的php进程选中后进行数据交互。

在具体应用场景中,本实施例中涉及到的代理进程可以是proxyserver。以及数据库系统为mysql、访问进程是php进程的情况下,在本实施例中还需要对php进程访问mysql进行改造,具体如下:

1),通过在php初始化中注册对pdo对象的构造(__construct),析构(__destruct),调用(__call)这三个基本的驱动函数的位置注册回调函数;

2),增加对pdo对象的release的调用函数;

3),通过重写/扩展上述函数的功能,实现数据库的连接实际上是和代理进程的连接,对数据库访问和获取的数据交互实际上是和代理进程的数据交互来达到目的。

4),如果选取worker无空闲而失败则排队的逻辑,通过进程间通过共享内存的方式来查询或修改worker的状态;

5),如果有排队php进程则负责在当前php进程退出或释放连接的时候唤醒worker的功能;

6),通过命名管道(namedpipe)来实现和worker的进程间通信,用以交互序列化后的mysql数据;

7),通过tcp连接方式和前述代理进程proxyserver的server进程进行通信,实现要求增加worker;此外,异常退出导致需要及时销毁对应工作worker的事件。

在本实施例的另一个可选实施方式中,对于本实施例步骤s102-12中涉及到的在代理进程中存在空闲的工作子进程的情况下,代理进程通过空闲的工作子进程将数据向数据库系统转发的方式,可以通过如下方式来实现:

步骤s102-121,代理进程判断是否存在与数据对应的分组进程;其中,代理进程包括一个或多个分组进程,每个分组进程包括一个或多个工作子进程;

步骤s102-122,在代理进程中存在与用于访问数据库系统的数据对应的分组进程,且分组进程中有空闲的工作子进程的情况下,代理进行通过该空闲的工作子进程转发数据;

步骤s102-123,在代理进程中不存在与数据对应的分组进程的情况下,代理进程与访问进程建立与数据对应的新的分组进程,并基于新的分组进程中的空闲工作子进程转发数据。

在本实施例的另一个可选实施方式中,本实施例的方法步骤还包括:

步骤s108,在等待队列中的当前数据基于非空闲的工作子进程执行访问数据库系统的操作完成的情况下,判断等待队列是否为空;

步骤s110,在判断结果为是的情况下,代理进程将非空闲的工作子进程的状态设置为空闲;在判断结果为否的情况下,代理进程唤醒等待队列中的用于访问数据库系统的数据基于非空闲的工作子进程继续对数据库系统进行访问。

通过上述步骤s108和步骤s110可知,对于具有等待队列的非空闲的工作子进程,如果等待队列中的数据执行访问数据系统的操作全部完成,则等待队列为空,将工作子进程的状态设置为空闲,如果等待队列中还有其他数据,则继续执行对数据库系统的访问操作。

在本实施例的另一个可选实施方式中,本实施的方法步骤还可以包括:

步骤s112,在收到用于指示第一工作子进程异常退出并释放数据库系统连接的信号的情况下,代理进程生成第二工作子进程;

步骤s114,代理进程基于第二工作子进程唤醒第一工作子进程中的等待队列。

下面结合本实施例的可选实施方式对本申请进行举例说明;

可选实施方式一:php进程选取空闲worker进行数据库操作

图4是根据本发明实施例的php进程选取空闲worker进行数据库操作的方法流程图,如图4所示,该方法步骤包括:

步骤s401,判断根据mysql数据库连接信息(ip/port/user)判断是否存在已经建立的group分组;

步骤s402,如果有分组,判断分组数量是否达到上限;

步骤s403,如果分组数量已达到最大,判断当前等待队列是否达到最大,如果否,则阻塞等待,如果是则退出进程避免phpfpm进程始终忙等待;

步骤s404,如果有分组且有空闲的worker,则使用当前worker进行通信;

步骤s405,如果分组数量没有达到上限,需要mmap共享内存新分配对应group信息,并通过和server进程建立的tcp连接,发送需要创建新建分组的worker事件;

步骤s406,由manager确定是否存在对应分子,php进程将要发送的数据库请求经过序列化后发送给和worker对应的命名管道,并将进程阻塞;

步骤s407,如果是需要新增的worker,server收到tcp新增事件的时候,通过signal信号通知manager进程需要根据新增worker;

步骤s408,manager收到信号后,创建出worker进程;worker启动后通过命名管道接收php进程序列化后的操作数据,并通过group信息创建mysql连接,将数据转发给mysql;

步骤s409,worker获取到mysql返回的数据后,通过命名管道将结果发送给php进程,再返回给php上层业务结果。

可选实施方式二:php进程间唤醒排队等待;

该php进程唤醒排队等待的方法步骤包括:

步骤s502,对于进程php1来说,如果是正常退出或release,也即上层业务保证对数据库的操作已经执行完毕,此时需要检查自身group的等待队列是否为空;

步骤s504,如果等待队列为空,则需要置当前的worker为idle状态,以便新执行的php进程可以重复利用当前的worker;

步骤s506,如果等待队列不为空,则不需要修改worker状态,仍然保持busy,接下来将队列头等待的进程php2通过信号唤醒,php2复用当前worker对数据库进行操作。

可选实施方式三:当php进程因为查询返回超时退出,或一项事务在php进程结束的时候未进行commit/rollback操作,也即没有正确释放连接;

该在没有正确释放连接的情况下的处理方法的步骤包括:

步骤s602,在退出的回调函数内通过tcp通知proxyserver,消息内容包含要重启的的worker相关信息(group_id,worker_id);

步骤s604,server通过发送signal给worker,将等待客户端写或卡在数据库io的worker唤醒;

步骤s606,worker收到信号后结束自身进程,以达到释放当前数据库连接的目的,从而停止慢查询操作或回滚事务释放被锁的数据库数据;

步骤s608,manager收到worker的退出信号后,如果状态是recycle后,则进行重启fork,生成新的worker2;

步骤s610,worker2在自身进程中,如果发现是异常退出重启替代的,则判断是否需要有唤醒的php2等待进程;

步骤s612,如果有则通过信号php2,并将自己的状态置成busy;

步骤s614,如果没有则将自己的状态设置为idle,以便后面的php进程使用;

步骤s616,进入到worker的主循环,和php进行数据交互。

需要说明的是,proxyserver还提供了reload功能,方便线上在不停服的情况下对配置文件进行重载,目前可以重载的内容包含:每个group可以包含的最大/最小worker数,可以控制mysql连接数;每次manager进程针对某个分组可以回收的worker最大上限;phpfpm可以排队的队列最大值,超过最大值,其他排队进程则直接退出,避免造成fpm进程卡死,数据库连接始终不能下降进而引起雪崩现象。

在相关技术中,短连接没有连接池的情况下,随着phpfpm进程数增加,与mysql建立的连接数也不断增加,mysql查询效率会随着连接数的增长而降低;而通过上述可选实施方式一至三可知,有了长连接的连接池后,通过代理进程proxyserver管理与mysql创建的连接,可以有效控制连接数并发数,控制并发的连接数,提升单个连接的效率,可以极大提升mysql的性能。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

实施例2

在本实施例中还提供了一种数据的处理装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。

图5是根据本发明实施例的数据的处理装置的结构示意图,该装置应用于代理进程侧,如图5所示,该装置包括:转发模块52,用于向数据库系统转发接收到的由访问进程发送的用于访问数据库系统的数据;接收模块54,与转发模块52耦合连接,用于接收数据库系统执行数据后反馈的结果;回收模块56,与接收模块54耦合连接,用于在结果指示当前数据库访问结束的情况下,回收访问进程释放的连接资源。

可选地,该转发模块52包括:第一判断单元,用于在接收到数据后,判断代理进程中是否存在空闲的工作子进程;第一转发单元,用于在代理进程中存在空闲的工作子进程的情况下,通过空闲的工作子进程将数据向数据库系统转发;第二判断单元,用于在代理进程中不存在空闲的工作子进程的情况下,判断非空闲的工作子进程的等待队列中用于传输访问数据库系统的数据的连接数是否超过预设阈值;第二转发单元,用于在连接数未超过预设阈值的情况下,将用于访问数据库系统的数据插入到非空闲的工作子进程的等待队列中以等待被转发;处理单元,用于在连接数超过预设阈值的情况下,断开连接数超过预设阈值的工作子进程与数据库系统的连接。

其中,该第一转发单元可以包括:判断子单元,用于判断代理进程中是否存在与数据对应的分组进程;其中,代理进程包括一个或多个分组进程,每个分组进程包括一个或多个工作子进程;第一转发子单元,用于在存在与用于访问数据库系统的数据对应的分组进程,且分组进程中有空闲的工作子进程的情况下,进行通过该空闲的工作子进程转发数据;第二转发子单元,用于在不存在与数据对应的分组进程的情况下,与访问进程建立与数据对应的新的分组进程,并基于新的分组进程中的空闲工作子进程转发数据。

需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。

实施例3

本发明的实施例还提供了一种存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。

可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:

s1,代理进程向数据库系统转发接收到的由访问进程发送的用于访问数据库系统的数据;

s2,代理进程接收数据库系统执行数据后反馈的结果;

s3,在结果指示当前数据库访问结束的情况下,代理进程回收访问进程释放的连接资源。

可选地,在本实施例中,上述存储介质可以包括但不限于:u盘、只读存储器(read-onlymemory,简称为rom)、随机存取存储器(randomaccessmemory,简称为ram)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。

本发明的实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。

可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。

可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。

显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1