点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!
为什么要使用sqlauditstore数据持久化工具?
gv$sql_audit数据保留存在淘汰机制,会自动将历史数据清理掉,避免该表数据过大,为了将将要淘汰的历史数据保留下来,这个时候,sqlauditstore工具发挥了很大的作用,对gv$sql_audit数据进行周期性采集并存储在本地,文件是csv格式,支持对文件进行压缩。
一个工具实例以docker容器形式存在,负责采集单个OB集群的sql_audit数据。 运行时需提前准备一个单独的mysql的database,自行创建,存储必要的数据,包括一些连接集群的配置信息。 确认集群系统参数enable_sql_audit为true,且待持久化sql记录的租户的ob_enable_sql_audit变量值为“on”。 csv文件存储的本地文件系统大小要大,需要测试评估。
obdw.yaml
### 工具占用的端口号, 可自行指定为未被占用的端口
server_port: 8686
### basic auth认证帐密,自行指定即可
auth_user: ****
auth_password: ****
### 当前机器的物理IP
host_ip: 10.66.1.1
### 前置条件1中提到的database连接信息
data_source:
db_user: 'root@obdw_meta#obcluster'
db_password: '****'
db_port: 3306
db_host: ocp-obproxy.intra.env66.shuguang.com
db_name: obdw
sqlauditstore.json
{
"scanInterval": 10,
"batchSendSize": 50000,
"storeType": "sls",
"logStoreTTL": 7,
"shardCnt": 16,
"endpoint": "data.cn-qingdao-env66-d01.sls.inter.env66.shuguang.com",
"accessKey": "****",
"accessSecret":"****",
"logLevel": "info",
"region":"cn-qingdao-env66-d01"
}
####镜像压缩文件会因版本不同名称会有差别,请以实际发布的版本介质为准
docker load -i sqlauditstore.tar.gz
sls 模式
docker run --network=host --name sqlauditstore-xxx -v
${PWD}/obdw.yaml:/home/admin/obdw/conf/obdw.yaml -v
${PWD}/sqlauditstore.json:/home/admin/obdw/plugins/sqlauditstore.json -v ${PWD}/log:/home/admin/obdw/logs -v etc/localtime:/etc/localtime:ro -d sqlauditstore:1.0.0
file 模式
docker run --network=host --name sqlauditstore-xxx -v
${PWD}/obdw.yaml:/home/admin/obdw/conf/obdw.yaml -v
${PWD}/sqlauditstore.json:/home/admin/obdw/plugins/sqlauditstore.json -v ${PWD}/log:/home/admin/obdw/logs -v
${PWD}/store:/home/admin/obdw/store -v /etc/localtime:/etc/localtime:ro -d sqlauditstore:1.0.0
docker exec -i sqlauditstore-xxx obdwctl start sqlauditstore -e obdw/plugins/sqlauditstore.json
docker exec -i sqlauditstore-xxx obdwctl ls

docker exec -it sqlauditstore-xxx bash
echo "*****" > plain.txt
obdwctl encrypt -f plain.txt

docker exec -i sqlauditstore-xxx obdwctl stop sqlauditstore
docker exec -i sqlauditstore-xxx obdwctl stop sqlauditstore
docker exec -i sqlauditstore-xxx obdwctl start sqlauditstore -e obdw/plugins/sqlauditstore.json
###在启动容器命令所在目录执行
tail -f logs/sqlaudit-store.log

日志文件中,“before scan tenantMap” 代表一次采集过程前,每个租户在每个observer 上v$sql_audit中的request_id 值。“after scan tenantMap” 代表一个采集结束后,每个租户在每个observer 上v$sql_audit中的request_id 值。从两个map可以看出每次采集 v$sql_audit中每个租户的request_id 增量,这个增量正常情况会小于或等于“batchSendSize”配置的值。
sls模式,请直接登陆SLS控制台进入对应的project 和logstore 查看具体sql日志 file模式,在启动docker容器命令的目录下挂载着一个store目录,目录下内容示例


