GBase 8a
其他
文章

数据加载高可用案例介绍(上)-日志管理系统

GBase用户17199
发表于2024-07-16 14:31:21508次浏览0个评论

1 前言

1.1 背景介绍

本文章为某项目日志管理系统数据加载高可用案例介绍,用于指导客户或系统实施、维护人员进行日志的数据加载和数据排序处理,操作对数据加载及排序整理方案、数据加载shell脚本进行详细的介绍说明。

1.2 名词解释

TASK_ID:每10分钟执行一次的数据加载唯一标识,根据时间戳yyyymmhhMMss生成;TASK_ID文件夹下存在多个业务数据文件夹,业务数据文件夹下为本次需加载的本业务的数据;

CTL文件:数据加载控制文件,包含本次数据加载的数据列表(file_list)、数据库名称、表名称等信息;每个CTL文件仅包含一个加载任务,任务mission名为[表名称_TASK_ID]形式;

表行数记录文件:记录某个业务日表的数据条目数,用于在数据加载高可用恢复时进行BILL_POOL路径下的数据是否已经加载;文件名称命名方式为[业务名称.当天日期];

BILL_POOL:数据待加载文件夹,TASK_ID文件夹的父文件夹。

BFILE_REPEATED:重复数据文件夹,包含有各业务文件夹,业务文件夹下为TASK_ID文件夹,将重复的数据mv到对应业务对应TASK_ID的目录下。

2 系统介绍

2.1 系统架构

某项目OCS日志管理系统GBASE集群共包含12台服务器

GBASE集群为10个节点分为5个SafeGroup安全组

每个SafeGroup包含2个节点服务器

2个数据加载服务器组成加载HA,用于进行实时数据加载。

此日志管理系统架构如下图:

2.2 业务类型介绍

日志数据来源于账务平台在线平台两大业务系统。账务平台业务内容主要包括计费、核算、缴费等;在线平台主要包括话务、流量、增值、WLAN及短信5种业务。
上述两大业务系统每个系统产生5种日志,利用Perl负责日志的抓取、解析和拆分,最终将每种日志结构化后的信息生成落地文件,再由我方根据相关规则将落地数据加载至两大类表,即phone和session表中。

2.3 数据加载要求

此日志管理系统要求对数据进行准实时的加载入库,数据加载要求整理如下:

  • 每15分钟加载一次;
  • 支持加载高可用;
  • 对待加载的数据文件进行排重,避免加载重复数据;

为保障数据查询性能,对入库的数据进行排序整理。实时数据加载将数据加载到当天日表中,通过insert select order by操作插入到月表中。

3 加载机高可用部署说明

    本章节主要介绍高可用部署过程中的一些注意事项,高可用的具体详细部署步骤及设计定义不在此详述

3.1 corosync启停说明

corosync进程主要负责监控两台加载机的运行状态,也会启停drbd服务,drbd主要负责底层数据同步,因此启停corosync有以下注意事项。

1、禁止两台机器同时启停corosync进程

两台同时启停corosync时,会造成加载机脑裂,导致数据从开始同步(本次nfs盘为7T,全部同步一次需要20小时),会造成业务终止

2、正常启停

 调起一台机器corosync,通过命令cat /proc/drbd查看drbd的状态,如果变成ds:Uptodate/Uptodate,即可以停掉另一台corosync进程。

3.2 注意事项

    本次部署过程中同时发现以下几个注意事项

  • drbd命令在redhat6.5上路径发生变化在配置drbd主备模式(即配置手册的第11步)时,
    原有命令为:primitive dispdrbd ocf:heartbeat:drbd params drbd_resource=dispdrbd op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30s
    需要将命令改为:primitive dispdrbd ocf:linbit:drbd params drbd_resource=dispdrbd op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30s
  • 两台加载机需要增加独立的网卡用于drbd服务底层数据同步,这两块网卡最好采用光纤(或网线)直连的方式,也可以连接至交换机。
  • 两台加载机需要配置虚拟ip用于对外访问,因此部署时需要用户提供3个外网ip。
  • 由于此现场环境不支持组播,因此corosync的配置文件(/etc/corosync/corosync.conf)需要按照udpu方式进行配置

