数据加载高可用案例介绍(上)-日志管理系统
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类表建立月表和日表。举例:
业务 | 日表 | 月表 |
业务受理scf | bcf_phone_yyyymmdd | bcf_phone_yyyymm |
业务受理scf | bcf_session_yyyymmdd | bcf_session_yyyymm |
业务受理billbfs | billbfs_session_yyyymmdd | billbfs_session_yyyymm |
语音scf | scf_cs_phone_yyyymmdd | scf_cs_phone_yyyymm |
语音scf | scf_cs_session_yyyymmdd | scf_cs_session_yyyymm |
H2查询 | h2_phone_yyyymmdd | h2_phone_yyyymm |
H2查询 | h2_session_yyyymmdd | h2_session_yyyymm |
数据业务scf | scf_ps_phone_yyyymmdd | scf_ps_phone_yyyymm |
数据业务scf | scf_ps_session_yyyymmdd | scf_ps_session_yyyymm |
补扣 | recharge_phone_yyyymmdd | recharge_phone_yyyymm |
补扣 | recharge_session_yyyymmdd | recharge_session_yyyymm |
租费 | rental_phone_yyyymmdd | rental_phone_yyyymm |
租费 | rental_session_yyyymmdd | rental_session_yyyymm |
短信scf | scf_sms_phone_yyyymmdd | scf_sms_phone_yyyymm |
短信scf | scf_sms_session_yyyymmdd | scf_sms_session_yyyymm |
一卡充 | topup_phone_yyyymmdd | topup_phone_yyyymm |
一卡充 | topup_session_yyyymmdd | topup_session_yyyymm |
增值业务scf | scf_vac_phone_yyyymmdd | scf_vac_phone_yyyymm |
增值业务scf | scf_vac_session_yyyymmdd | scf_vac_session_yyyymm |
wlan_scf | scf_wlan_phone_yyyymmdd | scf_wlan_phone_yyyymm |
wlan_scf | scf_wlan_session_yyyymmdd | scf_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脚本中的目录和文件的作用及含义如下:
序号 | 变量名 | 对应路径/文件 | 作用说明 |
1 | BILL_POOL_DIR | /nfsshare/gdlt_lib/pool | 数据待加载路径 |
2 | BILL_ARCHIVE_DIR | /nfsshare/gdlt_lib/archive | 数据归档备份路径 |
3 | BILL_LOAD_DIR | /nfsshare/gdlt_lib/load_logs | 数据加载日志路径 |
4 | BFILE_REPEATED_DIR | /nfsshare/gdlt_lib/data_repeated | 重复数据存放归档路径 |
5 | BILL_FTP_DIR | /nfsshare/ftproot | FTP上传路径 |
6 | ROW_COUNT_DIR | /nfsshare/gdlt_lib/rowcount | 表条目数文件存放路径 |
7 | BILL_LOAD_LOGFILE | /nfsshare/gdlt_lib/log/gbase_loader.log | 数据加载日志,记录某个加载的开始结束时间 |
8 | BILL_LOAD_RS_LOGFILE | /nfsshare/gdlt_lib/log/load_result.log | 数据加载结果日志,记录加载的表、TASK_ID、条目数及加载结果信息 |
9 | BILLFETCH_LOGFILE | /nfsshare/gdlt_lib/log/billfetch.log | 数据日志,记录每次数据加载时的文件列表 |
10 | ORDER_LOG_FILE | /nfsshare/gdlt_lib/log/daily_order.log | 数据排序日志,记录数据排序的执行情况 |
11 | ORDER_STATE_FILE | /nfsshare/gdlt_lib/order_state/order_state.txt | 数据排序标记文件,用于判断是否进行insert 月表select 日表order by数据排序,及进行哪个业务的数据排序 |
12 | LOAD_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_name | varchar(100) | 数据文件名,hash分布列 |
load_task_id | varchar(20) | TASK_ID |
file_lines | int(11) | 文件行数 |
file_size | bigint(20) | 文件字节数 |
f_type | varchar(20) | 业务类型 |
tbl_name | varchar(50) | 表名称 |
in_time | timestamp | 数据加载入库时间 |
repeat_flag | int(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_hashcolumn | varchar(20) | 表的排序字段名 |
dp_desc | varchar(100) | 表对应的业务描述 |
dp_lst | int(3) | 预留字段 |
5.2.3 存储过程说明
存储过程由数据加载shell脚本调用,如通过手工方式执行,要求严格遵循输入参数的要求。存储过程根据输入参数是否为null值来判断将昨天日表数据排序后插入到月表中。
存储过程中,对输入的昨天日表表名称进行解析,获取需要排序操作的数据业务类型;根据不同的业务,指定不同的数据排序字段和数据查询where条件中的时间字段,整理如下(以下配置均配置在表ocs_dp_conf中):
业务 | 排序字段(用户号码) | 时间字段 |
bcf_phone | phone | businesstime |
bcf_session | sessionid | businesstime |
billbfs_session | sessionid | businesstime |
scf_cs_phone | phone | businesstime |
scf_cs_session | sessionid | businesstime |
scf_h2_phone | phone | businesstime |
scf_h2_session | sessionid | businesstime |
scf_ps_phone | phone | businesstime |
scf_ps_session | sessionid | businesstime |
recharge_phone | phone | businesstime |
recharge_session | sessionid | businesstime |
rental_phone | phone | businesstime |
rental_session | sessionid | businesstime |
scf_sms_phone | phone | businesstime |
scf_sms_session | sessionid | businesstime |
topup_phone | phone | businesstime |
topup_session | sessionid | businesstime |
scf_vac_phone | phone | businesstime |
scf_vac_session | sessionid | businesstime |
scf_wlan_phone | phone | businesstime |
scf_wlan_session | sessionid | businesstime |
5.2.4 排序日志表
排序日志表的名称为:order_status_log,字段定义如下:
列名称 | 字段类型 | 说明 |
id | bigint | 自增列,HASH分布列 |
tbl_key | varchar(60) | 业务类型 |
tbl_yes | varchar(60) | 昨天日表名称 |
tbl_tod | varchar(60) | 今天日表名称 |
tbl_month | varchar(60) | 当月月表名称 |
tbl_last_month | varchar(60) | 上月月表名称 |
rowc_yestbl | Int | 昨天日表数据行数 |
is_daliy_order | Int | 是否为排序后插入今天日表 |
order_result | Int | 排序结果 |
ins_sql1 | varchar(2000) | 排序SQL1 |
ins_sql2 | varchar(2000) | 排序SQL2 |
errmsg | varchar(2000) | 错误信息 |
excute_begin_time | datetime | 开始时间 |
excute_end_time | datetime | 结束时间 |
excute_time | time | 排序执行时间 |
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';
以上过程详细配置见后续文章-《日志管理系统配置手册》
评论
热门帖子
- 12023-05-09浏览数:17116
- 22020-05-11浏览数:10810
- 32019-04-26浏览数:10481
- 42023-09-25浏览数:10358
- 52023-07-04浏览数:9697