海量日志写入数据库的方法、装置和日志容灾系统的制作方法
【技术领域】
[0001]本发明涉及数据存储领域,具体涉及海量日志写入数据库的方法、装置和日志容灾系统。
【背景技术】
[0002]日志是对用户在终端或通过终端所进行的一些行为的记录,这种记录一旦被保存下来,便可以作为以后查询、跟踪和分析的依据。日志的类型很多,常见的例如网站日志,是记录Web服务器接收处理请求以及运行时错误等各种原始信息的文件,网站日志最大的意义是记录网站运营中空间的运营情况和被访问请求的记录等内容。再如,在电话系统中,每产生一次通话,日志系统将会记录该通话的双方号码、起始时间、产生的话费等,这些内容也被称为日志。类似的还有银行的存取款记录和即时通信软件的登录记录等也可以称为日
O
[0003]产生日志的装置可以是处理业务的终端(例如,ATM机),也可以是处理该业务的后台服务器(例如,电话交换机和计费服务器等),而接收和保存日志的服务器被称为日志服务器。日志可以由日志服务器保存在文件中,也可以通过向数据库写入日志从而将日志保存在数据库中,其中,后者因为其易管理性而成为主流。
[0004]现有技术提供的一种将日志写入数据库的方法是首先将日志产生装置和日志服务器分开,即采用专门的日志服务器来接收和保存日志。日志产生装置将日志发送到日志服务器特定的网络端口(通常需要定义内部协议),日志服务器负责监听特定的网络端口,一旦有日志到达,就将日志接收下来,保存到磁盘,其中,保存到磁盘的一种方式是将日志直接插入到数据库,另一种方式先将日志保存到文件,再用数据库插入装置(inserter)读取文件内容,将日志一次一行地或一次多行地插入到数据库中。
[0005]然而,对于上述现有的将日志写入数据库的方法,在保存日志时无论采取上述两种保存方式中的哪一种,都面临一个重要的问题:磁盘输入输出(Input/Output,I/O)的速度赶不上网络I/O的速度。在海量日志即日志量很大时会导致日志来不及写而丢失,严重情况下,日志的丢失率可达90%甚至更高。
【发明内容】
[0006]本发明实施例提供海量日志写入数据库的方法、装置和日志容灾系统,以在日志产生装置产生大量日志时减小日志入库的丢失率。
[0007]本发明实施例提供一种海量日志写入数据库的方法,所述方法包括:
[0008]将日志产生装置生成并通过接口服务器发送的日志写入缓冲区进行缓存;
[0009]从所述缓冲区读取所述日志;
[0010]按照顺序写磁盘的操作方式将所述读取的日志保存至数据库。
[0011]本发明另一实施例提供一种海量日志写入数据库的装置,所述装置包括:
[0012]缓存模块,用于将日志产生装置生成并通过接口服务器发送的日志写入缓冲区进行缓存;
[0013]读取模块,用于从所述缓冲区读取所述日志;
[0014]写入模块,用于按照顺序写磁盘的操作方式将所述读取的日志保存至数据库。
[0015]本发明另一实施例提供一种日志容灾系统,所述系统包括接口服务器、主日志服务器和备日志服务器;
[0016]所述接口服务器,用于将日志产生装置生成的日志按照同一日志内容制作成正本和副本的方式分别发送至所述主日志服务器和备日志服务器;
[0017]所述主日志服务器或备日志服务器用于执行如下方法步骤:将日志产生装置生成并通过接口服务器发送的日志写入缓冲区进行缓存;从所述缓冲区读取所述日志;按照顺序写磁盘的操作方式将所述读取的日志保存至数据库。
[0018]从上述本发明实施例可知,一方面,由于日志在写入数据前可在缓冲区进行缓存,由此可以减轻在网络I/o速度较大时日志入库的写磁盘压力,另一方面,在从缓冲区读取日志后,是按照顺序写磁盘的操作方式将所述读取的日志保存至数据库,由于顺序写磁盘的速度远远大于随机写磁盘的速度,因此,本发明实施例提供的日志入库时写磁盘的方式大大提高了日志写入数据库的速度,减小了由于网络I/o速度较大时导致的日志入库的丢失率。
【附图说明】
[0019]图1是本发明实施例提供的海量日志写入数据库的方法的基本流程示意图;
[0020]图2是本发明实施例提供的海量日志写入数据库的装置逻辑结构示意图;
[0021]图3是本发明另一实施例提供的海量日志写入数据库的装置逻辑结构示意图;
[0022]图4是本发明另一实施例提供的海量日志写入数据库的装置逻辑结构示意图;
[0023]图5_a是本发明另一实施例提供的海量日志写入数据库的装置逻辑结构示意图;
[0024]图5_b是本发明另一实施例提供的海量日志写入数据库的装置逻辑结构示意图;
[0025]图5-c是本发明另一实施例提供的海量日志写入数据库的装置逻辑结构示意图;
[0026]图6是本发明实施例提供的日志容灾系统逻辑结构示意图;
[0027]图7是本发明实施例提供的实现海量日志写入数据库的系统架构图。
【具体实施方式】
[0028]本发明实施例提供海量日志写入数据库的方法,所述方法包括:将日志产生装置生成并通过接口服务器发送的日志写入缓冲区进行缓存;从所述缓冲区读取所述日志;按照顺序写磁盘的操作方式将所述读取的日志保存至数据库。本发明实施例还提供相应的海量日志写入数据库的装置和日志容灾系统。以下分别进行详细说明。
[0029]本发明实施例的海量日志写入数据库的方法可应用于日志服务器,其执行主体可以是日志服务器或者其中的功能模块。本发明实施例提供的海量日志写入数据库的方法的基本流程可参考图1,主要包括步骤SlOl至步骤S103,详细说明如下:
[0030]S101,将日志产生装置生成并通过接口服务器发送的日志写入缓冲区进行缓存。
[0031]在本发明实施例中,可以使用共享内存实现缓冲区,即本发明实施例的缓冲区可以为环状缓冲区。作为本发明一个实施例,将日志产生装置生成并通过接口服务器发送的日志写入缓冲区进行缓存可以是将所述日志产生装置生成并通过接口服务器发送的日志从所述环状缓冲区的尾部写入所述环状缓冲区,即,假设环状缓冲区大小为K个字节(byte),其当前的头部是第H字节,尾部是第T字节,向环状缓冲区写入日志时,从第(T+1)%K个字节开始写,其中,符号“%”表示将T+1与K相除后对结果取余。也就是说,如果Τ+1=Κ,那么从缓冲区的第O个字节开始写,这样就实现了环状缓冲区。在本发明实施例中,环状缓冲区应该足够大,例如,能容纳500万条日志(即假设每条日志200字节,共需要IG内存空间),以免缓冲区容易溢出,造成日志丢失。
[0032]S102,从缓冲区读取日志。
[0033]从缓冲区读取日志时,是从环状缓冲区的头部开始读取,分为两种情况,即:若Η+Ν<Κ,则将环状缓冲区的第H字节至第Η+Ν -1字节的日志内容导出;若Η+Ν彡K,则读取环状缓冲区的第H字节至第K 一 I字节以及第O字节至第N— I —Κ+Η字节的日志内容,此处,H为所述环状缓冲区当前头部对应的字节所在的序号,N为单条数据所占字节数,K为所述环状缓冲区的大小,其量纲为字节(by te )。
[0034]S103,按照顺序写磁盘的操作方式将读取的日志保存至数据库。
[0035]在本发明实施例中,按照顺序写磁盘的操作方式将读取的日志保存至数据库时,是调用腾讯(Tencent)公司自行研发的mysql入库引擎直接向磁盘(这里可以是硬盘)写数据,具体地,按照顺序写磁盘的操作方式将读取的日志保存至数据库包括如下S1031和S1032:
[0036]S1031,以MyIsam格式将读取的日志写入数据库所在的磁盘形成MyIsam格式的数据库表。
[0037]MyIsam格式的数据库表(以下将“MyIsam格式的数据库表”简称为“MyIsam表”)包括MYD文件、MYI文件和frm文件等三个文件,其中,frm文件存放MyIsam表的结构,MYI文件存放MyIsam表的索引以及记录条数等相关信息,MYD文件存放MyIsam表的数据。这些文件在没有索引并且只增加新数据的操作的情况下,增加一条新记录会改变两个文件=MYD文件会顺序增长,MYI文件中的记录条数会变化。基于上述MYD文件和MYI文件的特性、mysql数据库的开源特点、MYD文件、MYI文件以及frm文件的组成格式,本发明实施例可以MyIsam格式将从环状缓冲区读取的日志写入数据库所在的磁盘形成MyIsam格式的数据库表。直接写磁盘文件生成MyIsam表的方式绕开mysql的入库接口,绕开了 mysql本身的词法语法语义分析,可以得到很大的性能优化。
[0038]S1032,在写入新的日志数据时从MYD文件的尾部追加数据。
[0039]上述MYD文件存放的是MyIsam表数据,即需要保存到数据库的日志数据。MYD文件按照如下方式存储数据,即,每一条日志都会保存为一段有一定格式的数据,每一段数据顺序保存下去(类似于排队),如