配置PolarDB表到Tair表的映射关系

在完成添加Tair缓存节点创建Tair缓存节点账号以及创建Tair自定义连接地址操作后,您需要配置表映射关系,明确PolarDB数据库中的表到Tair缓存节点的Redis协议的KV(Key-Value)结构或者KKV(Key-Key-Value)结构,从而使Tair缓存节点按照您的业务预期来提供缓存能力。

前提条件

配置说明

目前映射配置支持String映射Hash映射两种模式。在此之前,我们来了解一下系统表。

系统表介绍

为了在PolarDB中实现Tair缓存一体化的能力,PolarDB预置了如下系统表:

-- system table, create by default, mysql

-- string映射模式的系统表
CREATE TABLE mysql.`tair_string_containers` (
  `name` varchar(50) NOT NULL COMMENT '映射的唯一名,用于唯一确定一个映射',
  `db_schema` varchar(250) NOT NULL COMMENT '映射的表所在的db', 
  `db_table` varchar(250) NOT NULL COMMENT '映射表',
  `key_column` varchar(250) NOT NULL COMMENT '映射的key使用的列',
  `value_column` varchar(250) NOT NULL COMMENT '映射的value使用的列',
  `unique_idx_name_on_key` varchar(250) NOT NULL COMMENT '使用的索引名,因为tair不感知所有的索引,也不使用优化器,因此需要手动指定索引',
  PRIMARY KEY (`name`)
);

-- hash映射模式的系统表
CREATE TABLE IF NOT EXISTS `tair_hash_containers` (
  `name` varchar(50) NOT NULL COMMENT '映射的唯一名,用于唯一确定一个映射',
  `db_schema` varchar(250) NOT NULL COMMENT '映射的表所在的db', 
  `db_table` varchar(250) NOT NULL COMMENT '映射表',
  `key_column` varchar(250) NOT NULL COMMENT '映射的key使用的列',
  `value_column` varchar(250) NOT NULL COMMENT '映射的value使用的列',
  `unique_idx_name_on_key` varchar(250) NOT NULL COMMENT '使用的索引名,因为tair不感知所有的索引,也不使用优化器,因此需要手动指定索引',
  PRIMARY KEY (`name`)
);

支持的字段数据类型如下:

key

value

TINYINT

支持

支持

SMALLINT

支持

支持

MEDIUMINT

暂未支持

暂未支持

INT或INTEGER

支持

支持

BIGINT

支持

支持

FLOAT

无意义,不支持

支持

DOUBLE

无意义,不支持

支持

DECIMAL

暂未支持

暂未支持

CHAR

支持

支持

VARCHAR

支持

支持

TINYBLOB

支持,不建议

支持

TINYTEXT

支持,不建议

支持

BLOB

支持,不建议

支持

TEXT

支持,不建议

支持

MEDIUMBLOB

支持,不建议

支持

MEDIUMTEXT

支持,不建议

支持

LONGBLOB

暂未支持

暂未支持

LONGTEXT

暂未支持

暂未支持

(推荐)模式一:String映射

说明

为了保证更好的使用体验,建议您优先选择String映射模式进行配置。

String映射支持在具有读写权限的表中,使用KV结构,将一个column作为key,一个column作为value。

说明

为保证key的唯一性,选择作为key的column,需要事先创建索引unique_idx_name_on_key

以下通过一个示例,带您了解如何通过SQL配置String映射:

CREATE database test_db;

use test_db

CREATE TABLE `test` (
  `key` varchar(50) NOT NULL,
  `value` varchar(50) DEFAULT NULL,
  `value2` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`key`)
);

insert into mysql.tair_string_containers values ("example", "test_db", "test", "key", "value", "PRIMARY");

insert into test values ("k", "v", "v2");

FLUSH TAIR;

从Tair缓存节点以Redis协议读取数据时,需要以设置的name作为key的前缀,并使用@分隔。例如:

redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get example@k
"v"

模式二:Hash映射

Hash映射符合Redis Hash结构用法,支持在具有读写权限的表中,使用KKV结构,将一个column作为key,多个column的字段名作为field,column的数据作为子field的value。

说明

为保证key的唯一性,选择作为key的column,需要事先创建索引unique_idx_name_on_key

以下通过一个示例,带您了解如何通过SQL配置Hash映射:

CREATE database test_db;

use test_db

CREATE TABLE `test` (
  `key` varchar(50) NOT NULL,
  `value` varchar(50) DEFAULT NULL,
  `value2` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`key`)
);

insert into mysql.tair_hash_containers values ("hexample", "test_db", "test", "key", "value,value2", "PRIMARY");

insert into test values ("k", "v", "v2");

FLUSH TAIR;

从Tair缓存节点以Redis协议读取数据时,需要以设置的name作为key的前缀,并使用@分隔。例如:

redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> hget hexample@k value2
"v2"
127.0.0.1:6379> hget hexample@k value
"v"

多column组成key

当前String映射模式和Hash映射模式都支持多column组成key。您只需要在key_column中传入多个逗号分隔的column名称即可。

说明

为了保证key的唯一性,选择作为key的column,需要创建unique_idx_name_on_key索引覆盖所有的key_column。

以下通过一个示例,带您了解如何通过SQL配置多column组成key:

CREATE database test_db;

use test_db

CREATE TABLE `test` (
  `user` varchar(50) NOT NULL,
  `phone` varchar(50) NOT NULL,
  `value` varchar(50) DEFAULT NULL,
  `value2` varchar(50) DEFAULT NULL,
);

ALTER TABLE test ADD UNIQUE INDEX idx_user_phone (user, phone);

insert into mysql.tair_hash_containers values ("hexample", "test_db", "test", "user,phone", "value,value2", "idx_user_phone");

insert into test values ("test_user", "13600001234", "v", "v2");

FLUSH TAIR;

从Tair缓存节点以Redis协议读取数据时,需要拼接多个key_column,并使用#分隔。例如:

redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> hget hexample@test_user#13600001234 value2
"v2"
127.0.0.1:6379> hget hexample@test_user#13600001234 value
"v"

问题排查

添加映射后,执行如下命令以刷新配置:

FLUSH TAIR;

刷新配置后,有些配置可能无法刷新成功,此时可以使用如下命令,查看对应的错误日志:

show warnings;

后续操作

在完成表映射关系配置后,您就可以连接到PolarDB数据库集群,并发出Redis命令以使用Tair缓存节点提供的功能。