迁移整体架构如下:
数据库为主备模式,最小单位为1主1备。首先线上业务将日志数据实实记录到MySQL主库,并同步到备库。在备库基于表订制迁移规则,将抽取的日志数据远程传输到infobright仓库,并load到数据仓库中。并发送通知到DBA。线上主库案仅保存1个月数据即可。备库可案需保存1~3个月数据。作为数据备份和即时查询。数据仓库保留1年以上的历史数据,供查询分析人员随时查询。
需要注意事项:
1.主库建日志表的时候最好按日期建立为分区表。方便清理数据和提高数据抽取时的效率。
2.数据仓库采用分表方式建立。每月一个表。查询分析时需要指定表后缀。因为infobright社区版不支持数据删除操作,这样分表可以方便以后清理数据。并且按月查询也可以提高查询效率。
3.因为数据抽取和导入是基于表级别的,需要为每个表的迁移写不同的程序抽取和导入。所以适合单表数据比较大,但是表数量不多的日志表 。
迁移操作关键步骤:
Infobright数据仓库创建表
CREATE TABLE `INSHOP_API_ACCESS_LOG_201407` (
`ID` bigint(20) NOT NULL COMMENT ‘主键ID’,
`MERCHANT_ID` bigint(18) DEFAULT NULL,
`INVOKE_METHOD` varchar(100) DEFAULT NULL COMMENT ‘方法名称’,
`METHOD_VER` varchar(20) DEFAULT NULL COMMENT ‘版本号’,
`RESULT_TYPE` int(2) DEFAULT NULL COMMENT ‘返回值类型’,
`RESULT_CODE` varchar(50) DEFAULT NULL COMMENT ‘返回错误编码’,
`ERP` varchar(20) DEFAULT NULL COMMENT ‘erp标识’,
`ERP_VER` varchar(20) DEFAULT NULL COMMENT ‘erp版本号’,
`SDK_TYPE` varchar(50) DEFAULT NULL COMMENT ‘SDK版本类型’,
`VISIT_DATE` timestamp NOT NULL COMMENT ‘访问时间’,
`IP` varchar(40) DEFAULT NULL COMMENT ‘调用接口的IP’,
`INVOKE_PARAM` varchar(4000) DEFAULT NULL COMMENT ‘调用接口的参数’,
`VISIT_TIME_COST` int(18) DEFAULT NULL COMMENT ‘接口响应时间’
) ENGINE=BRIGHTHOUSE DEFAULT CHARSET=utf8;
11:22:04 api_log> show tables;
+——————————+
| Tables_in_api_log |
+——————————+
| INSHOP_API_ACCESS_LOG_201404 |
| INSHOP_API_ACCESS_LOG_201405 |
| INSHOP_API_ACCESS_LOG_201406 |
| INSHOP_API_ACCESS_LOG_201407 |
| INSHOP_API_ACCESS_LOG_201408 |
| INSHOP_API_ACCESS_LOG_201409 |
| INSHOP_API_ACCESS_LOG_201410 |
| INSHOP_API_ACCESS_LOG_201411 |
| INSHOP_API_ACCESS_LOG_201412 |
+——————————+
MySQL数据库生成文件
11:36:18 api_log> select * from INSHOP_API_ACCESS_LOG where VISIT_DATE>=’2014-05-01 00:00:00′ and VISIT_DATE<‘2014-05-27 00:00:00’ into outfile ‘/data/house_apilog/INSHOP_API_ACCESS_LOG_5.csv’ FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘\”‘ ESCAPED BY ‘\\’ LINES TERMINATED BY ‘\n’;
Query OK, 942548825 rows affected (8 hours 9 min 1.71 sec)
Infobright load数据:
11:22:07 api_log> load data infile ‘/data/house_apilog/INSHOP_API_ACCESS_LOG_5.csv’ into table INSHOP_API_ACCESS_LOG_201405 FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘\”‘ ESCAPED BY ‘\\’ LINES TERMINATED BY ‘\n’;
Query OK, 942548825 rows affected (6 hours 42 min 10.90 sec)
Records: 942548825 Deleted: 0 Skipped: 0 Warnings: 0
09:55:25 api_log> select concat(truncate(sum(data_length)/1024/1024,2),’MB’) as data_size, concat(truncate(sum(max_data_length)/1024/1024,2),’MB’) as max_data_size, concat(truncate(sum(data_free)/1024/1024,2),’MB’) as data_free, concat(truncate(sum(index_length)/1024/1024,2),’MB’) as index_size from information_schema.tables where TABLE_NAME = ‘INSHOP_API_ACCESS_LOG’;
+————-+—————+———–+————-+
| data_size | max_data_size | data_free | index_size |
+————-+—————+———–+————-+
| 640783.09MB | 0.00MB | 179.00MB | 111563.18MB |
+————-+—————+———–+————-+
1 row in set (19.16 sec)
09:54:17 api_log> select concat(truncate(sum(data_length)/1024/1024,2),’MB’) as data_size, concat(truncate(sum(max_data_length)/1024/1024,2),’MB’) as max_data_size, concat(truncate(sum(data_free)/1024/1024,2),’MB’) as data_free, concat(truncate(sum(index_length)/1024/1024,2),’MB’) as index_size from information_schema.tables where TABLE_NAME = ‘INSHOP_API_ACCESS_LOG_201405’;
+————+—————+———–+————+
| data_size | max_data_size | data_free | index_size |
+————+—————+———–+————+
| 43760.19MB | 0.00MB | 0.00MB | 0.00MB |
+————+—————+———–+————+
1 row in set (0.01 sec)