4 数据加载排序方案

4.1 加载表说明

对账务平台和在线平台两大业务系统的phone和session类表建立月表和日表。举例:

业务日表月表
业务受理scfbcf_phone_yyyymmddbcf_phone_yyyymm
业务受理scfbcf_session_yyyymmddbcf_session_yyyymm
业务受理billbfsbillbfs_session_yyyymmddbillbfs_session_yyyymm
语音scfscf_cs_phone_yyyymmddscf_cs_phone_yyyymm
语音scfscf_cs_session_yyyymmddscf_cs_session_yyyymm
H2查询h2_phone_yyyymmddh2_phone_yyyymm
H2查询h2_session_yyyymmddh2_session_yyyymm
数据业务scfscf_ps_phone_yyyymmddscf_ps_phone_yyyymm
数据业务scfscf_ps_session_yyyymmddscf_ps_session_yyyymm
补扣recharge_phone_yyyymmddrecharge_phone_yyyymm
补扣recharge_session_yyyymmddrecharge_session_yyyymm
租费rental_phone_yyyymmddrental_phone_yyyymm
租费rental_session_yyyymmddrental_session_yyyymm
短信scfscf_sms_phone_yyyymmddscf_sms_phone_yyyymm
短信scfscf_sms_session_yyyymmddscf_sms_session_yyyymm
一卡充topup_phone_yyyymmddtopup_phone_yyyymm
一卡充topup_session_yyyymmddtopup_session_yyyymm
增值业务scfscf_vac_phone_yyyymmddscf_vac_phone_yyyymm
增值业务scfscf_vac_session_yyyymmddscf_vac_session_yyyymm
wlan_scfscf_wlan_phone_yyyymmddscf_wlan_phone_yyyymm
wlan_scfscf_wlan_session_yyyymmddscf_wlan_session_yyyymm

实时数据加载只针对当天日表进行,日表的生命周期为3天

月表用于存储历史数据,通过对日表数据进行排序后insert到月表中,每天执行一次,将昨日日表数据导入到当月月表中,月表的生命周期依据实际存储进行存储(即在现有磁盘容量下能存多长时间就存多长时间),目前暂时评估为4个月。

4.2 数据加载方式

使用GBASE集群的数据分发加载工具dispatch_server进行实时数据的加载。实时数据加载的步骤如下:

1)扫描ftproot路径下后缀为txt的文件,如果存在FTP的实时数据,则根据当前时间戳生成TASK_ID,在待加载路径建立TASK_ID文件夹;如不存在,则等待2分钟后再次扫描;

2)将FTP路径下的数据按业务文件夹mv到待加载路径下的TASK_ID文件夹,每个业务最多mv 800个数据文件;

3)对待加载TASK_ID文件夹中的业务文件夹进行轮询处理并生成CTL文件,包括如下几个操作:

  • 检查业务文件夹下数据文件是否已加载,如数据文件已加载,则将该数据文件移动到BFILE_REPEATED文件夹;
  • 获取数据文件的名称、字节数、行数等信息,并输出到一个文件中;
  • 将同一个业务下的全部数据文件(最多800个)拼接到一起,作为数据加载ctl文件中的file_list,并获取file_list全部数据文件的总行数;
  • 根据当前日期、业务名称生成要加载的日表名称;
  • 根据上述生成的file_list及table_name生成数据加载ctl文件;

4)对生成的ctl执行数据加载,dispcli的加载日志名称为<表名称_${TASK_ID}.log>;

5)加载完成后,对dispcli日志中的加载结果进行获取,并将加载结果、表名称、文件中的数据行数、TASK_ID等信息写入加载结果日志;

6)加载完成后,获取所加载表的数据条目数,将其写入到表行数记录文件中。

7)将加载完成的历史数据进行归档,在历史数据归档路径下创建TASK_ID文件夹,将已加载的业务数据及对应CTL文件mv到该文件夹下做备份;

8)完成全部业务数据的加载后,进行数据文件信息数据的加载,并在加载完成后将文件移动到备份归档路径;