注:store目录下的持久化文件(压缩文件 tar.gz格式),可通过sqlauditstore.json中配置项fileSaveSize来指定保存的压缩文件个数,工具运行期间会自动按时间顺序清理旧的压缩文件,直至压缩文件个数不超过指定值。
tenant: 1001 sql audit on observer:10.0.0.1 scan
exceed:50000, new requestId:280000, old requestId:200000, min requestId:260000
observer node restart, observer: 10.0.0.1, old request id 200000, new request id 200
出现这条WARN 日志说明,request_id没有保持递增,被重置为0后再保持递增。
1)指定的集群tenant_ids 范围,越多资源占用越高。 2)每个租户自身压力高低,常见指标如tps,tps越高资源占用越高。 3)file模式下,auditDataScale越大,资源占用越高。 4)适当配置auditWhereCondition 过滤条件,减少不必要的sql的持久化会降低资源消耗。
说明:上述内容为一个工具实例的资源最少占用量。资源实际占用量和现场环境每个租户承载的压力、租户个数正相关,请根据实际使用情况调整。
### auditDataScale=1
create table `base_audit` (
`cluster_name` varchar(64) NOT NULL,
`TENANT_ID` bigint(20) NOT NULL,
`DB_NAME` varchar(128) DEFAULT NULL,
`USER_NAME` varchar(64) DEFAULT NULL,
`CLIENT_IP` varchar(46) DEFAULT NULL,
`USER_CLIENT_IP` varchar(46) DEFAULT NULL,
`QUERY_SQL` longtext DEFAULT NULL,
`REQUEST_TIME` bigint(20) DEFAULT NULL,
`REQUEST_ID` bigint(20) NOT NULL,
`SVR_IP` varchar(46) NOT NULL,
`SVR_PORT` bigint(20) NOT NULL,
PRIMARY KEY (`SVR_IP`, `SVR_PORT`, `TENANT_ID`, `REQUEST_ID`)
) DEFAULT CHARSET = utf8mb4;
### auditDataScale=2
create table `medium_audit` (
`cluster_name` varchar(64) NOT NULL,
`TENANT_ID` bigint(20) NOT NULL,
`DB_NAME` varchar(128) DEFAULT NULL,
`USER_NAME` varchar(64) DEFAULT NULL,
`CLIENT_IP` varchar(46) DEFAULT NULL,
`USER_CLIENT_IP` varchar(46) DEFAULT NULL,
`QUERY_SQL` longtext DEFAULT NULL,
`REQUEST_TIME` bigint(20) DEFAULT NULL,
`REQUEST_ID` bigint(20) NOT NULL,
`SVR_IP` varchar(46) NOT NULL,
`SVR_PORT` bigint(20) NOT NULL,
`ELAPSED_TIME` bigint(20) DEFAULT NULL,
`SID` bigint(20) unsigned DEFAULT NULL,
`SQL_ID` varchar(32) DEFAULT NULL,
`TRACE_ID` varchar(128) DEFAULT NULL,
`AFFECTED_ROWS` bigint(20) DEFAULT NULL,
`RETURN_ROWS` bigint(20) DEFAULT NULL,
`RET_CODE` bigint(20) DEFAULT NULL,
`PLAN_TYPE` bigint(20) DEFAULT NULL,
`PLAN_HASH` bigint(20) unsigned DEFAULT NULL,
`PLAN_ID` bigint(20) DEFAULT NULL,
`IS_HIT_PLAN` tinyint(4) NOT NULL,
PRIMARY KEY (`SVR_IP`, `SVR_PORT`, `TENANT_ID`, `REQUEST_ID`)
) DEFAULT CHARSET = utf8mb4;
### auditDataScale=3
create table `full_audit` (
`cluster_name` varchar(64) NOT NULL,
`TENANT_ID` bigint(20) NOT NULL,
`DB_NAME` varchar(128) DEFAULT NULL,
`USER_NAME` varchar(64) DEFAULT NULL,
`CLIENT_IP` varchar(46) DEFAULT NULL,
`USER_CLIENT_IP` varchar(46) DEFAULT NULL,
`QUERY_SQL` longtext DEFAULT NULL,
`REQUEST_TIME` bigint(20) DEFAULT NULL,
`REQUEST_ID` bigint(20) NOT NULL,
`SVR_IP` varchar(46) NOT NULL,
`SVR_PORT` bigint(20) NOT NULL,
`ELAPSED_TIME` bigint(20) DEFAULT NULL,
`SID` bigint(20) unsigned DEFAULT NULL,
`SQL_ID` varchar(32) DEFAULT NULL,
`TRACE_ID` varchar(128) DEFAULT NULL,
`AFFECTED_ROWS` bigint(20) DEFAULT NULL,
`RETURN_ROWS` bigint(20) DEFAULT NULL,
`RET_CODE` bigint(20) DEFAULT NULL,
`PLAN_TYPE` bigint(20) DEFAULT NULL,
`PLAN_HASH` bigint(20) unsigned DEFAULT NULL,
`PLAN_ID` bigint(20) DEFAULT NULL,
`IS_HIT_PLAN` tinyint(4) NOT NULL,
`QUEUE_TIME` bigint(20) DEFAULT NULL,
`EXECUTE_TIME` bigint(20) DEFAULT NULL,
`TRANSACTION_HASH` bigint(20) unsigned DEFAULT NULL,
`GET_PLAN_TIME` bigint(20) DEFAULT NULL,
`NET_TIME` bigint(20) DEFAULT NULL,
`PARTITION_CNT` bigint(20) DEFAULT NULL,
`ROW_CACHE_HIT` bigint(20) DEFAULT NULL,
`RETRY_CNT` bigint(20) DEFAULT NULL,
`REQUEST_MEMORY_USED` bigint(20) DEFAULT NULL,
`IS_BATCHED_MULTI_STMT` tinyint(4) DEFAULT NULL,
`LOCK_FOR_READ_TIME` bigint(20) DEFAULT NULL,
`NET_WAIT_TIME` bigint(20) DEFAULT NULL,
`DECODE_TIME` bigint(20) DEFAULT NULL,
`MEMSTORE_READ_ROW_COUNT` bigint(20) DEFAULT NULL,
`SSSTORE_READ_ROW_COUNT` bigint(20) DEFAULT NULL,
`WAIT_CLASS_ID` bigint(20) DEFAULT NULL,
`WAIT_CLASS#` bigint(20) DEFAULT NULL,
`WAIT_CLASS` varchar(64) DEFAULT NULL,
`WAIT_TIME_MICRO` bigint(20) DEFAULT NULL,
`TOTAL_WAIT_TIME_MICRO` bigint(20) DEFAULT NULL,
PRIMARY KEY (`SVR_IP`, `SVR_PORT`, `TENANT_ID`, `REQUEST_ID`)
) DEFAULT CHARSET = utf8mb4;
### auditDataScale=4
create table `all_sql_audit` (
`cluster_name` varchar(64) NOT NULL,
`TENANT_ID` bigint(20) NOT NULL,
`DB_NAME` varchar(128) DEFAULT NULL,
`USER_NAME` varchar(64) DEFAULT NULL,
`CLIENT_IP` varchar(46) DEFAULT NULL,
`USER_CLIENT_IP` varchar(46) DEFAULT NULL,
`QUERY_SQL` longtext DEFAULT NULL,
`REQUEST_TIME` bigint(20) DEFAULT NULL,
`REQUEST_ID` bigint(20) NOT NULL,
`SVR_IP` varchar(46) NOT NULL,
`SVR_PORT` bigint(20) NOT NULL,
`ELAPSED_TIME` bigint(20) DEFAULT NULL,
`SID` bigint(20) unsigned DEFAULT NULL,
`SQL_ID` varchar(32) DEFAULT NULL,
`TRACE_ID` varchar(128) DEFAULT NULL,
`AFFECTED_ROWS` bigint(20) DEFAULT NULL,
`RETURN_ROWS` bigint(20) DEFAULT NULL,
`RET_CODE` bigint(20) DEFAULT NULL,
`PLAN_TYPE` bigint(20) DEFAULT NULL,
`PLAN_HASH` bigint(20) unsigned DEFAULT NULL,
`PLAN_ID` bigint(20) DEFAULT NULL,
`IS_HIT_PLAN` tinyint(4) NOT NULL,
`QUEUE_TIME` bigint(20) DEFAULT NULL,
`EXECUTE_TIME` bigint(20) DEFAULT NULL,
`TRANSACTION_HASH` bigint(20) unsigned DEFAULT NULL,
`GET_PLAN_TIME` bigint(20) DEFAULT NULL,
`NET_TIME` bigint(20) DEFAULT NULL,
`PARTITION_CNT` bigint(20) DEFAULT NULL,
`ROW_CACHE_HIT` bigint(20) DEFAULT NULL,
`RETRY_CNT` bigint(20) DEFAULT NULL,
`REQUEST_MEMORY_USED` bigint(20) DEFAULT NULL,
`IS_BATCHED_MULTI_STMT` tinyint(4) DEFAULT NULL,
`LOCK_FOR_READ_TIME` bigint(20) DEFAULT NULL,
`NET_WAIT_TIME` bigint(20) DEFAULT NULL,
`DECODE_TIME` bigint(20) DEFAULT NULL,
`MEMSTORE_READ_ROW_COUNT` bigint(20) DEFAULT NULL,
`SSSTORE_READ_ROW_COUNT` bigint(20) DEFAULT NULL,
`WAIT_CLASS_ID` bigint(20) DEFAULT NULL,
`WAIT_CLASS#` bigint(20) DEFAULT NULL,
`WAIT_CLASS` varchar(64) DEFAULT NULL,
`WAIT_TIME_MICRO` bigint(20) DEFAULT NULL,
`TOTAL_WAIT_TIME_MICRO` bigint(20) DEFAULT NULL,
`SQL_EXEC_ID` bigint(20) DEFAULT NULL,
`CLIENT_PORT` bigint(20) DEFAULT NULL,
`EFFECTIVE_TENANT_ID` bigint(20) DEFAULT NULL,
`USER_ID` bigint(20) DEFAULT NULL,
`USER_GROUP` bigint(20) DEFAULT NULL,
`DB_ID` bigint(20) unsigned DEFAULT NULL,
`QC_ID` bigint(20) unsigned DEFAULT NULL,
`DFO_ID` bigint(20) DEFAULT NULL,
`SQC_ID` bigint(20) DEFAULT NULL,
`WORKER_ID` bigint(20) DEFAULT NULL,
`EVENT` varchar(64) DEFAULT NULL,
`P1TEXT` varchar(64) DEFAULT NULL,
`P1` bigint(20) unsigned DEFAULT NULL,
`P2TEXT` varchar(64) DEFAULT NULL,
`P2` bigint(20) unsigned DEFAULT NULL,
`P3TEXT` varchar(64) DEFAULT NULL,
`P3` bigint(20) unsigned DEFAULT NULL,
`LEVEL` bigint(20) DEFAULT NULL,
`STATE` varchar(19) DEFAULT NULL,
`TOTAL_WAITS` bigint(20) DEFAULT NULL,
`RPC_COUNT` bigint(20) DEFAULT NULL,
`IS_INNER_SQL` tinyint(4) NOT NULL,
`IS_EXECUTOR_RPC` tinyint(4) NOT NULL,
`APPLICATION_WAIT_TIME` bigint(20) unsigned DEFAULT NULL,
`CONCURRENCY_WAIT_TIME` bigint(20) unsigned DEFAULT NULL,
`USER_IO_WAIT_TIME` bigint(20) unsigned DEFAULT NULL,
`SCHEDULE_TIME` bigint(20) unsigned DEFAULT NULL,
`BLOOM_FILTER_CACHE_HIT` bigint(20) DEFAULT NULL,
`BLOCK_CACHE_HIT` bigint(20) DEFAULT NULL,
`BLOCK_INDEX_CACHE_HIT` bigint(20) DEFAULT NULL,
`DISK_READS` bigint(20) DEFAULT NULL,
`TABLE_SCAN` tinyint(4) NOT NULL,
`CONSISTENCY_LEVEL` bigint(20) DEFAULT NULL,
`EXPECTED_WORKER_COUNT` bigint(20) DEFAULT NULL,
`USED_WORKER_COUNT` bigint(20) DEFAULT NULL,
`SCHED_INFO` varchar(16384) DEFAULT NULL,
`FUSE_ROW_CACHE_HIT` bigint(20) DEFAULT NULL,
`PS_STMT_ID` bigint(20) DEFAULT NULL,
`REQUEST_TYPE` bigint(20) DEFAULT NULL,
`OB_TRACE_INFO` varchar(4096) DEFAULT NULL,
`WAIT_TRX_MIGRATE_TIME` bigint(20) DEFAULT NULL,
`PARAMS_VALUE` longtext DEFAULT NULL,
PRIMARY KEY (`SVR_IP`, `SVR_PORT`, `TENANT_ID`, `REQUEST_ID`)
) DEFAULT CHARSET = utf8mb4;
./obloader --csv -h11.166.80.72 -P 2883 -c metacluster -t
obdw_meta -u root -p 'xxxxx' -D test_obdw -f
'/home/admin/yuhuai/obloader_test/csv_dir/oio_cluster-1004.csv' --table base_audit --sys-user root --sys-password 'xxxxx' --external-data --column-delimiter '"'

本文作者:刘思龙(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




