统计存储 #
数据库都会有自身的系统表,存储一些系统的统计数据。以 MySQL 为例,会存在 information_schema、mysql、performance_schema、sys 系统数据库,并且每个数据库下会存在许多系统表。 以 MySQL 协议的 Proxy 为例,Proxy 也应该存在这些系统库和对应的表,并且提供系统表对应的数据。由于 Proxy 处于物理库的上层,所以 Proxy 需要构建出符合 Proxy 层的逻辑数据。 比如 INFORMATION_SCHEMA.SCHEMATA 查询的是数据库的信息,在物理库执行和在 Proxy 层执行返回的数据是不一致的。在 Proxy 层需要返回逻辑库的数据。所以针对这种表的数据需要在 Proxy 层单独构建, 构建好后还需要对数据进行存储,而统计存储规则就是定义这些数据的存储位置。当前仅实现了 MySQL 数据库的部分系统表构建和存储。
已实现的表
MySQL: INFORMATION_SCHEMA.SCHEMATA、INFORMATION_SCHEMA.TABLES、INFORMATION_SCHEMA.COLUMNS。
Proxy: shardingsphere.table_statistics、shardingsphere.column_statistics (shardingsphere 为 Proxy 独有的系统库,当开启联邦查询时才会统计 table_statistics、column_statistics 表的数据)。
| 语法 | 类型 | 描述 |
|---|---|---|
| ALTER STATISTICS_STORAGE RULE | RAL | 修改统计存储规则 |
| SHOW STATISTICS_STORAGE RULE | RAL | 查看统计存储规则 |
| REFRESH STATISTICS METADATA | RAL | 刷新统计数据 |
| TRUNCATE STATISTICS METADATA | RAL | 清除统计数据 |
设置系统数据主动收集 job cron, 和开启系统数据自动收集
SET DIST VARIABLE proxy_meta_data_collector_cron = '0 0/30 * * * ?';
SET DIST VARIABLE proxy_meta_data_collector_enabled = 'true';
1. 修改统计存储规则配置 #
ALTER STATISTICS_STORAGE RULE (
NAME_PREFIX=sphereex,
STORAGE UNIT (
URL = "jdbc:mysql://127.0.0.1:3306?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true",
USER = "root",
PASSWORD = "123456",
PROPERTIES("maximumPoolSize" = 2, "idleTimeout" = "30000")
)
);
参数说明
NAME_PREFIX:数据库名称前缀,默认为 sphereexSTORAGE UNIT:存储信息URL:jdbc url 地址USER:用户PASSWORD:密码PROPERTIES:用于自定义连接池参数,key 和 value 均为 STRING 类型
数据收集后会自动在存储数据的数据库实例自动创建以 NAME_PREFIX 加下划线 “_” 为前缀的系统数据库,如 sphereex_information_schema、sphereex_shardingsphere。 STATISTICS_STORAGE RULE 中配置的数据库用户需要有下面权限(数据库账号和 NAME_PREFIX 前缀名称按照实际情况修改)。
GRANT CREATE, SELECT, INSERT, UPDATE, DELETE, DROP ON sphereex_information_schema.* TO 'root'@'%';
GRANT CREATE, SELECT, INSERT, UPDATE, DELETE, DROP ON sphereex_shardingsphere.* TO 'root'@'%';
2. 修改统计存储规则配置 #
SHOW STATISTICS_STORAGE RULE;
示例
mysql> SHOW STATISTICS_STORAGE RULE\G
*************************** 1. row ***************************
name_prefix: sphereex
type: MySQL
host: 127.0.0.1
port: 3306
db:
connection_timeout_milliseconds: 30000
idle_timeout_milliseconds: 30000
max_lifetime_milliseconds: 2100000
max_pool_size: 2
min_pool_size: 1
read_only: false
other_attributes: {"healthCheckProperties":{},"initializationFailTimeout":1,"validationTimeout":5000,"keepaliveTime":0,"leakDetectionThreshold":0,"registerMbeans":false,"allowPoolSuspension":false,"autoCommit":true,"isolateInternalQueries":false,"queryProperties":{"allowPublicKeyRetrieval":"true","serverTimezone":"UTC","useSSL":"false"}}
1 row in set (0.01 sec)
3. 刷新统计数据 #
REFRESH STATISTICS METADATA;
执行后会重新统计系统数据
4. 清除统计数据 #
TRUNCATE STATISTICS METADATA;
执行后会清除存储规则中存储的系统数据