9)TASK_ID文件夹中的数据全部加载完成后,删除TASK_ID文件夹;

等待2分钟并再次执行数据的获取和加载。

4.3 月表数据加载及排序方式

每日加载数据量较大,约1.2T左右,数据排序操作在每天凌晨进行,将昨天的日表中的历史数据order by后插入当月、上月月表中:

  • 每月的1日、2日的凌晨,将昨天的日表数据通过insert select order方式插入到当月月表和上月月表;SQL形式为:
    Insert into 月表 select * from 昨天日表 where 时间范围 order by 用户号码;
  • 其他日期,则将昨天的日表数据通过insert select order方式插入到今天的日表中,进行数据累积。SQL形式为:
    Insert into 今天日表 select * from 昨天日表 order by 用户号码;

数据排序需要满足如下几个条件:

  • 时间要求:凌晨1点后,下午15点前;
  • 当前加载任务已经完成且insert过程中不执行数据加载(操作均为串行);

insert月表的步骤如下:
1)一个TASK_ID的数据加载完成后,进行当前时间的判断:

  • 如当前时间点大于20点,则将标记文件中的内容修改为0;并继续进行数据加载;
  • 如当前时间点为凌晨1点~15点,通过查询配置表ocs_dp_conf统计出需要进行insert表的个数,与标记文件中的值进行比较,如大于则执行insert select数据操作;如不满足,则继续进行数据加载;

2)获取当天的日期、当月、上月等取值,并进行日期判断,如日期取值为01、02,则进行昨天日表数据排序插入当月或者上月月表的操作,否则进行昨天日表排序插入当月月表的操作;
3)如满足排序要求,且标记文件的值为0,则进行bcf_phone业务的bcf_session操作,并在完成排序后将标记文件中的值修改为1;
4)如满足排序要求,且标记文件的值为1,则进行bcf_session业务的bcf_session操作,以此类推,顺序完成全部业务的数据导入操作,将标记文件中的值修改为ocs_dp_conf表的行数 ;
数据insert select order by操作通过存储过程来实现。详见5.2数据排序存储过程。

5 数据加载程序说明

5.1 数据加载脚本

5.1.1 目录及文件说明

加载shell脚本中的目录和文件的作用及含义如下:

序号变量名对应路径/文件作用说明
1BILL_POOL_DIR/nfsshare/gdlt_lib/pool数据待加载路径
2BILL_ARCHIVE_DIR/nfsshare/gdlt_lib/archive数据归档备份路径
3BILL_LOAD_DIR/nfsshare/gdlt_lib/load_logs数据加载日志路径
4BFILE_REPEATED_DIR/nfsshare/gdlt_lib/data_repeated重复数据存放归档路径
5BILL_FTP_DIR/nfsshare/ftprootFTP上传路径
6ROW_COUNT_DIR/nfsshare/gdlt_lib/rowcount表条目数文件存放路径
7BILL_LOAD_LOGFILE/nfsshare/gdlt_lib/log/gbase_loader.log数据加载日志,记录某个加载的开始结束时间
8BILL_LOAD_RS_LOGFILE/nfsshare/gdlt_lib/log/load_result.log数据加载结果日志,记录加载的表、TASK_ID、条目数及加载结果信息
9BILLFETCH_LOGFILE/nfsshare/gdlt_lib/log/billfetch.log数据日志,记录每次数据加载时的文件列表
10ORDER_LOG_FILE/nfsshare/gdlt_lib/log/daily_order.log数据排序日志,记录数据排序的执行情况
11ORDER_STATE_FILE/nfsshare/gdlt_lib/order_state/order_state.txt数据排序标记文件,用于判断是否进行insert 月表select 日表order by数据排序,及进行哪个业务的数据排序
12LOAD_TABLE_CFGFILE/usr/sbin/load_table.config配置加载表的表名

5.1.2 功能模块介绍

数据加载shell程序共分为7个功能模块。

main函数
    脚本程序入口,控制整个数据加载流程,进行其他功能模块函数的调用执行;
通过无限的for循环进行TASK_ID的生成和数据处理加载函数的调用。

