面试题:如何快速解决跨库join表关联?
有一天产品经理提了一个需求,要关联查询A库的xxx表和B库的xxx表(跨库join),做实时分析(查询的表不固定,后期业务还会调整)。Java研发更改代码实现比较困难,大数据团队反馈可以,但不能保证实时性,会有30分钟左右的数据延迟。
产品经理说我这个需求很急,30分钟数据延迟业务不能接受。
那么问题来了,如何解决? 明天就上线。
【解决方案】
第一种、利用MySQL 多源复制技术,只同步产品经理需要的两张表
https://dev.mysql.com/doc/refman/8.0/en/replication-multi-source-adding-binlog-master.html
并设置并行复制replica_parallel_type = DATABASE
优点: MySQL InnoDB自身同步复制速度快(OLTP行式存储特性),优于大数据产品(OLAP列式存储),可以完美解决数据实时性入库。
缺点: 今后如果产品经理再需要同步其他表,需要再次导数据(数据搬运工)费时费事。
第二种、拒绝数据搬运工,1分钟解决战斗
我们采用MariaDB Spider存储引擎特性(映射远程InnoDB的表,相当于做一个超链接,Spider存储引擎本身并不存储数据),类似Clickhouse的mysql表引擎。
https://clickhouse.com/docs/en/integrations/mysql#1-configure-mysql
如果你熟悉MySQL FEDERATED存储引擎,Spider存储引擎相当于FEDERATED存储引擎的升级版,因为MySQL FEDERATED存储引擎已经停止维护了,生产环境不可用。
The FEDERATED Storage Engine is a legacy storage engine no longer being supported.
https://mariadb.com/kb/en/federated-storage-engine/
Spider存储引擎在生产环境成功案例是腾讯游戏,固我们采用该引擎。
Tencent Games. They handle 100TB data on 396 Spider nodes and 2800 data nodes. They use this cluster for their online games.
https://mariadb.com/kb/en/spider-case-studies/
安装部署腾讯版TSpider
# 下载腾讯版MariaDB TSpider
# 解压软链介质
shell> tar xzvf mariadb-10.3.7-linux-x86_64-tspider-3.7.8-gcs.tar.gz -C /usr/local/
shell> ln -s mariadb-10.3.7-linux-x86_64-tspider-3.7.8-gcstspider
shell> chown -R mysql.mysql mariadb-10.3.7-linux-x86_64-tspider-3.7.8-gcs/
# 初始化TSpider
shell> cd /usr/local/tspider && ./scripts/mysql_install_db --defaults-file=/etc/my_tspider.cnf --user=mysql
# 启动TSpider
shell> ./bin/mysqld_safe --defaults-file=/etc/my_tspider.cnf --user=mysql &
[client]
port=25000
socket=/tmp/mysql_tspider.sock
[mysqld]
basedir=/usr/local/tspider
datadir=/data/mysql/tspider/data
log-bin = /data/mysql/tspider/binlog/mysql-bin
tmpdir=/data/mysql/tspider/tmp
character-set-server=utf8mb4
port=25000
socket=/tmp/mysql_tspider.sock
default-storage-engine=spider
slow_query_log=1
slow_query_log_file=/data/mysql/tspider/slowlog/slow-query.log
long_query_time=3
log_slow_admin_statements=ON
performance_schema=ON
skip-name-resolve
skip-external-locking
skip-symbolic-links
sql_mode=''
###### Tspider config ######
spider_conn_recycle_mode=1
spider_bgs_mode=1
optimizer_switch= 'engine_condition_pushdown=on'
###### Tspider END ######
[mysql]
default-character-set=utf8mb4
no-auto-rehash
port=25000
socket=/tmp/mysql_tspider.sock
TSpider引擎的重要参数说明如下
spider_conn_recycle_mode=1
连接复用,类似于连接池的功能。
spider_bgs_mode=1
TSpider集群在接受应用层的SQL语句请求后,将判定SQL语句需要路
由到后端的哪些MySQL/MariaDB实例上执行,然后在对应的后端
MySQL/MariaDB实例上依次轮询执行,最后统一汇总结果。该参数取
值为0时表示不开启并行功能(即串行执行);取值为1时表示开启并行
功能。
optimizer_switch= 'engine_condition_pushdown=on'
引擎下推,将查询推送到后端数据库,然后将查询结果返回给TSpider做聚合。
更详细的参数说明:
https://tendbcluster.com/book-cn/Documentation/re-book/tspider-parameter.html
Spider引擎在Federated场景应用
Federated:允许MySQL服务器通过远程连接访问多个数据库来联合查询数据。
一、配置mysql.servers路由表
create server backend1
foreign data wrapper mysql
options(
host '127.0.0.1',
database 'aa',
user 'admin',
password '123456',
port 6666
);
create server backend2
foreign data wrapper mysql
options(
host '127.0.0.1',
database 'bb',
user 'admin',
password '123456',
port 3346
);
这里后端服务器的名字为backend1,数据库的名字为aa,后端MySQL/MariaDB服务器的IP地址为127.0.0.1,用户名为admin(权限为ALL),密码为123456,端口为6666。
注:如果配置有误,可以直接truncate mysql.servers路由表
二、创建表的“超链接”(将远程服务器的表映射为本地表)
CREATE TABLE `ta` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cid` int(11) DEFAULT NULL,
`uid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `cid` (`cid`)
) ENGINE=SPIDER COMMENT='wrapper "mysql" , table "ta" , srv "backend1"';
CREATE TABLE `tb` (
`id` int NOT NULL,
`cid` int DEFAULT NULL,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=SPIDER COMMENT='wrapper "mysql" , table "tb" , srv "backend2"';
这里通过设置COMMENT注释来调用后端的表,然后就可以访问TSpider查看ta表和tb表的数据了。
当创建一个Spider存储引擎的ta/tb表时,该表指向后端MySQL/MariaDB服务器上对应的表结构和名字相同的ta/tb表,就像在Linux系统中创建软链接一样。远程服务器上的表可以是任何存储引擎的表。在执行“CREATE TABLE”命令创建Spider引擎的表时,需要添加“COMMENT”或“CONNECTION”语法来指定远程服务器的地址等信息。