data_fetch函数
用于将数据移动到待加载路径,每次每个业务处理800个文件;
对BILL_FTP_DIR文件夹下的21个业务文件夹进行遍历,查看如有数据文件存在则在BILL_POOL_DIR目录下创建TASK_ID文件夹和业务子文件夹,并将数据mv到BILL_POOL_DIR下的待加载TASK_ID文件夹下;
在数据文件查看过程中,将文件名称写入到BILLFETCH_LOGFILE日志文件中。

create_ctl_file_load函数
用于对待加载路径下加载任务进行CTL文件的生成和数据加载的执行;
对待加载的数据文件进行文件信息的获取,包括文件名称、文件字节大小、数据行数等,并将这些信息输出到文件中,并加载入库;
文件遍历时,调用unrepeate函数进行数据文件名称查重的处理,将重复数据文件mv到BFILE_REPEATED_DIR路径;
通过文件遍历生成CTL文件中的file_list参数(数据文件列表),并依据当前日期、业务类型生成表名称,最终生成CTL文件;
调用dispcli执行CTL任务加载,加载结束后获取加载结果信息及数据文件总行数等,写入到BILL_LOAD_RS_LOGFILE日志中;
对已加载的数据进行归档备份。

unrepeat_data函数
用于数据文件的查重和处理;
从file_load_logs表中查询某数据文件是否存在,如存在则表示该数据文件已加载,将该文件mv到BFILE_REPEATED_DIR路径下。

data_order函数
用于进行数据排序后插入月表操作。
根据系统时间及ORDER_STATE_FILE文件判断是否需要进行数据导入月表操作;当满足数据插入月表条件时,调用存储过程进行数据的插入。

restore_check_load函数
在加载shell程序启动时,检查BILL_POOL_DIR路径下是否存在TASK_ID,并判断该TASK_ID是否加载。
使用ROW_COUNT_DIR路径下的数据记录文件与表中的行数进行对比,如数据条目数不一致则表明TASK_ID未加装,进而执行该TASK_ID的加载任务。否则,将该TASK_ID文件夹移动到归档路径下。

mkdir_path函数
用于创建脚本运行所需的目录。

5.1.3 数据文件排重表

每完成一个TASK_ID的加载,都将已经加载的历史数据文件名称加载到数据文件排重表中,用于下一次数据加载时的重复文件查询。
数据文件排重表名为file_load_logs,定义如下:

列名称字段类型说明
file_namevarchar(100)数据文件名,hash分布列
load_task_idvarchar(20)TASK_ID
file_linesint(11)文件行数
file_sizebigint(20)文件字节数
f_typevarchar(20)业务类型
tbl_namevarchar(50)表名称
in_timetimestamp数据加载入库时间
repeat_flagint(11)数据文件是否重复,默认值为0

5.2 数据排序存储过程

5.2.1 输入参数说明

GBASE集群排序插入月表的存储过程P_SORT有7个输入参数,参数顺序及解释如下:

1)tod_tbl VARCHAR(60)
    当天日表名称,如该参数为null,则进行将昨天日表数据排序整理后插入到月表;

2)yesd_tbl VARCHAR(60)
昨天日表名称;

3)month_tbl VARCHAR(60)
当月月表名称,如进行昨天日表排序插入到今日表,则该参数取值为null;

4)last_m_tbl varchar(60)
上月月表名称,如进行昨天日表排序插入到今日表,则该参数取值为null;

5)next_month_1st_dt varchar(60)
下月1日日期时间,如当月为5月,则该参的输入值为2013-06-01 00:00:00;如进行昨天日表排序插入到今日表,则该参数取值为null;

6)this_month_1st_dt varchar(60)
当月1日日期时间,如当月为5月,则该参数的输入值为2013-05-01 00:00:00;如进行昨天日表排序插入到今日表,则该参数取值为null;

7)last_month_1st_dt varchar(60)
    上月1日日期时间,如当月为5月,则该参数的输入值为2013-04-01 00:00:00;如进行昨天日表排序插入到今日表,则该参数取值为null;

5.2.2 排序及insert配置表

排序及insert月表的配置表名称为:ocs_dp_conf,字段定义如下:

列名称字段类型说明
dp_id        int(8)      id列
dp_tbname    varchar(20) 业务类型(表名)
dp_condition varchar(20) 表的时间字段名
dp_hashcolumnvarchar(20) 表的排序字段名
dp_desc      varchar(100)表对应的业务描述
dp_lst      int(3)      预留字段

5.2.3 存储过程说明

存储过程由数据加载shell脚本调用,如通过手工方式执行,要求严格遵循输入参数的要求。存储过程根据输入参数是否为null值来判断将昨天日表数据排序后插入到月表中。
存储过程中,对输入的昨天日表表名称进行解析,获取需要排序操作的数据业务类型;根据不同的业务,指定不同的数据排序字段和数据查询where条件中的时间字段,整理如下(以下配置均配置在表ocs_dp_conf中):

业务排序字段(用户号码)时间字段
bcf_phone      phone    businesstime
bcf_session    sessionidbusinesstime
billbfs_session sessionidbusinesstime
scf_cs_phone    phone    businesstime
scf_cs_session  sessionidbusinesstime
scf_h2_phone    phone    businesstime
scf_h2_session  sessionidbusinesstime
scf_ps_phone    phone    businesstime
scf_ps_session  sessionidbusinesstime
recharge_phone  phone    businesstime
recharge_sessionsessionidbusinesstime
rental_phone    phone    businesstime
rental_session  sessionidbusinesstime
scf_sms_phone  phone    businesstime
scf_sms_session sessionidbusinesstime
topup_phone    phone    businesstime
topup_session  sessionidbusinesstime
scf_vac_phone  phone    businesstime
scf_vac_session sessionidbusinesstime
scf_wlan_phone  phone    businesstime
scf_wlan_sessionsessionidbusinesstime

5.2.4 排序日志表

排序日志表的名称为:order_status_log,字段定义如下:

列名称字段类型说明
idbigint自增列,HASH分布列
tbl_keyvarchar(60)业务类型
tbl_yesvarchar(60)昨天日表名称
tbl_todvarchar(60)今天日表名称
tbl_monthvarchar(60)当月月表名称
tbl_last_monthvarchar(60)上月月表名称
rowc_yestblInt昨天日表数据行数
is_daliy_orderInt是否为排序后插入今天日表
order_resultInt排序结果
ins_sql1varchar(2000)排序SQL1
ins_sql2varchar(2000)排序SQL2
errmsgvarchar(2000)错误信息
excute_begin_timedatetime开始时间
excute_end_timedatetime结束时间
excute_timetime排序执行时间

6 加载业务增删步骤

6.1 增加步骤

未来需增加新的表,进行业务表扩充时,按照下边步骤进行即可,具体如下:
1、新增的表添加到加载表的配置文件/usr/sbin/load_table.config中,两台加载机都需要配置。
用gbase用户登录系统,输入命令“vim /usr/sbin/load_table.config”

[gbase@OCSJZ14 ~]$ vim /usr/sbin/load_table.config
bcf_phone
bcf_session
billbfs_session
scf_cs_phone
scf_cs_session
h2_phone
h2_session

如需新增业务表A需要加载:
[gbase@OCSJZ14 ~]$ vim /usr/sbin/load_table.config
bcf_phone
bcf_session
billbfs_session
scf_cs_phone
scf_cs_session
h2_phone
h2_session
A

保存退出即可。
2、将新增的表配置到表ocs_dp_conf中,主要服务于存储过程,用于日表到月表的数据导入。表定义详见5.2.4.
3、目前脚本为2分钟扫描一次,上述步骤1和2配置好后,2分钟后新增表的ftp路径即可创建和实现加载。

6.2 删除步骤

加载业务表删除,基本按照增加步骤反向操作即可实现,具体如下:
1、编辑加载表的配置文件/usr/sbin/load_table.config,将取消加载的表名删掉。
2、登录数据库,将对应表名的配置从ocs_dp_conf中delete掉。
执行sql:  delete from cloudcdr. ocs_dp_conf where dp_tbname='table_name';

以上过程详细配置见后续文章-《日志管理系统配置手册》

评论

登录后才可以发表评论
加载中...